1

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

微软的服务器要求音频数据具有特定的参数,特别是要求 16000 帧率\频率。

但是从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()

音频通过 socketio 以 dict\json 数据的形式接收。如果我直接保存而不更改任何内容,那听起来不错。但是如果我将采样率更改为 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 的函数获取采样率。但是如果不将其写入磁盘,我该怎么做呢?谢谢。如果我必须为此提出一个新问题,当然可以。

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

4

1 回答 1

2

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

于 2016-10-21T21:43:08.883 回答