Python3 boto3 对 wav 的响应

Python3 boto3 response to wav

我正在使用 AWS Lex 生成对我的声音的响应 (http://boto3.readthedocs.io/en/latest/reference/services/lex-runtime.html)。

响应 audioStream 是来自 boto3 (https://botocore.readthedocs.io/en/latest/reference/response.html#botocore.response.StreamingBody) 的 StreamingBody object。

问题是如何将返回的字节数组转换为可以用sox播放的wav文件?

我试过以下方法:

audio_stream = response['audioStream'].read()
f = open('response.wav', 'wb')
f.write(audio_stream)
f.close()

但随后我收到 sox 和 aplay 的错误消息,指出格式无效(未找到 RIFF header)

我还尝试使用 wave 库和以下代码

audio_stream = response['audioStream'].read()
f = wave.open('response.wav', 'wb')
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(16000)
f.writeframesraw(audio_stream)
f.close()

但是后来我播放文件时只有白噪音,而且长度很短。

答案是在将流写入文件之前关闭流。工作代码如下所示:

    audio_stream = response['audioStream'].read()
    response['audioStream'].close()

    f = wave.open(self.response_fname, 'wb')
    f.setnchannels(2)
    f.setsampwidth(2)
    f.setframerate(16000)
    f.setnframes(0)

    f.writeframesraw(audio_stream)
    f.close()