当前位置:   article > 正文

Python语音信号处理_现代语音信号处理(python版)" "程序代码及实验说明

现代语音信号处理(python版)" "程序代码及实验说明

个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-44.html

 语言信息是多种信息的混合载体 ,其中包括内容信息、说话人信息和情感信息。 本文介绍了一些语音的基本知识,和使用Python进行处理。

 

时域特征

    使用wave模块读取wav音频文件,画图时域图像,代码如下。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import os
  4. import wave
  5. path='D://NLP//dataset//语音情感//test.wav'
  6. f=wave.open(path,'rb')
  7. params=f.getparams()
  8. #通道数、采样字节数、采样率、采样帧数
  9. nchannels,sampwidth,framerate,nframes=params[:4]
  10. voiceStrData=f.readframes(nframes)
  11. waveData = np.fromstring(voiceStrData,dtype=np.short)#将原始字符数据转换为整数
  12. #音频数据归一化
  13. waveData = waveData * 1.0/max(abs(waveData))
  14. #将音频信号规整乘每行一路通道信号的格式,即该矩阵一行为一个通道的采样点,共nchannels行
  15. waveData = np.reshape(waveData,[nframes,nchannels]).T # .T 表示转置
  16. f.close()
  17. time=np.arange(0,nframes)*(1.0/framerate)
  18. plt.plot(time,waveData[0,:],c='b')
  19. plt.xlabel('time')
  20. plt.ylabel('am')
  21. plt.show()

代码执行结果:

index.png

 

频域特征

    numpy模块自带了快速傅里叶变换的函数,对上面的音频数据进行傅里叶变换,代码如下:

  1. fftdata=np.fft.fft(waveData[0,:])
  2. fftdata=abs(fftdata)
  3. hz_axis=np.arange(0,len(fftdata))
  4. plt.figure()
  5. plt.plot(hz_axis,fftdata,c='b')
  6. plt.xlabel('hz')
  7. plt.ylabel('am')
  8. plt.show()

程序运行结果:

fft.png

 

语谱图

    使用matplotlib可以直接获得语谱图,代码如下:

  1. #帧长20~30ms
  2. framelength = 0.025
  3. #每帧点数 N = t*fs,通常情况下值为256512,要与NFFT相等
  4. #而NFFT最好取2的整数次方,即framesize最好取的整数次方
  5. framesize = framelength*framerate
  6. #找到与当前framesize最接近的2的正整数次方
  7. nfftdict = {}
  8. lists = [32,64,128,256,512,1024]
  9. for i in lists:
  10. nfftdict[i] = abs(framesize - i)
  11. sortlist = sorted(nfftdict.items(), key=lambda x: x[1])#按与当前framesize差值升序排列
  12. framesize = int(sortlist[0][0])#取最接近当前framesize的那个2的正整数次方值为新的framesize
  13. NFFT = framesize #NFFT必须与时域的点数framsize相等,即不补零的FFT
  14. overlapSize = 1.0/3 * framesize #重叠部分采样点数overlapSize约为每帧点数的1/3~1/2
  15. overlapSize = int(round(overlapSize))#取整
  16. spectrum,freqs,ts,fig = plt.specgram(waveData[0],NFFT = NFFT,Fs =framerate,window=np.hanning(M = framesize),noverlap=overlapSize,mode='default',scale_by_freq=True,sides='default',scale='dB',xextent=None)#绘制频谱图
  17. plt.ylabel('Frequency')
  18. plt.xlabel('Time(s)')
  19. plt.title('Spectrogram')

程序运行结果:

sp.png

 

 

梅尔频率倒谱系数

    提取MFCCs有两种方式,通过librosa模块或者python_speech_features模块,代码如下。

    1.通过python_speech_features提取mfcc

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.io import wavfile
  4. from python_speech_features import mfcc, logfbank
  5. # 读取输入音频文件
  6. sampling_freq, audio = wavfile.read(path)
  7. # 提取MFCC和滤波器组特征
  8. mfcc_features = mfcc(audio, sampling_freq)
  9. filterbank_features = logfbank(audio, sampling_freq)
  10. print('\nMFCC:\n窗口数 =', mfcc_features.shape[0])
  11. print('每个特征的长度 =', mfcc_features.shape[1])
  12. print('\nFilter bank:\n窗口数 =', filterbank_features.shape[0])
  13. print('每个特征的长度 =', filterbank_features.shape[1])
  14. # 画出特征图,将MFCC可视化。转置矩阵,使得时域是水平的
  15. mfcc_features = mfcc_features.T
  16. plt.matshow(mfcc_features)
  17. plt.title('MFCC')
  18. # 将滤波器组特征可视化。转置矩阵,使得时域是水平的
  19. filterbank_features = filterbank_features.T
  20. plt.matshow(filterbank_features)
  21. plt.title('Filter bank')
  22. plt.show()

运行结果:

mfcc1.png

 

    2.通过librosa提取mfcc

    需要说明的是,librosa.load()函数是会改变声音的采样频率的。如果 sr 缺省,librosa.load()会默认以22050的采样率读取音频文件,高于该采样率的音频文件会被下采样,低于该采样率的文件会被上采样。因此,如果希望以原始采样率读取音频文件,sr 应当设为 None。该函数返回的参数y是经过归一化的声音数据

  1. import librosa
  2. y,sr = librosa.load(path,sr=None)
  3. mfcc_data = librosa.feature.mfcc( y,sr,n_mfcc=13)
  4. plt.matshow(mfcc_data)
  5. plt.title('MFCC')

运行结果:

mfcc2.png

    从上面的代码可以看到,这两个库提取出的mfcc是不一样的。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号