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