如何将 Linear16 PCM wav 转换为与 g711.org 相同质量的 G711 8-bit 8-khz MULAW wav?

Posted

技术标签:

【中文标题】如何将 Linear16 PCM wav 转换为与 g711.org 相同质量的 G711 8-bit 8-khz MULAW wav?【英文标题】:How to convert Linear16 PCM wav to G711 8-bit 8-khz MULAW wav with same quality as g711.org? 【发布时间】:2019-01-04 14:58:27 【问题描述】:

我正在使用 NAudio 尝试将来自第 3 方 Text-To-Speech API 的 Linear16 PCM wav 文件转换为可用作电话提示的 G711 8 位 8-khz MULAW。使用库作者文档和一些堆栈溢出帖子中的技术,特别是按照建议进行两步转换。

dynamic foo = JsonConvert.DeserializeObject<dynamic>(result);

byte[] decoded = Convert.FromBase64String(foo.audioContent.ToString());

WaveFormat newFormat = new WaveFormat(8000, 16, 1);
WaveFormat mulaw = WaveFormat.CreateMuLawFormat(8000, 1);

using (MemoryStream mem = new MemoryStream(decoded))
using (WaveFileReader reader = new WaveFileReader(mem))
using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
using (var convStream2 = new WaveFormatConversionStream(mulaw, conversionStream))

     WaveFileWriter.CreateWaveFile("voiceprompt_downsample_8bit-8khz.wav", convStream2);
     File.WriteAllBytes("voiceprompt_raw.wav", decoded);

不幸的是,转换后的文件的音频质量相当下降(在一定程度上这是可以预料的)。但是,如果我采用与上面代码完全相同的源文件并将其提交到g711.org 的转换器并选择“BroadWorks Classic (8Khz, Mono, u-law)”选项,则生成的音频听起来要好得多(特别注意,在我们的一些提示中,它不会用“访问”和“密码”之类的词来剪裁/粉碎 S)。

我已确认两个音频文件(我使用 NAudio 转换的文件和使用 g711.org 生成的文件)都可以通过我们的电话系统正常播放。

想知道是否有任何具有 NAudio 经验的人对我可以在 NAudio 中做哪些不同的事情以使转换后的文件的输出质量与我从 g711.org 网站得到的质量相匹配有什么建议?

【问题讨论】:

【参考方案1】:

自己想通​​了,问题是我需要使用其他选项之一来重新采样音频,而不是仅使用 WaveFormatConversionStream。使用 MediaFoundationResampler 重新采样后,与我通过 WaveFormatConversionStream 使用 ACM 获得的相比,音频质量有了很大改善。

doc 帮助我实现了这一目标……

【讨论】:

是的,ACM 重采样器可能会引入混叠

以上是关于如何将 Linear16 PCM wav 转换为与 g711.org 相同质量的 G711 8-bit 8-khz MULAW wav?的主要内容,如果未能解决你的问题,请参考以下文章

将原始PCM数据转换为RIFF WAV

wav格式和pcm格式怎么相互转换?

如何将wav音频文件格式为pcm转化为ima adpcm格式

如何使用 node.js 将 .pcm 文件转换为 wav 文件?

使用 NAudio 将 WAV 文件转换为 2 个单独的 PCM 文件

怎么将8位的WAV声音文件转换为16位?