Python語音基礎操作--6.2LPC編碼

《語音信號處理試驗教程》(梁瑞宇等)的代碼主要是Matlab實現的,現在Python比較熱門,所以把這個項目大部分內容寫成了Python實現,大部分是手動寫的。使用CSDN博客查看幫助文件:

Python語音基礎操作–2.1語音錄製,播放,讀取
Python語音基礎操作–2.2語音編輯
Python語音基礎操作–2.3聲強與響度
Python語音基礎操作–2.4語音信號生成
Python語音基礎操作–3.1語音分幀與加窗
Python語音基礎操作–3.2短時時域分析
Python語音基礎操作–3.3短時頻域分析
Python語音基礎操作–3.4倒譜分析與MFCC係數
Python語音基礎操作–4.1語音端點檢測
Python語音基礎操作–4.2基音週期檢測
Python語音基礎操作–4.3共振峯估計
Python語音基礎操作–5.1自適應濾波
Python語音基礎操作–5.2譜減法
Python語音基礎操作–5.4小波分解
Python語音基礎操作–6.1PCM編碼
Python語音基礎操作–6.2LPC編碼
Python語音基礎操作–6.3ADPCM編碼
Python語音基礎操作–7.1幀合併
Python語音基礎操作–7.2LPC的語音合成
Python語音基礎操作–10.1基於動態時間規整(DTW)的孤立字語音識別試驗
Python語音基礎操作–10.2隱馬爾科夫模型的孤立字識別
Python語音基礎操作–11.1矢量量化(VQ)的說話人情感識別
Python語音基礎操作–11.2基於GMM的說話人識別模型
Python語音基礎操作–12.1基於KNN的情感識別
Python語音基礎操作–12.2基於神經網絡的情感識別
Python語音基礎操作–12.3基於支持向量機SVM的語音情感識別
Python語音基礎操作–12.4基於LDA,PCA的語音情感識別

代碼可在Github上下載busyyang/python_sound_open

線性預測編碼(linear predictive coding, LPC) 是運用於音頻信號處理與語音處理的壓縮編碼方式,根據線性預測模型的信息表示數字語音信號譜包絡。它是最有效的語音分析技術之一,也是低位速高質量語音編碼的最有用的方法之一,能夠提供非常精確的語音參數預測。線性預測編碼通過估計共振峯剔除它們在語音信號中的作用,估計保留的蜂鳴音強度與頻率來分析語音信號;同時,使用蜂嗚參數與殘餘信號生成源信號,使用共振峯生成表示聲道的濾波器,源、信號經過濾坡器的處理來逆向合成語音信號。由於語音信號隨着時間變化這個過程是在一段段的語音信號幀上進行處理的,通常每秒30-50幀就能對可理解的信號進行很好的壓縮。

線性預測編碼通常用於語音的重新合成,它是電話公司使用的聲音壓縮格式,如GSM標準就在使用LPC編碼格式。它還用作安全無線通信中的格式,在安全的無線通信中,聲音必須進行數字化、加密然後通過狹窄的語音信道傳輸。

線性預測分析的基本思想是:由於語音樣點之間存在相關性,所以可以用過去的樣點值來預測現在或將來的樣點值,即一個語音抽樣可以用過去若干個語音抽樣或它們的線性組合來逼近。通過使實現語音抽樣與線性預測抽樣之間的誤差在某個準則(通常爲最小均方誤差準則)下達到最小值來決定一組預測係數。這一組預測係數就反映了語音信號的特性,可以作爲語音信號的特徵參數用於語音合成和語音識別等。

線性預測分析的基本假設是認爲語音信號是一個激勵信號通過一個濾波器得到的。採樣點的輸出s(n)s(n)可以用前p個樣本的線性組合來表示:
s^(n)=pais(ni)\hat s(n)=\sum^p a_is(n-i)

通過E(n)=s(n)s^(n)E(n)=s(n)-\hat s(n)最小來求解。LPC參數是模擬人的發聲器官,是基於語音合成的模型參數,每個聲管對應一個LPC模型的極點,一般情況下,極點個數爲12~16之間,就可以足夠清晰地描述語音信號的特徵,選擇p=12可以對絕大多數語音信號的聲道模型取得足夠的近似,增大p可以改善近似效果,但是計算量變大。

from scipy.signal import filtfilt

from chapter2_基礎.soundBase import *
from chapter3_分析實驗.lpc import lpc_coeff

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

data, fs = soundBase('C6_1_y.wav').audioread()
N = len(data)
time = [i / fs for i in range(N)]  # 設置時間
p = 12
ar, g = lpc_coeff(data, p)
ar[0] = 0
est_x = filtfilt(-ar, [1], data)

plt.subplot(2, 1, 1)
plt.plot(time, data, 'k')
plt.plot(time, est_x, 'c')
plt.title('LPC解碼')
plt.legend(['信號', '解碼信號'])
plt.subplot(2, 1, 2)
plt.plot(est_x - data)
plt.title('誤差')
plt.savefig('LPC解碼.png')
plt.close()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章