基于HTK的語音撥號系統

為什么80%的碼農都做不了架構師?>>> ??hot3.png

基于 HTK 的語音撥號系統

Veket

? NWPU

2011-6-22

目標:

該系統能夠識別連續說出的數字串和若干組姓名。建模是針對子詞( sub-word,eg.. 音素),具有一定的可擴充性。當加入一個新名字時,只需修改發音詞典和任務語法即可。模型為連續混合高斯輸出,運用語音決策樹聚類形成的綁定狀態式三音素。

內容:

1. 數據準備

(1) ????? 任務語法定義

(2) ????? 字典定義

(3) ????? 錄制 語音數據

(4) ????? 標注數據,得到真值文件

(5) ????? 數據特征的提取

2. 創建單音素 HMM 模型

(6) ????? 一致初始化法創建單音素模型

(7) ????? 修補啞音素模型

(8) ????? 重新校正數據

3. 創建綁定狀態的三音素 HMM 模型

(9) ????? 得到三音素 HMM

(10) ? 綁定三音素

4. 識別器評估

11 )驗證測試結果

步驟:

1. 數據準備

需要錄制訓練數據和測試數據。為了進行校準,還需要數據的標注文本。這里用任務語法( task grammar )產生真值文本( ground truth . 為了處理訓練數據,需要定義一個語音集合和一個字典用以涵蓋訓練和測試數據中涉及的單詞。

(1) ????? 任務語法定義

任務語法以包含變量的正則表達式形式定義,存儲在文件 gram (手工制作,在 Notepad++ UltraEdit 環境下進行 , 最后要空一行)里:

?

上面的語法是高層表示,必須通過 HParse 轉換成 HTK 的底層表示。

運行指令: HParse gram wdnet

?

底層表示存于文件 wdnet HParse 工具生成 )中。

?

(2) ????? 字典定義

利用 BEEP 語音詞典(現成的),除去其中的重音符。

在每個發音后加入 sp(short pause). 如果有啞音標志,就用 MP 命令把 sil sp 合并成 sil ,這些處理命令放在 global.ded (手工制作)的腳本中。

?

文件 wlist (此系統由于涉及的單詞較少,于是手工制作即可)是出現在任務語法中的所有單詞的有序列表。

?

?????? 文件 names 是專有人名的發音(手工制作,包括 SEND-START,SENT-END )。

?

?????? 執行 HDMan:

HDMan -m -w lists/wlist - g global.ded ? -n lists/monophones 0 -l dlog dict/dict1 ? dict/beep dict/names

?

生成的文件 monophones 0 是用到的音素列表(包括 sp , 生成的 dlog 是參數文件,其中包含生成的字典 dict1 的相關統計信息,還會提示是否丟失單詞。生成的與任務相關的發音詞典 dict1, 需要手工修改,為 SENT-END SENT-START 加上無輸出標志。

?

為了避免在 dlog 里出現 warnning, 可在 names beep 同一目錄下分別建立同名的編輯腳本,內容為空即可。

?

(3) ????? 錄制語音數據

HSGen 工具可以生成符合 task grammar 的句子,用來指導錄音:

HSGen -l -n 10 wdnet dict/dict1>labels/trainprompts

HSGen -l -n 1 0 wdnet dict/dict1>labels/testprompts

?????? 根據上述生成的指令文件,錄制相應的 10 個訓練用語音數據 文件和 10 個測試用語音數據 文件。一個錄制例子如下:

HSLab ./data/Train/speech/S0001

?

(4) ????? 標注數據,得到真值文件

perl 腳本 prompts2mlf( 現成的 ) 可以把錄音文本截成單詞級真值文件 trainwords _2 .mlf testwords _2 .mlf

perl scripts/prompts2mlf labels/trainwords _2 .mlf labels/trainprompts

perl scripts/prompts2mlf labels/testwords _2 .mlf labels/testprompts

:將生成的文件 trainwords _2 .mlf testwords _2 .mlf trainwords _1 .mlf testwords _1 .mlf 的格式 "*/S0*.lab" 添加到其文件末尾,并保存為 trainwords.mlf testwords.mlf

標注編輯器 HLEd 可把單詞級真值文本( word level MLF )轉成音素級真值文本( phone level MLF phones0.mlf

HLEd -l * -d dict/dict1 -i labels/phones0.mlf mkphones0.led labels/trainwords.mlf

編輯腳本 mkphones0.led 的內容如下:

?

其中 EX 命令表示按照字典 dict1 進行展開, IS 表示在每個話語的前后插入標志, DE 一行表示 phones0.mlf 中單詞間不用 sp 隔開。

?

(5) ? 數據的特征提取

這里所用特征為 MFCC 。工具 HCopy 可以實現提取特征的工作

HCopy -T 1 -C config/config 1 -S codetr.scp

其中,配置文件 config1 要設置轉換參數(紅色標出), config 內容如下:

# Coding parameters

??? TARGETKIND = MFCC_0_D_A?????????? // 目標文件參數類型

??? TARGETRATE = 100000.0?????????????? // 目標速率, 100 /

?? ? SOURCEFORMAT = WAV ?????????????? // 源文件格式

??? SAVECOMPRESSED = T??????????????? // 以壓縮的方式存儲

??? SAVEWITHCRC = T??????????????????? // 附加校驗和到輸出參數中

??? ZMEANSOURCE=TRUE

??? SOURCERATE=208??????????????????? // 源文件的速率

??? WINDOWSIZE = 250000.0? ???????????? // 25ms 為一幀進行分幀處理

??? USEHAMMING = T??????????????????? // 采用漢明窗,進行加窗處理

??? PREEMCOEF = 0.97?????????????????? // 預加重系數

??? NUMCHANS = 26???????????????????? //26 組濾波器

??? CEPLIFTER = 22????????????????????? // 倒譜濾波系數

??? NUMCEPS = 12?????????????? ???????? // 參數個數

??? ENORMALISE = F??????????????????? // log 能量不進行 歸一

?

實現該命令所需的腳本文件 codetr.scp 可采用如下方式生成: DOS 環境下進入到 wav 文件所在路徑,用 dir/b/s > wav.scp 指令將所有的 wav 文件名寫入到 wav.scp 文件中(注意刪除多出的一行),然后在 Notepad++ 中構造 下圖 所示的文件, coder.scp ( 注:生成的wav.scp 中的文件路徑是絕對路徑,可以手動改成相對路徑)

?

codetr.scp 指定訓練及輸入和輸出文件列表。執行結果, HCopy codetr.scp 文件左側的語音數據 config 1 的配置提取特征并存入 codetr.scp 文件右側特征文件中。

對于測試數據如法炮制。

HCopy -T 1 -C config/config 1 -S codet e .scp

?

2. 創建單音素 HMM 模型

6 )一致初始化法創建單音素模型

?????? 定義一個原始模型 proto:

?

?

訓練文件 train.scp 的生成也是在 DOS 環境下進入到 MFCC 特征的文件路徑下,執行 dir/b/s> train.scp 。需要注意的是要在 Nodepad++ UltraEdit 下把多余的一行刪除掉。

?

用全局均值和方差來初始化 HMM 模型的高斯參數:

HCompV -T 1 -C config/config1 -f 0.01 -m -S train.scp -M hmm s/hmm0 ? proto

?????? 在目錄 hmm0 下生成了更新后的 proto 和一個截至宏 vFloors 。基于 ./hmms/hmm0/ 下的兩個文件,手工制作主宏文件 hmmdefs 和與 vFloors 相關的宏 macro, 具體制作過程參見 HTKbook

?

?

由于暫時不使用 sp 模型,刪除 monophones 0 中的 sp, 構成 monophones 1 文件,重估參數:

HERest ? -C config/config1 - I ? labels/phone s 0.mlf ? - t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm0/macros -H hmms/hmm0/hmmdefs ? -M hmms/hmm1 ? lists/monophones 1

同上,重復估計兩次:

HERes t ? -C ./config/config1 -I ./labels/phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H ./hmms/hmm1/macros -H ./hmms//hmm1/hmmdefs -M ./hmms/hmm2 ./lists/monophones 1

?

HERest ? -C ./config/config1 -I ./labels/phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H ./hmms/hmm2/macros -H ./hmms/hmm2/hmmdefs -M ./hmms/hmm3 ./lists/monophones1

?

(6) ????? 修補啞音素模型

hmm3 中的 macros 復制到 hmm4 中, hmmdefs 中的 sil 復制到文件末尾并將 sil 改為 sp 及狀態改為 3 放到 hmm4

?

(1) 利用 HHEd 加入回溯轉移概率:

HHEd -T 1 -H hmms/hmm4/macros - H hmms/hmm4/hmmdefs -M hmms/hmm5 sil.hed ? lists/monophone s0

修改 mkphones0.led, 去掉最后一行,存為 mkphones1.led ,利用 HLEd 工具得到包含 sp

的音素級真值文本:

HLEd -l * -d ./dict/dict1 -i ./labels/phones1.mlf mkphones1.led ./labels/trainwords.mlf

?

(2) 重估兩次:

HERest -C config/config1 -I labels/phone s0 .mlf -t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm5/macros -H hmms/hmm5/hmmdefs -M hmms/hmm6 ? lists/monophones 0

?

HERest -C config/config1 -I labels/phone s0 .mlf -t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm 6 /macros -H hmms/hmm 6 /hmmdefs -M hmms/hmm 7 ? lists/monophones 0

?

8 )重校準訓練數據

確認 trainwords.mlf 中的路徑為 ”*/S0 * .lab” 并且加上前面的 140 句話 ,修改 dict 1 加入 silence sil 一項,另存為 dict 2 ,執行 HVite 進行 Viterbi 校準:

HVite -l * -o SWT - b silence -C config/config1 -a -H hmms/hmm7/macros ? -H hmms/hmm7/hmmdefs -i labels/aligned.mlf -m -t 350.0 -y lab -I labels/trainwords.mlf -S train.scp ? dict/dict 2 ? lists/monophones 0

?

利用 HERest 重估兩次 ,最后保存到 hmm9

HERest _3.4 -C config/config1 -I labels/aligned.mlf -t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm 7 /macros -H hmms/hmm 7 /hmmdefs -M hmms/hmm 8 ? lists/monophones 0

?

HERest _3.4 -C config/config1 -I labels/aligned.mlf ? -t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm 8 /macros -H hmms/hmm 8 /hmmdefs -M hmms/hmm 9 ? lists/monophones 0

來看看這時的識別率怎么樣

HVite -H ./hmms/hmm 9 /macros -H ./hmms/hmm 9 /hmmdefs -S test.scp -l * -i ./results/recout_step 9 .mlf -w wdnet -p 0.0 -s 5.0 ./dict/dict 2 ./lists/monophones 0

HResults -I ./labels/testwords.mlf ./lists/monophones 0 results/recout_step 9 .mlf

轉載于:https://my.oschina.net/dake/blog/196721

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

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

相關文章

MySQL無法重啟問題解決Warning: World-writable config file '/etc/my.cnf' is ignored

為什么80%的碼農都做不了架構師?>>> 今天幫朋友維護服務器,在關閉數據庫的命令發現mysql關不了,提示Warning: World-writable config file /etc/my.cnf is ignored ,大概意思是權限全局可寫,任何一個用戶都…

用戶體驗分析: 以 “南通大學教務管理系統微信公眾號” 為例

基于實例分析,體會用戶體驗設計的 7 條準則,分析“南通大學教務管理系統微信公眾號” 在用戶體驗設計方面讓你覺得滿意的地方(不少于2點);(20分),請陳述理由。 同樣,分析…

JVM學習筆記(一):Java內存區域

由于Java程序是交由JVM執行的,所以我們在談Java內存區域劃分的時候事實上是指JVM內存區域劃分。在討論JVM內存區域劃分之前,先來看一下Java程序具體執行的過程: 首先Java源代碼文件(.java后綴)會被Java編譯器編譯為字節碼文件(.class后綴)&am…

EdgeRouter X設置外網遠程訪問和HTTPS連接指定出口網關

EdgeRouter X雖然小巧,但功能強大,為方便遠程管理,必須對防火墻進行設置,允許從外部進行訪問,由于公網的80、443端口都已被運營商關閉,必須設置端口轉發才能從外部訪問。一、設置外網遠程訪問通過瀏覽器進入…

overflow妙用--去除默認滾動條,內容仍可滾動

在開發中我們往往要去除默認滾動條&#xff0c;但是其在豎直方向的滾動效果仍然需要。 <div id"parent"><div id"child"><h1>文本區</h1><h1>文本區</h1><h1>文本區</h1></div> </div> #pare…

數據倉庫基礎(二)ETL

本文轉載自&#xff1a;http://www.cnblogs.com/evencao/archive/2013/06/14/3135529.html ETL在數據倉庫中具有以下的幾個特點&#xff1a; 數據流動具有周期性&#xff1a; 因為數據倉庫中的數據量巨大&#xff0c;一般采用成熟的ETL工具去完成抽取、轉換、加載&#xff0c;以…

CSV出力ボタンラッパー(asp.net)[イベントの作り方に役立つ]

為什么80%的碼農都做不了架構師&#xff1f;>>> /// <summary> /// CSV出力ボタンラッパー。 /// </summary> public class CsvOutputButtonWrapper { /// <summary> /// CSV出力ボタン /// </summary> …

結構體變量字節填充

二&#xff1a; &#xff08;1&#xff09;sizeof也可以對一個函數調用求值&#xff0c;其結果是函數返回類型的大小&#xff0c;函數并不會被調用。 &#xff08;2&#xff09;終于搞懂struct結構體內存分配問題了&#xff0c;結構體中各個成員字節對齊遵循以下幾個原則&#…

iOS GoldRaccoon第三方FTP文件夾下載失敗原因

一、問題描述&#xff1a;1.下載失敗報錯&#xff1a; 文件寫入失敗Error DomainNSCocoaErrorDomain Code512 "未能將文件“jquery_1_10_2_min.js”存儲到文件夾“Q20180104153006399”中。" 原因及解決方法&#xff1a;文件夾下均為文件&#xff0c;不包含子文件夾&…

項目UML設計(團隊)

團隊信息 隊名&#xff1a;massivehard 組長&#xff1a;曉輝 隊員&#xff1a;一飛&#xff0c;帥珍&#xff0c;斌豪&#xff0c;錦謀 團隊分工 模塊序號模塊名模塊具體內容1日記編輯添加隨筆2照片選擇選擇照片識別3消息模塊收發消息4個人信息賬號&#xff0c;密碼等負責人分…

安裝asp.net mvc4后mvc3項目編譯報錯

為什么80%的碼農都做不了架構師&#xff1f;>>> 安裝asp.net mvc4之后&#xff0c;之前的mvc3項目編譯時報這個錯“The type System.Web.Mvc.ModelClientValidationRule exists in both c:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.M…

SqlServer SqlBulkCopy批量插入 -- 多張表同時插入(事務)

這段時間在解決一個多個表需要同時插入大量數據的問題&#xff0c;于是在網上找了下&#xff0c;查到說用SqlBulkCopy效率很高&#xff0c;實驗后確實很快&#xff0c;10萬條數據只要4秒鐘&#xff0c;用ef要用40秒。但是我的還需兩張表同時插入&#xff0c;且需要用到事務&…

一介書生,僅此而已

喜歡寫文章&#xff0c;所以很少發隨筆。 嘛~其實是一開始就搞錯隨筆和文章的場景了&#xff0c;遷移太麻煩&#xff0c;有時間自己做個個人博客好了~~轉載于:https://www.cnblogs.com/restartyang/p/7710907.html

POJ 3608 Bridge Across Islands 《挑戰程序設計競賽》

為什么80%的碼農都做不了架構師&#xff1f;>>> POJ 3608 Bridge Across Islands跨島大橋&#xff1a;在兩個凸包小島之間造橋&#xff0c;求最小距離&#xff1f;3.6與平面和空間打交道的計算幾何 凸包 這題原始數據已經是凸包&#xff08;convex polygons&#x…

抓包(Charles工具入門)

一、charles工具簡單使用 1、錄制操作 錄制請求、清空錄制請求&#xff1a; 兩種展示請求的視圖方式&#xff1a; 2、錄制請求的簡單分析 &#xff08;1&#xff09;請求的總覽頁面Overview&#xff1a;可查看請求路徑、請求方式、請求時間等有關該請求的內容 &#xff08;2&am…

探秘創造力

為什么80%的碼農都做不了架構師&#xff1f;>>> 創造力&#xff0c;在很多行業和領域都被視為神奇的存在&#xff0c;大家都希望自己的創造力能夠無限&#xff0c;感覺創造力已經被神話了。其實&#xff0c;一個簡單問題可能很少人能夠明確&#xff1a;”創造力是天…

2017.10.23解題報告

預計分數&#xff1a;100600160 實際分數&#xff1a;100800180 T1 題目描述 現在有一個字符串&#xff0c;每個字母出現的次數均為偶數。接下來我們把第一次出現的字母a和第二次出現的a連一條線&#xff0c;第三次出現的和四次出現的字母a連一條線&#xff0c;第五次出現的和六…

Chrome Android 60.X+ 不能自動播放audio音頻的解決辦法

Chrome Android等一些瀏覽器默認限制了自動播放音頻視頻等&#xff0c;需要用戶有點擊的動作后才可以播放。這樣的原因在于很多用戶流量需要付費&#xff0c;而限制了自動播放可以避免用戶在不知情的情況下產生高額的流量費用。 在60.X版本之前&#xff0c;chrome://flags中有一…

(水一下)Linux啟動步驟(面試題)

1.加載并初始化Linux內核2.配置硬件設備3.內核創建自發進程4.由用戶決定是否進入手工引導模式5.init進程執行系統啟動腳本6.進入多用戶模式轉載于:https://blog.51cto.com/12942223/2408649

【WebGL】《WebGL編程指南》讀書筆記——第5章

一、前言 終于到了第五章了&#xff0c;貌似開始越來越復雜了。 二、正文 Example1&#xff1a;使用一個緩沖區去賦值多個頂點數據&#xff08;包含坐標及點大小&#xff09; function initVertexBuffers(gl) {var verticesSizes new Float32Array([0.0, 0.5, 10.0, -0.5, …