一,實例化和配置git
AudioProcessing* apm = AudioProcessing::Create(0); //這裏的0指的是channelID,只是一個標註那個通道的表示github
apm->level_estimator()->Enable(true);//啓用 重試次數估計 組件
web
apm->echo_cancellation()->Enable(true);//啓用回聲消除組件app
apm->echo_cancellation()->enable_metrics(true);//
測試
apm->echo_cancellation()->enable_drift_compensation(true);//啓用時鐘補償模塊(聲音捕捉設備的時鐘頻率和google
播放設備的時鐘頻率可能不同)
spa
apm->gain_control()->Enable(true);//啓用增益控制組件,client必須啓用哦!
.net
apm->high_pass_filter()->Enable(true);//高經過濾器組件,過濾DC偏移和低頻噪音,client必須啓用
code
apm->noise_suppression()->Enable(true);//噪聲抑制組件,client必須啓用
blog
apm->voice_detection()->Enable(true);//啓用語音檢測組件,檢測是否有說話聲
apm->voice_detection()->set_likelihood( VoiceDetection::kModerateLikelihood);//設置語音檢測的閥值,閥值越大,
語音越不容易被忽略,一樣一些噪音可能被當成語音。
apm->Initialize();//保留全部用戶設置的狀況下從新初始化apm的內部狀態,用於開始處理一個新的音頻流。第一個流
建立以後不必定須要調用此方法。
二,工做流程
AudioProcessing也是事件驅動的,事件分爲初始化事件、捕捉音頻事件、渲染音頻事件。
初始化事件:
apm->set_sample_rate_hz(sample_rate_hz);//設置本地和遠程音頻流的採樣率。
apm->echo_cancellation()->set_device_sample_rate_hz();//設置音頻設備的採樣率,
咱們假定音頻採集和播放設備採用一樣的採樣率。(drift組件啓用時必須調用)。
apm->set_num_channels(num_capture_input_channels, num_capture_output_channels);//設置
本地和遠程音頻流的通道數。
播放事件:
apm->AnalyzeReverseStream(&far_frame));//分析遠端音頻流的10ms的frame數據,這些數據爲回聲抑制提供參考。
(啓用回聲抑制的時候須要調用)
捕捉事件:
apm->gain_control()->set_stream_analog_level(capture_level);
apm->set_stream_delay_ms(delay_ms + extra_delay_ms);//設置本地和遠端音頻流之間的延遲,單位毫秒。
這個延遲是遠端音頻流和本地音頻流之間的時差,計算方法爲:
delay = (t_render - t_analyze) + (t_process - t_capture);在調用前記錄便可。
其中
t_analyze是遠端音頻流交給AnalyzeReverseStream()方法的時間;
t_render是與剛纔一樣的遠端音頻frame的播放時間;
elesos注:render-aanalyze感受就是遠端音頻處理的時間,從其開始處理到最終渲染的這一段時間。而
process-capture感受就是近端,從採集到開始處理的這段時間。時差就是雙方的和。
t_capture是本地音頻frame捕捉的時間;
t_process是一樣的本地音頻frame被交給ProcessStream()方法的時間。
apm->echo_cancellation()->set_stream_drift_samples(drift_samples);//
設置音頻設備捕捉和播放的採樣率的差值。(drift組件啓用時必須調用)
int err = apm->ProcessStream(&near_frame);//處理音頻流,包括各個環節的處理。(如增益調節、回聲消除、噪聲
抑制、語音檢測、高經過率等,沒有解碼哦!是針對pcm數據作處理的)
capture_level = apm->gain_control()->stream_analog_level();//模擬模式下,必須在ProcessStream以後調用此方法,
獲取新的音頻HAL的推薦模擬值。
stream_has_voice =apm->voice_detection()->stream_has_voice();//檢測是否有語音,必須在ProcessStream以後調用
此方法,elesos注:可參考Audio_processing.h
ns_speech_prob = apm->noise_suppression()->speech_probability();//返回內部計算出的當前frame的人聲優先機率。
三,釋放和資源回收
AudioProcessing::Destroy(apm);
apm = NULL;
四,webrtc中自帶例子測試
webrtc工程項目組有個audioproc項目,是測試APM模塊的,不須要指定測試文件和參數,詳情能夠看裏面的--hlep選項。
elesos注:https://code.google.com/p/webrtc-audioproc/ 移到
https://github.com/DoubangoTelecom/webrtc-audioproc (WebRTC AudioProc (AEC, VAD, NS...))
參考: