將百度DeepSpeech的keras後端由theano改爲tensorflow,整合mozilla解碼模塊進行中文語音識別模型部署,以下稱deepspeech-enhance模型。
文章目錄
項目背景
這是我調整了整整一年後落地的項目,效果能和科大訊飛媲美,不如訊飛的點是識別結果中沒有標點符號,在特定領域準確率極高。
國內中文語音識別相關的有用資料很少,技術相對封閉,搜索引擎中能找到的方法基本上都是10年前的傳統方法,早已過時。
在這個過程中踩了很多坑(開始兩個月嘗試先轉拼音再轉文字,fail),請教了很多人,很多個夜晚睡不着覺,想盡一切辦法積累數據,有很多次會想放棄,持續專注的做了一年,最終呈現一個效果還不錯的結果。
很贊同季逸超的觀點,互聯網領域的idea不值錢,實現也不值錢,值錢的是“經過沉澱的idea + 反覆推敲地執行”
一、和百度deepspeech 2 的不同點
1.框架選擇
背景:2019年3月12號接受了新採購的GPU機器一臺,由於新機器適配的驅動版本太高(2019年2月發佈),deepspeech 2轉寫模型使用的深度學習框架theano偏學術研究,theano的開發團隊在17年就加入了google,已經停止維護,theano不支持分佈式,相比之下tensorflow框架更偏工程,已經是主流框架,支持分佈式,支持新硬件,我們有必要對轉寫工程做框架調整。
deepspeech 2模型框架:theano_0.8.2、keras_1.1.0
deepspeech-enhance模型框架:tensorflow_1.13.1、keras_2.2.4
分析:根據調研資料顯示,tensorflow新版本相比theano可以帶來性能上一倍的提升,同時需要更大的內存。
2.聲學模型結構
在模型結構上主要做了6項調整,分析了每個調整項帶來的影響:
調整項 | deepspeech 2模型 | deepspeech-enhance模型 | 準確率 | 性能 | 資源佔用 | 說明 |
---|---|---|---|---|---|---|
網絡結構 | 1D_CNN+3*GRU | 1_DCNN+3*BiGRU | 有提升 | 降低近一倍 | 更大的內存 | 現在雙向網絡已是主流,transformer、bert等都是雙向網絡 |
損失函數 | warp-ctc(baidu出品) | tensorflow-ctc(google出品) | 不確定 | 降低一點 | 不確定 | 前者是batch緯度計算損失,並行度高,但是訓練階段容易出現長尾問題;後者是樣本緯度計算損失,訓練過程不會出現長尾問題 |
輸出節點數 | 26個英文字母+2 | 4563個常用漢字 | 降低 | 降低一點 | 增加 | 漢字共有6000左右,統計發現有一千五百多個生僻字出現在日常對話中的概率極低 |
語音幀長 | 20ms | 25ms | 有一點提升 | 提升一點 | 更小的內存 | - |
採樣率 | 16k | 8k | 有一點降低 | 提升 | 更小的內存和磁盤 | 工業使用中在保證效果的前提下節省一半空間 |
參考論文:http://proceedings.mlr.press/v48/amodei16.pdf
3.其他調整項
(1)卷積層輸出處理:忽略卷積層的前兩位輸出,因爲它們通常無意義,且會影響模型最後的輸出;
(2)BN層處理:最後一次訓練凍結BN層,傳入加載模型(純開源數據訓練的)的移動均值和方差。
調整後準確率平均提升2個百分點
4.增加beam search和n-gram組合解碼模塊(這裏是重點)
- deepspeech 2 模型是貪婪搜索解碼
- deepspeech-enhance的解碼模塊使用現在GitHub 上比較熱門的mozilla基金會實現的beam search解碼模型,n-gram的作用就是進一步糾錯。
關於解碼
爲了在解碼過程中整合語言模型信息,Graves&Jaitly(2014)使用其經過CTC訓練的神經網絡對由基於HMM的最新系統生成的晶格或n最佳假設列表進行評分。 這引入了潛在的混淆因素,因爲n最佳列表會很大程度上限制可能的轉錄集。 另外,它導致整個系統仍然依靠HMM語音識別基礎結構來獲得最終結果。 相反,我們提出的首遍解碼結果使用神經網絡和語言模型從頭開始解碼,而不是對現有假設進行重新排序。
以上來自論文:https://arxiv.org/pdf/1408.2873.pdf
二、測試結果
1.開源數據
100條數據堂電話語音數據上平均字錯率0.02,句錯率0.06
詳細見./test_result/recongnnize_result.txt
列舉幾個準確率(1-編輯距離)不等於1的case,可以看到語言模型真正起到了糾錯的作用。
語音 | label | predict | acc |
---|---|---|---|
G2425/session01/T0055G2425S0213.wav | 我不是發給你了麼 | 我不是發給你了嗎 | 0.875 |
G1978/session01/T0055G1978S0487.wav | 你那有什麼服務價格多少 | 你那裏有什麼服務價格多少 | 0.90909091 |
G2863/session01/T0055G2863S0065.wav | 週末大掃除沒空啊 | 週末大掃除沒空 | 0.875 |
G1940/session01/T0055G1940S0496.wav | 那你也不給我說一聲 | 那你也不跟我說一聲 | 0.88888889 |
2.垂直領域效果
貼上自己錄音的識別效果:
三、deepspeech 環境搭建
新建虛擬環境:conda create -n tensorflow python=3.6
激活虛擬環境:source activate tensorflow
1.安裝tensorflow:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow==1.13.1
2.安裝keras:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple keras==2.2.4
3.安裝語音流處理模塊:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple soundfile==0.10.2
訓練環境安裝前三個就可以,測試環境需要後面兩個
4.安裝beam search解碼模塊(解碼模塊使用mozilla項目裏面的):pip install https://index.taskcluster.net/v1/task/project.deepspeech.deepspeech.native_client.v0.5.0-alpha.11.cpu-ctc/artifacts/public/ds_ctcdecoder-0.5.0a11-cp36-cp36m-manylinux1_x86_64.whl
報錯platform不支持的話在mozilla的DeepSpeech裏面執行進行安裝:pip install $(python util/taskcluster.py --decoder)
gpu版:pip install https://index.taskcluster.net/v1/task/project.deepspeech.deepspeech.native_client.v0.5.0-alpha.11.cpu-ctc/artifacts/public/ds_ctcdecoder-0.5.0a11-cp35-cp35m-manylinux1_x86_64.whl
5.讀字節流:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pydub
四、訓練調參經驗
參數 | 調整 | 分析 |
---|---|---|
數據過度 | 先開源數據,後業務數據 | 先用開源數據做預訓練使模型收斂,再用垂直領域的業務數據做fine-tune |
batch size | 16 | 嘗試過16、32、64,設置16的情況下訓練效果最好。batch size變小,數據擬合能力更好,訓練時長會更長 |
驗證集大小 | 3000 | 放大驗證集,結果更有說服力,訓練時長會更長 |
優化器 | adam | 嘗試過adam、SGD、adam+SGD、NAG。adam學習率自適應,比較智能 |
學習率 | 2e-4 - 4e-6 | 前期學習率大一點,後期小一點。loss出現nan,一般來說是學習率太大,應該減小學習率 |
五、失敗的嘗試
調整 | 失敗原因 |
---|---|
聲學模型映射1400個帶聲調的拼音 | 聲調的特徵不是獨立佔位的,其特徵包含在拼音的位置裏面,而ctc損失計算的本質是給每一幀做分類,所以這樣訓練的效果並不好。 |
聲學模型映射410個不帶聲調的拼音 | 映射單元減少了準確率提升特別大,單純音頻轉拼音這個環節的準確率提升很大,準確率很高,beam search解top-n能保證極高的召回率,但是拼音進一步轉漢字的階段效果很差,主要是在短句上的效果不好,長句上的效果還不錯,這個階段和拼音輸入法的原理一樣。 |
貢獻者名單
姓名 | 屬性 | 主要貢獻 |
---|---|---|
陶瑞 | 項目負責人 | 聲學模型調整、聲學模型數據收集和調整,模型訓練及整體技術選型 |
盛長霞 | 團隊成員 | 語言模型調整、語言模型數據收集和調整、語音端點檢測算法實現、mozilla工程梳理 |
劉堯 | 團隊成員 | 工程運維、數據收集 |
蔣志宇 | 團隊成員 | 服務部署 |
袁文傑 | 外援 | 協助 |
趙若琪 | 團隊成員 | 參與deepspeech2梳理 |
張瑞雄 | 外援 | 答疑解惑 |
檸檬博主 | 外援 | 答疑解惑 |
其他幫我答疑的同學暫時想不起來,想起來再補充,這裏再次感謝以上同學對該項目的貢獻。