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

标签 naudio naudio-framework

我正在使用 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 处的转换器。并选择“BroadWorks Classic(8Khz、Mono、u-law)”选项,生成的音频听起来更好(特别注意,它不会在我们的一些提示中剪切/压缩“访问”和“密码”等单词中的 S )。

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

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

最佳答案

我自己解决了这个问题,问题是我需要使用其他选项之一来重新采样音频,而不是仅使用 WaveFormatConversionStream。使用 MediaFoundationResampler 重新采样后,音频质量比我通过 WaveFormatConversionStream 使用 ACM 获得的质量有了很大提高。

这个doc帮助我认识到这一点......

关于naudio - 如何将 Linear16 PCM wav 转换为与 g711.org 质量相同的 G711 8 位 8-khz MULAW wav?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54041389/

相关文章:

c# - 如何将 NAudio WaveStream 写入内存流?

c# - Naudio-library C#支持播放哪些文件类型

c# - 使用 NAudio 压缩音频 WAV - 调用 acmStreamOpen 时出现 AcmNotPossible 错误

c# - 音频采样率计时

c# - WasapiLoopbackCapture 内部音频识别在没有音频时会出现乱码和文本

c# - 如何从音频文件中获取样本的 float 组

c# - 如何区分耳机与PC中的集成音频

c# - 使用 C# 以编程方式切换耳机中的立体声音频 channel (左 <> 右)