今天开始学习洪青阳老师编写的语音识别原理与应用,把书中的内容用代码复现下,系统的进行学习
3.1预处理
(1)预加重
在这里插入图片描述这里实际上是设计了一个一阶高通滤波器

原始语音信号图“蓝天白云碧绿的大海”
在这里插入图片描述

预加重
在这里插入图片描述

(2)分帧
语音信号的短时平稳性
语音信号的短时分析
短时信号的切取
-分帧
-帧长
-帧移

语音分帧
每帧10-30ms, 帧间隔10ms
在这里插入图片描述
在这里插入图片描述

(3)加窗
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
import librosa.display
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = "D:\Desktop\语音识别原理与应用\方正粗黑宋简体.ttf",size=14)
#%% 原始音频
data, sample_rate = librosa.load('sky.wav')
print("长度 = {0} 秒".format(len(data) / sample_rate))
plt.figure(1)
plt.subplot(211)
librosa.display.waveplot(data, sample_rate)
plt.subplot(212)
N=len(data)
# 分辨率
df = sample_rate/(N-1)
# 构建频率数组
f = [df*n for n in range(0,N)]
Y = np.fft.fft(data)*2/N  #*2/N 反映了FFT变换的结果与实际信号幅值之间的关系
absY = [np.abs(x) for x in Y]      #求傅里叶变换结果的模
plt.plot(f,absY)
plt.xlabel('频率(Hz)',FontProperties = fonts)
plt.title("fft")
plt.show()
#%%1.预加重
import python_speech_features
emphasized_signal=python_speech_features.sigproc.preemphasis(data, coeff=0.95)
pre_emphasis = 0.98 #预加重系数
plt.figure(2)
plt.subplot(211)
librosa.display.waveplot(emphasized_signal, sample_rate)
plt.subplot(212)
N=len(emphasized_signal)
# 分辨率
df = sample_rate/(N-1)
# 构建频率数组
f = [df*n for n in range(0,N)]
Y = np.fft.fft(emphasized_signal)*2/N  #*2/N 反映了FFT变换的结果与实际信号幅值之间的关系
absY = [np.abs(x) for x in Y]      #求傅里叶变换结果的模
plt.plot(f,absY)
plt.xlabel('频率(Hz)',FontProperties = fonts)
plt.title("fft")
plt.show()
#%%2.分帧
def enframe(x, win, inc=None):
    nx = len(x)
    if isinstance(win, list) or isinstance(win, np.ndarray):
        nwin = len(win)
        nlen = nwin  # 帧长=窗长
    elif isinstance(win, int):
        nwin = 1
        nlen = win  # 设置为帧长
    if inc is None:
        inc = nlen
    nf = (nx - nlen + inc) // inc
    frameout = np.zeros((nf, nlen))
    indf = np.multiply(inc, np.array([i for i in range(nf)]))
    for i in range(nf):
        frameout[i, :] = x[indf[i]:indf[i] + nlen]
    if isinstance(win, list) or isinstance(win, np.ndarray):
        frameout = np.multiply(frameout, np.array(win))
    return frameout
#%%3.加窗
import numpy as np
import matplotlib.pyplot as plt
plt.subplot(3, 1, 1)
window1 = np.ones(32)
plt.title('(a)矩形窗',FontProperties = fonts)
plt.plot(window1)
plt.subplot(3, 1, 2)
window2 = np.hamming(32)
plt.title('(b)汉明窗',FontProperties = fonts)
plt.plot(window2)
plt.subplot(3, 1, 3)
window3= np.hanning(32)
plt.title('(c)汉宁窗',FontProperties = fonts)
plt.plot(window3)
plt.show()

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐