基於tensorflow和deepspeech的中文語音識別模型,訓練+部署

將百度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梳理
張瑞雄 外援 答疑解惑
檸檬博主 外援 答疑解惑

其他幫我答疑的同學暫時想不起來,想起來再補充,這裏再次感謝以上同學對該項目的貢獻。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章