私は、エンコードとデコードにspeex(基本的にC#で移植されたJspeex)を使用して、Silverlightボイスチャットアプリケーションに取り組んでいます。以下を実装したい:
- 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のエンコードとデコードのクラスを微調整して、運がなくても最適な音声品質を取得しています。そして、私がアクセスして実装できるAECをspeexクラスで検索してきましたが、ここでも運がありませんが、speexのドキュメントにはC ++でのAECについて記載されていますが、C#での実装方法は明確ではありません。
私はC#開発に不慣れです。可能であれば、このAECを実装して音声品質を向上させるのに役立つ方向を教えてください。どんな指導にも感謝します。
ありがとう!