我正在使用NAudio尝试将来自第三方文本语音转换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)”选项,则会产生声音好得多(尤其要注意的是,在某些提示中,它不会以“ access”和“ password”之类的词来剪裁/粉碎S)。
我已经确认这两个音频文件(使用NAudio转换的音频文件和使用g711.org生成的音频文件)在我们的电话系统中都能正常播放。
是否想知道有NAudio经验的人对我可以在NAudio中做些什么来获得转换后的文件的输出质量以匹配我从g711.org网站获得的输出的任何建议?
答案 0 :(得分:1)
我自己弄清楚了,问题是我需要使用其他选项之一来重新采样音频,而不是仅使用WaveFormatConversionStream。通过MediaFoundationResampler重新采样后,音频质量比通过WaveFormatConversionStream在ACM上获得的音频质量有了很大改善。
这个doc帮助我实现了这一目标...