Я работаю над распознаванием речи с помощью нейронной сети. Для этого мне нужно получить спектрограммы этих обучающих аудиофайлов (.wav). Как получить эти спектрограммы в python?
построение спектрограммы в анализе звука
Ответы (3)
Есть множество способов сделать это. Проще всего проверить методы, предложенные в Kernels на конкурсе Kaggle TensorFlow Speech Recognition Challenge (просто отсортируйте по наибольшему количеству голосов). Этот вопрос особенно ясен и прост и содержит следующее: функция. Входными данными являются числовой вектор выборок, извлеченных из файла wav, частота дискретизации, размер кадра в миллисекундах, размер шага (шага или пропуска) в миллисекундах и небольшое смещение.
from scipy.io import wavfile
from scipy import signal
import numpy as np
sample_rate, audio = wavfile.read(path_to_wav_file)
def log_specgram(audio, sample_rate, window_size=20,
step_size=10, eps=1e-10):
nperseg = int(round(window_size * sample_rate / 1e3))
noverlap = int(round(step_size * sample_rate / 1e3))
freqs, times, spec = signal.spectrogram(audio,
fs=sample_rate,
window='hann',
nperseg=nperseg,
noverlap=noverlap,
detrend=False)
return freqs, times, np.log(spec.T.astype(np.float32) + eps)
Выходные данные определены в руководстве по SciPy с исключение состоит в том, что спектрограмма перемасштабируется с помощью монотонной функции (Log()), которая подавляет большие значения намного больше, чем меньшие значения, оставляя большие значения все еще большими, чем меньшие значения. Таким образом, никакое экстремальное значение в спецификации не будет доминировать в вычислении. В качестве альтернативы можно ограничить значения некоторым квантилем, но предпочтительным является логарифм (или даже квадратный корень). Есть много других способов нормализовать высоту спектрограммы, то есть предотвратить «запугивание» вывода экстремальными значениями :)
freq (f) : ndarray, Array of sample frequencies.
times (t) : ndarray, Array of segment times.
spec (Sxx) : ndarray, Spectrogram of x. By default, the last axis of Sxx corresponds to the segment times.
Кроме того, вы можете проверить код train.py и models.py на репозиторий github из примера Tensorflow по распознаванию звука.
Вот еще одна тема, которая объясняет и дает код для создания спектрограммы в Python.
audio = audio[:, 0]
, и тогда ваш log_specgram
будет отлично работать. :-) Спасибо еще раз!
- person Greg Sadetsky; 14.07.2020
Scipy служит этой цели.
import scipy
# Read the .wav file
sample_rate, data = scipy.io.wavfile.read('directory_path/file_name.wav')
# Spectrogram of .wav file
sample_freq, segment_time, spec_data = signal.spectrogram(data, sample_rate)
# Note sample_rate and sampling frequency values are same but theoretically they are different measures
Используйте библиотеку matplot для визуализации спектрограммы
import matplotlib.pyplot as plt
plt.pcolormesh(segment_time, sample_freq, spec_data )
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()
Вы можете использовать пакеты NumPy, SciPy и matplotlib для создания спектрограмм. Смотрите этот следующий пост. http://www.frank-zalkow.de/en/code-snippets/create-audio-spectrograms-with-python.html