Python wave 音频采样率

Python wave audio sample rate

我正在尝试将 javascript 前端、flask 服务器和微软的音频识别认知服务结合在一起。

Microsoft 的服务器要求音频数据具有特定参数,特别是要求 16000 framerate\frequency。

但是从 windows 上的浏览​​器我只能得到 41000。 现在,我在 41000 获取音频,然后像这样保存它:

audioData = message['audio']     
af = wave.open('audioData.wav', 'w')
af.setnchannels(1)
af.setparams((1, 2, 16000, 0, 'NONE', 'Uncompressed'))
af.writeframes(audioData)
af.close()

音频以 dict\json 数据的形式通过 socketio 接收。如果我不做任何更改直接保存它,听起来还不错。但是如果我把采样率改成16000,显然声音失真而且很慢,所以几秒钟的音频拉长到一分钟左右。

如何正确更改音频速率而不影响它在 Python 3.4 中的声音?

谢谢。

编辑: 这是工作代码:

with open("audioData_original.wav", 'wb') as of:
of.write(message['audio'])
audioFile = wave.open("audioData_original.wav", 'r')
n_frames = audioFile.getnframes()
audioData = audioFile.readframes(n_frames)
originalRate = audioFile.getframerate()
af = wave.open('audioData.wav', 'w')
af.setnchannels(1)
af.setparams((1, 2, 16000, 0, 'NONE', 'Uncompressed'))
converted = audioop.ratecv(audioData, 2, 1, originalRate, 16000, None)
af.writeframes(converted[0])
af.close()
audioFile.close()

这里的缺点是,即使我通过 json 从 mediaRecorder Api 获取音频数据,所以我将它保存在内存中...然后我将它写在磁盘上,然后打开它再次能够使用 wave 的函数获得采样率。但是,如果不将其写入磁盘,我该怎么做呢?谢谢。如果我必须为此提出一个新问题,当然可以。

编辑2: 哦,好的,回答我自己的后续问题 - io.BytesIO 成功了。

看看 audioop.ratecv(它在标准库中) 让它对样本的原始帧进行操作(在您的例子中,audioData)。 这是一个简单的算法,所以预计会有一些音质损失,但我想对于语音来说是微不足道的。