音頻變速播放原理分析及實現方案


[時間: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三種方案,僅供后續參考。

參考資料

  1. 音頻倍速(變速不變調)的實現
  2. 變速變調原理與方法總結
  3. SoundTouch官網
  4. ijkplayer倍速變調問題解決方案
  5. SoundTouch實現音頻變速變調


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM