python做语音信号处理

举报
莫言2021 发表于 2021/10/21 17:02:38 2021/10/21
【摘要】 音频信号的读写、播放及录音标准的python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudiio(http://people.csail.mit.edu/hubert/pyaudio)。最后我们还将使用pyMedia(http://pymedia.org)进行Mp3的解码和播放。  音频信号是模拟信号,我们需要将其保存为数字信号,才能对语音进行算法操作,WAV是Micros...

音频信号的读写、播放及录音
标准的python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudiio(http://people.csail.mit.edu/hubert/pyaudio)。最后我们还将使用pyMedia(http://pymedia.org)进行Mp3的解码和播放。

  音频信号是模拟信号,我们需要将其保存为数字信号,才能对语音进行算法操作,WAV是Microsoft开发的一种声音文件格式,通常被用来保存未压缩的声音数据。

语音信号有三个重要的参数:声道数、取样频率和量化位数。

声道数:可以是单声道或者是双声道
采样频率:一秒内对声音信号的采集次数,44100Hz采样频率意味着每秒钟信号被分解成44100份。换句话说,每隔$\frac{1}{44100}Hz$就会存储一次,如果采样率高,那么媒体播放音频时会感觉信号是连续的。
量化位数:用多少bit表达一次采样所采集的数据,通常有8bit、16bit、24bit和32bit等几种
例如CD中所储存的声音信号是双声道、44.1kHz、16bit。

如果你需要自己录制和编辑声音文件,推荐使用Audacity(http://audacity.sourceforge.net),它是一款开源的、跨平台、多声道的录音编辑软件。在我的工作中经常使用Audacity进行声音信号的录制,然后再输出成WAV文件供Python程序处理。

wave-读wav文件
wava模块为WAV声音格式提供了方面的界面,他不支持压缩/解压,但支持单声道/立体声。

Wave_read = wave.open(file,mode="rb")

file通常为是字符串格式的文件名或者文件路径

    例如voice.wav文件的路径C:\Users\Never\Desktop\code for the speech

  则file有以下三种填写格式:

    r"C:\Users\Never\Desktop\code for the speech\voice.wav"

    "C:/Users/Never/Desktop/code for the speech/voice.wav"

    "C:\\Users\\Never\\Desktop\\code for the speech\\voice.wav"

  三者等价,右划线\为转意字符,如果要表达\则需要\\,引号前面加r表示原始字符串。

mode是缺省参数,可以不填,也可以是"rb":只读模式;"wb":只写模式。注意不支持读/写格式。

该open()函数可用于with声明中。当with块完成时,Wave_read.close()或Wave_write.close()方法被调用。Wave_read是读取的文件流。

 

 

 

Wave_read.getparams()    

一次性返回所有的音频参数,返回的是一个元组(声道数,量化位数(byte单位),采样频率,采样点数,压缩类型,压缩类型的描述)。(nchannels, sampwidth, framerate, nframes, comptype, compname)wave模块只支持非压缩的数据,因此可以忽略最后两个信息。

str_data = Wave_read.readframes(nframes)  

指定需要读取的长度(以取样点为单位),返回的是字符串类型的数据

wave_data = np.fromstring(str_data, dtype=np.short)

将读取的字符串数据转换为一维short类型的数组。

通过np.fromstring函数将字符串转换为数组,通过其参数dtype指定转换后的数据格式(由于我们的声音格式是以两个字节表示一个取样值,因此采用short数据类型转换)

现在的wave_data是一个一维的short类型的数组,但是因为我们的声音文件是双声道的,因此它由左右两个声道的取样交替构成:LR

wave_data.shape = (-1, 2)  # -1的意思就是没有指定,根据另一个维度的数量进行分割,得到n行2列的数组。

getnchannels, getsampwidth, getframerate, getnframes等方法可以单独返回WAV文件的特定的信息。

Wave_read.close()  关闭文件流wave

Wave_read.getnchannels()  返回音频通道的数量(1对于单声道,2对于立体声)。

Wave_read.getsampwidth()  以字节为单位返回样本宽度

Wave_read.getframerate()  返回采样频率。

Wave_read.getnframes()   返回音频帧数。

Wave_read.rewind()      将文件指针倒回到音频流的开头。

Wave_read.tell()      返回当前文件指针位置。 
————————————————
版权声明:本文为CSDN博主「凌逆战」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34218078/article/details/84967662

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。