Kaldi語音識别技術(五) ----- 特征提取
文章目錄
- Kaldi語音識别技術(五) ----- 特征提取
-
- 一、識别流程
- 二、MFCC特征提取概述
- 三、檔案格式
-
-
- 檔案格式說明
- 提取部分資料
- 修複提取資料
- 提取剩餘部分資料
-
- 四、特征提取
-
-
- 特征提取—C++
- 特征提取—并行提取
- 特征提取—特征檢視
-
- 五、CMVN
-
-
- CMVN—腳本
- CMVN—指令
-
一、識别流程
在之前的文章中我們已經完成了L.fst和G.fst的生成,在這裡簡單對Kaldi語音識别的整體進行一個回顧。
二、MFCC特征提取概述
人通過聲道産生聲音,聲道的shape決定了發出怎樣的聲音。聲道的shape包括舌頭,牙齒等。如果我們可以準确的知道這個形狀,那麼我們就可以對産生的音素(phoneme)進行準确的描述。聲道的形狀在語音短時功率譜的包絡中顯示出來。而MFCC就是一種準确描述這個包絡的一種特征。所謂特征提取,也就是提取語音信号中有助于了解語言内容的部分而丢棄掉其它的東西(比如背景噪音和情緒等等)。
MFCC(Mel頻率倒譜系數:Mel-Frequency Cepstral Coefficients)是一種在自動語音和說話人識别中廣泛使用的聲學特征。它是在1980年由Davis和Mermelstein搞出來的。從那時起。在語音識别領域,MFCC在人工特征方面可謂是鶴立雞群,一枝獨秀,從未被超越啊(至于說Deep Learning的特征學習那是後話了)。
語音的産生過程如下:語音信号是通過肺部呼出氣體,然後通過聲門的開啟與閉合産生的周期信号。再通過聲道(包括舌頭牙齒)對信号調制後産生。區分語音的關鍵就是聲道的不同形狀。不同的形狀就對應不同的濾波器,進而産生了不同的語音。如果我們可以準确的知道聲道的形狀,那麼我們就可以得到不同的音素(phoneme)的表示。聲道的形狀展現在語音信号短時功率譜的包絡(envelope)中,是以好多特征提取方法需要準确的表示包絡資訊。
MFCC特征提取流程如下:
MFCC使得特征更具區分性:
預加重
人的發音特性,每個發音段到高頻部分能量就降下來了。同時,人們認為高頻的資訊對識别音素有幫助,人們為了使用這個高頻特征來去識别音素,就需要把高頻能量往上提。主要通過加一個一階高通濾波器來實作,以提升高頻部分。
加窗
把音頻分為一小段一小段,每20ms一段
窗長 假設為20ms 隻看20ms的内容
窗移 假設為10ms 每次窗移動10ms
有重疊
離散傅裡葉變化(FFT)
需要把一個視窗的資料,從時域上轉化為頻域上來處理。
需要在頻域上判斷:
1、任何信号都可以看成不同頻率正弦波的疊加。
2、如果現在有一個純的正弦波,在頻譜上判斷,就在對應的頻率上有一個亮點(能量),沒有其他的頻率成分,就一個。
3、頻率的取值範圍是0-正無窮
梅爾濾波器
根據人耳的特性設計的這一個特征
人耳是對低頻很敏感,低頻隻要變一點,人耳都可以聽出來聲音的不同(500Hz—800Hz,可以聽出不同),但是如果頻率變的很高,高頻變一點,人耳就聽不出來不同(2000Hz—3000Hz)
人耳機制:低頻敏感,高頻很不敏感
正常的傅裡葉變化頻率的取值範圍是0-正無窮,需要把這個資訊映射到梅爾頻域上(普通頻域 - > 梅爾濾波器 - > 梅爾頻域)
基于人耳特性
梅爾頻率,低頻分辨率高,高頻分辨率低
梅爾濾波器
低頻 分布密集,均勻分布
高頻 濾波器越來越大,log形式
逆傅裡葉變換
對頻域再做一個傅裡葉變換,把它反過來
逆傅裡葉變換如果是對稱的話,做的就是離散餘弦變換(DCT)
做了DCT之後,取前12次元資訊,就是我們看到的資料
MFCC的第一次元是能量(12+1 = 13次元)
CMVN均值方差歸一化
針對每個發音人的倒譜(特征)的均值和方差,以降低不同發音人統計特性,達到普适性。
把每一次元的數都換成均值為0、方差為1的正态分布。即,減均值/方差
運作準備
. ~/kaldi/path.sh
cd ~/kaldi/data
mkdir H
cp -R /root/kaldi/kaldi_file ./
三、檔案格式
檔案格式說明
scp 不存放真實資料,隻存放路徑(基本檔案wav.scp)
ark 生成的特征檔案(二進制),用語存放真實資料
提取部分資料
提取部分音頻資訊用于訓練集和測試集
提取方法
subset_data_dir.sh [--speakers|--shortest|--first|--last|--per-spk] <srcdir> <destdir>
./utils/data/subset_data_dir.sh ../kaldi_file/ 100 ./H/kaldi_file_test
參數詳解:
第一個參數:存放4個基本檔案的檔案夾(wav.scp,utt2spk,spk2utt,text)
第二個參數:要提取的數量
第三個參數:提取後存放的檔案夾
使用介紹: https://blog.csdn.net/qq_36782366/article/details/103543480
修複提取資料
在制作4個基本檔案時,text的檔案可能因各種因素(如空内容)比其他3個檔案少,可以使用以下指令(根據text檔案)删除(utt2spk,spk2utt,text)多餘的内容,達到一緻性
./utils/data/fix_data_dir.sh ./H/kaldi_file_test
參數詳解:
kaldi_file_test 存放4個基本檔案的檔案夾(wav.scp,utt2spk,spk2utt,text)
提取剩餘部分資料
提取了指定數量的部分音頻資訊後,需要将剩餘未提取的提取出來
1、擷取已提取音頻資訊的utt
cd ./H/kaldi_file_test
awk -F ' ' '{print($1)}' text >./H/utt_id.txt
2、查找剩餘音頻text
将已提取的utt與全部的音頻text中的第一列(utt)比對比對,并取反,得到未提取的音頻資訊
mkdir train
grep -v -F -w -f kaldi_file_test/utt_id.txt kaldi_file/text > ./train/text
3、複制所有的音頻資訊(除text之外)
cp kaldi_file/{utt2spk,spk2utt,wav.scp} train/
4、修複提取資料
cd ..
./utils/fix_data_dir.sh ./H/train/
四、特征提取
特征提取—C++
compute-mfcc-feats
用法:
compute-mfcc-feats scp:xxx.scp ark:xxx.ark
compute-mfcc-feats scp:kaldi_file/wav.scp ark:all.ark
參數詳解:
第一個參數為傳入的wav.scp檔案(音頻路徑)
第二個參數為生成的特征檔案
1、檢視ark檔案
ark為二進制檔案,無法直接檢視。可通過指令将ark檔案生成文本檔案檢視:
copy-feats ark:all.ark ark,t:all.txt
2、直接生成文本檔案
compute-mfcc-feats scp:kaldi_file/wav.scp ark,t:all2.txt
特征提取—并行提取
準備配置檔案
在
~/kaldi/data
檔案夾中建立一個
conf/mfcc.conf
配置檔案,可在配置檔案配置以下2個參數
–user-energy true表示提取出的mfcc特征含能量資訊(第一列),false表示不含能量資訊
–sample-frequency 視訊的采樣率
如果提取特征時不含配置檔案,預設的
user-energy為true
,
sample-frequency為16000
cd ~/kaldi/data
vim conf/mfcc.conf
# 添加以下資訊後儲存退出
--use-energy=false # only non-default option.
--sample-frequency=16000
make_mfcc.sh
在data檔案夾中運作以下指令:
./steps/make_mfcc.sh --cmd "run.pl" --mfcc-config conf/mfcc.conf --nj 2 H/kaldi_file_test/ H/mfcc/exp/ H/mfcc/
注:由于本腳本第20行要判斷是否有path.sh 是以需要将
~/kaldi/utils/path.sh
複制到data目錄中。
參數詳解:
–cmd run.pl單機運作;queue.pl叢集運作
–mfcc-config 是否使用自定義的配置檔案,如使用該參數則需要在該參數後添加自定義的配置檔案, mfcc的配置檔案是寫死的,在與make_mfcc同級的conf/mfcc.conf
–nj 開幾個線程提取特征(根據自身資源合理設定)
train_make_mfcc/kaldi_file/ 主要是wav.scp,utt2spk,spk2utt
train_make_mfcc/exp/ 日志檔案
train_make_mfcc/mfcc/ :
1、raw_mfcc_kaldi_file.N.ark 最終輸出的特征檔案
2、raw_mfcc_kaldi_file.N.ark.txt 使用copy-feats生成的文本檔案
3、raw_mfcc_kaldi_file.N.scp 路徑
上述的N為N個線程,即有N個線程就會單獨生成N個.ark和.scp檔案
特征提取—特征檢視
這裡為了友善講解,隻提一句音頻的特征
在data檔案夾中建立檔案夾用于存放特征:
H/mfcc/
cd ~/kaldi/data/H
head -n 1 kaldi_file/wav.scp >1wav.scp
提取MFCC特征:
compute-mfcc-feats scp:1wav.scp ark:1.ark
生成文本格式的MFCC特征:
copy-feats ark:1.ark ark,t:1.txt
檢視特征值次元:
feat-to-dim ark:1.ark -
五、CMVN
CMVN—腳本
compute_cmvn_stats.sh
注:這個腳本隻能做每個人的發音特征的CMVN
cd ~/kaldi/data
./steps/compute_cmvn_stats.sh H/kaldi_file_test H/mfcc/exp/ H/cmvn/
參數詳解:
第一個參數:提取特征後在原資料檔案夾中生成的scp檔案(含feats.scp檔案夾)
第二個參數:輸出日志
第三個參數:輸出的cmvn檔案
CMVN—指令
在每個人的發音特征上做CMVN
compute_cmvn_stats
compute-cmvn-stats --spk2utt=ark:kaldi_file_test/spk2utt scp:kaldi_file_test/feats.scp ark,scp:cmvn/per.ark,cmvn/per.scp
參數詳解:
第一個參數:要提取特征的檔案的spk2utt檔案
第二個參數:提取特征後在原資料檔案夾中生成的scp檔案
第三個參數:輸出的cmvn和scp檔案
在所有人的發音特征上做CMVN
compute_cmvn_stats , H檔案夾下執行
compute-cmvn-stats scp:kaldi_file_test/feats.scp cmvn/global.cmvn
參數詳解:
第一個參數:提取特征後在原資料檔案夾中生成的scp檔案
第二個參數:輸出的cmvn檔案
檢視global.cmvn
copy-matrix --binary=false cmvn/global.cmvn cmvn/global.txt
cat cmvn/global.txt
在特征上做CMVN
apply-cmvn --utt2spk=ark:train_compute-mfcc-feats/utt2spk --norm-means=true
--norm-vars=false scp:train_compute-mfcc-feats/cmvn_train_compute-mfcc-feats.scp scp:train_compute-mfcc-feats/raw_mfcc_train_compute-mfcc-feats.1.scp ark,t:after_cmvn.ark
參考文章:
MFCC特征提取教程
梅爾頻率倒譜系數(MFCC) 學習筆記
初識語音識别及 Kaldi 的安裝使用