построение спектрограммы в анализе звука

Я работаю над распознаванием речи с помощью нейронной сети. Для этого мне нужно получить спектрограммы этих обучающих аудиофайлов (.wav). Как получить эти спектрограммы в python?


person kks    schedule 23.12.2017    source источник
comment
См. этот модуль Python: Распознавание речи   -  person jdoe    schedule 23.12.2017
comment
@kks, помог ли тебе мой ответ?   -  person Oleg Melnikov    schedule 23.12.2017
comment
Да ... получил несколько хороших ресурсов из вашего ответа. @Олег Мекников   -  person kks    schedule 26.12.2017


Ответы (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.

person Oleg Melnikov    schedule 23.12.2017
comment
Можете ли вы помочь, что возвращается по частотам, временам и спецификациям ?? Я видел документацию, но все еще запутался. @Олег Мельников - person kks; 24.12.2017
comment
@kks: см. дополнительное объяснение вывода :) Надеюсь, это поможет. - person Oleg Melnikov; 24.12.2017
comment
Большое спасибо! Просто добавим небольшое замечание: если загруженный файл .wav является стереофоническим, вы увидите, что перекрытие должно быть меньше, чем ошибка nperseg, что является отвлекающим маневром. Вы можете получить аудиосигнал первого канала, выполнив 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()  
person sarannns    schedule 23.12.2017

Вы можете использовать пакеты NumPy, SciPy и matplotlib для создания спектрограмм. Смотрите этот следующий пост. http://www.frank-zalkow.de/en/code-snippets/create-audio-spectrograms-with-python.html

person Lasith Niroshan    schedule 23.12.2017