Préparation et augmentation des données audio

Voir sur TensorFlow.org Exécuter dans Google Colab Voir la source sur GitHub Télécharger le cahier

Aperçu

L'un des plus grands défis de la reconnaissance vocale automatique est la préparation et l'augmentation des données audio. L'analyse des données audio peut être dans le domaine temporel ou fréquentiel, ce qui ajoute une complexité supplémentaire par rapport à d'autres sources de données telles que les images.

En tant que partie de l'écosystème de tensorflow, tensorflow-io paquet fournit un bon nombre d' API liées audio-utiles qui aide à l' assouplissement de la préparation et l' augmentation des données audio.

Installer

Installez les packages requis et redémarrez le runtime

pip install tensorflow-io

Usage

Lire un fichier audio

Dans tensorflow IO, classe tfio.audio.AudioIOTensor vous permet de lire un fichier audio dans un paresseux chargé 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>

Dans l'exemple ci - dessus, le fichier Flac brooklyn.flac est d'un clip audio accessible au public en nuage Google .

L'adresse GCS gs://cloud-samples-tests/speech/brooklyn.flac sont directement utilisés parce GCS est un système de fichiers pris en charge dans tensorflow. En plus de Flac format WAV , Ogg , MP3 et MP4A sont également pris en charge par AudioIOTensor avec détection de format de fichier automatique.

AudioIOTensor est chargé paresseux forme alors que, DTYPE et le taux d' échantillonnage sont présentés au départ. La forme de la AudioIOTensor est représentée par [samples, channels] les 28979 int16 [samples, channels] , ce qui signifie le clip audio chargé est mono canal avec 28979 échantillons dans int16 .

Le contenu du clip audio ne sera lu au besoin, que ce soit en convertissant AudioIOTensor à Tensor par to_tensor() , ou bien trancher. Le découpage est particulièrement utile lorsque seule une petite partie d'un gros clip audio est nécessaire :

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)

L'audio peut être lu via :

from IPython.display import Audio

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

Il est plus pratique de convertir le tenseur en nombres flottants et d'afficher le clip audio sous forme de graphique :

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

Couper le bruit

Parfois , il est logique de couper le bruit de l'audio, ce qui pourrait être fait via l' API tfio.audio.trim . Renvoyé de l'API est une paire de [start, stop] position du segement:

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

Fondu d'entrée et de sortie

Une technique d'ingénierie audio utile est le fondu, qui augmente ou diminue progressivement les signaux audio. Cela peut se faire par tfio.audio.fade . tfio.audio.fade supports de formes différentes telles que des fondus linear , logarithmic ou 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

Spectrogramme

Le traitement audio avancé fonctionne souvent sur les changements de fréquence au fil du temps. Dans tensorflow-io une forme d' onde peut être converti en spectrogramme par 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

Des transformations supplémentaires à différentes échelles sont également possibles :

# 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

SpecAugmentation

En plus de ce qui précède la préparation des données mentionnées et les API augmentation, tensorflow-io paquet fournit également des augmentations de spectrogramme avancées, notamment la fréquence et le temps Masking discuté dans SpecAugment: (. Park et al, 2019) Une méthode simple des données d' augmentation pour la reconnaissance automatique de la parole .

Masquage de fréquence

Dans le masquage de fréquence, des canaux de fréquence [f0, f0 + f) sont masqués où f est choisi parmi une distribution uniforme de 0 au paramètre masque de fréquence F , et f0 est choisi parmi (0, ν − f)ν est le nombre de canaux de fréquence.

# 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

Masquage temporel

Dans le masquage du temps, t pas de temps consécutifs [t0, t0 + t) sont masqués où t est choisi parmi une distribution uniforme de 0 dans le masque de temps paramètre T , et t0 est choisi parmi [0, τ − t) , où τ est le pas de temps.

# 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