語音識別FBank特征提取學習筆記

語音識別就是把一段語音信號轉換成對應的文本信息,這一過程包括四個大的模塊,分別是:特征提取、聲學模型、語言模型、字典與解碼。

本篇就來梳理一下特征提取模塊的實現思路和方法。

常用的語音特征有:

  • 梅爾頻率倒譜系數(Mel-Frequency Cepstral Coefficients, MFCC)
  • 梅爾濾波器組系數(Mel Filter Bank, FBank,也叫log-Mel)
  • 線性預測系數(Linear Prediction Coefficient, LPC)

基于深度學習網絡的語音識別,目前多采用FBank特征。?獲得FBank特征主要包括以下幾個步驟:

  1. 預加重;
  2. 分幀、加窗;
  3. 快速傅里葉變換,計算功率譜;
  4. Mel濾波器組;
  5. 取對數,得到FBank。

1. 預加重(Pre-Emphasis)

在音頻錄制過程中,高頻信號更容易衰減,高頻成分的丟失,可能導致音素的共振峰不明顯,使得聲學模型對這些音素的建模能力不強。預加重是個一階高通濾波器,可以提高信號高頻部分的能量。

預加重的實現方法:給定時域輸入信號x,預加重之后的信號y為:y(t)=x(t)?αx(t?1),其中0.9≤α≤1.0。經過預加重之后的頻譜圖和原始的頻譜圖的比較如下圖所示,其中,左側為原始頻譜圖,右側為預加重處理之后的頻譜圖。

2. 分幀、加窗

語音信號是一個時變的、非穩態的信號,但在短時間范圍內可以認為是時不變的、穩態的。這個短時間的長度一般取10~30ms,可在這個時間范圍內進行語音信號處理。這就是分幀。

分幀一般采用交疊分段的方法,這是為了使幀與幀之間平滑過渡,保持其連續性。前一幀和后一幀的交疊部分稱為幀移,幀移與幀長的比值一般為0~1/2。分幀如下圖所示:

分幀之后,需要使用有限長度窗口進行加權處理,也就是加窗,即sw(n) = s(n) * w(n)。那么,為什么要加窗呢?這是因為后面要對信號進行快速傅里葉變換(FFT)。FFT處理的要求是,信號要么從-∞到+∞,要么為周期信號。由于語音信號只能是有限長度信號,并且分幀后的信號是非周期的,進行FFT處理時會存在頻率泄露的問題。為了盡可能地減小頻率泄露,就需要對信號進行加窗處理。那么,窗函數的選擇就需要滿足:(1) 窗函數頻譜主瓣寬度盡量窄,以得到較高的頻率分辨能力;(2) 窗函數旁瓣衰減盡量大,以減少泄露。

下圖顯示了加窗和不加窗的FFT變換對比:

常用的加窗函數有漢明窗(Hamming)、漢寧窗(Hanning)等。其中,漢明窗的窗函數表達式為:

其中,0≤n≤N?1,N為窗口長度。窗口圖形繪制如下:

3. 短時快速傅里葉變換(STFT),計算功率譜

對于每一幀加窗信號,進行N點FFT變換,也稱為短時傅里葉變換(STFT),N通常取256或512。然后,計算能量譜:

4.? Mel濾波器組

人耳對不同頻率的聲音有不同的感知能力,通常情況下,人耳對低頻的感知辨識力比高頻更好,為了模擬人耳對不同頻率的非線性感知能力,引入了Mel頻率。赫茲頻率(f)與Mel頻率(m)之間的轉換關系如下:

該步是通過定義M個三角濾波器組,對上一步得到的功率譜進行濾波。M的取值范圍一般在22~40,標準值為26,這里取40。濾波器組中的每個濾波器都是三角形的,中心頻率為f(m),該處響應為1,中心頻率兩邊線性減小到0。各f(m)之間的間隔隨著m值的增大而變寬,如下圖所示:

三角濾波器的定義如下:

f(m)是在Mel尺度上轉換回赫茲頻率的位置,由于濾波器最終對第3步計算出來的功率譜進行濾波,因此,在實現中,可以將濾波器位置轉換成FFT bin所在的位置來計算。為了說明這一點,用一段代碼來描述這個過程:

low_freq_mel = 0
high_freq_mel = (2595 * numpy.log10(1 + (sample_rate / 2) / 700))  # Convert Hz to Mel
mel_points = numpy.linspace(low_freq_mel, high_freq_mel, nfilt + 2)  # Equally spaced in Mel scale,在Mel頻率范圍內均勻創建nfilt+2也就是40個點
hz_points = (700 * (10**(mel_points / 2595) - 1))  # Convert Mel to Hz,將42個點的Mel points轉回赫茲頻率
bin = numpy.floor((NFFT + 1) * hz_points / sample_rate)   # 將hz_points轉換到FFT binfbank = numpy.zeros((nfilt, int(numpy.floor(NFFT / 2 + 1))))for m in range(1, nfilt + 1):f_m_minus = int(bin[m - 1])   # leftf_m = int(bin[m])             # centerf_m_plus = int(bin[m + 1])    # rightfor k in range(f_m_minus, f_m):fbank[m - 1, k] = (k - bin[m - 1]) / (bin[m] - bin[m - 1])     # 三角濾波器左側for k in range(f_m, f_m_plus):fbank[m - 1, k] = (bin[m + 1] - k) / (bin[m + 1] - bin[m])   # 三角濾波器右側filter_banks = numpy.dot(pow_frames, fbank.T)  # pow_frames即當前幀的功率譜
filter_banks = numpy.where(filter_banks == 0, numpy.finfo(float).eps, filter_banks)  # Numerical Stability
filter_banks = 20 * numpy.log10(filter_banks)  # dB,進行對數計算,得到最終的FBank特征

5. 取對數,得到FBank

這一步較簡單,在上一步的Python代碼中,對三角濾波器組的輸出取對數,得到最終的FBank特征。不再贅述。

6. 均值歸一化(Mean Normalization)

為了平衡頻譜并提高信噪比,可以通過減去(所有幀的)系數平均值的方式來進行歸一化。

filter_banks -= (numpy.mean(filter_banks, axis=0) + 1e-8)

7. MFCC特征

由于許多ASR系統使用MFCC特征,這里做一個補充說明。

由于FBank系數存在高度相關性,在一些機器學習系統(如之前流行的GMMs-HMMs)中會存在問題,因此,如果對Fbank進行DCT變換來對FBank系數進行去相關,則可以得到MFCC(Mel-Frequency Cepstral Coefficients)。MFCC是FBank的一種壓縮表示。在ASR系統中,一般會保留前2~13個系數,其他的則被丟棄。被丟棄的這些系數表示filter bank的快速變化,這些精細的細節對某些ASR系統是沒有貢獻的。

mfcc = dct(filter_banks, type=2, axis=1, norm='ortho')[:, 1 : (num_ceps + 1)] # num_ceps = 2 - 13

?還可以對MFCC應用正弦提升來改善ASR在噪聲信號下的識別能力:

(nframes, ncoeff) = mfcc.shape
n = numpy.arange(ncoeff)
lift = 1 + (cep_lifter / 2) * numpy.sin(numpy.pi * n / cep_lifter)
mfcc *= lift  

MFCC也可以應用均值歸一化。?

參考資料:

Practical Cryptography

Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What’s In-Between | Haytham Fayek

《人工智能技術》,鄭孝宗主編?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42626.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42626.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42626.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學生管理系統(通過順序表,獲取連續堆區空間實現)

將學生的信息,以順序表的方式存儲(堆區),并且實現封裝函數 : 1】順序表的創建, 2】判滿、 3】判空、 4】往順序表里增加學生信息、 5】遍歷學生信息 6】任意位置插入學生信息 7】任意位置刪除學生信…

0301STM32GPIO外設輸出

STM32GPIO外設輸出 STM32內部的GPIO外設GPIO簡介基本結構GPIO位結構輸入部分:輸出部分: GPIO八種工作模式浮空/上拉/下拉輸入模擬輸入開漏/推挽輸出復用開漏/推挽輸出 手冊寄存器描述GPIO功能描述外設的GPIO配置GPIO寄存器描述端口輸入數據寄存器端口輸出…

QT入門筆記-自定義控件封裝 30

具體代碼如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

并查集(還有反集也在)

一.定義 定義: 并查集是一種樹型的數據結構,用于處理一些不相交集合的合并及查詢問題(即所謂的并、查)。比如說,我們可以用并查集來判斷一個森林中有幾棵樹、某個節點是否屬于某棵樹等。 主要構成: 并查集…

PHP-實例-文件上傳

1 需求 2 basename 在 PHP 中,basename() 函數用于返回路徑中的文件名部分。如果路徑中包含了文件擴展名,則該函數也會返回它。如果路徑的結尾有斜杠(/)或反斜杠(\),則 basename() 函數會返回空…

Android計算器界面的設計——表格布局TableLayout實操

目錄 任務目標任務分析任務實施 任務目標 使用TextView、Button等實現一個計算器界面,界面如圖1所示。 圖1 計算器界面效果圖 任務分析 界面整體使用表格布局,第一行使用一個TextView控件,橫跨4列,中間4行4列,最后一…

Laravel HTTP客戶端:網絡請求的瑞士軍刀

標題:Laravel HTTP客戶端:網絡請求的瑞士軍刀 Laravel的HTTP客戶端是一個功能強大的工具,它提供了一種簡潔、直觀的方式來發送HTTP請求。無論是與外部API集成,還是進行網絡數據抓取,Laravel的HTTP客戶端都能滿足你的需…

小紅書選品中心商家采集 小紅書商家電話采集軟件

可采集名稱銷量評分聯系方式等 需要有1000粉絲以上已實名認證過的小紅書達人才可以使用 以下是一個示例程序,可以用于批量獲取小紅書選品中心商家的信息: import requestsdef get_merchants(page_num):url f"https://www.xiaohongshu.com/selec…

git 添加本地分支, clean

//以develop為源創建本地分支fromdevelop git checkout -b fromdevelop git add . git commit -m "local" git checkout -b local/dev //切換到遠程分支. git checkout dev git clean_git clean -f -d-CSDN博客 git clean -f -d #刪除當前目錄下沒有被track…

RAC spfile 坑 +data INSTANCE_NUMBER thread x is mounted by another instance

RAC相關三個參數 thread reset 就可以默認 instance_number 需要單獨設置 sid‘SIDX’ cluster_database boolean TRUE SQL> alter system reset instance_number sid* scopespfile; alter system reset instance_number sid* scopespfile …

解析Torch中`Transformer`

解析torch官方代碼腳本文件:transformer.py。版本:1.9.1cu111。 首先查看《Torch中多頭注意力MultiheadAttention的中文注釋》解析; 最后查看下方transformer解析。 話不多說,看代碼吧! import copy from typing imp…

Vue的學習之class與style綁定

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>Vue的學習</title><script src"vue.js" type"text/javascript" charset"utf-8"></script></head><body><…

如何在std::map中查找元素

在std::map中查找元素可以通過幾種不同的方式完成&#xff0c;但最常用的方法是使用find成員函數。std::map是一個基于鍵值對的關聯容器&#xff0c;其中每個元素都是一個鍵值對。鍵是唯一的&#xff0c;并且用于排序和快速查找。 使用find成員函數 find成員函數接受一個鍵作…

io流 多線程

目錄 一、io流 1.什么是io流 2.流的方向 i.輸入流 ii.輸出流 3.操作文件的類型 i.字節流 1.拷貝 ii.字符流 ?3.字符流輸出流出數據 4.字節流和字符流的使用場景 5.練習 6.緩沖流 1.字節緩沖流拷貝文件 2.字符緩沖流特有的方法 1.方法 2.總結 7.轉換流基本用法…

第2集《修習止觀坐禪法要》

請打開補充講表第一面&#xff0c;附表一、念佛攝心方便法。 我們前面講到修止&#xff0c;就是善取所緣境的相貌&#xff0c;然后心于所緣&#xff0c;專一安住&#xff1b;心于所緣&#xff0c;相續安住&#xff1b;達到心一境性的目的。 站在修學凈土的角度&#xff0c;他…

FastAPI+SQLAlchemy數據庫連接

FastAPISQLAlchemy數據庫連接 目錄 FastAPISQLAlchemy數據庫連接配置數據庫連接創建表模型創建alembic遷移文件安裝初始化編輯env.py編輯alembic.ini遷移數據庫 視圖函數查詢 配置數據庫連接 # db.py from sqlalchemy import create_engine from sqlalchemy.orm import sessio…

9、程序化創意

程序化創意 程序化創意&#xff08;Programmatic Creative&#xff09;是指通過自動化的方式制作并優化廣告創意&#xff0c;以提高廣告效果。針對不同受眾的多樣化需求&#xff0c;以及同一受眾在不同場景下的消費需求&#xff0c;程序化創意能夠自動生成個性化的精準創意&am…

《C語言》預處理

文章目錄 一、預定義符號二、#define定義常量三、#define定義宏四、宏更函數的對比五、#和##1、#運算符2、##運算符 一、預定義符號 C語言設置了一些預定義符號&#xff0c;可以直接使用&#xff0c;在預處理期間進行處理的。 __FILE__//進行編譯的源文件 __LINE__//文件當前的…

在網站存在漏洞的情況下強化安全防御

一、引言 網絡安全是一個持續的戰斗&#xff0c;尤其是在網站存在已知或未知漏洞的情況下。本文將探討如何在網站存在漏洞的情況下&#xff0c;采取有效措施進行安全防御。 二、理解漏洞 首先&#xff0c;我們需要理解網站的漏洞。這些可能包括SQL注入、跨站腳本&#xff08…

【數據結構與算法】插入排序

&#x1f493; 博客主頁&#xff1a;倔強的石頭的CSDN主頁 &#x1f4dd;Gitee主頁&#xff1a;倔強的石頭的gitee主頁 ? 文章專欄&#xff1a;《數據結構與算法》 期待您的關注 ?