הכנה והגדלה של נתוני אודיו

הצג באתר TensorFlow.org הפעל בגוגל קולאב צפה במקור ב-GitHub הורד מחברת

סקירה כללית

אחד האתגרים הגדולים ביותר בזיהוי דיבור אוטומטי הוא הכנה והגדלה של נתוני אודיו. ניתוח נתוני אודיו יכול להיות בתחום זמן או תדירות, מה שמוסיף מורכבות נוספת בהשוואה למקורות נתונים אחרים כגון תמונות.

כחלק האקולוגי TensorFlow, tensorflow-io חבילה מספקת APIs שימושי למדי כמה קשור שמע כי עוזר להקל על הכנת הגדלת נתון אודיו.

להכין

התקן את החבילות הנדרשות והפעל מחדש את זמן הריצה

pip install tensorflow-io

נוֹהָג

קרא קובץ שמע

בשנת TensorFlow IO, בכיתה tfio.audio.AudioIOTensor מאפשר לך לקרוא קובץ אודיו לתוך עצלן טעון 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>

בדוגמה לעיל, קובץ Flac brooklyn.flac הוא מ- קליפ אודיו נגיש לציבור Google Cloud .

כתוב GCS gs://cloud-samples-tests/speech/brooklyn.flac משמש במישרין בגלל GCS היא מערכת קבצים נתמכת ב TensorFlow. בנוסף Flac פורמט, WAV , Ogg , MP3 , ו MP4A נתמכים גם על ידי AudioIOTensor עם זיהוי פורמט קובץ אוטומטי.

AudioIOTensor הוא עצלן טעון כל כך רק לעצב, dtype, ואת קצב דגימה מוצגים בתחילה. הצורה של AudioIOTensor מיוצגת [samples, channels] , מה שאומר קליפ אודיו שטען מונו ערוץ עם 28979 דגימות ב int16 .

התוכן של קליפ אודיו יקראו רק לפי הצורך, בין אם על ידי המרת AudioIOTensor כדי Tensor דרך to_tensor() , או על פי חיתוך. חיתוך שימושי במיוחד כאשר יש צורך רק בחלק קטן מקטע שמע גדול:

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)

ניתן להשמיע את האודיו באמצעות:

from IPython.display import Audio

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

זה יותר נוח להמיר טנזור למספרי צפים ולהראות את קטע האודיו בגרף:

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

חתוך את הרעש

לפעמים זה הגיוני לקצץ את הרעש מן אודיו, אשר יכול להיעשות באמצעות API tfio.audio.trim . חזר מן API הוא זוג [start, stop] עמדת 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

Fade In ו Fade Out

טכניקת הנדסת שמע שימושית אחת היא דהייה, אשר מגדילה או מקטינה בהדרגה את אותות השמע. ניתן לעשות זאת באמצעות tfio.audio.fade . tfio.audio.fade תומך צורות שונות של דוהה כגון linear , logarithmic , או 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

ספקטרוגרם

עיבוד אודיו מתקדם עובד לרוב על שינויים בתדרים לאורך זמן. בשנת tensorflow-io צורת גל ניתן להמיר ספקטרוגרמה דרך 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

טרנספורמציה נוספת לסולמות שונים אפשרית גם היא:

# 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

בנוסף לומר לעיל הכנת נתונים שהוזכרה ו- APIs הגדלה, tensorflow-io חבילה מספקת גם augmentations ספקטרוגרמה מתקדם, תדירות בראש ובראשונה זו ושעת המיסוך שנדון SpecAugment: (. פרק ואח, 2019) שיטת הגדלת נתונים פשוט עבור זיהוי דיבור אוטומטי .

מיסוך תדרים

בשנת מיסוך תדרים, ערוצי תדר [f0, f0 + f) הם רעולי פנים שבו f נבחר מתוך התפלגות אחידה בין 0 ל המסכה תדירות פרמטר F , ו f0 נבחר מן (0, ν − f) שבו ν הוא מספר ערוצי תדר.

# 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

מסיכת זמן

בשנת מיסוך זמן, t צעדים זמן רצופים [t0, t0 + t) מחופשים שבו t נבחר מתוך התפלגות אחידה בין 0 ל המסכה זמן פרמטר T , ו t0 נבחר מ [0, τ − t) שבו τ הוא צעדי זמן.

# 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