一、概述介紹
在WebRTC中,存在兩種擴展算法:PreemptiveExpand和Expand。盡管這兩種算法的目標都是擴展音頻信號,但它們的實現原理和應用場景卻有所不同。
- PreemptiveExpand(預防性擴張)
主動擴展策略,旨在防止即將出現的音頻數據短缺。當系統檢測到可播放的音頻數據即將耗盡,會根據當前的語音信號狀況,適當地插入舒適噪聲或復制基音周期,以減緩數據不足的趨勢。這種方法的關鍵在于:
平滑過渡:通過在音頻流中插入額外的噪聲或信號,PreemptiveExpand能夠確保播放的連貫性,不會引起聽覺上的不適。
預防為主:目前還有數據可播,不會強制補充破壞音質的數據,只是根據音頻數據的實際情況,適當的填充舒適噪音或周期基因。
- 2. Expand(擴展)
與PreemptiveExpand不同,Expand是在系統已經沒有可播放音頻的情況下進行的補償措施。這種擴展算法主要用于處理丟包或音頻數據丟失的情況,確保音頻流的平滑過渡。其特點包括:
丟包補償:當音頻數據完全耗盡時,Expand通過生成合成音頻來填補空白,使得音頻播放不會突然中斷。
合成信號:該算法利用已有的信號特征(如有聲和無聲部分)來合成新的音頻信號,以保持音頻流的連貫性。
二、擴張實現
當網絡傳輸中出現音頻包丟失時,直接播放會產生卡頓。Expand在剛剛沒有數據可播的起始階段,在Expand::AnalyzeSignal函數中會調取之前播放的最后一幀數據,提取的播放前的最后一幀數據的音頻特征(周期性、頻譜、能量等),生成與原始音頻相似的臨時片段,填補丟包造成的時間缺口,讓聽眾感覺不到卡頓。
后續在持續沒有數據送來的情況下,通過混合、衰減、加噪聲等優化,盡量確保生成的填補音頻自然流暢,讓聽眾無法察覺丟包的存在。
step1:準備與初始化
首次擴張:調用 AnalyzeSignal 提取原始音頻的關鍵特征(基音周期、LPC 參數、混合比例等),存儲在 channel_parameters_ 中;
非首次擴張:直接復用已提取的特征,僅生成新的隨機噪聲向量(用于清音生成)。
step2:生成濁音部分(復制基因周期片段)
濁音的強周期性是生成的關鍵,若原始音頻中基音周期內的波形高度相似,則可通過復制周期片段 + 交叉淡入淡出生成新的濁音:
1)選擇擴張向量
從 AnalyzeSignal 提取的 expand_vector0 和 expand_vector1(原始音頻中兩個高相似性的周期片段)中,根據當前滯后(current_lag,即基音周期長度)選擇片段:
current_lag_index_=0:直接使用 expand_vector0;
current_lag_index_=1:3/4 expand_vector0 + 1/4 expand_vector1;
current_lag_index_=2:1/2 expand_vector0 + 1/2 expand_vector1;
混合不同比例是為了避免單純復制導致的 “機械感”,增加自然度。
2)重疊拼接(消除拼接雜音)
生成的新片段與歷史音頻的重疊部分(overlap_length_)采用 “交叉淡入淡出” 處理:
歷史音頻的重疊部分音量逐漸減小(muting_window);
新生成片段的重疊部分音量逐漸增大(unmuting_window);
兩者疊加后,拼接處音量平滑過渡,無 “爆音” 或 “斷裂感”。
step3:生成清音部分(濾波噪聲模擬頻譜)
清音無周期性,無法通過復制生成,需通過LPC 濾波隨機噪聲模擬原始音頻的頻譜特征:
1)生成隨機噪聲
通過 GenerateRandomVector 生成白噪聲(random_vector),作為清音的 “原材料”。
2)LPC 濾波塑造頻譜
用 AnalyzeSignal 提取的 LPC 參數(ar_filter)對隨機噪聲濾波:
LPC 參數模擬了原始音頻的聲道頻譜響應;
濾波后,白噪聲的頻譜被重塑為與原始清音相似的頻譜,保證音色一致;
同時通過 ar_gain 控制能量,避免音量突變。
step4:混合濁音與清音(比例動態調整)
根據 voice_mix_factor(濁音 / 清音混合比例,由 AnalyzeSignal 計算)動態混合兩部分:
高周期性(濁音為主):voice_mix_factor 大,濁音占比高;
低周期性(清音為主):voice_mix_factor 小,清音占比高;
混合通過 “交叉淡入淡出” 實現(DspHelper::CrossFade),避免過渡突兀。
step5:音量控制與背景噪聲(避免聽覺疲勞)
靜音衰減:連續擴張時(consecutive_expands_ 增加),通過 mute_slope 逐漸降低音量(如 3 次擴張后從 1.0→0.95),避免長時間重復片段導致的聽覺疲勞;
背景噪聲補充:當音量過低或擴張次數過多時,調用
background_noise_->GenerateBackgroundNoise 添加與環境匹配的背景噪聲,避免完全靜音的 空洞感。
step6:輸出與更新狀態
生成的臨時音頻片段存入 output,同時更新連續擴張計數(consecutive_expands_)和總擴張時長,防止無限制擴張導致音質惡化(超過閾值后強制限制)。
三、算法總結
該算法的核心邏輯是基于特征的相似性生成,本質是用已知推未知:
1、先通過AnalyzeSignal提取原始音頻的特征值(周期、頻譜、能量等參數);
2、對濁音:復制周期片段并混合,利用周期性保證相似性;
3、對清音:用LPC濾波噪聲,利用頻譜特征保證相似性;
最后通過混合、衰減、加噪聲等優化,確保生成的填補音頻自然流暢,讓聽眾無法察覺丟包的存在。