使用Speex中的AEC模組,提高聲音品質

來源:互聯網
上載者:User

在Speex(www.speex.org)的最新版本中,開始整合了迴音消除的模組,而迴音消除一直是Voip之中亟待解決的主要問題。 
很多朋友和我說speex的aec模組的效能並不好,我們先來看一下speex的aec的api調用方式。 

/* 
*建立AEC對象 
*/ 
SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length); 

frame_size 的取值最好是一個編碼的frame大小, 在低頻寬條件下,一般延遲20ms,而大小為160 
filter_length,最好是房間內反射時間的1/3 
如: 一個房間的反射時延為300ms 
    那麼這個filter_length就最好是100ms(這個長度又被稱為tail length). 

而其中filter_length的設定是一個關鍵。 

/* 
*執行AEC 
*/ 
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue); 

其中: 
input_frame: 就是被音效卡捕捉到的聲音 
echo_frame: 是由擴音器播放出的聲音,這個聲音是需要從 input_frame中抵消的聲音. 

output_frame 是處理完以後輸出的聲音 

residue是一個選擇性參數,如果不使用可以將之設定為NULL, 也可以通過preprocessor 來控制 

問題的關鍵是 處理input和echo 之間的關係, 
也就是說在捕捉到的訊號和播放的訊號之間的延遲必須足夠的小,才可以提高效率. 

writetosndcard(echo_frame, frame_size) 
readfromsndcard(input_frame, frame_size) 
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue) 
如果你想要儘可能的減小訊號中的迴音,那麼可以將residue這個參數設定為噪音參數. 

我相信在大多數情況下,都是因為聲音捕捉和聲音播放之間的同步問題沒有處理好,導致的音頻品質下降。 

/* 
*銷毀和複位 
*/ 
speex_echo_state_destroy(echo_state); 

speex_echo_state_reset(echo_state); 
不再複述了! 

說明: 
據說在Speex的最新的1.2beta版本上,Speex提供了可選擇的,簡化的API,來提高echo執行過程中的同步問題。 
這些,我會在以後的文章中在討論。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.