[時間:2019-05] [狀態:Open]
[關鍵詞:音頻,audio,倍速,變速,變調,soundtouch,sonic]
音頻變調變速原理分析
先來一段語音處理的理論:
變速變調可分為:變速不變調和變調不變速。
語音變速不變調是指保持音調和語義保持不變,語速變快或變慢。該過程表現為語譜圖在時間軸上如手風琴般壓縮或者擴展。那也就是說,基頻值幾乎不變,對應於音調不變;整個時間過程被壓縮或者擴展,聲門周期的數目減小或者增加,即聲道運動速率發生改變,語速也隨之變化。對應於語音產生模型,激勵和系統經歷與原始發音情況幾乎相同的狀態,但持續時間相比原來或長或短。
嚴格地講,基頻和音調是兩個不同的概念,基頻是指聲帶振動的頻率,音調是指人類對基頻的主觀感知,但是兩者變化基本一致,即基頻越高,音調越高,基頻越低,音調越低,音調是由基頻決定的。因此,語音變調不變速就是指改變說話人基頻的大小,同時保持語速和語義不變,即保持短時頻譜包絡(共振峰的位置和帶寬)和時間過程基本不變。對應於語音產生模型,變調改變了激勵源;聲道模型的共振峰參數幾乎不變,保證了語義和語速不變。
綜上所述,變速改變聲道運動速率,力求保持激勵源不變;變調改變激勵源,力求保持聲道的共振峰信息不變。但是聲源和聲道不是相互獨立的,在改變聲源時,必然也會非線性的影響聲道,同樣地,改變聲道時也會或多或少的影響聲源,兩者之間相互影響,相互作用。
語音變調在變聲軟件中較常用。而語音變速在播放器中常用,比如倍速播放(快播、慢播)。本文重點關注變速。
相對於視頻基於幀的變速原理,跳幀或者插幀。音頻的變速原理並不是如此簡單,因為簡單的抽采樣點會引起聲音的不連續、噪聲或爆破音,主觀體驗較差。
所以一下簡單的音頻處理策略通常是行不通的:(以x2倍速為例)
1.播放設備實現,設置播放設備播放采樣率加倍,這樣單位時間播放的采樣點數加倍,可以實現變二倍速不變調,但聲音不連續。
2.播放前PCM重采樣為原采樣率的一半,可以實現二倍速,但是會變調。
3.丟幀,每隔一幀丟一幀,可以實現兩倍速,但是也會有刺啦刺啦的噪音,而且聲音會產生斷續,體驗十分差。
可用方案
所以為了實現較好的主觀體驗,只能采用相對復雜的語音處理策略。目前較為常用的音頻變速解決方案有兩個:soundtouch和Sonic。
ijkplayer使用的是soundtouch,EXOPlayer使用的是Sonic。
在Android上還有一種實現方式,基於AudioTrack的變速播放,代碼如下:
PlaybackParams params = audioTrack.getPlaybackParams();
//params.setSpeed(1.0f); // available
//params.setSpeed(0.5f); // available
params.setSpeed(1.5f); // not available
audioTrack.setPlaybackParams(params);
詳細用法建議參考PlaybackParams。
Sonic和Soundtouch用法類似,都是提供封裝好的庫,將原音頻的PCM數據通過接口函數處理為目標格式,比如二倍速,可能PCM采樣點就減半。
這里以Soundtouch提供的接口為例,說明下如下使用:
參數設置類接口:
- setChannels(int) 設置聲道,1 = mono單聲道, 2 = stereo立體聲
- setSampleRate(uint) 設置采樣率
- setRate(double) 指定播放速率,原始值為1.0,大快小慢
- setTempo(double) 指定節拍,原始值為1.0,大快小慢
- setRateChange(double)、setTempoChange(double) 在原速1.0基礎上,按百分比做增量,取值(-50 .. +100 %)
- setPitch(double) 指定音調值,原始值為1.0
- setPitchOctaves(double) 在原音調基礎上以八度音為單位進行調整,取值為[-1.00,+1.00]
- setPitchSemiTones(int) 在原音調基礎上以半音為單位進行調整,取值為[-12,+12]
PCM處理類接口:
- putSamples(const SAMPLETYPE *samples, uint nSamples) 輸入采樣數據
- receiveSamples(SAMPLETYPE *output, uint maxSamples) 輸出處理后的數據,需要循環執行
- flush() 沖出處理管道中的最后一組“殘留”的數據,應在最后執行
從上述接口來看,類似於常規的解碼器或者解復用器的調用邏輯。
小結
本文簡述了音頻變速變調的原理,並對目前Android平台上可用的音頻變速方案做了總結,包括Soundtouch、Sonic及AudioTrack三種方案,僅供后續參考。