在音频分析中绘制频谱图

时间:2017-12-23 16:16:04

标签: python audio tensorflow neural-network spectrogram

我正在使用神经网络进行语音识别。为此,我需要获取那些训练音频文件(.wav)的频谱图。如何在python中获取这些频谱图?

3 个答案:

答案 0 :(得分:8)

有很多方法可以做到这一点。最简单的方法是查看Kernels关于Kaggle竞赛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 repoTensorflow example on audio recognition上的train.py和models.py代码。

Here is another thread解释并提供了在Python中构建光谱图的代码。

答案 1 :(得分:3)

Scipy就是为了这个目的。

import matplotlib.pyplot as plt
plt.pcolormesh(segment_time, sample_freq, spec_data )
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()  

使用matplot库可视化频谱图

{{1}}

答案 2 :(得分:0)

您可以使用 NumPy SciPy matplotlib 包制作光谱图。见以下帖子。 http://www.frank-zalkow.de/en/code-snippets/create-audio-spectrograms-with-python.html