Persiapan dan Augmentasi Data Audio

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Ringkasan

Salah satu tantangan terbesar dalam Pengenalan Ucapan Otomatis adalah persiapan dan peningkatan data audio. Analisis data audio bisa dalam domain waktu atau frekuensi, yang menambah kompleks tambahan dibandingkan dengan sumber data lain seperti gambar.

Sebagai bagian dari ekosistem TensorFlow, tensorflow-io paket menyediakan beberapa API yang berhubungan dengan audio yang berguna yang membantu meringankan persiapan dan augmentasi data audio.

Mempersiapkan

Instal Paket yang diperlukan, dan mulai ulang runtime

pip install tensorflow-io

Penggunaan

Baca File Audio

Dalam TensorFlow IO, kelas tfio.audio.AudioIOTensor memungkinkan Anda untuk membaca file audio menjadi malas-dimuat 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>

Dalam contoh di atas, Flac file yang brooklyn.flac adalah dari klip audio yang dapat diakses publik di google cloud .

GCS alamat gs://cloud-samples-tests/speech/brooklyn.flac digunakan langsung karena GCS adalah sistem file yang didukung di TensorFlow. Selain Flac Format, WAV , Ogg , MP3 , dan MP4A juga didukung oleh AudioIOTensor dengan deteksi format file otomatis.

AudioIOTensor malas-dimuat sehingga hanya bentuk, dtype, dan sample rate ditunjukkan pada awalnya. Bentuk AudioIOTensor direpresentasikan sebagai [samples, channels] , yang berarti klip audio Anda dimuat adalah mono channel dengan 28979 sampel di int16 .

Isi dari klip audio hanya akan dibaca sebagai dibutuhkan, baik dengan mengkonversi AudioIOTensor untuk Tensor melalui to_tensor() , atau meskipun mengiris. Mengiris sangat berguna ketika hanya sebagian kecil dari klip audio besar yang diperlukan:

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)

Audio dapat diputar melalui:

from IPython.display import Audio

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

Lebih mudah untuk mengubah tensor menjadi angka float dan menampilkan klip audio dalam grafik:

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

Kurangi kebisingan

Kadang-kadang masuk akal untuk memangkas suara dari audio, yang dapat dilakukan melalui API tfio.audio.trim . Kembali dari API adalah sepasang [start, stop] posisi segement yang:

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 dan Fade Out

Salah satu teknik rekayasa audio yang berguna adalah fade, yang secara bertahap menambah atau mengurangi sinyal audio. Hal ini dapat dilakukan melalui tfio.audio.fade . tfio.audio.fade mendukung berbagai bentuk memudar seperti linear , logarithmic , atau 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

Spektogram

Pemrosesan audio tingkat lanjut sering kali bekerja pada perubahan frekuensi dari waktu ke waktu. Dalam tensorflow-io bentuk gelombang dapat dikonversi ke spektogram melalui 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

Transformasi tambahan ke skala yang berbeda juga dimungkinkan:

# 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

SpecAugment

Selain yang disebutkan di atas persiapan data dan pembesaran API, tensorflow-io paket juga menyediakan augmentations spektogram canggih, terutama Frekuensi dan Waktu Masking dibahas dalam SpecAugment: (. Taman et al, 2019) Metode data Augmentation sederhana untuk Automatic Speech Recognition .

Penyembunyian Frekuensi

Di masking frekuensi, saluran frekuensi [f0, f0 + f) yang bertopeng di mana f dipilih dari distribusi seragam dari 0 ke topeng frekuensi parameter F , dan f0 dipilih dari (0, ν − f) dimana ν adalah jumlah saluran frekuensi.

# 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

Penyembunyian Waktu

Dalam waktu masking, t langkah waktu berturut-turut [t0, t0 + t) yang bertopeng di mana t dipilih dari distribusi seragam dari 0 ke waktu topeng parameter T , dan t0 dipilih dari [0, τ − t) di mana τ adalah langkah waktu.

# 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