使用NAudio将WAV流转换为Opus

时间:2017-02-15 00:59:34

标签: c# .net audio wav opus

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

我正在使用以下库:

我正在使用此功能合成语音:

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 个答案:

答案 0 :(得分:3)

这很可能是输入长度。 1.请记住,输入长度是每个通道16位采样的计数,其中代码只传递字节数。除以(2 * numChannels) 2.输入长度必须是有效的Opus帧大小(2.5,5,10,20,60ms,默认值为20)。因此,您需要反复传递固定数量的样本以获得输入的长度。在16khz mono的情况下,帧大小为320。