Python语音信号处理

Python语音信号处理个人博客:http://www.chenjianqu.com/原文链接:http://www.chenjianqu.com/show-44.html语言信息是多种信息的混合载体,其中包括内容信息、说话人信息和情感信息。本文介绍了一些语音的基本知识,和使用Python进行处理。时域特征使用wave模块读取wav音频文件,画图时域图像,代码如下。import…

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

 

时域特征

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

import numpy as np
import matplotlib.pyplot as plt
import os
import wave

path='D://NLP//dataset//语音情感//test.wav'
f=wave.open(path,'rb')
params=f.getparams()
#通道数、采样字节数、采样率、采样帧数
nchannels,sampwidth,framerate,nframes=params[:4]
voiceStrData=f.readframes(nframes)
waveData = np.fromstring(voiceStrData,dtype=np.short)#将原始字符数据转换为整数
#音频数据归一化
waveData = waveData * 1.0/max(abs(waveData))
#将音频信号规整乘每行一路通道信号的格式,即该矩阵一行为一个通道的采样点,共nchannels行
waveData = np.reshape(waveData,[nframes,nchannels]).T # .T 表示转置
f.close()

time=np.arange(0,nframes)*(1.0/framerate)
plt.plot(time,waveData[0,:],c='b')
plt.xlabel('time')
plt.ylabel('am')
plt.show()

代码执行结果:

index.png

 

频域特征

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

fftdata=np.fft.fft(waveData[0,:])
fftdata=abs(fftdata)
hz_axis=np.arange(0,len(fftdata))
plt.figure()
plt.plot(hz_axis,fftdata,c='b')
plt.xlabel('hz')
plt.ylabel('am')
plt.show()

程序运行结果:

fft.png

 

语谱图

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

#帧长20~30ms
framelength = 0.025 
#每帧点数 N = t*fs,通常情况下值为256或512,要与NFFT相等
#而NFFT最好取2的整数次方,即framesize最好取的整数次方
framesize = framelength*framerate  
#找到与当前framesize最接近的2的正整数次方
nfftdict = {}
lists = [32,64,128,256,512,1024]
for i in lists:
    nfftdict[i] = abs(framesize - i)
sortlist = sorted(nfftdict.items(), key=lambda x: x[1])#按与当前framesize差值升序排列
framesize = int(sortlist[0][0])#取最接近当前framesize的那个2的正整数次方值为新的framesize
 
NFFT = framesize #NFFT必须与时域的点数framsize相等,即不补零的FFT
overlapSize = 1.0/3 * framesize #重叠部分采样点数overlapSize约为每帧点数的1/3~1/2
overlapSize = int(round(overlapSize))#取整
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)#绘制频谱图         
plt.ylabel('Frequency')
plt.xlabel('Time(s)')
plt.title('Spectrogram')

程序运行结果:

sp.png

 

 

梅尔频率倒谱系数

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

    1.通过python_speech_features提取mfcc

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank

# 读取输入音频文件
sampling_freq, audio = wavfile.read(path)
# 提取MFCC和滤波器组特征
mfcc_features = mfcc(audio, sampling_freq)
filterbank_features = logfbank(audio, sampling_freq)
print('\nMFCC:\n窗口数 =', mfcc_features.shape[0])
print('每个特征的长度 =', mfcc_features.shape[1])
print('\nFilter bank:\n窗口数 =', filterbank_features.shape[0])
print('每个特征的长度 =', filterbank_features.shape[1])
# 画出特征图,将MFCC可视化。转置矩阵,使得时域是水平的
mfcc_features = mfcc_features.T
plt.matshow(mfcc_features)
plt.title('MFCC')
# 将滤波器组特征可视化。转置矩阵,使得时域是水平的
filterbank_features = filterbank_features.T
plt.matshow(filterbank_features)
plt.title('Filter bank')
plt.show()

运行结果:

mfcc1.png

 

    2.通过librosa提取mfcc

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

import librosa 

y,sr = librosa.load(path,sr=None)
mfcc_data = librosa.feature.mfcc( y,sr,n_mfcc=13)

plt.matshow(mfcc_data)
plt.title('MFCC')

运行结果:

mfcc2.png

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141457.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PO模式之无模式

    PO模式之无模式目标1.深入理解方法封装的思想2.能够使用方法封装的思想对代码进行优化3.深入理解PO模式的思想4.熟练掌握PO模式的分层思想PO模式学习思路采用版本迭代的方式来学习,便于对不同版本的优缺点进行对比和理解。V1:不使用任何设计模式和单元测试框架V2:使用UnitTest管理用例V3:使用方法封装的思想,对代码进行优化…

    2022年5月30日
    56
  • 行为识别笔记:improved dense trajectories算法(iDT算法)

    行为识别笔记:improved dense trajectories算法(iDT算法)iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法。由INRIA的IEAR实验室于2013年发表于ICCV。目前基于深度学习的行为识别算法效果已经超过了iDT算法,但与iDT的结果做ensemble总还是能获得一些提升。所以这几年好多论文的最优效果都是“Ourmethod+iDT”的形式。此前由于项目原因,对iDT算法进行了很多研究和实验,故此处对其核心思路与

    2022年6月21日
    23
  • BeanUtils的populate方法之日期处理

    BeanUtils的populate方法之日期处理BeanUtils的populate方法之日期处理BeanUtils.populate(Obj,Map);可以使map转对象,但是如果是Obj有个日期字段而Map中这个字段为空时候就会报错,无法赋值,这个时候就需要一个日期转换器!首先写一个日期转换器packagecom.hzdl.examination.web;importorg.apache.commons.beanutils.BeanUtilsBean;importorg.apache.commons.beanutils.Conve

    2022年7月13日
    27
  • c++和java区别_科普:Java 和 C++ 有何区别[通俗易懂]

    c++和java区别_科普:Java 和 C++ 有何区别[通俗易懂]我是一名Java工程师,平时用C++的时候并不多,这篇文章讲述了两者的区别。欢迎大家关注我。Java和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于C++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!Java则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多…

    2022年7月7日
    28
  • shell 或运算_shell 变量运算

    shell 或运算_shell 变量运算shell中多重条件与或运算if[-e/dev/mmcblk0p1]&&[-e/dev/mmcblk0p2]&&[-e/dev/mmcblk0p3];then echo-e"—->partitionisexisting!" exit0fi参考:Shell脚本IF条件判断和判断条件总结…

    2022年10月9日
    3
  • goLand 2022.01激活码-激活码分享

    (goLand 2022.01激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月1日
    776

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号