基于线性预测的语音编码原理解析
文 | 拍樂云
早期的音頻系統都是基于聲音的模擬信號實現的,在聲音的錄制、編輯和播放過程中很容易引入各種噪聲,從而導致信號的失真。隨著信息技術的發展,數字信號處理技術在越來越多領域得到了應用,數字信號更是具備了易于存儲和遠距離傳輸、沒有累積失真、抗干擾能力強等等,信號和信號處理都往數字化發展。為了使得數字音頻可以被高效地壓縮存儲并高品質地還原,數字音頻的編碼技術就變成至關重要的一個部分了。本篇文章會介紹當今的音頻的編碼器(傳統算法非深度學習)的兩大主流陣營之一的基于線性預測的語音編碼器的原理。
?#01
音頻的編碼器分類及簡介
比較流行基于傳統算法的音頻的編碼器基本可以分成兩個大的類別:
Audio Codec(音頻編碼器): aac, mp3, ogg, celt(inside of opus) ...
Speech Codec(語音編碼器):?ilbc, isac, silk(inside of opus) ...
而這兩種編碼器類型基于完全不同的編碼原理,Audio Codec (音頻編碼器)利用了人類聽覺感知系統的特性來研究音頻編碼的方法,可以對較多音源,復雜信號進行高品質的編碼。而Speech Codec (語音編碼器)是以語音生成模型為基礎,可以對單個音源(人或者一些樂器的發音器官單元)進行更低碼率的高效編碼。
為什么已經有了可以對較多音源,復雜信號進行高品質編碼的Audio Codec,還需要研究和發展Speech Codec呢?
因為應用領域的需求完全不一樣。Audio Codec的應用領域更多和音樂有關,研究的是在保證盡量小的感知失真的前提下,對聲音進行壓縮編碼。早期mp3想要實現高品質所需要的編碼碼率還是比較高的,壓縮比并不高。而早期的數字電信系統的帶寬有限,如何可以用盡量小的帶寬實現可以還原出清晰的語音則成了Speech Codec的任務。更多在8kHz和16kHz采樣率下實現較低碼率的編碼。
?#02
語音的發聲模型和特性
既然需要設計一款專門針對語音的編碼器,那肯定要先研究一下語音的一些特性。
1. 人的發聲模型
總的來說,人的發聲模型可以分成三個部分:
由肺和氣管產生生氣源
喉和聲帶組成聲門
咽腔,口腔,鼻腔等組成聲道
人的發聲過程基本過程可以這樣描述:由肺部擠壓產生流動高壓氣體,通過氣管,經過喉嚨,喉嚨控制相關軟骨組織和肌肉組織(其中最為重要為聲道)進行復雜運動,最終聲帶在控制下進行合攏或者分離,最終產生了聲音的激勵,再經過咽腔、口腔、鼻腔共鳴最終形成聲音。
2. 語音信號的一般分類
人發出不同的聲音時,語音激勵和聲道的情況也是完全不同的,發出的聲音基本可以分類為兩種類型:
濁音:空氣流經過聲帶時,聲帶呈緊繃狀態,并產生張弛振動,即聲帶進行周期性的開啟和閉合,空氣流經過聲帶后形成一個一個脈沖,然后再經過各種聲道的共鳴作用,最后形成濁音。濁音典型波形如下圖:
非常的周期性
輕音:空氣流經過聲帶時,聲帶呈放松狀態,之后在進入聲道時,如果聲道收縮,則氣流被迫高速通過,最終產生摩擦音或者清音,如果聲道某個部位完全閉合,氣流經過這里則受到阻塞,氣壓增大,然后閉合點突然開啟則最終產生爆破音。清音典型波形如下圖:
無明顯周期性
3. 語音信號的特性和模型
視頻編碼會針對時間和空間的冗余,那語音里面是不是也有一些明顯冗余呢?至少就前面的濁音來看,有非常明顯的周期性,從時間軸上來看是應該有明顯的冗余的,那如何進行壓縮呢,另外清音是否也有類似的冗余呢?
想弄明白答案,還是要先從根本來分析,先針對人的發聲系統進行建模:
需要注意的是發生濁音和清音是由完全不同的聲音激勵,再經過聲道共鳴發出的。
濁音的語音激勵近似為:脈沖信號
清音的語音激勵近似為:白噪聲
所以整個語音產生可以描述為一個系統,叫Speech Source-Filter Model,如下圖所示:
從這個模型我們可以看出來,語音的激勵本身不是脈沖信號就是白噪聲,基本上頻譜都是比較平的,且基本不包含實際信息。而語音本身所包含的復雜信息主要是由變化的聲道的處理形成的。而語音信號本身又符合短時平穩的特性。那么語音信號編碼器的一個樸素的編碼思想就在這里形成了:?
是不是可以針對每個短時語音序列分析,由于語音的復雜性基本由聲道處理形成,嘗試對于這個短時語音信號的聲道進行建模,然后再把簡單的語音激勵信號和聲道模型進行編碼,解碼的時候就可以利用語音的激勵信號,再次通過聲道模型,從而讓這個語音再次“說”一遍。
經過對人體生理發聲的一系列基礎研究,發現聲道模型的傳遞函數是自回歸滑動平均模型ARMA(Autoregressive moving average model),而ARMA模型本身就表明存在內在的相關性,即可以從歷史預測未來。這也就從根本上確定了之前對于語音信號時間冗余的編碼的可行性和理論基礎。
總的來說,語音的產生是:激勵模型G(z)、輻射模型R(z)和聲道模型V(z)進行級聯組合形成的,也符合ARMA模型。而建模過程為了可以方便計算經過近似,大致可以用全極點模型AR(p)過程來表達:
?? ??(1)
采用這樣的一個簡單模型的主要優點在于可以用線性預測分析法對增益G和濾波器系數{??}?進行直接而高效的計算。
?#03
LPC線性預測
線性預測編碼(LPC, Linear predictive coding)是主要用于音頻信號處理與語音處理中根據線性預測模型的信息用壓縮形式表示數字語音信號譜包絡(spectral envelope)的工具。它是最有效的語音分析技術之一,也是低碼率下編碼高質量語音最有用的方法之一,它能夠提供非常精確的語音參數預測。
線性預測的基本思想是:一個語音取樣的現在值可以用若干個語音取樣過去值的線性加權組合來逼近。
語音抽樣信號s(n)和激勵信號u(n)之間的關系可以用下列簡單的差分方程來表示:
?? ??(2)
p階線性預測是根據信號過去的p個取樣值的加權和來預測信號的當前取樣值s(n)的:
?? ??(3)
預測誤差定義為:
???(4)
其系統函數為:
??? ?(5)
那么A(z)和H(z)的關系如下:
?????(6)
此時線性預測的問題就變成求出一組預測系數{??} ,但是問題是e(n)的表達公式只有s(n)序列是已知的,???和?e(n)?都是未知的,這個方程其實是過定的,也就是解不唯一,那我們只需要找到一個“好”的解即可。而我們希望預測誤差越小越好,所以預測誤差的“最小均方差”就是一個很好方案,即:
??? ??(7)
然后對于a求偏導,經過一系列的計算,最終得到了著名的Yule-Walker方程:
??? ??(8)
其中R是自相關函數,R(j-i)=E[s(n-i)s(n-j)] ? ? ?(i, j = 1, 2, 3, ..., p)
可以看到上面的矩陣,不僅是對稱矩陣,而且平行對角線的元素也都相等,這樣的矩陣稱Toeplitz矩陣。這個方程組包含p+1個未知數(p個預測系數??和一個最小均方誤差??),而??到??都是已知數,可解。
另外增益模型也可以利用激勵信號的為白噪聲的均方誤差為1且自相關函數為0的特性得出:
??? ??(9)
PS: 即使在濁音的情況下,由于一串脈沖信號在大部分時間也是非常小的,所以使用最小的預測誤差e(n)逼近u(n)和u(n)能量很小不矛盾。
至此公式(1)內的全極點模型的所有參數都解出來了。
?#04
Levinson-Durbin算法與格型濾波器
全極點模型的參數在可以計算的前提下,實際應用特別是對編碼傳輸來說還是有很大痛點:
解方程需要求矩陣的逆,非常的消耗計算量;
AR的模型里面使用的是FIR濾波器,直接型FIR特別是高階的對于濾波系數的量化誤差異常敏感。
那么怎么解決呢?首先來看如何快速求解預測參數。
1. Levinson-Durbin算法
對于求解Yule-Walker方程,由于Toeplitz矩陣自己的特性,可以得到一種有效的迭代算法,論證的過程這里就不詳細寫了,相信有很多資料都可以查到。這個算法是一個迭代計算的過程,從最低階往上計算逐步遞推。不僅求出了所有的p階預測系數,還得到了所有低階預測系數,具體過程如下:
其中??又稱為是反射系數,并且只有??,才能保證系統H(z)穩定,且??和??是一一對應的。
2. 格型濾波器
有了??這個中間變量后,??把預測濾波器的低階系數和高階系數聯系到了一起:
?? ??j = 1,2,3,...,i-1
??? ? ? ? ? ? ? ?????(10)
那么既然反射系數??和預測系數替換,系統都由反射系數表達會變成什么樣呢?
原本FIR濾波器的時域差分方程為:
??? ???(11)
由于這里??是從之前i個采樣點來預測s[n]時產生的誤差,所以稱為:前向預測誤差。
??? ? ?(12)
再將公式(10)帶入并推導,最后得到的時域解釋為:
??? ??(13)
這里??則是根據樣本(n-i)之后的i個樣本點預測得到的,所以這個??又被稱為后向預測誤差。
前向和后向表達里的預測系數??替換成??的表達為:
??(14)
??(15)
那么根據(13)(14)遞推公式,已知我們知道s[n]求??,p階預測誤差濾波器由??表達如下,且各階前向和后向誤差也如下圖:
而語音的發聲的全極點建模如下圖:
缺點:輸出每個樣本所經歷的計算量是普通直接型濾波器的兩倍。
優點:只要保證反射系數??,就不會使得系統不穩定。
特別是高階型的濾波器對于系數的量化非常敏感,量化誤差稍大就可能導致系統不穩定,所以在需要對系數粗量化時,格型濾波器仍然是最優的實現方法。
?#05
LPC的全極點模型階數的影響
線性預測編碼里的全極點建模提供了一種從截取或加窗數據中獲得一個高分辨率信號頻譜的方法。但這是基于一個前提,即如果參數信號數據和模型互相擬合,那么可以用數據的有限長區間段來確定模型參數,進而也確定了其頻譜。
是不是LPC的全極點模型的階數越高越精確呢?
如果s[n]本身就是全極點系統生成的,那么只要估計方案選擇得當,使用高于原生成系統的階數意義并不大。而即使信號s[n]本身不能用一個全極點系統來精確建模,通常也會存在一個p的取值,在該值之上再增大時,對于預測誤差的影響就會非常小或者沒有影響。而這個閾值將表明一個全極點模型階數的有效選擇。
那么如果在有效階數一下,降低p的取值會對建模本身帶來多少誤差呢,或者說誤差主要表現在哪里呢?
這里直接給出一個基于線性預測全極點重建數據頻譜包絡在不同p值之下和原信號的對比圖:
有圖可見,降低LPC的全極點模型的階數和原信號的頻譜的對比表明了,其重建信號在階數越低的情況下其頻譜包絡越平滑(如圖:p=12),而越高的階數(p=40)則能表現更多的細節。所以基于LPC的編碼器的碼率肯定會影響模型的階數和量化的精度,由此也能看出重建聲音在低碼率下的音質并不能表現更多細節了。
?#06
總結
本文介紹了基于線性預測的編碼器的主要工作原理,更說明了各個部分的設計緣由、特點、缺陷等,希望讀者可以對整個編碼主體部分的分工和由來有一個基本概念。很多推導過程都已省略,相信很多書籍和材料都能查到相應算法的具體推導。另外這也只是基于LPC編碼器編碼的主體原理,實際應用時,編碼器可能還會有很多其他模塊,比如熵編碼模塊、抵抗量化噪聲的模塊等等。
掃描圖中二維碼或點擊閱讀原文
了解大會更多信息
總結
以上是生活随笔為你收集整理的基于线性预测的语音编码原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Easy Tech:什么是I帧、P帧和B
- 下一篇: 【今晚七点半】:对话平行未来姜雨晴——重