這次來訓練一個基於CNN的語音識別模型。訓練完成后,我們將嘗試將此模型用於Hotword detection。
人類是怎樣聽懂一句話的呢?以漢語為例,當聽到“wo shi”的錄音時,我們會想,有哪兩個字是讀作“wo shi”的,有人想到的是“我是”,也有人覺得是“我市”。
我們可以通過”wo shi”的頻率的特征,匹配到一些結果,我們這次要訓練的模型,也是基於頻率特征的CNN模型。單純的基於頻率特征的識別有很大的局限性,比如前面提到的例子,光是聽到“wo shi”可能會導致產生歧義,但是如果能有上下文,我們就可以大大提高“識別”的成功率。因此,類似Google Assistant那樣的識別,不光是考慮到字詞的發音,還聯系了語義,就算有一兩個字發音不清,我們還是能得到正確的信息。
但是基於頻率特征的模型用作Hotword detection還是比較合適的,因為Horword通常是一兩個特定的詞,不需要聯系語境進行語義分析。
准備訓練數據集
開源的語言數據集比較少,這里我們使用TensorFlow和AIY團隊推出的一個數據集,包含30個基本的英文單詞的大量錄音:
下載地址
這個數據集只有1G多,非常小的語音數據集,不過用來實驗是完全夠的。
運行docker並掛載工作目錄
新建一個speech_train文件夾,並在其中創建子文件夾dataset,logs,train,它們將用於存放數據集,log和訓練文件。解壓數據集到dataset,然后運行docker:
1 |
docker run -it -v $(pwd)/speech_train:/speech_train |
使用默認的conv模型開始訓練
1 |
cd /tensorflow/ |
在這里我們指定希望識別的label: one,two,three,four,five,marvin。數據集的其他部分將被歸為unknown
使用TensorBoard使訓練可視化
我們可以通過分析生成的log使訓練過程可視化:
1 |
大專欄 使用TensorFlow訓練自己的語音識別AI class="line">tensorboard --logdir /speech_train/logs |
運行指令后,可以通過瀏覽器訪問本地的6006端口進入TensorBoard。下圖是使用conv模型完成18000 steps 訓練的過程圖:
訓練花了差不多15個小時。
生成pb文件
訓練完成后,我們需要將其轉化為pb文件:
1 |
python tensorflow/examples/speech_commands/freeze.py |
完成后,我們將得到一個名為conv.pb的文件,配合包含可識別label的txt文件就可以直接使用了。
測試
使用測試腳本進行測試:
1 |
python tensorflow/examples/speech_commands/label_wav.py |
訓練的模型應能正確識別出marvin。
使用准確度較低但是預測更快的low_latency_conv模型
我們可以使用另外一種准確度較低但是預測更快的low_latency_conv模型進行訓練:
1 |
python tensorflow/examples/speech_commands/train.py |
當使用該模型時,可以適當增加training steps和learning rate。在這種情況下,訓練的時間大大縮短了:
只花了不到3小時.
其他
也可以使用gpu版本的tensorflow進行訓練,速度可以提升不少哦。