1.怎麼表示聲音。
2.怎麼更有效的表示聲音(sfft)
使用取樣可以表示聲音,但是以取樣率16000, 一秒鐘的聲音就需要16000個數字表示,如果這樣做語音合成,那麼10個字(大概5秒鐘)就需要**近80000個點。對模型太難了…
stft大概就是將乙個週期訊號可以拆分為多個週期訊號, 而任意一段訊號(序列)我們可以擷取一小段然後構造出乙個類似的週期訊號。之後使用傅利葉變換來將這些週期的時域訊號(振幅隨著時間變化),轉換為在該極短時間內的頻域訊號: 不同頻率的訊號疊加, 這裡不同頻率就是週期性不一樣,還需要各個週期訊號的振幅和相位才能還原原訊號。參考圖左。
擷取一小塊(一幀,若幀大小1000, 則共包含1000個點) 新增窗函式(避免頻譜洩漏【鏈結-什麼是頻譜洩漏】)。由於sfft變換後,訊號在頻域的表示是對稱的,所以我們只需要研究一半,也即500個點(新增時間資訊後就是500個向量(時間、位移)),fft將其轉換為頻域上的500個點(振幅,相位)。這500個點分別對應著最小頻率到最大頻率中劃分的500個頻段(中間點的頻率?)。也即可以用這500個頻率(週期性訊號)加上其對應的幅度和相位就可以還原一幀聲音頻號。【鏈結- 取樣率、bin、fft後的理解】
上面就講了一幀的變換,如果對整個時間訊號進行多次stft,就可以表示這個聲音了。具體設定hop_length=200(每次向前移動200個取樣點)。使用stft後一秒16000個點(對應800200 也即約800+1 幀)就可以變換為乙個矩陣[500,801]的複數(實部表示振幅,虛部表示相位) 矩陣(幀大小1000, hop_ength為200)。由於幅度保留的資訊更多,一般只取幅度資訊(實數部分)。 grifinlim演算法就是使用幅度譜還原聲音的演算法,但是效果比較差。
前面講了stft變換,但是16000個點最後變成了500801約40w個點。這反而比原始的點更多了(由於hop_length較小,幀與幀之間有重疊)
怎麼更有效的表示聲音(mel譜)
人對高頻訊號並不敏感。人耳對hz這種標度單位並不是線**知關係,例如如果我們適應了1000hz的音調,如果把音調頻率提高到2000hz,我們的耳朵只能覺察到頻率提高了一點點,根本察覺不到頻率提高了一倍。mel譜刻度和hz刻度是log關係(如下圖,公式見右圖),當頻率較小時,mel隨hz變化較快;當頻率很大時,mel的上公升很緩慢。 在使用中使用80個mel濾波器,也即將前面的500個頻帶(頻率)對映到80個頻帶(mel頻率)上。 【鏈結-梅爾頻譜和梅爾倒譜】
轉換到mel譜後對應的是每個mel 頻帶的振幅,得到乙個80801的矩陣。而由於振幅差距比較大,一般轉換為db(分貝),也即取log。也就是說轉換為mel譜這一步有兩個log: a. 500個線性頻帶對映到80個對數性頻帶 b. 80501個振幅點取log變為分貝。
最終得到的是80*501的矩陣,501代表501幀,80代表有80個mel頻帶,每個點的值代表該幀該頻帶的分貝。 tts一般使用的就是該mel譜。
訊號增強
預加重預加重就是對輸入訊號高頻分量進行補償。語音的低頻段能量較大,能量主要分布在低頻段,語音的功率譜密度隨頻率的增高而下降,通過預加重來,保持輸出訊號不變,有效降低輸出雜訊,以達到提高輸出訊雜比的目的。預加重如下圖所示。【鏈結-預加重】
加窗加窗主要是為了使時域訊號似乎更好地滿足 fft 處理的週期性要求,減少洩漏。具體就是fft分析需要滿足週期性,但是直接按照幀大小擷取一段出來的一般都不是整週期,而通過加窗來減弱頻譜洩漏。
如圖左,發現其就是乙個低頻正弦波,如果我們擷取一段,而沒有擷取到整週期,然後複製這一段形成右圖。右圖就會導致原單低頻波分解為乙個低頻波加上一些高頻的分量。
頻譜的獲得:對乙個時域訊號進行傅利葉變換,得到訊號的頻譜。
頻譜的組成:訊號的頻譜由兩部分構成: 幅度譜和相位譜。
在傅利葉分析中, 把各個分量的幅度隨著頻率的變化稱為訊號的幅度譜。
把各個分量的相位隨著頻率變化稱為訊號的相位譜。
能量譜,也稱為能量譜密度,是指用密度的概念表示訊號能量在各頻率點的分布情況,反應能量隨頻率的變化。
能量譜是訊號幅度譜的模的平方,其量綱是焦/赫,對能量譜在頻域上積分就可以得到訊號的能量。
功率譜,也稱為功率譜密度,是指用密度的概念表示訊號功率在各頻率點的分布情況,反應功率隨頻率的變化。
功率譜是訊號自相關函式的傅利葉變換,對功率譜在頻域上積分就可以得到訊號的功率。
由於得到的聲譜圖較大,為了得到合適大小的聲音特徵,通常將它通過梅爾尺度濾波器組(mel-scale filter banks),變為梅爾頻譜。頻率的單位是hz,人耳能聽到的頻率範圍是20-20000hz,但是人耳對hz單位不是線性敏感,而是對低hz敏感,對高hz不敏感,將hz頻率轉化為梅爾頻率,則人耳對頻率的感知度就變為線性
就是一種訊號的傅利葉變換經對數運算後再進行傅利葉反變換得到的譜。它的計算過程如下:
梅爾頻率倒譜係數(mel frequency cepstrum coefficient, mfcc)考慮到了人類的聽覺特徵,先將線性頻譜對映到基於聽覺感知的mel非線性頻譜中,然後轉換到倒譜上。
步驟先得到mel頻譜,在mel頻譜上面進行倒譜分析(取對數,做逆變換,實際逆變換一般是通過dct離散余弦變換來實現,取dct後的第2個到第13個係數作為mfcc係數),獲得mel頻率倒譜係數mfcc,這個mfcc就是這幀語音的特徵;(倒譜分析,獲得mfcc作為語音特徵)
sampling_rate音訊檔案一秒包含的音訊取樣數
fft_size短時傅利葉變換中一幀的音訊取樣數
hop_length幀移。一般設定為fft-size的1/4
win_length視窗大小。
num_mels產生的梅爾帶數
fmax/fmin最高頻率/最低頻率
spectrum頻譜
spectrogram: 聲譜圖
amplitude振幅
#輸入為線性譜s
#1.初始化乙個虛部並轉換為相位:
angles = np.exp(
2j* np.pi * np.random.rand(
*s.shape)
)#2.轉換s為實數(實部為s)
s_complex = np.
abs(s)
.astype(np.
complex
)#3.逆stft變換
y = librosa.istft(s_complex * angles, hop_length=get_hop_size(hparams)
, win_length=hparams.win_size)
#4.迴圈
for i in
range
(hparams.griffin_lim_iters)
: angles = np.exp(
1j* np.angle(_stft(y, hparams)))
y = librosa.istft(s_complex * angles, hop_length=get_hop_size(hparams)
, win_length=hparams.win_size)
語音基礎知識
1 語音頻號的處理基礎 1 語音頻號的產生模型 語音是由發生器官產生的。肺呼進空氣,由氣管呼出形成氣流,氣流經由聲門,使聲帶振動,產生一系列離散脈衝,再經由咽腔和口腔,有時還經由鼻腔。隨著發音的不同,口的張合程度不同,舌在口中位置的不同,氣流經過各容積不斷變化的空腔時產生許多共振,最後從口和鼻以聲波...
VOIP語音基礎知識
voip語音基礎知識 1.voice gateway 主要用於實現從ip網路到傳統 網路 pstn 線路的轉換。2.gatekeeper 網守,它提供了兩個功能。第乙個 呼叫選路,類似於dns功能,負載 號碼和ip的解析。第二 cac,用於對呼叫建立請求的一種接納機制 接通前檢查網路頻寬環境是否建立...
語音的基礎知識
1 語音頻號的處理基礎 1 語音頻號的產生模型 語音是由發生器官產生的。肺呼進空氣,由氣管呼出形成氣流,氣流經由聲門,使聲帶振動,產生一系列離散脈衝,再經由咽腔和口腔,有時還經由鼻腔。隨著發音的不同,口的張合程度不同,舌在口中位置的不同,氣流經過各容積不斷變化的空腔時產生許多共振,最後從口和鼻以聲波...