¡El Día de la Comunidad de ML es el 9 de noviembre! Únase a nosotros para recibir actualizaciones de TensorFlow, JAX, y más Más información

Preparación y aumento de datos de audio

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar cuaderno

Descripción general

Uno de los mayores desafíos del reconocimiento automático de voz es la preparación y el aumento de datos de audio. El análisis de datos de audio podría realizarse en el dominio del tiempo o de la frecuencia, lo que agrega complejidad adicional en comparación con otras fuentes de datos, como las imágenes.

Como parte del ecosistema de TensorFlow, el paquete tensorflow-io proporciona bastantes API útiles relacionadas con el audio que ayudan a facilitar la preparación y el aumento de los datos de audio.

Configuración

Instale los paquetes necesarios y reinicie el tiempo de ejecución

pip install tensorflow-io

Uso

Leer un archivo de audio

En TensorFlow IO, la clase tfio.audio.AudioIOTensor te permite leer un archivo de audio en un IOTensor carga IOTensor :

import tensorflow as tf
import tensorflow_io as tfio

audio = tfio.audio.AudioIOTensor('gs://cloud-samples-tests/speech/brooklyn.flac')

print(audio)
<AudioIOTensor: shape=[28979     1], dtype=<dtype: 'int16'>, rate=16000>

En el ejemplo anterior, el archivo Flac brooklyn.flac proviene de un clip de audio de acceso público en la nube de Google .

La dirección de GCS gs://cloud-samples-tests/speech/brooklyn.flac se usa directamente porque GCS es un sistema de archivos compatible en TensorFlow. Además del formato Flac , MP4A también admite WAV , Ogg , MP3 y AudioIOTensor con detección automática de formato de archivo.

AudioIOTensor tiene carga diferida, por lo que inicialmente solo se muestran la forma, el tipo d y la frecuencia de muestreo. La forma del AudioIOTensor se representa como [samples, channels] , lo que significa que el clip de audio que cargó es un canal mono con 28979 muestras en int16 .

El contenido del clip de audio solo se leerá según sea necesario, ya sea convirtiendo AudioIOTensor a Tensor través de to_tensor() , o mediante el corte. El corte es especialmente útil cuando solo se necesita una pequeña parte de un clip de audio grande:

audio_slice = audio[100:]

# remove last dimension
audio_tensor = tf.squeeze(audio_slice, axis=[-1])

print(audio_tensor)
tf.Tensor([16 39 66 ... 56 81 83], shape=(28879,), dtype=int16)

El audio se puede reproducir a través de:

from IPython.display import Audio

Audio(audio_tensor.numpy(), rate=audio.rate.numpy())

Es más conveniente convertir el tensor en números flotantes y mostrar el clip de audio en un gráfico:

import matplotlib.pyplot as plt


tensor = tf.cast(audio_tensor, tf.float32) / 32768.0

plt.figure()
plt.plot(tensor.numpy())
[<matplotlib.lines.Line2D at 0x7fbdd3eb72d0>]

png

Recorta el ruido

A veces tiene sentido recortar el ruido del audio, lo que podría hacerse a través de API tfio.audio.trim . La API devuelve un par de posiciones [start, stop] del segmento:

position = tfio.audio.trim(tensor, axis=0, epsilon=0.1)
print(position)

start = position[0]
stop = position[1]
print(start, stop)

processed = tensor[start:stop]

plt.figure()
plt.plot(processed.numpy())
tf.Tensor([ 2398 23546], shape=(2,), dtype=int64)
tf.Tensor(2398, shape=(), dtype=int64) tf.Tensor(23546, shape=(), dtype=int64)
[<matplotlib.lines.Line2D at 0x7fbdd3dce9d0>]

png

Fade in y fade out

Una técnica de ingeniería de audio útil es el desvanecimiento, que aumenta o disminuye gradualmente las señales de audio. Esto se puede hacer a través de tfio.audio.fade . tfio.audio.fade admite diferentes formas de fundidos, como linear , logarithmic o exponential :

fade = tfio.audio.fade(
    processed, fade_in=1000, fade_out=2000, mode="logarithmic")

plt.figure()
plt.plot(fade.numpy())
[<matplotlib.lines.Line2D at 0x7fbdd00d9b10>]

png

Espectrograma

El procesamiento de audio avanzado a menudo funciona con los cambios de frecuencia con el tiempo. En tensorflow-io una forma de onda se puede convertir en espectrograma a través de tfio.audio.spectrogram :

# Convert to spectrogram
spectrogram = tfio.audio.spectrogram(
    fade, nfft=512, window=512, stride=256)

plt.figure()
plt.imshow(tf.math.log(spectrogram).numpy())
<matplotlib.image.AxesImage at 0x7fbdd005add0>

png

También es posible una transformación adicional a diferentes escalas:

# Convert to mel-spectrogram
mel_spectrogram = tfio.audio.melscale(
    spectrogram, rate=16000, mels=128, fmin=0, fmax=8000)


plt.figure()
plt.imshow(tf.math.log(mel_spectrogram).numpy())

# Convert to db scale mel-spectrogram
dbscale_mel_spectrogram = tfio.audio.dbscale(
    mel_spectrogram, top_db=80)

plt.figure()
plt.imshow(dbscale_mel_spectrogram.numpy())
<matplotlib.image.AxesImage at 0x7fbcfb20bd10>

png

png

Aumento de especificaciones

Además de las API de preparación y aumento de datos mencionadas anteriormente, el paquete tensorflow-io también proporciona aumentos avanzados de espectrograma, sobre todo el enmascaramiento de frecuencia y tiempo discutido en SpecAugment: A Simple Data Augmentation Method for Automatic Speech Recognition (Park et al., 2019) .

Enmascaramiento de frecuencia

En el enmascaramiento de frecuencia, los canales de frecuencia [f0, f0 + f) se enmascaran donde f se elige de una distribución uniforme de 0 al parámetro de máscara de frecuencia F , y f0 se elige de (0, ν − f) donde ν es el número de canales de frecuencia.

# Freq masking
freq_mask = tfio.audio.freq_mask(dbscale_mel_spectrogram, param=10)

plt.figure()
plt.imshow(freq_mask.numpy())
<matplotlib.image.AxesImage at 0x7fbcfb155cd0>

png

Enmascaramiento de tiempo

En el enmascaramiento de tiempo, se enmascaran t pasos de tiempo consecutivos [t0, t0 + t) donde t se elige de una distribución uniforme de 0 al parámetro de máscara de tiempo T , y t0 se elige de [0, τ − t) donde τ es el Pasos de tiempo.

# Time masking
time_mask = tfio.audio.time_mask(dbscale_mel_spectrogram, param=10)

plt.figure()
plt.imshow(time_mask.numpy())
<matplotlib.image.AxesImage at 0x7fbcfb0d9bd0>

png