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

How to convert Linear16 PCM wav to G711 8-bit 8-khz MULAW wav with same quality as g711.org?

我正在使用 NAudio 尝试将来自第 3 方文本转语音 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 和 select 的转换器 "BroadWorks Classic (8Khz, Mono, u-law)" 选项,则生成的音频声音好多了(特别注意,在我们的一些提示中,它不是 clipping/crushing 中的 "access" 和 "password" 等词中的 S)。

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

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

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

这个 doc 帮助我实现了这一点...