本節將說明如何使用 ASRA 來對華語進行辨識與評分,此說明適用於 WIN 平台。對於其他平台的說明,請見: 請由下列網址下載 ASRA package: 本頁將說明如何使用 ASRA package 所提供的程式庫檔案(.lib 和 .dll 檔案)來編譯以命令列為主的範例程式。根據此範例程式,使用者即可整合語音辨識與評分的功能於各種應用程式之中。
- 語音辨識
語音辨識的主要程式是 vcLibFile.cpp。若要編譯 vcLibFile.cpp,請進入 mainProgram 後,直接執行 goMainCompile.bat,即可抓取 lib 目錄下的相關程式庫,直接對 mainProgram 之下的所有主程式進行編譯。(本範例使用 VC 進行在命令列的編譯,因此在使用此範例前,請先確認你你的系統有安裝 VC,並且有加入搜尋路徑。)編譯後產生 vcLibFile.exe,其用法如下:
vcLibFile recogParamFile wavFile txtFile
相關參數用法,說明如下:
- recogParamFile: 這是一個參數檔,記錄語音辨識所用到的各種參數。(相關參數說明,可見此範例檔案內容:testInputChinese/chinese.vc.prm。)
- wavFile: 這是一個語音檔案,記錄使用者由麥克風錄製的一句話,檔案格式必須是 16 KHz, 16-bit, Mono,錄音長度不超過10秒。
- txtFile: 這是一個文字檔案,記錄可辨識的文句,每一句必須換列。目前所支援的文字格式是中文大五碼(big5)。
下達上述命令後,此程式將會根據語音內容來進行比對,並由可辨識文句中,選出最有可能的句子,並用一個介於 0 到 100 之間的分數來代表其信心度(confidence measure)。換句話說,如果分數不高,代表辨識結果可能不可靠,反之,如果分數越高,代表辨識結果的可信度很高。
本程式除了可以進行辨識外,也內建標注音功能,因此能夠考慮文句所對應的所有可能注音組合,例如,當文句是「朝辭白帝彩雲間」時,可能會對應到四種唸法,這四種唸法都可以讓系統進行正確的辨識:
- 朝(ㄓㄠ )辭白(ㄅㄞˊ)帝彩雲間
- 朝(ㄓㄠ )辭白(ㄅㄛˊ)帝彩雲間
- 朝(ㄔㄠˊ)辭白(ㄅㄞˊ)帝彩雲間
- 朝(ㄔㄠˊ)辭白(ㄅㄛˊ)帝彩雲間
本目錄也包含了一些範例,所用的可辨識文句是 tangPoem3223.txt,包含了唐詩三百首的每一句,共含有3223句唐詩。請先開啟 DOS 視窗,同時改變目錄至 ASRA 的主目錄,即可直接進行測試,用法及說明如下:
- 請直接在命令列下達「mainProgram\vcLibFile testInputChinesechinese.vc.prm testInputChinese\朝辭白帝彩雲間01.wav testInputChinese\tangPoem3223.txt」,辨識結果是「朝辭白帝彩雲間」。
說明:本範例的音檔(朝辭白帝彩雲間01.wav)的唸法是「朝(ㄓㄠ )辭白(ㄅㄞˊ)帝彩雲間」,分數是 84.8051 。- 請直接在命令列下達「mainProgram\vcLibFile testInputChinesechinese.vc.prm testInputChinese\朝辭白帝彩雲間02.wav testInputChinese\tangPoem3223.txt」,辨識結果是「朝辭白帝彩雲間」
說明:本範例的音檔(recog 朝辭白帝彩雲間02.wav)的唸法是「朝(ㄔㄠˊ)辭白(ㄅㄛˊ)帝彩雲間」,分數是 89.194 。(由此範例可知道本程式可以處理破音字的問題。)- 請直接在命令列下達「mainProgramvcLibFile testInputChinesechinese.vc.prm testInputChinese長安不見使人愁.wav testInputChinese angPoem3223.txt」,辨識結果是「長安不見使人愁」,分數是 89.8734 。
- 請直接在命令列下達「mainProgramvcLibFile testInputChinesechinese.vc.prm testInputChinese主人下馬客在船.wav testInputChinese angPoem3223.txt」,辨識結果是「主人下馬客在船」,分數是 96.3018 。
其他相關的範例腳本檔都放在 script4winChinese,你可以直接檢視檔案內容,即可看到相關資訊。
在上述說明的用法中,我們並沒有指定注音,因此系統會根據可能的破音字,來產生所有可能的組合,這樣做的好處是不需要事先對可辨識文句標示注音,但也有下列兩項壞處:
- 需要查詢破音字表以產生所有的組合,速度較慢。
- 需要比對的文字變多,除了速度變慢外,辨識率也可能下降。
若希望避開上述第一點壞處來加快辨識速度,我們可以先產生可辨識文句所對應的標音檔案等,然後在命令列指定這些檔案,方法如下:
- 先執行一般「未指定標音檔案」的辨識,例如:
mainProgramvcLibFile testInputChinesechinese.vc.prm testInputChinese長安不見使人愁.wav testInputChinese angPoem3223.txt
- 拷貝下列檔案至目前目錄:
- output\output.syl ===> tangPoem3223.syl
- output\output.net ===> tangPoem3223.net
- 此時再執行下列「指定標音檔案」及「指定辨識網路檔案」的辨識,速度即可變快:
mainProgramvcLibFile testInputChinesechinese.vc.prm testInputChinese長安不見使人愁.wav testInputChinese angPoem3223.txt 0 output tang3223.syl tangPoem3223.net
若希望避開上述第二點壞處,方法很類似,如下:
- 先執行一般「未指定標音檔案」的辨識,例如:
mainProgramvcLibFile testInputChinesechinese.vc.prm testInputChinese長安不見使人愁.wav testInputChinese angPoem3223.txt
- 拷貝下列檔案至目前目錄:
然後砍掉不正確的發音方式。(在此檔案內的每一列,即代表一種發音方式,而每一列的尾端數字即代表在 tangPoem3223.txt 對應的文句編號。)
- output\output.syl ===> tangPoem3223.syl
- 此時再執行下列「指定標音檔案」的辨識,即可根據修改後的標音檔案來進行比對:
mainProgramvcLibFile testInputChinesechinese.vc.prm testInputChinese長安不見使人愁.wav testInputChinese angPoem3223.txt 0 output tang3223.syl
- 若還仍嫌速度不夠快,則可在進行上述辨識後,拷貝下列檔案至目前目錄:
- output\output.net ===> tangPoem3223.net
- 此時再執行下列「指定標音檔案」及「指定辨識網路檔案」的辨識,速度即可變快:
mainProgramvcLibFile testInputChinesechinese.vc.prm testInputChinese長安不見使人愁.wav testInputChinese angPoem3223.txt 0 output tang3223.syl tangPoem3223.net
- 語音評分
語音辨識的主要程式是 saLibFile.cpp。若要編譯 saLibFile.cpp,請進入 mainProgram 後,直接執行 goMainCompile.bat,即可抓取 lib 目錄下的相關程式庫,直接對 mainProgram 之下的所有主程式進行編譯。(本範例使用 VC 進行在命令列的編譯,因此在使用此範例前,請先確認你你的系統有安裝 VC,並且有加入搜尋路徑。)編譯後產生 saLibFile.exe,其用法如下:
saLibFile recogParamFile wavFile txtFile
這些命令列的參數意義同前所述。下達上述命令後,此程式將會根據語音與文字內容,進行比對,並把每一個文字所對應的語音切出來,然後根據語音所對應的聲學模型,計算相似度,最後算出來一個分數,代表此段語音與文字之間的契合度,並用一個介於 0 到 100 之間的分數來表示。換句話說,如果分數不高,代表咬字不清;反之,如果分數越高,代表此人的咬字清晰,字正腔圓。相關的應用面如下:
- 以電腦來輔助學習的口說華語評分系統
- 卡拉OK的咬字評分系統
- 語音和文字的自動對應(Speech & Text Alignment),以便用於其他處理,例如文字轉語音(TTS, Text-to-speech)的語料自動切音
本目錄也包含了一些範例音檔,對應的標準文句是「朝辭白帝彩雲間」(寫在 朝辭白帝彩雲間.txt),用法及說明如下:
- 請直接在命令列下達「mainProgramsaLibFile testInputChinesechinese.sa.prm testInputChinese est1.wav testInputChinese朝辭白帝彩雲間.txt」,辨識結果是
分數:80.5309 分
說明:本範例的音檔(test1.wav)的唸法是「朝(ㄓㄠ )辭白(ㄅㄞˊ)帝彩雲間」。- 請直接在命令列下達「mainProgramsaLibFile testInputChinesechinese.sa.prm testInputChinese est2.wav testInputChinese朝辭白帝彩雲間.txt」,辨識結果是
分數:88.6375 分
說明:本範例的音檔(test2.wav)的唸法是「朝(ㄔㄠˊ)辭白(ㄅㄛˊ)帝彩雲間」。(由此範例可知道本程式可以自動找出每個文字所對應的破音字,並根據音檔來找出最有可能的破音字發音。)- 請直接在命令列下達「mainProgramsaLibFile testInputChinesechinese.sa.prm testInputChinese est3.wav testInputChinese朝辭白帝彩雲間.txt」,辨識結果是
分數:70.9934 分
說明:本範例的音檔(test3.wav)的唸法是「朝辭黑帝黑雲間」。- 請直接在命令列下達「mainProgramsaLibFile testInputChinesechinese.sa.prm testInputChinese est4.wav testInputChinese朝辭白帝彩雲間.txt」,辨識結果是
分數:65.9982 分
說明:本範例的音檔(test4.wav)的唸法是「朝辭ABCDE」。- 請直接在命令列下達「mainProgramsaLibFile testInputChinesechinese.sa.prm testInputChinese est5.wav testInputChinese朝辭白帝彩雲間.txt」,辨識結果是
分數:38.2368 分
說明:本範例的音檔(test5.wav)的唸法是「千里江陵一日還」,和標準文句差很多,所以分數很低。- 請直接在命令列下達「mainProgramsaLibFile testInputChinesechinese.sa.prm testInputChinese est6.wav testInputChinese朝辭白帝彩雲間.txt」,辨識結果是
分數:11.5716 分
說明:本範例的音檔(test6.wav)的唸法是狗叫聲,和標準文句完全不同,所以分數很低。雖然本程式碼可以自動找出每個文字所對應的破音字,並根據音檔來找出最有可能的破音字發音,但是這不見得是正確的作法,例如前述的「朝辭白帝彩雲間」,「朝」必須唸成「ㄔㄠˊ」,而「白」可以念成「ㄅㄞˊ」或「ㄅㄛˊ」。若要指定這樣的正確念法,我們可以先準備 *.syl 的發音檔案,用法及說明如下:
- 請直接在命令列下達「mainProgramsaLibFile testInputChinesechinese.sa.prm testInputChinese est2.wav testInputChinese朝辭白帝彩雲間.txt 0 output correct1.syl」,辨識結果是
分數:75.23 分
說明:本範例的音檔(test2.wav)的唸法是「朝(ㄔㄠˊ)辭白(ㄅㄛˊ)帝彩雲間」,而記錄在 correct1.syl 的正確念法是「朝(ㄓㄠ )辭白(ㄅㄞˊ)帝彩雲間」,因此分數不理想。- 請直接在命令列下達「mainProgramsaLibFile testInputChinesechinese.sa.prm testInputChinese est2.wav testInputChinese朝辭白帝彩雲間.txt 0 output correct2.syl」,辨識結果是
分數:85.85 分
說明:本範例的音檔(test2.wav)的唸法是「朝(ㄔㄠˊ)辭白(ㄅㄛˊ)帝彩雲間」,而記錄在 correct2.syl 的正確念法是「朝(ㄓㄠ )辭白(ㄅㄞˊ)帝彩雲間」或「朝(ㄓㄠ )辭白(ㄅㄛˊ)帝彩雲間」,因此分數高於前一個範例。- 其他相關說明
在執行上述範例程式時,所有相關的輸出檔案,都會寫到 output 目錄下。比較常用到的檔案如下:
- output/cm.xml: 此檔案記錄評分的細節,包含每個音素的時間區間、分數、混淆音、log likelihood 等。
- output/recogResult.txt: 此檔案記錄辨識結果、總分、長庚拼音、國語注音、漢語拼音、音調、對數機率等資訊。
- output/phone.lab: 此檔案記錄每一個音節以及每一個 phone 的開始和結束時間,以 100 ns ( = 10e-7 s) 為單位。
- output/phone.cmd: 此檔案記錄每一個音節以及每一個 phone 的開始和結束時間,包含每一個phone以及每一個syllable的分數。
- output/score.txt: 此檔案記錄最後的評分分數。(若未開啟評分機制,則不產生此檔案。)
請注意:
- 在上述檔案中,cm.xml 和 phone.cmd 的拼音方式是根據內部所用的語音模型(可能是長庚拼音或是漢語拼音)而定,,若要轉成其他拼音方式(例如國語注音或漢語拼音),可以使用拼音對照表:asraData/chinese/pinyinTable.txt(格式:第一直行是音碼,第二直行是長庚拼音,第三直行是國語注音,第四直行是漢語拼音。)。
- vcLibFile/saLibFile 在螢幕上所印出的訊息,通常只是用來除錯,因此常會變動,請勿直接抓取訊息來作為程式的輸出。若要取得程式的輸出,請直接抓取 output 目錄下的檔案。
- 在呼叫 vcLibFile/saLibFile 前,請先刪除 output 目錄下的檔案,以避免「在 vcLibFile/saLibFile 出錯的情況下(例如未完成完整執行),外部程式從 output 目錄取得前一次執行結果」的錯誤情況。
事實上,vcLibFile 或 saLibFile 可以接受更多的輸入參數,直接在命令列視窗輸入 vcLibFile 或 saLibFile 後,即可列出所有可用的參數。請注意:命令列的參數若和 recogParamFile 的內容有所衝突,則以命令列為主。
有關信心度分數的計算,請直接閱讀 vcLibFile.cpp 或 saLibFile.cpp 程式碼中有關於「列出評分細節」的部分。(請將「// ====== 列出評分細節」此列之前的 「exit(0);」 註解掉,再重新編譯及執行,就可以列印出評分細節。)。基本上所有的評分資訊都是儲存在 myMlf 的物件(例如 myMlf.m_finalScore 代表最後計算出來的總分),只要直接取用即可。(當然,也可以從 output/phone.cmd 讀出評分細節,結果是相同的。)
若要加速語音評分的計算速度,可以參考前述加速語音辨識的方法,在此不再贅述。
若在使用上有任何問題,請和張智星()聯繫,謝謝。
Audio Signal Processing and Recognition (音訊處理與辨識)