语音识别中常用的音频特征包括fbank与mfcc。
获得语音信号的fbank特征的一般步骤是:预加重、分帧、加窗、短时傅里叶变换(STFT)、mel滤波、去均值等。对fbank做离散余弦变换(DCT)即可获得mfcc特征。
下面通过代码进行分析说明。
- 1、导包
# 导包
import numpy as np
from scipy.io import wavfile
from scipy.fftpack import dct
import matplotlib.pyplot as plt
- 2、绘图函数
绘制时域图
def plot_time(sig, fs):
time = np.arange(0, len(sig)) * (1.0 / fs)
plt.figure(figsize=(20, 5))
plt.plot(time, sig)
plt.xlabel('Time(s)')
plt.ylabel('Amplitude')
plt.grid()
绘制频域图
def plot_freq(sig, sample_rate, nfft=512):
xf = np.fft.rfft(sig, nfft) / nfft
freqs = np.linspace(0, sample_rate/2, nfft/2 + 1)
xfp = 20 * np.log10(np.clip(np.abs(xf), 1e-20, 1e100))
plt.figure(figsize=(20, 5))
plt.plot(freqs, xfp)
plt.xlabel('Freq(hz)')
plt.ylabel('dB')
plt.grid()
绘制二维数组
def plot_spectrogram(spec, notylabele):
fig = plt.figure(figsize=(20, 5))
heatmap = plt.pcolor(spec)
fig.colorbar(mappable=heatmap)
plt.xlabel('Time(s)')
plt.ylabel(ylabel)
plt.tight_layout()
plt.show()
- 3、数据读取
音频信号链接:OSR_us_000_0010_8k.wav
wav_file = 'OSR_us_000_0010_8k.wav'
fs, sig = wavfile.read(wav_file)
# 保留前3.5s数据
sig = sig[0: int(3.5 * fs)]
plot_time(sig, fs)
![f0f644c543565fea181497e565e836e7.png](https://i-blog.csdnimg.cn/blog_migrate/1f7461aa29665b93abd4a0545cd3a301.jpeg)
plot_freq(sig, fs)
![e307a492bc55b29a2b80505fb8d85dc2.png](https://i-blog.csdnimg.cn/blog_migrate/b19ab5faafbf0f494e554667f069e87a.jpeg)
- 4、预加重
pre_emphasis = 0.97
sig = np.append(sig[0], sig[1:] - pre_emphasis * sig[:-1])
plot_time(sig, fs)