利用函数wavread对语音信号进行采样_语音信号处理相关知识
本文的初衷是為后續模型介紹和論文速覽提供一個過渡,核心價值在于介紹一些較為基礎的概念,以使得后文中如遇到不太理解的概念通過本文查證
一、語音的表示
語音的表示形式本質為波形,從語音到波形的理解可以想象打鼓時的鼓膜運動方式,假定我們只觀察鼓膜的中心點,也就可以看到隨著聲音的產生鼓膜的運動過程。
在聲音的產生過程中,鼓膜中心點以一定的規律進行上下運動,轉化成數學二維表達,就是假定橫軸為時間,縱軸為當前時間鼓膜中心點與初始點的距離。然后我們就可以畫出一個中心點隨時間的運動軌跡,也就是一個波形。
語音波形示例二、 語音的存儲
語音的表示形式是一個以時間為自變量的波形這一步沒問題后,我們來討論下語音怎么存儲的。
首先這種波形明顯是不能夠直接存到電腦的,一個波不是一個數字,根本無法確定存儲數據量大小。所以要轉化,那么轉化其實就兩種辦法,一種是我把這個波形用一個函數表達出來,然后存函數的參數,這樣的確存儲空間確定了,而且需要的空間很小,但是太麻煩了,需要函數來擬合波形,甚至有些波形不可以用函數表達怎么辦(我知道你可能在想直接用大量的分段函數來表達,這其實和我后面要說的方法本質是一樣的)。 另外一種就是,我間隔一定的時間存儲一個點的數值(是不是類似這個時間間隔的分段函數),然后一段語音波形就可以通過一個基于時間長度的向量表達存儲了。這就是語音的離散存儲方式。
三、 語音的基礎特征
這樣可以引出很多語音的基礎概念,比如離散的存儲方式中,時間間隔其實就和語音的采樣率(Sample Rate)相關,間隔給定的時間記錄一個數值,那么一秒的語音中記錄多少個點的數量就是語音采樣率。也就是說16000 采樣率的語音表示,一秒有16000個點被記錄下來。每個點記錄的數據格式(整型,浮點型)就是語音的精度(Precision)。記錄的數值是否做過編碼壓縮以及怎么做的編碼壓縮,就是采樣點編碼(Sample Encoding)。
語音通道數(Channels)指的其實是這段語音由幾個波形組成。
四、傅里葉變換
傅里葉變換只考慮使用的話其實只需要理解它的意義,而不用完全推導。
1 . 傅里葉變化意義
傅里葉變換的意義其實很簡單,可以看作固定基底的因子分解,這可能越說越繞,舉個貼近生活的例子就是垃圾分類。對傅里葉變換就是垃圾分類,這里有一包各種混合的垃圾(語音波形),現在要按要求將其中垃圾進行分類,我們得到的其實就是分類好后各種垃圾的數量。
好的,再用語音復述一遍上述過程,我們有一個由各種正弦波組成的波形,然后經過傅里葉變換,我們得到了各種正弦波的占比。
傅里葉變換圖解(wiki)當然這個敘述中有一個明顯漏洞,那就是憑什么一個波形能夠由正弦波組成,正弦波擬合波形的精度又如何確定,這的確無法通過抽象的語言講明白,需要嚴格的推導,如果需要可以推導一下傅里葉變換即可。
得到各種正弦波的占比,其實也就是正弦波的能量也就能畫出頻域圖了,頻域的自變量其實是離散的,對應的就是每種正弦波,因變量則是能量了。
這里為防止疑惑再提一句,為什么會有多種正弦波,畢竟正弦波的樣子都是完全一樣的嘛。這里的種類其實是指的頻率,頻率越高的正弦波實際上會變化得越快,也就是周期越小。頻率的不同決定了正弦波的不同。
當然還有相位等概念,但我會在講述比較傳統的vocoder之前一定會詳細敘述這一部分。在neural vocoder部分其實不用太深入,知道傅里葉變換是在做正弦波分解即可。
2 . 幀與窗
另外在傅里葉變換計算過程中還需要有個“幀”的概念,這是因為傅里葉變換實際時對一個波形全實數域范圍內的處理,可現實語音波形是隨時間復雜多變的。所以我們只能每次取波形的一部分(然后復制粘貼到全實軸上)做傅里葉變換,這是基于語音信號的短時不變性做的妥協性操作。背后的邏輯是假設一段短時語音的正弦信號構成是穩定的,所以對于這段語音的傅里葉變換結果是可靠且唯一的。
那么我們每次取一“窗”語音做傅里葉變換的結果作為一“幀”語音的頻譜,這里“窗”的概念是基于窗函數而來的,這將在后文講頻譜泄漏部分較為完整的敘述。如果將一條語音分成n個收尾相連的“窗”,那么這里窗的數量實際就是幀數。可是實際處理中大多是更少量的移動窗,而將窗移作為一幀的單位。舉個例子,假設一個窗包含160個點,每隔80個點設置一個窗,那么對于一個長度為1000個點的語音,實際上是分成了11幀(有11個窗)。
五、 Mel 譜(Mel Spectragram)
上節講述了通過傅里葉變換得到頻譜,實際上傅里葉變換后的頻譜為和其他譜圖具有區分性,稱為線性譜(linear spectragram)。
而mel 譜實際是對線性譜的自變量(頻率)做了一個彎折(wrap)處理(先不考慮三角濾波器的問題)。也就是說線性譜的頻率通過一個函數后再和能量一一對應的譜圖就是mel譜。
那么為什么需要做這個彎折(wrap)?這是類比人耳的聽覺認知做的一種類似操作。現實中人耳并非對于每個頻率的敏感程度都是相同的,總體來說,人耳對于低頻更加敏感,而對高頻不敏感。這樣處理語音時更應該關注低頻部分而非平均分配注意力。
而這種不均勻分配注意力的方式,數學上是通過頻率映射完成的。讓低頻部分頻率的變化情況更為明顯,那么計算對于低頻的感知也就更敏感。
正常頻域到Mel域的映射當然,在mel譜的使用中,不僅需要它具有調整頻段分布的作用還需要兼具頻譜降維的功能。假設現在一幀語音傅里葉變換后得到512+1維(多的一維是殘差)的頻譜,我們得到的mel譜需要小于100維。降維的方式同樣參考人耳,可以把人耳當作一個濾波器組,濾波器組中每個濾波器都可以使用一種簡單的濾波器----三角濾波器。人耳對于低頻敏感其實意味著在低頻部分濾波器密度更高,而高頻部分更為稀疏。最后濾波器的個數也就是mel譜的維數。
Mel域對應三角濾波器示例以上初步講解了mel譜,更為復雜的MFCC(mel倒譜系數)和MCEP等將在使用到之前更為詳細的敘述。
六、 語音中噪聲或擾動的必要性
大多數情況談到噪聲第一反應是累贅,是需要在模型中去掉的東西。當然這在許多場合下是合理的,可是當我們看許多vocoder 模型的時候會發現,這些模型在主動添加噪聲和擾動,這內在原因如果單純認為噪聲是不好的東西是無法理解的。
主要矛盾的根源是語音中的很多發音其實就是白噪聲,同時背噪也在一定程度上決定了音色。換言之,噪聲是聽覺系統不可分割的一部分。例如摩擦音的主體就是白噪聲,所以語音生成過程中噪聲的合理加入是必不可少的一部分。
同時不合理的噪聲的去除也是必要的,即使看起來是規則的,周期性的,實際上在聽覺系統中反而會被當作奇怪的東西。
當然這部分內容大多不會在Neural Vocoder中有什么實質性的操作,談及噪聲只是為了說明模型中大量添加隨機性的合理性。而真正的噪聲譜的添加將會在傳統vocoder的講解中敘述。
尾巴
這里大多講述都是基于我的記憶來說的,所以可能用詞不是很正式,也許有些講述鏈條中突然出現了一些讀者不知道但我沒講述過的東西,希望能夠指出,非常感謝
總結
以上是生活随笔為你收集整理的利用函数wavread对语音信号进行采样_语音信号处理相关知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: invalid signature 错误
- 下一篇: 原型模式的应用场景_23中设计模式(上)