選單

基於線性預測的語音編碼原理解析

文 | 拍樂雲

早期的音訊系統都是基於聲音的模擬訊號實現的,在聲音的錄製、編輯和播放過程中很容易引入各種噪聲,從而導致訊號的失真。隨著資訊科技的發展,數字訊號處理技術在越來越多領域得到了應用,數字訊號更是具備了易於儲存和遠距離傳輸、沒有累積失真、抗干擾能力強等等,訊號和訊號處理都往數字化發展。為了使得數字音訊可以被高效地壓縮儲存並高品質地還原,數字音訊的編碼技術就變成至關重要的一個部分了。本篇文章會介紹當今的音訊的編碼器(傳統演算法非深度學習)的兩大主流陣營之一的基於線性預測的語音編碼器的原理。

#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編碼器編碼的主體原理,實際應用時,編碼器可能還會有很多其他模組,比如熵編碼模組、抵抗量化噪聲的模組等等。