2

我一直在研究 Silverlight 语音聊天应用程序,使用 speex(基本上是 C# 移植的 Jspeex)进行编码和解码。我想实现以下内容:

  1. 在 C# 中使用 Speex 进行声学回声消除:我一直在环顾四周,还没有找到可行的解决方案,或者真的不确定如何做到这一点。
  2. 声音的质量非常嘈杂,每 30 秒就会中断一次。

以下是我迄今为止实现的代码:

/*******************************编码******************* ***************/

  JSpeexEnc encoder = new JSpeexEnc();
    public byte[] SpeexEncoding(byte[] InputBuffer)
    {
        MemoryStream msIn = new MemoryStream(InputBuffer);
        MemoryStream msOut = new MemoryStream();
        encoder.EncodeToSpeex(new RandomInputStream(msIn), new      RandomOutputStream(msOut));
        return msOut.GetBuffer();
    }

    void SendVoiceBuffer(object VoiceBuffer, EventArgs e)
    {

        byte[] PCM_Buffer = (byte[])VoiceBuffer;

        if (PCM_Buffer.Length >= 8000)
        {
            byte[] buffer = SpeexEncoding(PCM_Buffer);
            Send_Bytes(buffer);

            //this.Dispatcher.BeginInvoke(new ShowMessagedelegate(ShowBufferSize), buffer.Length.ToString());
        }
    }

/****************************解码******************** *******************/

    private void PlayReceivedBuffer(byte[] Encodedbuffer)
    {
       // if (MuteCheckBox.IsChecked == false)
            try
            {
                JSpeexDec decoder = new JSpeexDec();
                decoder.setDestFormat(JSpeexDec.FILE_FORMAT_RAW);
                decoder.setStereo(true);
                MemoryStream InStream = new MemoryStream(Encodedbuffer);
                MemoryStream OutStream = new MemoryStream();
                decoder.decode(new RandomInputStream(InStream), new RandomOutputStream(OutStream));
                PlayWave(OutStream.GetBuffer());
            }
            catch (Exception) { }

            StartReceiving();
    }

    void PlayWave(byte[] PCMBytes)
    {
        MemoryStream ms_PCM = new MemoryStream(PCMBytes,44,PCMBytes.Length-44);
        MemoryStream ms_Wave = new MemoryStream();

        _pcm.SavePcmToWav(ms_PCM, ms_Wave, 16, 8000, 1);


        WaveMediaStreamSource WaveStream = new WaveMediaStreamSource(ms_Wave);
        mediaElement1.SetSource(WaveStream);
        mediaElement1.Play();
   }

我一直在调整 speex 编码和解码类以获得最佳语音质量,但没有运气。并且一直在 speex 类中搜索我可以访问和实现的任何 AEC,这里也没有运气,但是 speex 文档提到了 C++ 中的 AEC,但不清楚如何在 C# 中实现。

我是 C# 开发的新手,请指导,如果可能的话,请指出一个可以帮助我实现这个 AEC 并提高语音质量的方向。我很感激任何指导。

谢谢!

4

0 回答 0