語音識別技術

mi_zy發表於2018-03-04

語音識別背後的技術

——GPU叢集+DNN演算法


專業名詞:

1、Automatic Speech Recognition (ASR):

2、deep neural network(DNN): 深度神經網路

3、Deep learning(DL):深度學習

4、Restricted Boltzmann Machine (RBM):限制波爾茲曼機

5、Deep Belief Networks(DBNs):深度信念網路

6、NVIDIA  GeForce GTX 1080:8G視訊記憶體,訓練DNN的GPU


關鍵字:

語音識別、語義分析、深度神經網路、深度學習、深度信念網路、標籤

*:標準空管指令的訓練語音資料大約800小時,字錯誤率10%左右。

*:語音識別和語義解析 都是主要基於DNN實現的。

問題:

1、      使用成都空管記錄儀的管制語音的訓練的模型不適合用於太原現場。那在實驗室使用PCM傳輸的管制語音訓練的模型,適用直接從內話引接語音的情況嗎?還有假如更換內話系統之後呢?或使用VHF共用系統透過傳輸裝置來到語音呢?

2、      當識別率達到80%以上,即管制員可作為參考使用的水平時,做標籤訓練的工作由管制員完成更合適,需要提供維護介面,用於持續提高識別率水平。

3、      增加一臺終端放置在管制大廳管制主任席,引接實驗室語音識別的訊號。

4、       開發的Pad終端,建議每個Pad只顯示當前席位管制扇區的管制狀態綜合航跡,並引接當前扇區的對空指揮話音用於完成輔助提示等應用。


一、深度學習框架:

學習深度學習框架,要用到keras庫,keras可以搭建在tensorflow和theano上。Keras 可以基於兩個Backend,一個是 Theano,一個是 Tensorflow。如果我們選擇Theano作為Keras的Backend, 那麼Keras就用 Theano 在底層搭建你需要的神經網路;同樣,如果選擇 Tensorflow 的話呢,Keras 就使用 Tensorflow 在底層搭建神經網路。Keras 切換後端(Theano和TensorFlow)

keras的GPU模式安裝- theano 後端:

http://blog.csdn.net/dexter_morgan/article/details/53872900

二、訓練DNN 聲學模型:

一個神經網路就是一個分類工具,能夠將一些新的特徵(如聲學特徵)分類到某一個 class。DNN 的輸入 nodes 一般為 39 維的 MFCC 特徵,輸出的 nodes 為相關的 labels(eg: 900 個輸出 <-> 900 個 context-dependent triphones[即 decision tree leaves])。也就是說:Acoustic features 用於訓練 GMM-HMM 和 decision tree,這兩部分是 Acoustic model(input layer and outlayer) 建模的關鍵部分。

Keras用MNIST資料集訓練一個DNN。
——帶標籤資料訓練, Keras以Numpy陣列作為輸入資料和標籤的資料型別。訓練模型一般使用fit函式。Keras用帶標籤資料訓練集訓練DNN。
標籤分兩種:一種是語音識別的標籤,也就是我們識別出來的語音文字,要去人工修改為正確的。另一種是語義解析的標籤,也就是基於語音識別的文字資訊,我們要標出來哪些是航班號,哪些的意圖等等。


三、語音識別:

微軟研究人員透過與hinton合作,首先將RBM和DBN引入到語音識別聲學模型訓練中,並且在大詞彙量語音識別系統中獲得巨大成功,使得語音識別的錯誤率相對減低30%。但是,DNN還沒有有效的並行快速演算法,很多研究機構都是在利用大規模資料語料透過GPU平臺提高DNN聲學模型的訓練效率。

——2006 年,Hinton 等人基於受限波爾茲曼機(Re- stricted Boltzmann Machines, RBMs)提出的深度信念網路(Deep Belief Networks, DBNs)是深度學習理論在機器學習領域打響的第一槍,併成為了其後至今深度學習演算法的主要框架。

——(cnn深度神經網路)最開始的改進是使用GPU來加速訓練,GPU可以看成一種SIMT的架構,和SIMD有些類似,但是執行相同指令的warp裡的32個core可以有不同的程式碼路徑。對於反向傳播演算法來說,基本計算就是矩陣向量乘法,對一個向量應用啟用函式這樣的向量化指令,而不像在傳統的程式碼裡會有很多if-else這樣的邏輯判斷,所以使用GPU加速非常有用。


在國際上,IBM、google等公司都快速進行了DNN語音識別的研究,並且速度飛快。理論認為人的認知模式,處事方式是儲存在神經元與神經元之間的連線上的,稱為“神經元連線權重”,人腦神經佈局類似網狀結構,神經元是網的交叉點,權重就是網的連線,這些連線有粗有細,也就是權重的大小不同。而人類的學習能力就是去不斷改變權重的值,從而改變自己的認知模式和處事方式,簡單的說,不同人對同一個外部事物有不同看法,就是因為同樣的初始訊號,在不同粗細的神經元連線放大或縮小後,變成了側重點不同的最終訊號。


神經網路簡單說就是輸入是訓練資料,中間是隱藏節點,輸出是標籤。訓練資料可以以一定的權重啟用隱藏節點,隱藏節點啟用輸出標籤。


如何訓練:

既然我們希望網路的輸出儘可能的接近真正想要預測的值。那麼就可以透過比較當前網路的預測值和我們真正想要的目標值,再根據兩者的差異情況來更新每一層的權重矩陣(比如,如果網路的預測值高了,就調整權重讓它預測低一些,不斷調整,直到能夠預測出目標值)。因此就需要先定義“如何比較預測值和目標值的差異”,這便是損失函式或目標函式(loss function or objective function),用於衡量預測值和目標值的差異的方程。loss function的輸出值(loss)越高表示差異性越大。那神經網路的訓練就變成了儘可能的縮小loss的過程。

所用的方法是梯度下降(Gradient descent):透過使loss值向當前點對應梯度的反方向不斷移動,來降低loss。一次移動多少是由學習速率(learning rate)來控制的。


四、開源TensorFlow

Google釋出的第二代深度學習系統Tensor Flow(TensorFlow核心以C++寫成,前端支援Python和C++,並且容易擴充套件對其他語言的支援):Google釋出的第二代深度學習系統。

TensorFlow最早是在2015年10月的灣區機器學習會(BayLearn 2015)上亮相的。當時,Google 資深系統專家Jeff Dean做了題為Large-Scale Deep Learning for Intelligent Computer Systems的演講,介紹了Google未曾在論文上發表過的第二代深度學習系統TensorFlow。TensorFlow支援CNN、RNN/LSTM等機器學習演算法,擁有C++/Python程式設計介面。

Google開源TensorFlow的意義:

這一次的Google開源深度學習系統TensorFlow在很多地方可以應用,如語音識別,自然語言理解,計算機視覺,廣告等等。但是,基於以上論點,我們也不能過分誇大TensorFlow這種通用深度學習框架在一個工業界機器學習系統裡的作用。在一個完整的工業界語音識別系統裡, 除了深度學習演算法外,還有很多工作是專業領域相關的演算法,以及海量資料收集和工程系統架構的搭建。


不過總的來說,這次谷歌的開源很有意義,尤其是對於中國的很多創業公司來說,他們大都沒有能力理解並開發一個與國際同步的深度學習系統,所以TensorFlow會大大降低深度學習在各個行業中的應用難度。

——Tensor(張量)意味著N維陣列,Flow(流)意味著基於資料流圖的計算,TensorFlow即為張量從圖的一端流動到另一端。

——TensorFlow 表達了高層次的機器學習計算,大幅簡化了第一代系統,並且具備更好的靈活性和可延展性。TensorFlow一大亮點是支援異構裝置分散式計算,它能夠在各個平臺上自動執行模型,從電話、單個CPU / GPU到成百上千GPU卡組成的分散式系統。從目前的文件看,TensorFlow支援CNN、RNN和LSTM演算法,這都是目前在Image,Speech和NLP最流行的深度神經網路模型。

——從目前Tensor Flow的release來看,他們只支援單機多卡,不支援多機的分散式環境。開源的TensorFlow是單機實現,其最有價值的分散式資料流實現,並沒有開源。

——深度學習系統或軟體不是一裝上就能用的,它在釋出前期需要透過使用者資料進行很多測試、調整,顧名思義就是一個學習的過程。調整這些引數需要不斷試錯,初次接觸的人要花費很長時間。


問題NOTE:
1、    語音識別主機系統重啟有時會出現NVIDIA掉驅動的問題,需要重新安裝驅動,Gcc4.7版本時安裝驅動提示DKMS Building核心模組失敗,改為Gcc5.0版本OK。
    遇到編譯核心等問題可能會依賴於某個gcc版本,需要改變到合適的版本。在/usr/bin/目錄下,gcc開頭的檔案,其中有一個是gcc,是個連結檔案,連結到當前的gcc檔案(例如ubuntu16.04連結的是gcc-5),改變他的連結原始檔就可以了,假如我們現在的gcc是gcc-5.4,我們要降級到gcc-4.7

apt install gcc-4.7 (在/usr/bin目錄下看到gcc-4.7這個檔案,然後在/usr/bin目錄下刪除gcc這個檔案
rm /usr/bin/gcc
ln -s gcc gcc-4.7
gcc -v

1)ctrl + alt + F1 切換到控制檯,停止圖形介面:   sudo service lightdm stop 
2)降級到gcc-4.7後,先解除安裝原來的驅動:sudo apt-get --purge remove nvidia-*
3)
然後安裝安裝nvidia依賴包: sudo apt-get install nvidia-384
  編譯依賴:sudo apt-get install build-essential pkg-config xserver-xorg-dev linux-headers-`uname -r`
  若命令不成功:單獨執行 uname -r 而後將輸出新增到上一行命令列尾

4)受限制驅動列表:sudo apt-get install nvidia-current nvidia-settings
5)安裝驅動:sudo chmod a+x Nvidia*.run
   sudo ./NVIDIA-Linux-x86_64-384.59.run –no-x-check –no-nouveau-check –no-opengl-files
最後會詢問是否更新配置檔案,選擇否! 否則可能會進不去圖形化介面!
6)完成後 sudo service lightdm start 測試:輸入 nvidia-smi    若輸出顯示卡資訊則安裝成功!
7)安裝nvidia驅動後,如果桌面不顯示工具欄,需要重灌ubuntu桌面。

2、Ubuntu系統起來後,Internet網預設未連線,需要在桌面右上角點選一下“有線連線2”,提示“已連線”即OK。

3、在一個網路卡設兩個IP(192.168.1.51/168.192.11.90),cdc.bat和adapter.exe一啟動就退出,會初始化網路失敗,使用兩個網路卡OK。

4、透過Internet使用SSH連線到內網主機(Ubuntu):
cat /usr/local/bin/runssh.sh      #runssh.sh可能需要安裝teamviewer後才有。檢視埠號和ID
ssh username@WAN-IP  -p 埠號

2018/4/11

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7970627/viewspace-2151488/,如需轉載,請註明出處,否則將追究法律責任。

相關文章