語音識別的技術原理是什麼?

本題已收錄至知乎圓桌:人工智慧 · 語言智能,更多「人工智慧」相關話題歡迎關注討論


簡要給大家介紹一下語音怎麼變文字的吧。需要說明的是,這篇文章為了易讀性而犧牲了嚴謹性,因此文中的很多表述實際上是不準確的。對於有興趣深入了解的同學,本文的末尾推薦了幾份進階閱讀材料。下面我們開始。

首先,我們知道聲音實際上是一種波。常見的mp3等格式都是壓縮格式,必須轉成非壓縮的純波形文件來處理,比如Windows PCM文件,也就是俗稱的wav文件。wav文件里存儲的除了一個文件頭以外,就是聲音波形的一個個點了。下圖是一個波形的示例。

在開始語音識別之前,有時需要把首尾端的靜音切除,降低對後續步驟造成的干擾。這個靜音切除的操作一般稱為VAD,需要用到信號處理的一些技術。

要對聲音進行分析,需要對聲音分幀,也就是把聲音切開成一小段一小段,每小段稱為一幀。分幀操作一般不是簡單的切開,而是使用移動窗函數來實現,這裡不詳述。幀與幀之間一般是有交疊的,就像下圖這樣:

圖中,每幀的長度為25毫秒,每兩幀之間有25-10=15毫秒的交疊。我們稱為以幀長25ms、幀移10ms分幀。

分幀後,語音就變成了很多小段。但波形在時域上幾乎沒有描述能力,因此必須將波形作變換。常見的一種變換方法是提取MFCC特徵,根據人耳的生理特性,把每一幀波形變成一個多維向量,可以簡單地理解為這個向量包含了這幀語音的內容信息。這個過程叫做聲學特徵提取。實際應用中,這一步有很多細節,聲學特徵也不止有MFCC這一種,具體這裡不講。

至此,聲音就成了一個12行(假設聲學特徵是12維)、N列的一個矩陣,稱之為觀察序列,這裡N為總幀數。觀察序列如下圖所示,圖中,每一幀都用一個12維的向量表示,色塊的顏色深淺表示向量值的大小。

接下來就要介紹怎樣把這個矩陣變成文本了。首先要介紹兩個概念:

  1. 音素:單詞的發音由音素構成。對英語,一種常用的音素集是卡內基梅隆大學的一套由39個音素構成的音素集,參見The CMU Pronouncing Dictionary?。漢語一般直接用全部聲母和韻母作為音素集,另外漢語識別還分有調無調,不詳述。
  2. 狀態:這裡理解成比音素更細緻的語音單位就行啦。通常把一個音素劃分成3個狀態。

語音識別是怎麼工作的呢?實際上一點都不神秘,無非是:
把幀識別成狀態(難點)。
把狀態組合成音素。
把音素組合成單詞。

如下圖所示:

圖中,每個小豎條代表一幀,若干幀語音對應一個狀態,每三個狀態組合成一個音素,若干個音素組合成一個單詞。也就是說,只要知道每幀語音對應哪個狀態了,語音識別的結果也就出來了。

那每幀音素對應哪個狀態呢?有個容易想到的辦法,看某幀對應哪個狀態的概率最大,那這幀就屬於哪個狀態。比如下面的示意圖,這幀在狀態S3上的條件概率最大,因此就猜這幀屬於狀態S3。

那這些用到的概率從哪裡讀取呢?有個叫「聲學模型」的東西,裡面存了一大堆參數,通過這些參數,就可以知道幀和狀態對應的概率。獲取這一大堆參數的方法叫做「訓練」,需要使用巨大數量的語音數據,訓練的方法比較繁瑣,這裡不講。

但這樣做有一個問題:每一幀都會得到一個狀態號,最後整個語音就會得到一堆亂七八糟的狀態號。假設語音有1000幀,每幀對應1個狀態,每3個狀態組合成一個音素,那麼大概會組合成300個音素,但這段語音其實根本沒有這麼多音素。如果真這麼做,得到的狀態號可能根本無法組合成音素。實際上,相鄰幀的狀態應該大多數都是相同的才合理,因為每幀很短。

解決這個問題的常用方法就是使用隱馬爾可夫模型(Hidden Markov Model,HMM)。這東西聽起來好像很高深的樣子,實際上用起來很簡單:
第一步,構建一個狀態網路。
第二步,從狀態網路中尋找與聲音最匹配的路徑。

這樣就把結果限制在預先設定的網路中,避免了剛才說到的問題,當然也帶來一個局限,比如你設定的網路里只包含了「今天晴天」和「今天下雨」兩個句子的狀態路徑,那麼不管說些什麼,識別出的結果必然是這兩個句子中的一句。

那如果想識別任意文本呢?把這個網路搭得足夠大,包含任意文本的路徑就可以了。但這個網路越大,想要達到比較好的識別準確率就越難。所以要根據實際任務的需求,合理選擇網路大小和結構。

搭建狀態網路,是由單詞級網路展開成音素網路,再展開成狀態網路。語音識別過程其實就是在狀態網路中搜索一條最佳路徑,語音對應這條路徑的概率最大,這稱之為「解碼」。路徑搜索的演算法是一種動態規劃剪枝的演算法,稱之為Viterbi演算法,用於尋找全局最優路徑。

這裡所說的累積概率,由三部分構成,分別是:

  1. 觀察概率:每幀和每個狀態對應的概率
  2. 轉移概率:每個狀態轉移到自身或轉移到下個狀態的概率
  3. 語言概率:根據語言統計規律得到的概率

其中,前兩種概率從聲學模型中獲取,最後一種概率從語言模型中獲取。語言模型是使用大量的文本訓練出來的,可以利用某門語言本身的統計規律來幫助提升識別正確率。語言模型很重要,如果不使用語言模型,當狀態網路較大時,識別出的結果基本是一團亂麻。


這樣基本上語音識別過程就完成了。

以上的文字只是想讓大家容易理解,並不追求嚴謹。事實上,HMM的內涵絕不是上面所說的「無非是個狀態網路」,如果希望深入了解,下面給出了幾篇閱讀材料:

1. Rabiner L R. A tutorial on hidden Markov models and selected applications in speech recognition. Proceedings of the IEEE, 1989, 77(2): 257-286.
入門必讀。深入淺出地介紹了基於HMM的語音識別的原理,不注重公式的細節推導而是著重闡述公式背後的物理意義。

2. Bilmes J A. A gentle tutorial of the EM algorithm and its application to parameter estimation for Gaussian mixture and hidden Markov models. International Computer Science Institute, 1998, 4(510): 126.
詳細介紹了用E-M演算法訓練HMM參數的推導過程,首先講E-M的基本原理,然後講解如何應用到GMM的訓練,最後講解如何應用到HMM的訓練。

3. Young S, Evermann G, Gales M, et al. The HTK book (v3.4). Cambridge University, 2006.
HTK Book,開源工具包HTK的文檔。雖然現在HTK已經不是最流行的了,但仍然強烈推薦按照書里的第二章流程做一遍,你可以搭建出一個簡單的數字串識別系統。

4. Graves A. Supervised Sequence Labelling with Recurrent Neural Networks. Springer Berlin Heidelberg, 2012: 15-35.
基於神經網路的語音識別的入門必讀。從神經網路的基本結構、BP演算法等介紹到 LSTM、CTC。

5. 俞棟, 鄧力. 解析深度學習——語音識別實踐, 電子工業出版社, 2016.
高質量的中文資料非常稀有,推薦買一本。最早把深度學習技術應用於語音識別就是這本書的作者。


樓上張俊博的回答比較仔細的講解了基礎的經典語音識別演算法。我想對演算法背後的含義做一個簡單的解釋,對涉及到的特徵提取(包括分幀)、音素建模、字典、隱式馬爾科夫模型等可以參閱樓上的回答。

語音識別的第一個特點是要識別的語音的內容(比聲韻母等)是不定長時序,也就是說,在識別以前你不可能知道當前的 聲韻母有多長,這樣在構建統計模型輸入語音特徵的時候無法簡單判定到底該輸入0.0到0.5秒還是0.2到0.8秒進行識別,同時多數常見的模型都不方便處理維度不確定的輸入特徵(注意在一次處理的時候,時間長度轉化成了當前的特徵維度)。一種簡單的解決思路是對語音進行分幀,每一幀佔有比較短固定的時 長(比如25ms),再假設說這樣的一幀既足夠長(可以蘊含 足以判斷它屬於哪個聲韻母的信息),又很平穩(方便進行短時傅里葉分析),這樣將每一幀轉換為一個特徵向量,(依次)分別識別它們屬於哪個聲韻母,就可以 解決問題。識別的結果可以是比如第100到第105幀是聲母c,而第106幀到115幀是韻母eng等。 這種思路有點類似微積分 中的『以直代曲』。另外在實際的分幀過程中,還有很多常用技巧,比如相鄰兩幀之間有所重疊,或引入與臨近幀之間的差分作為額外特徵,乃至直接堆疊許多語音幀等等,這些都可以讓前述的兩個假設更可靠。近年來,研究種也出現了一些更新穎的處理方式,比如用.wav文件的採樣點取代分幀並處理後的語音幀,但這樣的方法在處理速度及性能上 暫時還沒有優勢。

當我們有了分幀後的語音特徵之後,下一步常用的處理是使用某種分類器將之分類成某種跟語音內容相關的類別,如聲韻母,這一步通常稱作聲學模型建模。對於分類目標的選取,最簡單的選擇可以是片語,或者是組成片語的漢字所對應的音節。但這樣的選擇方式通常會對訓練模型的語音數據提出過高的要求,帶來『數據稀疏』的問題,即數據中 很難包含漢語中的所有片語,同時每個片語也很難具有充足的訓練樣本以保證統計聲學模型的可靠性。由於一個片語通常由多個音素的連續發音 構成,常見的音素都包含在國際音標表中,它們具有恰當的數目(通常幾十個),以及清晰的定義(由特定的發聲器官運動產生),於是音素成了各種語言中的語音識別中都最為常見的 建模選擇(漢語的聲韻母也是由一到三個音素構成), 識別中再結合片語到音素的發音字典使用。使用音素也方便對混合語言(如漢語種夾雜英語辭彙)進行識別——當然不同母語的人對相同音素的發音也有區別,這是另外一個話題。另外由於人類發生器官運動的連續性,以及某些語言中特定的拼讀習慣(比如英語中定冠詞『the』在母音和輔音之前有不同讀音),會導致發音,尤其是音素的發音受到前後音素的影響,稱為『協同發音』。於是 可以進行所謂『上下文相關』的音素(或者考慮到音素實際的拼讀,稱為音子)分類。比如wo chi le這個序列,可以寫為w o ch i l e,這樣是普通的『上下文無關』音子序列,也可以考慮前一個音素對當前音素的影響寫成sil-w w-o o-ch ch-i i-l l-e (sil表示語音開始前的靜音,A-B表示收到A影響的B)或考慮後一個音素的影響寫成w+o o+ch ch+i i+l l+e e+sil(sil表示語音結束後的靜音,A+B表示受到B影響的A)。實際中以同時考慮前後各一個音素的三音子最為常見,最多也有人使用四音子模型。使用三音子或四音子模型會導致 分類目標的幾何增長(如僅僅30個音素就可以擴展出30^3=27000個三音子), 並再次導致數據稀疏的問題。最常用的解決方法是使用基於決策樹的方式對這些三音子或四音子模型進行聚類,對每一類模型進行參數共享以及訓練數據的共享。在構建決策樹的方式上以及決策樹進行自頂向下的 分裂過程中,都可以 導入適當的語音學知識, 將知識與數據驅動的方法進行結合, 同時還可以 減少運算量並在識別中 使用訓練數據中未出現的三音子模型等。

有了具體的分類的目標(比如三音子)之後,下面就要選擇具體的數學模型進行聲學建模。這裡可以根據語音學等研究 使用多種線性結構或非線性結構的模型或模型組合。目前最廣泛使用的仍然是基於隱式馬爾科夫模型的建模方法,即對每個三音子分別建立一個模型,具體可以參見樓上的回答。隱式馬爾科夫模型的轉移概率密度以幾何分布最為常見,但語音合成中也常用高斯分布;觀測概率密度函數傳統上通常使用 高斯混合模型,也有人使用人工神經網路等,近年來隨著深度學習的發展,使用各種深層神經網路的情況 越來越多。最近也有人使用不同方法直接利用遞歸神經網路進行建模,有一些工作也取得了比較好的效果。但無論使用哪種模型甚至非線性的模型 組合,背後的含義都是假設了對應於每種 類別(三音子)的語音幀在它所對應的高維空間中具有幾乎確定的空間分布,可以通過對空間進行劃分,並由未知語音幀的空間位置來對語音幀進行正確的分類。

在完成聲學模型建模後,就可以基於聲學模型對未知語音幀序列進行語音識別了,這一過程通常稱為搜索解碼過程。解碼的原理通常是在給定了根據語法、字典對馬爾科夫模型進行連接後的搜索的網路(網路的每個節點可以是一個片語等)後,在所有可能的搜索路徑中選擇一條或多條最優(通常是最大後驗概率)路徑(字典中出現片語的片語串)作為識別結果,具體的搜索演算法可以有不同的實現方式。這樣的搜索可以對時序的語音幀根據其前後幀進行約束;注意使用多狀態 隱式馬爾科夫模型的理由之一是可以在 搜索中對每個三音子的最短長度施加限制。語音識別任務通常有不同的分類,最困難的問題是所謂大詞表連續語音識別,即對可能由數萬種日常用片語成的發音自然的語句(比如我們日常隨意對話中的語句)進行識別,這樣的 問題中通常要 將聲學模型同概率語言模型聯合使用,即在搜索中導入 統計獲得的先驗語言層級信息,優點是可以顯著的提高識別器的性能,缺點是也會造成識別器明顯偏向於識別出語言模型中 出現過的信息。

以上就是我理解的語音識別的原理,包括大致的系統構成和基本設計思路。具體在最前沿的研究和評測 中,通常還需要把許多不同的語音識別器通過各種不同的手段進行系統組合,以便在最終使最終的(組合)系統 能夠獲得具有互補性的信息,從而得到最佳的識別效果。


鑒於傳統架構的語音識別方法在其他的回答中已經有了詳細的介紹,這裡主要介紹end-to-end語音識別架構,主要涉及到RNN神經網路結構以及CTC。

Outline:

1、 語音識別的基本架構

2、 聲學模型(Acoustic Model,AM)

  • a) 傳統模型
  • b)CTC模型
  • c) end-to-end模型

3、 語言模型

4、 解碼

----------------------------------------------------

1、 語音識別的基本架構

上式中W表示文字序列,Y表示語音輸入。公式1表示語音識別的目標是在給定語音輸入的情況下,找到可能性最大的文字序列。根據Baye』 Rule,可以得到公式2,其中分母表示出現這條語音的概率,它相比於求解的文字序列沒有參數關係,可以在求解時忽略,進而得到公式3。公式3中第一部分表示給定一個文字序列出現這條音頻的概率,它就是語音識別中的聲學模型;第二部分表示出現這個文字序列的概率,它就是語音識別中的語言模型。


無論是傳統的方法也好,現在火熱的深 度神經網路的方法也罷,目前的語音識別架構都沒有脫離上面的公式,也就是說都離不開AM和LM。下面分別對這兩部分進行介紹


2、 聲學模型(Acoustic Model,AM)


聲學模型可以理解為是對發聲的建模,它能夠把語音輸入轉換成聲學表示的輸出,更準確的說是給出語音屬於某個聲學符號的概率。

a) 傳統模型


在英文中這個聲學符號可以是音節(syllable)或者更小的顆粒度音素(phoneme);在中文中這個聲學符號可以是聲韻母或者是顆粒度同英文一樣小的音素。那麼公式3中的聲學模型就可以表示為下面的公式4的形式:

其中Q表示發音單位的序列。從公式中可以看到,聲學模型最終轉換成了一個語音到發音序列的模型和一個發音序列到輸出文字序列的字典。這裡的發音序列通常是音素,到此為止聲學模型是從語音到音素狀態的一個描述。為了對不同上下文的音素加以區分,通常使用上下文相關的「三音子」作為建模單元。可以用下圖表示:

其中字典部分表示為如下公式5,其意義是把每個文字拆分成若干發音符號的序列。

公式4中的聲學部分可以繼續分解為如下公式6 :

公式6表示聲學建模的顆粒度可以繼續分解為更小的狀態(state)。通常一個三音子對應有3個狀態(靜音通常是5個狀態),那麼聲學建模的總數就是 3*Q^3+5 這麼多。為了壓縮建模單元數量,狀態綁定的技術被大量使用,它使得發音類似的狀態用一個模型表表示,從而減少了參數量。狀態綁定的技術可以使用專家手工編撰的規則,也可以使用數據驅動的方式。具體綁定形式如下圖所示:

基於上面的推到,聲學模型是一個描述語音和狀態之間轉換的模型。

此時,引入HMM假設:狀態隱變數,語音是觀測值,狀態之間的跳轉符合馬爾科夫假設。那麼聲學模型可以繼續表示為如下公式:

其中a表示轉移概率,b表示發射概率。用圖來表示的話就是下圖中的結構 :

如圖中所示,觀測概率通常用GMM或是DNN來描述。這就是CD-GMM-HMM架構[Mark Gales, 2006]和CD-DNN-HMM架構[George E. Dahl, 2012]的語音識別聲學模型。CD-DNN-HMM的架構這裡引用文章中的圖表示如下:

b) CTC模型


在基於CD-DNN-HMM架構的語音識別聲學模型中,訓練DNN通常需要幀對齊標籤。在GMM中,這個對齊操作是通過EM演算法不斷迭代完成的,而訓練DNN時需要用GMM進行對齊則顯得非常彆扭。因此一種不需要事先進行幀對齊的方法呼之欲出。

此外對於HMM假設一直受到詬病,等到RNN出現之後,使用RNN來對時序關係進行描述來取代HMM成為當時的熱潮。


隨著神經網路優化技術的發展和GPU計算能力的不斷提升,最終使用RNN和CTC來進行建模實現了end-to-end語音識別的聲學模型。


CTC的全稱是Connectionist Temporal Classification,中文翻譯大概是連接時序分類。它要達到的目標就是直接將語音和相應的文字對應起來,實現時序問題的分類。

用公式來描述的話,CTC的公式推導如下:

p(pi|x)=prod_{t=1}^Ty_{pi_t}^t, forallpiin L

其中π表示文字序列,X表示語音輸入,y表示RNN的輸出。由於很多幀可以輸出同樣的一個文字,同時很多幀也可以沒有任何輸出,因此定義了一個多對一的函數,把輸出序列中重複的字元合併起來,形成唯一的序列,進而公式表示如下:

p(l|x)=sum_{piinRe^{-1}(l) }p(pi|x)

起始l表示對應的標註文本,而π是帶有冗餘的神經網路輸出。求解上述公式,需要使用前後向演算法,定義前向因子

alpha_t(s)stackrel{def}{=} sum_{piin N^t:Re(pi_{1:t}=l_{1:s})}prod_{t

和後向因子:

eta_t(s)stackrel{def}{=}sum_{piin N^t:Re(pi_{t:T})=l_{s:|l|}}prod_{t

那麼神經網路的輸出和前後向因子的關係可以表示為:

alpha_t(s)eta_t(s)=sum_{piinRe^{-1}(l):pi_t=l

進而得到:

p(l|x)=sum_{s=1}^{|l

利用上述公式,就可以進行神經網路的訓練了,這裡仍然可以描述為EM的思想:

  • E-step:使用BPTT演算法優化神經網路參數;
  • M-step:使用神經網路的輸出,重新尋找最有的對齊關係。

CTC可以看成是一個分類方法,甚至可以看作是目標函數。在構建end-to-end聲學模型的過程中,CTC起到了很好的自動對齊的效果。同傳統的基於CD-DNN-HMM的方法相比,對齊效果引用文章[Alex Graves,2006]中的圖是這樣的效果:

這幅圖可以理解:基於幀對齊的方法強制要求切分好的幀對齊到對應的標籤上去,而CTC則可以時幀的輸出為空,只有少數幀對齊到對應的輸出標籤上。這樣帶來的差別就是幀對齊的方法即使輸出是正確的,但是在邊界區域的切分也很難準確,從而給DNN的訓練引入錯誤。


c) End-to-end模型


由於神經網路強大的建模能力,End-to-end的輸出標籤也不再需要像傳統架構一樣的進行細分。例如對於中文,輸出不再需要進行細分為狀態、音素或者聲韻母,直接將漢字作為輸出即可;對於英文,考慮到英文單詞的數量龐大,可以使用字母作為輸出標籤。


從這一點出發,我們可以認為神經網路將聲學符號到字元串的映射關係也一併建模學習了出來,這部分是在傳統的框架中時詞典所應承擔的任務。針對這個模塊,傳統框架中有一個專門的建模單元叫做G2P(grapheme-to-phoneme),來處理集外詞(out of vocabulary,OOV)。在end-to-end的聲學模型中,可以沒有詞典,沒有OOV,也沒有G2P。這些全都被建模在一個神經網路中。

另外,在傳統的框架結構中,語音需要分幀,加窗,提取特徵,包括MFCC、PLP等等。在基於神經網路的聲學模型中,通常使用更裸的Fbank特徵。在End-to-en的識別中,使用更簡單的特徵比如FFT點,也是常見的做法。或許在不久的將來,語音的採樣點也可以作為輸入,這就是更加徹底的End-to-end聲學模型。


除此之外,End-to-end的聲學模型中已經帶有了語言模型的信息,它是通過RNN在輸出序列上學習得到的。但這個語言模型仍然比較弱,如果外加一個更大數據量的語言模型,解碼的效果會更好。因此,End-to-end現在指聲學模型部分,等到不需要語言模型的時候,才是完全的end-to-end。


3、 語言模型(Language Model, LM)


語言模型的作用可以簡單理解為消解多音字的問題,在聲學模型給出發音序列之後,從候選的文字序列中找出概率最大的字元串序列。

關於語言模型,目前最常見的是N-Gram語言模型和基於RNN的語言模型,基於CNN的語言模型facebook也有paper發出來。想深入了解的,可以參考我的這篇回答:

語音識別如何處理漢字中的「同音字」現象? - 知乎

4、 解碼


傳統的語音識別解碼都是建立在WFST的基礎之上,它是將HMM、詞典以及語言模型編譯成一個網路。解碼就是在這個WFST構造的動態網路空間中,找到最優的輸出字元序列。搜索通常使用Viterbi演算法,另外為了防止搜索空間爆炸,通常會採用剪枝演算法,因此搜索得到的結果可能不是最優結果。


在end-to-end的語音識別系統中,最簡單的解碼方法是beam search。儘管end-to-end的聲學模型中已經包含了一個弱語言模型,但是利用額外的語言模型仍然能夠提高識別性能,因此將傳統的基於WFST的解碼方式和Viterbi演算法引入到end-to-end的語音識別系統中也是非常自然的。然而由於聲學模型中弱語言模型的存在,解碼可能不是最優的。文章[yuki Kanda, 2016]提出在解碼的時候,需要將這個若語言模型減掉才能得到最優結果。公式推導如下:

其中Pr(s|X)是CTC的聲學模型,α是權重係數。語言模型部分推導如下:

Pr(W|s)=frac{Pr(s|W)Pr(W)}{Pr(s)^{eta}}

其中Pr(s|W)是字元到單詞的映射,通常是一對一的。因此上述公式可以表示為如下形式:

Pr(W|s)=frac{Pr(W)}{Pr(s)^eta}

其中Pr(W)是傳統的語言模型,Pr(s)是字元語言模型,β權重係數。上面的公式表示在CTC的模型解碼時,語言模型需要進行減先驗的操作,這個先驗就是聲學訓練數據中的字元語言模型。


參考文獻:

1、Mark Gales and Steve Young, The Application of Hidden Markov Models in Speech Recognition, 2006

2、George E. Dahl, Dong Yu, Li Deng, and Alex Acero,Context-Dependent Pre-Trained Deep Neural Networks for Large-Vocabulary Speech Recognition,2012

3、Alex Graves,Santiago Fern ?andez,Faustino Gomez,Ju ?rgen Schmidhuber, Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks,2006

4、Alex Graves , Navdeep Jaitly, Towards End-to-End Speech Recognition with Recurrent Neural Networks, 2014

5、Rafal Jozefowicz, Oriol Vinyals, Mike Schuster, Noam Shazeer, Yonghui Wu, Exploring the Limits of Language Modeling, 2016

6、Naoyuki Kanda, Xugang Lu, Hisashi Kawai, Maximum A Posteriori based Decoding for CTC Acoustic Models, 2016


語音識別,是人工智慧的重要入口,越來越火。從京東科大訊飛合作的叮咚,亞馬遜的明星產品Echo,到最近一個月谷歌Master和百度小度掀起的人機大戰,賺夠了眼球。但語音只是個入口,內容或者說引導用戶做決策乃至消費,才是王道。

基於半年來在語音識別方面的實踐心得,結合HTK開源工具,分成兩部分來分享對語音識別的原理以及流程的認識。不喜請噴,看完賞讚,手留余香。

第一部分 語音識別系統

1.語音識別系統的一般架構如左圖,分訓練和解碼兩階段。訓練,即通過大量標註的語音數據訓練聲學模型,包括GMM-HMM、DNN-HMM和RNN+CTC等;解碼,即通過聲學模型和語言模型將訓練集外的語音數據識別成文字。目前常用的開源工具有HTK Speech Recognition Toolkit,Kaldi ASR以及基於Tensorflow(speech-to-text-wavenet)實現端到端系統。我以古老而又經典的HTK為例,來闡述語音識別領域涉及到的概念及其原理。HTK提供了豐富的語音數據處理,以及訓練和解碼的工具。

2.語音識別,分為孤立詞和連續詞語音識別系統。早期,1952年貝爾實驗室和1962年IBM實現的都是孤立詞(特定人的數字及個別英文單詞)識別系統。連續詞識別,因為不同人在不同的場景下會有不同的語氣和停頓,很難確定詞邊界,切分的幀數也未必相同;而且識別結果,需要語言模型來進行打分後處理,得到合乎邏輯的結果。

3.以孤立詞識別為例,能夠很好地闡述語音識別的流程級相關概念。假如對詞進行建模,在訓練階段學習每個模型的參數;在識別階段,計算輸入語音序列在每個模型的得分(概率值),最高分者獲勝。但是,任何語言里的常用單詞都以千計,學習數以千計的模型不僅需要龐大的語料庫,還需要漫長的迭代時間。此外,漢語還分有調無調,模型數量又成倍增加。

因此,通常對音素建模,然後由音素組合成單詞;將極大地降低模型數量,提高訓練和解碼效率。對英語,常用的音素集是卡內基梅隆大學提供的一套由39個音素構成的音素集(參見The CMU Pronouncing Dictionary)。對漢語,一般用23個聲母和24個韻母作為音素集。

4. 採用隱馬爾可夫模型(Hidden Markov Model,HMM)對音素建模。1970年,普林斯頓大學的Lenny Baum發明HMM模型,並於20世紀80年代引入到語音識別領域,取得里程碑性的突破。HMM的通俗講解參見簡單易懂的例子解釋隱馬爾可夫模型。

如上左圖,每個音素用一個包含6個狀態的HMM建模,每個狀態用高斯混合模型GMM擬合對應的觀測幀,觀測幀按時序組合成觀測序列。每個模型可以生成長短不一的觀測序列,即一對多映射。訓練,即將樣本按音素劃分到具體的模型,再學習每個模型中HMM的轉移矩陣和GMM的權重以及均值方差等參數。

5.參數學習,通過Baum-Welch演算法,採用EM演算法的思想。因此,每個模型需要初始化,GMM一般採用每個模型對應所有樣本的均值和方差。硬分類模式,即計算每幀對應每個狀態的GMM值,概率高者獲勝;而軟分類模式,即每幀都以對應概率值屬於對應的狀態,計算帶權平均。

其中,L_{j}(t) 表示t時刻的幀o_{t} 屬於狀態j的概率。用動態規劃前向後向演算法計算L_{j}(t)

另外,轉移矩陣參數的更新策略:

值得一提,CTC演算法的核心就是前向後向演算法。

6. 解碼,採用Viterbi演算法。模型在時間軸上展開的網路中貪婪地尋找最優路徑問題,當前路徑的聯合概率值即為模型得分,選擇最優模型,識別出音素,再查找字典,組裝成單詞。取對數可以避免得分過小的問題。

THK基於Token Passing實現Viterbi演算法,用鏈表記錄識別路徑信息:

7. HTK開源工具包實現了搭建完整語音識別系統各個環節:錄製數據,標註文件,模型初始化與參數學習,以及解碼識別,支持語言模型n-gram和RNNLM,實現GPU加速,極大地提高了迭代效率。美中不足的是,目前僅支持前饋型神經網路模型,而且版本更新越來越慢。

8. HTK的歷史一覽,曾被微軟公司收購,最終又回歸劍橋大學。從版本更新可知語音識別技術的歷史(深度 | 四十年的難題與榮耀--從歷史視角看語音識別發展)發展進程。在引入深度學習以前(Hinton 2009),HTK緊跟技術潮流。

第二部分 語音識別概念

9. Grammar:HParse可以將語法規則(類似於正則表達式的概念)展開成詞網路(Word Network),也稱詞圖(Lattice),即限制語音識別的路徑,無論什麼數據的識別結果都必然是詞網路中的一條路徑。詞網路起到了語言模型的作用;在大規模數據集上,可以被n-gram和RNNLM模型代替。

10. Dictionary: HDMan根據完整的發音字典、詞網路中的詞以及特定任務中的特定詞,生成具體任務的詞典和音素表(如果對單音素建模,音素數等於模型數)。如果是對音素建模,首先識別出狀態,再根據狀態路徑的聯合概率值識別出音素,音素查找字典組合成單詞,單詞參考語言模型連接成句子,找到最為匹配的詞序作為輸出結果。

11. Transcription: 根據詞網路可以按需生成標註樣本,根據樣本採集語音數據。HLEd可以根據字典將詞級別的標註文件轉換成音素級別的標註,完成處理的數據,可以進一步提取特徵或轉化成語譜圖作為聲學模型的輸入。

12. Feature: HCopy根據配置文件對音頻信號提取特徵,常用的有MFCC,即Mel頻率倒譜係數。更多語音特徵提取參見語音識別特徵提取。

13. Training Monophone HMMs: HERest採用處理後的標註數據,根據最大似然(ML)準則,迭代音素文件列表中枚舉的模型,直至收斂。其中HCompv採用所有訓練樣本的均值和方差來初始化GMM的策略,訓練數據可以不帶標籤,非監督初始化。

為了提高迭代效率和排除錯誤標註數據的影響,參數學習過程中需要裁剪,分為狀態級別裁剪或模型級別約束,即定向搜索beam search,按規則約束搜索範圍。

14. Realigning: 基於Viterbi演算法的幀層次對齊操作,可以糾正偏差的語音標註,生成帶時間戳的標註文本,用來再迭代訓練模型,提高訓練準確率。

15. Triphones HMMs: 基於單音素模型可以構造三音素模型,在音素級別可以利用更多的上下文信息,同時也意味著模型數量的增加。這時需要狀態共享和狀態聚類技術,降低模型的參數,提高訓練效率。

16. Discriminative Training: 模型最大似然輸出的結果,根據最大互信息(MMI)和最小音素錯誤率(WPE)兩種訓練準則,進一步調整HMM模型的參數,降低識別錯誤率。HInit利用帶標籤的語音數據來初始化,並基於Viterbi演算法再生成標註文件迭代數次訓練模型。

判別性訓練的詳細參考步驟:

判別性訓練,HDecode解碼器和DNN-HMM模型等大規模連續辭彙識別技術都是基於跨詞模式。詞內模式的三音素不能跨詞連接,因此利用較少的上下文信息,識別性能也較跨詞模型差。

17. DNN:之後將近20年,語音識別技術的發展比較緩慢;直至2009年,Hinton將DNN應用於聲學建模,並在TIMIT數據集上獲得了當時最低的詞錯率。隨著GPU的普及,加速了DNN的發展。採用DNN替換GMM對HMM狀態的發射概率進行建模有兩大優點:一是不需要對語音數據分布進行假設,不需要切分成stream來分段擬合;DNN的輸入可以將相鄰語音幀拼接成包含時序結構信息的矢量,在幀層次利用更多的上下文信息。HTK支持基於幀和序列兩種訓練DNN-HMM模型的方式。

更多參見L09-DNN-Acoustic-Modeling。

18. Decoder: HVite根據聲學模型、語言模型和字典識別未知語音,並用HResults來統計分析識別準確率。此外,HTK還支持大規模連續辭彙的解碼工具HDecode,可以融合更加複雜的語言模型,如3-gram和Recurrent Neural Network Language Models。為了提高識別效率,解碼器也支持裁剪,Beam Search。

---------------------------------------------------------------------------------------------------------------------------

以上分析可知,基於HMM的模型訓練需要經過很多細緻的步驟,從數據處理及特徵提取,到模型初始化,從單音素到三音素的訓練和解碼,從基於最大似然的訓練到基於最大互信息的判別性訓練,以及大量的配置文件,需要很高的學習時間成本;為了獲得比較好得識別準確率,還需要對齊操作。深度學習的興起,從開始用DNN代替GMM,發展到現在複雜的LSTM和Deep CNN模型,結合CTC目標函數,甚至attention機制,帶來了基於end-to-end的方法,把中間的一些需要人工做的步驟或者需要預處理的部分去掉。

最後,基於Tensorflow實現端到端的Wavenet做中文語音識別。


謝邀,關於這個問題,我們想採用微軟首席語音科學家黃學東博士在清華大學的分享——微軟是如何利用人工智慧技術做好語音識別的,回答這個問題。講座中,黃學東博士為我們分享了微軟在語音識別中取得不斷突破背後的技術支持。


————這裡是正式回答的分割線————


在幾十年的歷程中,有非常多優秀的公司在語音和語言領域進行了不懈地探索,終於在今天,達到了和人一樣精準的語音識別,這是非常了不起的歷史性突破。語言是人類特有的交流工具。今天,計算機可以在假定有足夠計算資源的情況下,非常準確地識別你和我講的每一個字,這是一個非常大的歷史性突破,也是人工智慧在感知上的一個重大里程碑。


Switchboard是整個工業界常用的一個測試數據集。很多新的領域或新的方法錯誤率基本都在20%左右徘徊。大規模標杆性的進展是IBM Watson,他們的錯誤率在5%到6%之間,而人的水平基本上也在5%到6%之間。過去20年,在這個標杆的數據集上,有很多公司都在不懈努力,如今的成果其實並不是一家公司所做的工作,而是整個業界一起努力的結果。


各種各樣的神經網路學習方法其實都大同小異,基本上是通過梯度下降法(Gradient Descent)找到最佳的參數,通過深度學習表達出最優的模型,以及大量的GPU、足夠的計算資源來調整參數。所以神經網路對計算機語音識別的貢獻不可低估。早在90年代初期就有很多語音識別的研究是利用神經網路在做,但效果並不好。因為,第一,數據資源不夠多;第二,訓練層數少。而由於沒有計算資源、數據有限,所以神經網路一直被隱馬爾可夫模型(Hidden Markov Model)壓制著,無法翻身。

深度學習翻身的最主要原因就是層數的增加,並且和隱馬爾可夫模型結合。在這方面微軟研究院也走在業界的前端。深度學習還有一個特別好的方法,就是特別適合把不同的特徵整合起來,就是特徵融合(Feature Fusion)。


如果在噪音很高的情況下可以把特徵參數增強,再加上與環境噪音有關的東西,通過深度學習就可以學出很好的結果。如果是遠長的語音識別,有很多不同的迴音,那也沒關係,把迴音作為特徵可以增強特徵。如果要訓練一個模型來識別所有人的語音,那也沒有關係,可以加上與說話人有關的特徵。所以神經網路厲害的地方在於,不需要懂具體是怎麼回事,只要有足夠的計算資源、數據,都能學出來。


我們的神經網路系統目前有好幾種不同的類型,最常見的是借用計算機視覺CNN(Convolution Neural Net,卷積神經網路)可以把不同變化位置的東西變得更加魯棒。你可以把計算機視覺整套方法用到語音上,把語音看成圖像,頻譜從時間和頻率走,通過CNN你可以做得非常優秀。另外一個是RNN(Recurrent Neural Networks,遞歸神經網路), 它可以為時間變化特徵建模,也就是說你可以將隱藏層反饋回來做為輸入送回去。這兩種神經網路的模型結合起來,造就了微軟歷史性的突破。


微軟語音識別的總結基本上可以用下圖來表示。

下圖是業界在過去幾十年裡面錯誤率下降的指標,可以看到5.8%是微軟在去年達到的水平。Switchboard的錯誤率從80%左右一直到5.8%左右,是用了什麼方法呢?我們是怎麼達到這個目標呢?

大家知道語音識別有兩個主要的部分,一個是語音模型,一個是語言模型

語音模型我們基本上用了6個不同的神經網路,並行的同時識別。很有效的一個方法是微軟亞洲研究院在計算機視覺方面發明的ResNet(殘差網路),它是CNN的一個變種。當然,我們也用了RNN。可以看出,這6個不同的神經網路在並行工作,隨後我們再把它們有機地結合起來。在此基礎之上再用4個神經網路做語言模型,然後重新整合。所以基本上是10個神經網路在同時工作,這就造就了我們歷史性的突破。


————這裡是回答結束的分割線————


以上回答摘選自回答:語音識別領域的最新進展目前是什麼樣的水準? 了解黃學東博士的完整演講內容,請移步:講堂|黃學東:微軟是如何利用人工智慧技術做好語音識別的

感謝大家的閱讀。

本賬號為微軟亞洲研究院的官方知乎賬號。本賬號立足於計算機領域,特別是人工智慧相關的前沿研究,旨在為人工智慧的相關研究提供範例,從專業的角度促進公眾對人工智慧的理解,並為研究人員提供討論和參與的開放平台,從而共建計算機領域的未來。

微軟亞洲研究院的每一位專家都是我們的智囊團,你在這個賬號可以閱讀到來自計算機科學領域各個不同方向的專家們的見解。請大家不要吝惜手裡的「邀請」,讓我們在分享中共同進步。

也歡迎大家關注我們的微博和微信賬號,了解更多我們研究。


看圖

  • 編碼:把語音變成向量
    • 頻域信息:人類是通過振動頻率來判斷聲音的,所以要用傅里葉變換來完成時域頻域之間的轉換;
    • 特徵:如,MFCC是依照人耳的聽聲特點提出的filter。然後我們有了語音向量。

  • 訓練:從數據中學習對語音的判斷,而不是用人工的規則。
    • 聲學模型(acoustic model):用於識別語音向量;可用GMM或DNN等方法來識別向量,用DTW或HMM或CTC來對齊(alignment)識別結果的輸出(單詞從何時開始,何時結束)
    • 字典(dictionary):多數模型並不是以單詞,而是以音素為識別單位。當識別出? p l這三個音素時,利用字典,就可以判斷出所說的詞是apple。
    • 語言模型(language model):我們在聽老外說錯誤的中文時依然能夠識別內容是因為我們有關於語法的知識,可以調整聲學模型所識別出的不合邏輯的詞語。這就是語言模型的作用

  • 解碼:用訓練好的模型組合起來就可以通過判斷新的語音向量,來識別語音了。


作者:九五要當學霸
鏈接:知乎專欄
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

原文:Adam Geitgey


原文鏈接:https://medium.com/@ageitgey/machine-learning-is-fun-part-6-how-to-do-speech-recognition-with-deep-learning-28293c162f7a#.42h1r63ev

翻譯:巡洋艦科技——趙95


你是不是看煩了各種各樣對於深度學習的報導,卻不知其所云?我們要來改變這個問題。

有趣的機器學習 前五章已更新!點此查看第一章:最簡明入門指南、第二章:用機器學習【製造超級馬里奧】的關卡、第三章:圖像識別【鳥or飛機】第四章:用深度進行【人臉識別】第五章:使用深度學習進行【語言翻譯】和 序列的魔力第六章:如何用深度學習進行【語音識別】

語音識別正在「入侵」我們的生活。它內置在我們的手機,遊戲主機和智能手錶里。它甚至在自動化我們的家園。只需50美元,你可以買到一個Amazon Echo Dot -
一個能夠讓你訂購比薩,獲知天氣預報,甚至購買垃圾袋的魔術盒——只要你大聲說出你的需求:

Alexa,訂一個大號的比薩!

Echo Dot機器人在(2016年聖誕)這個假期太受歡迎了,以至於Amazon似乎都沒貨了!

然而語音識別已經出現了幾十年了,為何它才剛剛成為主流呢?原因是,深度學習,終於讓語音識別,能夠在非嚴格可控的環境下也能準確的識別。

吳恩達教授(百度首席科學家,人工智慧和機器學習領域國際上最權威的學者之一,也是在線教育平台Coursera的聯合創始人)長期以來預測,隨著語音識別從95%精確度上升到99%,它將成為我們與計算機交互的主要方式。這個想法是基於,4%的精確度實際就是「太不靠譜」與「極度實用」之間的差別。感謝深度學習,我們終於達到了頂峰。

讓我們了解一下如何用深度學習進行語音識別吧!

機器學習並不總是一個黑盒

如果你知道神經機器翻譯是如何工作的,那麼你可能會猜到,我們可以簡單地將聲音送入到神經網路中,並訓練使之生成文本:

這就是用深度學習進行語音識別的核心,但目前我們還沒有完全做到(至少在我寫這篇文章的時候沒做到——我打賭,在未來的幾年我們可以做到)。

最大的問題是言速不同。一個人可能很快的說「hello!」而另一個人可能會非常緩慢說「heeeelllllllllllllooooo!」。這產生了一個更長的聲音文件和更多的數據。這兩個聲音文件都應該被識別為完全相同的文本「hello!」而事實證明,把各種長度的音頻文件自動對齊到一個固定長度的文本是很難的一件事情。

為了解決這個問題,我們必須使用一些特殊的技巧和一些除了深度神經網路以外的特殊處理。讓我們看看它是如何工作的吧!

將聲音轉換成「位(Bit)」

語音識別的第一步是很顯而易見的——我們需要將聲波輸入到計算機當中。

在第3章中,我們學習了如何把圖像視為一個數字序列,以便我們直接將其輸入進神經網路進行圖像識別:

圖像只是圖片中每個像素深度的數字編碼序列

但聲音是作為(Waves) 的形式傳播的。我們如何將聲波轉換成數字呢?讓我們使用我說的「hello」這個聲音片段我們例子:

我說「hello」的波形

聲波是一維的。(譯者註:其實是二維的,有時間,還有振幅)在每個時刻,基於波的高度,它們有一個值(譯者註:叫做振幅)。讓我們把聲波的一小部分放大看看:

為了將這個聲波轉換成數字,我們只記錄聲波在等距點的高度:

給聲波採樣

這被稱為採樣Sampling。我們每秒讀取數千次,並把聲波在該時間點的高度用一個數字記錄下來。這基本上就是一個未壓縮的.wav音頻文件。

「CD音質」的音頻是以44.1khz(每秒44,100個讀數)進行採樣的。但對於語音識別,16khz(每秒16,000個採樣)的採樣率足以覆蓋人類語音的頻率範圍。

讓我們把「Hello」的聲波每秒採樣16,000次。這是前100個採樣:

每個數字表示在一秒鐘的16000分之一處的聲波的振幅

數字採樣小助手

你可能認為採樣只是對原始聲波進行粗略近似估計,因為它只是間歇性的讀取。我們的讀數之間有間距,所以我們會丟失數據,對嗎?

數字採樣能否完美重現原始聲波?那些間距怎麼辦?

但是,由於採樣定理(Nyquist theorem),我們知道我們可以利用數學,從間隔的採樣中完美的重建原始模擬聲波——只要以我們希望得到的最高頻率的兩倍來採樣就可以。

我提到這一點,是因為幾乎每個人都會犯這個錯誤,並誤認為使用更高的採樣率總是能獲得更好的音頻質量。其實並不是。

預處理我們的採樣聲音數據

我們現在有一個數列,其中每個數字代表16000分之一秒的聲波振幅。

我們可以把這些數字輸入到神經網路中,但是試圖直接分析這些採樣來進行語音識別仍舊是困難的。相反,我們可以通過對音頻數據進行一些預處理來使問題變得更容易。

讓我們開始吧,首先將我們的採樣音頻分組為20毫秒長的塊兒。這是我們第一個20毫秒的音頻(即我們的前320個採樣):

將這些數字繪製為簡單折線圖,圖中給出了20毫秒時間內原始聲波的粗略估計:

雖然這段錄音只有50分之一秒的長度,但即使這樣短暫的時長也是由不同頻率的聲音複雜的組合在一起的。一些低音,中音,甚至高音混在一起。但總的來說,就是這些不同頻率的聲音混合在一起,才組成了人類的語音。

為了使這個數據更容易被神經網路處理,我們將把這個複雜的聲波分解成一個個組件部分。我們將一步步分離低音部分,下一個最低音部分,以此類推。然後通過將(從低到高)每個頻帶中的能量相加,我們就為各個類別(音調)的音頻片段創建了一個指紋fingerprint

想像你有一段某人在鋼琴上演奏C大調和弦的錄音。這個聲音是由三個音符組合而成的 - C,E和G – 他們都混合在一起組成一個複雜的聲音。我們想把這個複雜的聲音分解成單獨的音符,以此來發現它們是C,E和G。這和我們(語音識別)的想法一樣。

我們使用被稱為傅里葉變換Fourier Transform的數學運算來做到這一點。它將複雜的聲波分解為簡單的聲波。一旦我們有了這些單獨的聲波,我們將每一個包含的能量加在一起。

最終結果是每個頻率範圍的重要程度,從低音(即低音音符)到高音。下面的每個數字表示我們的20毫秒音頻剪輯中每個50Hz頻帶中有多少能量:

列表中的每個數字表示在50Hz頻帶中有多少能量

但是當你繪製一個圖表時,你很容易看到這些能量:

你可以看到,我們的20毫秒聲音片段中有很多低頻率能量,然而在更高的頻率中並沒有太多的能量。這是典型「男性」的聲音。

如果我們對每20毫秒的音頻塊重複這個過程,我們最終會得到一個頻譜圖(每一列從左到右都是一個20ms的塊):

hello」聲音剪輯的完整譜圖

頻譜圖很酷,因為你可以從音頻數據中實際看到音符和其他音高模式。對於神經網路來說,相比於原始聲波,它可以更加容易地從這種數據中找到規律。因此,這就是我們將實際輸入到神經網路的數據表示方式。

從短聲音識別字元

現在我們有了一個易於處理的格式的音頻,我們將把它輸入到深度神經網路中去。神經網路的輸入將會是20毫秒的音頻塊。對於每個小的音頻切片(Audio Slice),它將試圖找出當前正在說的聲音對應的字母(letter

我們將使用一個循環神經網路 - 即一個擁有記憶來影響未來預測的神經網路。這是因為它預測的每個字母都應該能夠影響下一個字母的預測可能性。例如,如果我們到目前為止已經說了「HEL」,那麼很有可能我們接下來會說「LO」來完成「Hello」。我們不太可能會說「XYZ」之類根本讀不出來的東西。因此,具有先前預測的記憶有助於神經網路對未來進行更準確的預測。

當我們通過神經網路運行我們的整個音頻剪輯(一次一塊)之後,我們將最終得到每個音頻塊和其最可能被說出的那個字母的一個映射(mapping)。這是一個看起來說」Hello」的映射:

我們的神經網路正在預測我說的那個詞很有可能是「HHHEE_LL_LLLOOO」。但它同時認為我說的也可能是「HHHUU_LL_LLLOOO」,或者甚至是「AAAUU_LL_LLLOOO」。

我們遵循一些步驟來整理這個輸出。首先,我們將用單個字元替換任何重複的字元:

HHHEE_LL_LLLOOO變為HE_L_LO

HHHUU_LL_LLLOOO變為HU_L_LO

AAAUU_LL_LLLOOO變為AU_L_LO

然後,我們將刪除所有空白處:

HE_L_LO變為HELLO

HU_L_LO變為HULLO

AU_L_LO變為AULLO

這讓我們得到三種可能的轉錄 - 「Hello」,「Hullo」和「Aullo」。如果你大聲說出這些詞,所有這些聲音都類似於「Hello」。因為它每次只預測一個字元,神經網路會得出一些試探性的轉錄。例如,如果你說「He would not go」,它可能會給一個可能 「He wud net go」 的轉錄。

解決問題的訣竅是將這些基於發音的預測與基於書面文本(書籍,新聞文章等)大資料庫的可能性得分相結合。你拋棄掉最不可能的轉錄,而保留住最現實的轉錄。

在我們可能的轉錄「Hello」,「Hullo」和「Aullo」中,顯然「Hello」將更頻繁地出現在文本資料庫中(更不用說在我們原始的基於音頻的訓練數據中),因此它可能是正確的。所以我們會選擇「Hello」 而不是其他作為我們的最後的轉錄。完成!

等一下!

你可能會想「但是如果有人說Hullo」怎麼辦?這是一個有效的詞。也許「Hello」是錯誤的轉錄!

HulloWho dis

當然可能有人實際上說「Hullo」而不是「Hello」。但是這樣的語音識別系統(基於美國英語訓練)基本上不會產生「Hullo」作為轉錄。用戶說「Hullo」,它總是會認為你在說「Hello」,無論你發「U」的聲音有多重。

試試看!如果你的手機被設置為美式英語,嘗試讓你的手機助手識別單詞「Hullo」。這不行!它掀桌子不幹了(╯‵□′)╯︵┻━┻!它總是會理解為「Hello」。

不識別「Hullo」是一個合理的行為,但有時你會發現令人討厭的情況:你的手機就是不能理解你說的有效的語句。這就是為什麼這些語音識別模型總是被更多的數據訓練來修復這些少數情況。

我能建立自己的語音識別系統嗎?

機器學習最酷炫的事情之一就是它有時看起來十分簡單。你得到一堆數據,把它輸入到機器學習演算法當中去,然後就能神奇的得到一個運行在你的遊戲筆記本電腦的顯卡上的世界級AI系統...對吧

這在某些情況下是真實的,但對於語音識別並不成立。語音識別是一個困難的問題。你必須克服幾乎無限的挑戰:質量差的麥克風,背景噪音,混響和回聲,口音變化,還有很多很多。所有這些問題都需要存在於你的訓練數據中,以確保神經網路可以應對它們。

這裡有另外一個例子:你知不知道,當你在一個充滿噪音的房間里說話時,你不自覺地提高你的音調,以便能夠蓋過噪音。人類在什麼情況下都可以理解你,但神經網路需要訓練來處理這種特殊情況。所以你需要人們對著噪音大聲說話的訓練數據!

要構建一個能在Siri,Google Now!或Alexa等平台上運行的語音識別系統,你將需要大量的訓練數據 -如果你不僱傭數百人為你錄製的話,它需要的訓練數據比你自己能夠獲得的數據要多得多。由於用戶對低質量語音識別系統的容忍度很低,因此你不能吝嗇。沒有人想要一個只有80%的時間有效的語音識別系統。

對於像谷歌或亞馬遜這樣的公司,在現實生活中記錄的數十萬小時的人聲語音就是黃金。這就是將他們世界級語音識別系統與你自己的系統拉開差距的地方。讓你免費使用Google Now!或Siri或只要50美元購買Alexa而沒有訂閱費的意義就是:讓你儘可能多的使用他們。你對這些系統所說的每一句話都會永遠記錄下來,並用作未來版本語音識別演算法的訓練數據。這才是他們的真實目的!

不相信我?如果你有一部安裝了Google Now!的Android手機,請點擊這裡收聽你自己對它說過的每一句話:

你可以通過Alexa在Amazon上找到相同的東西。然而,不幸的是,蘋果並不讓你訪問你的Siri語音數據。

因此,如果你正在尋找一個創業的想法,我不建議你嘗試建立自己的語音識別系統來與Google競爭。相反,你應該找出一種能讓人們把他們說幾個小時話的錄音給予你的方法。這種數據可以是你的產品。

路在遠方

這個用來處理不同長度音頻的演算法被稱為Connectionist Temporal Classification或CTC。你可以閱讀2006年文章。

百度的Adam Coates在灣區深度學習學校做了關於「深度學習語音識別」的精彩演講。你可以在YouTube上觀看這段視頻(他的演講從3分51秒開始)。強烈推薦。


感謝「點名」。去年老羅在鎚子手機發布會上,秀的那段訊飛輸入法,其實背後就是語音識別技術。我們拿訊飛輸入法這款產品,梳理了背後的技術原理。如右→_→「識別一秒鐘,線下十年功」 -- 語音輸入如何一分鐘400字 - 知乎專欄 。祝閱讀愉快,也歡迎更多關於語音識別技術的交流、討論。


有朋友說我好久沒回答專業的東西了,正好今年在國內的時候接觸了一個關於語音識別技術原理的項目,對此略有了解,可以簡單說一說。


自動語音識別技術(ASR,Automatic Speech Recognition)是一種通過讓機器通過識別和理解的過程,把人類的語音信號轉變為相應文本的技術。咱們先來看看語音識別的歷史


其實早在計算機發明之前,有關ASR技術的理念就已經誕生了,而早期的聲碼器就可以被視為是語音識別及合成的雛形。而1920年代生產的"Radio Rex"玩具狗,可能是最早的語音識別器,當這隻狗的名字被呼喚的時候,它能夠從底座上彈出來。這麼看來論輩分它是阿爾法狗的爺爺……

但毫無疑問60年代計算機的發展推動了語音識別技術技術,這其中最重要的一個里程碑就是動態規劃技術(DP)線性預測分析技術(LP),後者又發展出了更成熟的動態時間歸正技術(DTW),包括矢量量化(VQ)隱馬爾可夫模型(HMM)理論。但這些還都只是枯燥又晦澀的演算法,換句話說,工程師看到這些玩意也一頭霧水,根本沒辦法迅速在應用到實踐里。


所以在80年代時,著名的ATT Bell實驗室通過努力,把原本深奧無比的HMM純數學模型工程化,為應用開發打下了重要的基石。到90年代時,深度神經網路技術的突破性發展,終於把語音識別技術原本的難關攻破了。所以在我們會發現,從21世紀後語音識別技術的發展就迅速加快了。


其實看起來高大上的語音識別技術,原理並沒有多麼複雜。


不論是微軟家的Cortana、三星家的S-voice蘋果家的Siri,還是國內一些獨立做語音識別的比如訊飛、Rokid,在原理在本質上沒有多少差異:就是語音輸入後,進行特徵提取,將提取的特徵值放進模型庫里,再不斷地進行訓練和匹配,最終解碼得到結果。

如果要細說的話就比較複雜了,比如模型庫中又分為聲學模型語言模型。其中語言模型是根據不同種類的語言,對詞串進行統計建模,目前普遍採用的是基於(n-1)階馬爾可夫鏈統計的n元語法模型。


這裡詳細說下聲學建模吧。首先通過前端特徵提取獲得聲學特徵,再進一步對聲學特徵進行統計建模。建模使用到的貝葉斯統計建模框架,也就是最大後驗概率決策準則。這裡演算法這種深奧的東西就不說了,除非深度開發,否則直接套用就行了,我自己也是一知半解,還是念書的時候學的。


說說提取聲學特徵該如何實現:當語音輸入之後,首先進行模電轉換,將模擬信號轉變為數字信號,再進行靜音切除去掉無關噪音,然後進行分幀。將此時的信號分成一幀一幀之後(每一幀並不是獨立存在的而是互相關聯的),還要進行一系列的信號處理,包括預加重、加窗之後,再進行FFT變換之後,再通過Mel參數的濾波和取對數、離散餘弦變換等一系列演算法處理後,可以進行用梅爾頻率倒譜係數(MFCC)進行特徵提取,得到聲學特徵。


感覺越說越複雜了……後面簡略點說吧。前面說了語言模型,而聲學模型就是將聲學特徵統計建模後得到的。得到了模型庫之後就可以進行模型訓練和模式匹配了。


所謂模型訓練就是指按照一定的準則,從大量已知語音模式中獲取一個最具特徵的模型參數。而模式匹配則相反,是根據一定準則,將未知語音模式與模型庫中的某一個模型獲得最佳匹配。


最後的解碼過程又可以分成動態解碼網路靜態解碼網路兩種:動態網路會編譯一個狀態網路並構成搜索空間,把單詞轉換成一個個的音素後將其按照語序拆分成狀態序列,再根據音素上下文一致性原則將狀態序列進行連接。

而靜態網路一般是針對一些特殊詞(孤立詞)的識別網路,它的結構就簡單多了:先將每條特殊詞擴展成HMM狀態序列,然後再計算得分,選擇得分最大的作為識別輸出結果。因為靜態網路是根據聲學概率計算權重,不需要查詢語言模型概率,因此解碼速度很快。


這樣的一個流程大體上就是語音識別技術的主要原理。


最後再說點題外話吧,語音識別技術其實應用以及很廣泛了,比如在北美很多企業的電話自動服務都會用到,只要用戶直接說出想要的命令,就可以自動查詢到需要的服務,不需要像過去那樣按鍵。手機應用里使用語音識別技術比如微信的聲音鎖,訊飛、搜狗語音輸入等等很多就不說了,而個人最看好的是聲控語音撥號系統、家用機器人、智能家電等領域,以語音交流的形式取代過去的傳統人機互動。國內在這個領域的語音識別嘗試也是相當多的,比如Rokid這樣可以語音識別命令還具有深度學習能力的家用機器人,可以自動播放視頻、音樂,甚至以後可以語音對話機器人叫個餓了么外賣,叫個滴滴出行等等。我今年夏天去參觀過他們的語音識別開發部門,他們用的是自己獨立開發的一套流程在跑,整個語音模型庫也是根據中國人發音習慣(連讀、口音)做的。當時測試的產品識別度挺驚艷的,有種真正在人機交互的感覺,等於通過這個機器人接入口來控制其他電子產品,令人耳目一新。


不過遺憾的是,我家的掃地機器人還是只能用手去按鍵操作……


更遺憾的是,我這篇答案還是只能靠手打……


是根據統計概率計算出來的,國內做的比較好的是科大訊飛,目前的普通話考試用的就是他們的系統。
吳軍的《數學之美》對語音識別做了個通俗易懂的介紹,有興趣可以去看看。


我習慣把語音識別比喻成: 讓你識別出圖片中的人和豬。(只不過把圖片變成了語音)
1.語音的特徵提取: 我比喻成識別圖片里的人和豬的時候 你是看鼻子還是看耳朵。豬的鼻子比人大 耳朵也比人大 利用這個特徵就可以區分開豬和人。 當然在語音領域就是MFCC PLC 基頻 等等特徵(太多了 查下文獻一大堆)。
2.模式識別 這裡用的分類器有很多: SVM 向量機 GMM高斯混合模型 ANN人工神經網路等 不同的分類任務 可以選用不同的分類器。 學識淺薄 大概說一下ANN人工神經網路的原理 :你給ANN輸入豬的特徵(大耳朵大鼻子粉嘟嘟的皮膚) 並告訴ANN 你tm給我記住這是豬!然後ANN就自動調節內部參數 並記住有這種特徵就輸出:這tm是一頭豬!
語音同理:你可以把mfcc等特徵 輸入ANN並訓練它。最後就得到了會語音識別的分類器。
圖片里的豬人識別,可以自動換成語音中的病態嗓音識別或是聲紋識別。

我還只是剛入門小白 有什麼說的不對的地方

你們就乖乖聽著(?˙ー˙?)


java 同學可以看看這個:http://www.cp.jku.at/people/schedl/Research/Development/CoMIRVA/webpage/CoMIRVA.html


大體的想法還是正確的,不過有一點:
設計一個「標準」的模擬信號庫,與用戶輸入比對這個,在網路上為你找了一點更詳細的介紹:

最早的基於電子計算機的語音識別系統是由ATT貝爾實驗室開發的Audrey語音識別系統,它能夠識別10個英文數字。其識別方法是跟蹤語音中的共振峰。該系統得到了98%的正確率。到1950年代末,倫敦學院(Colledge of London)的Denes已經將語法概率加入語音識別中。  1960年代,人工神經網路被引入了語音識別。這一時代的兩大突破是線性預測編碼Linear Predictive Coding (LPC), 及動態時間彎折Dynamic Time Warp技術。 語音識別的最重大突破是隱含馬爾科夫模型Hidden Markov Model的應用。從Baum提出相關數學推理,經過Labiner等人的研究,李開復最終實現了第一個基於隱馬爾科夫模型的大辭彙量語音識別系統Sphinx,他也憑藉此發明獲得1988 美國商業周刊最重要發明獎。此後嚴格來說語音識別技術並沒有脫離HMM框架,可以說現在手機上的語音撥號就脫胎於李開復的語音識別系統。

引用百度百科《語音識別系統》,http://baike.baidu.com/view/1013816.htm


補充個人的理解語音識別,狹義的識別,為文字內容識別;寬泛的識別,可以當作人耳,人能從語音中聽出男女、語種、說話人、內容等,則意味著語音識別就是機器耳朵,能有性別、語種方言、聲紋(類似指紋概念)、內容識別了。簡單而言,目前識別就是2步,訓練和測試。拿好理解的語種識別來說:訓練,就是提取特徵描述語音,是學習過程,例如搞一定量的漢語、英語,訓練出2個語種模型;而識別測試,則每一條語音提取特徵,然後和這2個語種模型特徵對比,給出相似度判斷即可。


好帖子


高手如雲,大概了解了


非業內專業人士,但從使用者來說,我覺得單講識別原理現在已經很成熟。但只做到轉換音頻到文本不是重點,難點關鍵是使用場景,以及語義理解和質量,是否真的適用我們的實際需求?!

比如,有比較複雜的環境背景雜音,識別場景中多個角色的?

不久前工作中有一段長音頻,需要轉文字提取,重點是識別場景中多個角色的
,給以區分標識。
嘗試了4種不同自動識別的系統,最終放棄了,感覺自動是別的不靠譜啊!最後尋求一家速錄寶的公司,進行人工轉寫,終於解決了我的需要,滿足區分多人對話以及排版格式的需求。

希望未來的語音識別可以更強大更智能。


業界就科大和百度兩家最厲害吧。http://www.iflytek.com/,語音識別-百度大腦


先通過經驗模型轉換為字元串
再隱馬模式識別轉換為自然語言


個人認為語音識別可以看成兩個步驟的輸入法:第一,根據聲學模型把聲音轉換成音節(可以看成拼音),第二,就是就根據統計語言模型把拼音轉換成文字了。主要問題是兩個模型怎麼去訓練和使用


很多知友指出《數學之美》中討論的只是自然語言處理部分的內容,與語音識別關係不大,對原先這個不太科學的回答可能造成的誤導表示抱歉。回答這個問題的本意是分享一些自己所看到過的信息,所以還是把原來的回答保留在下面。
==
《數學之美》一書中對自然語言處理的主題有所提及,可以參考一下。我對此是外行,但從這本書中的描述來看,現在自然語言處理技術主要是基於統計學來做的,純粹的傳統意義上的基於規則的語義分析(類似於編譯原理中講的那些)這條路基本上是走不通的。


啥,原來不是手機裡面有個人啊,我還以為是我說話,手機里的那個人幫我在打字呢!


門外漢,純猜測

既然音頻能夠轉換成波形,那麼語音識別和圖像識別技術在某些方面是共通的。
因為人說的話都是連貫的,帶有語義的,所以語音識別又和全文搜索技術有一定聯繫。

簡單來說

li xiang

這個拼音有很多種可能

如 理想,立項,離鄉,莉香等等

但是如果是

li xiang zhe ge ren

那麼代表這裡的li xiang 是指帶的一個人物

再根據語調

可以判斷出到第是李湘,還是李想


推薦閱讀:

有哪些看似很帥,其實很傻的行為?
小時候長得好看是怎樣一種體驗呢?
有哪些讓你覺得「高端的東西就是好」的瞬間?
如何評價「學數理化有什麼用?」這一類的言論?
穿打底褲是一種怎樣的體驗?

TAG:人工智慧 | 科普 | 語音識別 | X 的原理 | X 的工作原理 |