今天解决了以前的一个小问题。VOIP语音抓包、解码与带宽计算 - 简书 (jianshu.com)在以前的实践中,笔者想到把G771A编码后的pcm语音再次转换为16bit的数据,然后回放语音时有很多背景噪声,当时一直没有找到答案,一直搁置没有解决。在这段时间的wave文件的操作中找到灵感,然后基于python来完成这个疑问的解答。
wav存储的一般是解码后为[-1, 1]的float数据,文件头有44个字节记录文件的采样率、长度等等信息。pcm存储的是int型整数,不含任何采样率相关信息。Python 播放 PCM 音频文件 里面有关于wave与pcm格式的详细说明。那么wav与pcm之间的转换方法如下:
wav转pcm:将文件头去掉,数据转成int型即可。
pcm转wav:Python 中内置了 wave 库给音频数据加上一个头部信息。 ffmpeg工具也可以完成。下面是基于python的格式转换函数pcm2wav,同时利用PyAudio可以 直接播放 PCM 音频。
联想到神经网络的音频处理tensorflow-io库,tensorflow-io 软件包提供了不少与音频相关的 API。音频数据准备和增强 中,AudioIOTensor 延迟加载张量返回的就是int16 类型的samples,可以通过Audio(audio_tensor.numpy(), rate=audio.rate.numpy()) 来播放。除于32768之后,将张量转换为浮点数并在计算图中显示音频片段。
那么AudioIOTensor 直接返回的就是PCM数据,除于32768之后再添加头部就是wave格式数据。
网友评论