前言
在使用Novatek iVoT平台開發有播放聲音功能的產品,例如視訊會議系統時,經常會出現以下情況:
由於每位發言者的說話習慣不同,有的講話較大聲,有的較小聲,有些人喜歡與麥克風距離近些,也有人習慣距離遠一點,這些差異會導致在輸出端的音量幅度有巨大的差異。
此時可透過AudioLib的協助,用軟體的方式讓iVoT的設備可以支援Automatic Gain Control(AGC)的功能,對每個人的聲音進行增益補償,以確保系統輸出端維持在一個較為恆定的音量。
AudioLib
AudioLib是一個開放原始碼的函式庫,存放在GitHub,其中包含數個聲音相關的函式庫與編解碼器等,而Acoustic Echo Cancellation也包含在內,其背後的功能實現是奠基於另外一套開源函式庫speex,但是重新包裝讓使用者更方便使用。
其中AGC相關的功能,包含在AEC的功能中,可以參考其中的AEC資料夾,裡面有所需的header files、source files與範例程式。
編譯與建置
按照說明文件”Audio codec library user guide.pdf”的說明,將特定資料夾複製至Novatek SDK的對應資料夾中,再於SDK中執行make指令,便可以編譯函式庫,並自動於編譯完成後將函式庫複製至SDK的輸出資料夾中,方便專案的整合。AGC的功能包含在AEC的lib中,因此我們需將AEC的相關檔案複製到SDK中。
範例說明
將專案中編譯完成的函式庫與測試檔案,複製到EVB上,其中AGC的部分請參考aec_test.c
中的main_AGC()
,內容說明如下:
- agc_in.pcm:為原始要播放的聲音訊號
- agc_output.pcm:為進行AGC處理後的結果
函式使用時,需先指定以下參數
- SAMPLING_RATE:聲音採樣率,範例中設為8k
- NN:每次送入的audio frame中有多少個sample
- CH:聲道數
將各參數設置到對應的成員變數中,並執行AUD_AGC_PreInit(),API會計算函式庫所需的記憶體大小並配置之。
接下來是初始化函式庫並設定AGC相關參數。
其中參數說明如下
- EN_AUD_AGC_AGC - 開啟/關閉AGC功能
- EN_AUD_AGC_DENOISE - 開啟/關閉降噪功能
- EN_AUD_AGC_NOISE_SUPPRESS - 降噪強度
- EN_AUD_AGC_AGC_LEVEL - AGC強度
- EN_AUD_AGC_AGC_MAX_GAIN - 最大GAIN值
後續便是依序讀取pcm檔案的內容並輸入至API中處理,最後將結果輸出於output檔案。
執行結果
執行aec_test
程式後,會出現選單,再輸入a便可執行AGC的測試,過程的中顯示的訊息如下:
使用分析軟體可以發現,原本波形中音量過大的部分,在經過AGC處理後被抑制較小,其中的雜訊也被denoise的功能所消除,我們可以得到一段較乾淨且更不刺耳的聲音。
評論