跳到主要內容

Mozilla Deep Speech 中文心得

因為一些特殊原因
導致我需要開始接觸 Speech to text (STT) 這塊領域
完全對這方面不熟,於是乎就開始了收集資料之旅
有些推薦的教學影片如果有想知道STT如何實踐的,可以去看李宏毅老師的影片
真的看完就豁然開朗了起來!!!
建議有興趣的可以去看看

這篇主要是怕自己忘記如何實踐Deep speech for 中文
因為在 discourse.mozilla.org 看了很多篇
慢慢整理
所以有了這篇的紀錄 來記錄自己的心路歷程

首先是數據的部份
訓練的語料庫我是用THCHS30的 open data (期待之後Common voice 出中文的資料集)
還有一些自己錄的音檔、TED的影片&字幕 等等
THCHS30的資料下載點: http://www.openslr.org/18/
有興趣的人也是可以去下載 AISHELL 的資料
AISHELL 下載點:http://www.openslr.org/33/

只是這兩個資料都需要稍稍整理一下

正文開始!

1. 需要建立自己的alphabet.txt
因為是中文 所以不能用Deep speech的alphabet.txt (因為裡面是a b c d)
所以需要添加自己的中文字(是字不是詞)
所有語料庫中 有出現過的字 都必須出現在這份檔案中
所以我就... 寫個小小的script 把所有transcript中的字都塞進去這裡面
因為中文字大概有幾萬個字吧...慢慢列是會要人命的...
當然網路上可能有大神們整理過的 找找看或許有吧


2. 建立 train, dev, test 三個資料夾
然後把音檔全部都丟丟進去
分配的比率 看個人喜好
我自己是 70 : 20 : 10
見仁見智

然後建立 train.csv, dev.csv, test.csv
這三個csv中,應該有三種資料 (依序):路徑、檔案大小(bytes)、音檔對應到的文字(transcript)

大概像是這樣子:

wav_filename,wav_filesize,transcript
data/thchs30_data/test/D11_750.wav,333356,東 北 軍 的 一 些 愛 國 將 士 馬 佔 山 李 杜 唐 聚 伍 蘇 炳 艾 鄧 鐵 梅 等 也 奮 起 抗 戰
data/thchs30_data/test/D11_751.wav,228204,王 英 漢 被 槍 斃 後 部 分 餘 孽 深 藏 起 來 幾 次 圍 捕 均 未 抓 獲
...



因為THCHS30本身就有transcript了
所以只需要做一些加工 加入檔案大小就可以了
並且將每個中文字中間做空白區隔



3.建立中文 lm.binary & trie

在這裡是用KenLM 來做
Github連結:https://github.com/kpu/kenlm
記得先自己compile過一次這個專案

把只有transcript(沒有檔案大小、路徑)的檔案複製到kenlm的目錄下,命名成vocabulary.txt
然後執行:


./lmplz --text vocabulary.txt --arpa  words.arpa --o 3


後面那個 3 是代表 n-gram的n
這裡表示說只取到 3-gram 可以根據自己的喜好來改
一般來說 取到 3-gram就蠻夠的了

接著把檔案轉成binary
./build_binary -T -s words.arpa  lm.binary

4. 建立 tire 檔
在開始之前
先去 DeepSpeech 把 native_client 下載下來:
https://github.com/mozilla/DeepSpeech/blob/master/native_client/README.md

如果跟我一樣是用 mac 的話
記得加上 --arch osx  在DeepSpeech 專案目錄下:
python3 util/taskcluster.py --arch osx --target .

然後執行:(記得把路徑換成你的路徑)
native_client/generate_trie DeepSpeech/data/alphabet.txt DeepSpeech/data/lm/lm.binary DeepSpeech/data/lm/vocabulary.txt DeepSpeech/data/trie

就可以得到tire啦~


5. 訓練模型

感謝有人在試參數
於是乎 我就直接把他建議的參數拿來用了(感謝 jackhuang 大大)
在這裡 只需要下:

python -u DeepSpeech.py  --train_files data/train.csv  --dev_files data/dev.csv  --test_files data/test.csv   --n_hidden 512  --epoch 20   --learning_rate 0.0001 --train_batch_size 80 --dev_batch_size 80 --test_batch_size 40 --validation_step 1 --early_stop True --dropout_rate 0.22 --estop_std_thresh 0.1 --earlystop_nsteps 6 --report_count 100 --use_seq_length False  --export_dir results/model_export/  —checkpoint_dir results/checkout/  --decoder_library_path ../Native_Client/libctc_decoder_with_kenlm.so  --alphabet_config_path data/alphabet_new.txt  --lm_binary_path data/lm.binary  —lm_trie_path data/trie 


重點只在於
你要確定你的 train, dev, test 三個資料夾中的檔案是否都有對應到 train.csv, dev.csv, test.csv 中所描述的路徑

有的話
就開始...慢慢等吧!(誠心建議不要在mac上跑)


後記:
補充一下
在這裡我所用的所有音檔規格都是:mono, 16kHz, 16bits
實際效果如何,我沒有仔細測試
因為訓練資料真的太少了 估計效果也不是很好
待有充足資料後(等 Common voice 專案 release 中文) 再來做完整測試跟訓練











留言

張貼留言