Python語音基礎操作--7.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

對於線性預測器s^(n)=i=1pais(ni)\hat s(n)=\sum\limits_{i=1}^pa_is(n-i),其誤差爲e(n)=s(n)s^(n)e(n)=s(n)-\hat s(n),那麼在預測誤差e(n)e(n)和預測係數aia_i已知的情況下,就可以求出合成語音。

from chapter2_基礎.soundBase import *
from chapter7_語音合成.flipframe import *
from chapter3_分析實驗.C3_1_y_1 import enframe
from chapter3_分析實驗.lpc import lpc_coeff

from scipy.signal import lfilter

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

data, fs = soundBase('C7_2_y.wav').audioread()

data -= np.mean(data)
data /= np.max(np.abs(data))
N = len(data)
time = [i / fs for i in range(N)]  # 設置時間
p = 12
wlen, inc = 200, 80
msoverlap = wlen - inc
y = enframe(data, wlen, inc)
fn = y.shape[0]
Acoef = np.zeros((y.shape[0], p + 1))
resid = np.zeros(y.shape)
synFrame = np.zeros(y.shape)
## 7.2.1

# 求每幀的LPC係數與預測誤差
for i in range(fn):
    a, _ = lpc_coeff(y[i, :], p)
    Acoef[i, :] = a
    resid[i, :] = lfilter(a, [1], y[i, :])

# 語音合成
for i in range(fn):
    synFrame[i, :] = lfilter([1], Acoef[i, :], resid[i, :])

outspeech = Filpframe_OverlapS(synFrame, np.hamming(wlen), inc)
plt.subplot(2, 1, 1)
plt.plot(data / np.max(np.abs(data)), 'k')
plt.title('原始信號')
plt.subplot(2, 1, 2)
plt.title('還原信號-LPC與誤差')
plt.plot(outspeech / np.max(np.abs(outspeech)), 'c')

plt.show()

在這裏插入圖片描述

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