使用 NAudio 将 WAV 流转换为 Opus

Posted

技术标签:

【中文标题】使用 NAudio 将 WAV 流转换为 Opus【英文标题】:Converting WAV Stream to Opus using NAudio 【发布时间】:2017-07-03 12:02:34 【问题描述】:

我正在使用 .Net 的 SpeechSynthesizer 从字符串生成 WAV 流。然后我需要将该流从 WaveStream 转换为 Opus。

我正在使用以下库:

NA 音频 作品.Net:https://github.com/JohnACarruthers/Opus.NET

我正在使用这个函数合成语音:

public static Stream Speak(string text)

    SpeechSynthesizer s = new SpeechSynthesizer();
    MemoryStream stream = new MemoryStream();
    s.SetOutputToWaveStream(stream);
    s.Speak(text);
    s.SetOutputToNull();
    return stream;

为了进行转换,我使用了以下函数:

public static Stream SpeakOgg(string text)

    MemoryStream orgstream = Speak(text) as MemoryStream;
    orgstream.Seek(0, SeekOrigin.Begin);

    WaveFileReader reader = new WaveFileReader(orgstream);

    WaveFormat newFormat = new WaveFormat(16000, reader.WaveFormat.Channels);
    WaveFormatConversionStream newStream = new WaveFormatConversionStream(newFormat, reader);
    WaveStream conv = WaveFormatConversionStream.CreatePcmStream(newStream);

    byte[] bytes = new byte[conv.Length];
    conv.Position = 0;
    conv.Read(bytes, 0, (int)conv.Length);

    OpusEncoder encoder = OpusEncoder.Create(newStream.WaveFormat.SampleRate, newStream.WaveFormat.Channels, Opus.Application.Voip);
    int encodedLength = 0;
    byte[] encoded = encoder.Encode(bytes, (int)conv.Length, out encodedLength);

    MemoryStream finish = new MemoryStream();
    finish.Write(encoded, 0, encodedLength);

    return finish;

我的问题是 OpusEncoder 抛出异常说:

编码失败 - BadArg

它在函数调用“opus_encode”时被抛出。 谁能帮我跟踪问题?

编辑 1:

环顾四周,我发现抛出的异常实际上是 Opus 的 API 中的一个定义,称为:“OPUS_BAD_ARG”,文档说明:

一个或多个无效/超出范围的参数。

我仍然找不到错误的论点......

【问题讨论】:

【参考方案1】:

很可能是输入长度。 1. 请记住,输入长度是每个通道 16 位样本的计数,您的代码只是传递字节数。除以 (2 * numChannels) 2. 输入长度必须是有效的 Opus 帧大小(2.5、5、10、20、60ms,默认为 20)。因此,您需要在输入的长度内一遍又一遍地传递固定数量的样本。在 16khz 单声道的情况下,帧大小为 320。

【讨论】:

以上是关于使用 NAudio 将 WAV 流转换为 Opus的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node JS 中将原始 PCM 流转换为 Discord 机器人的 opus 或 wav 流?

即时将原始音频字节从 NAudio 转换为 wav 字节

使用 NAudio 将 g722 音频转换为 WAV

从 .opus 转换为 .wav

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

Naudio mvc 将 mp3 转换为 wav