我正在使用神经网络进行语音识别。为此,我需要获取那些训练音频文件(.wav)的声谱图。如何在python中获取这些频谱图?
最佳答案
有很多方法可以做到这一点。最简单的方法是检查Kaggle竞赛Kernels上TensorFlow Speech Recognition Challenge中提出的方法(仅按投票数排序)。 This one特别清晰和简单,并包含以下功能。输入是从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 manual中定义的,但频谱图是通过单调函数(Log())重新缩放的,该函数将较大的值压制得比较小的值要小得多,而较大的值仍要比较小的值大。这样,规范中没有极值将主导计算。或者,可以将值限制在某个分位数上,但首选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.
或者,您可以从github repo检查Tensorflow example on audio recognition上的train.py和models.py代码。
Here is another thread解释并提供有关在Python中构建频谱图的代码。