我一直在研究 Silverlight 语音聊天应用程序,使用 speex(基本上是 C# 移植的 Jspeex)进行编码和解码。我想实现以下内容:
- 在 C# 中使用 Speex 进行声学回声消除:我一直在环顾四周,还没有找到可行的解决方案,或者真的不确定如何做到这一点。
- 声音的质量非常嘈杂,每 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 并提高语音质量的方向。我很感激任何指导。
谢谢!