天天看點

語音識别介紹聲學語言WFST總結

語音識别--通俗簡介

  • 介紹
  • 聲學
  • 語言
  • WFST
  • 總結

介紹

語音識别是将音頻波形轉換為文字的過程,本質上是音頻序列到符号序列的解碼問題,先插一張通俗簡單的圖(盜圖誰不會?)

語音識别介紹聲學語言WFST總結

上圖簡單介紹了訓練與識别的流程,主要用到兩個模型:聲學模型和語音模型,然後由解碼網絡(也就是“語音解碼和搜尋算法”這個框,通常是wfst–有限狀态轉換器實作)将這兩個模型整合到一起;之前有說過識别過程是一個序列到序列的解碼問題,在wfst中就是一個網絡尋徑問題(帶權最短路徑?viterbi?動态規劃?一個意思)。下面依次通俗講解各個部分。

聲學

聲學模型,通俗的講,是用于将語音轉換成拼音的模型,如何轉換?先提一個概念:音素,可以簡單了解成聲母、韻母、或者音标,一個字的發音由若幹音素串聯組成,很顯然我們的問題就變成了解碼音素序列;而一個音素又是由多個音頻幀組成,問題進一步轉換為若幹個音頻幀到底屬于哪一個音素;ok,那麼現在的問題就轉變為“判斷音頻特征序列是否屬于某一個音素模型”,對時間序列的模組化顯然HMM隐馬爾可夫模型很适合,模組化的對象就是音素(也有對字、詞的模組化,比如對字的模組化,HMM隐狀态是聲母韻母的音素,觀測序列是MFCC特征,這或許能讓你更好的了解,然而實際生産模型幾乎都是基于音素的模組化,通常是狀态綁定的三音素模型,前述的對字模組化反而會讓人走入誤區,因為音素HMM模型的隐狀态是無實際實體意義的)。

識别千萬步,特征第一步,從特征提取說起,音頻幀是PCM時域信号不便直接分析,那首先需要找到能顯著标注該音頻幀的特征值。

特征提取:音頻幀是時域信号,其時域特征不足以區分不同的發音,而頻域特征卻清晰很多,并且頻譜的共振峰包含了絕大部分的語音資訊,是以特征提取的方式也都是圍繞着這部分在進行,比如經典的mfcc特征,核心是FFT+對數譜+DCT導出共振峰資訊,此處給個連結,是我能找到解釋得最詳盡的一篇文章 https://blog.csdn.net/u013378306/article/details/65954965 ,你也可以不關心其過程,隻需要知道這裡是将每一幀音頻用一個向量(這個向量可以用來表征共振峰)來表示,這就夠了。

提取完特征後得到的是一個特征向量序列,我們針對每個音素訓練其HMM模型(Baum-Welch算法、EM算法完成模型訓練,算法資料遍地是,不怕搜不到,就怕看不懂),關于HMM模型不細說,你需要明白以下幾點:

  • 兩個集合:觀測序列、狀态序列
  • 兩個矩陣:狀态轉移矩陣(狀态間的轉移機率),發射機率矩陣(狀态下“發射”出某一觀察值的機率)
  • 初始狀态機率分布
  • 三個問題:評估問題,解碼問題,訓練問題,以及各自對應的算法(前向/後向算法,viterbi算法,EM、BW算法)

最後把觀測序列在每個音素的HMM模型上跑一遍,“跑出來看哪個音素模型生成其的機率最大,就認為是該音素,拼音序列也就有了”。

本文的重點來了!

聽起來很對也很好了解,對應于HMM的“評估問題”,一切看似很美好,針對孤立詞是評估問題沒錯,但是 目前模型都是連續語音識别,暫認為輸入給HMM的是觀測序列(其實不是,因為還有GMM),輸出的并非是“屬于某一個音素模型的機率”,而是 隐狀态序列。

你可以這麼了解:所有的音素模型最終會組成一個巨大的狀态網絡,實際上我們要的是隐狀态序列,并最終在狀态網絡裡尋徑;這也是為什麼針對HMM而言,孤立詞語音識别是評估問題而連續語音識别是解碼問題。如果你之前的了解都是基于孤立詞語音識别,那麼在了解連續語音識别可能需要多轉換一下思路,并非串起來就能搞定。

說了這麼多,那GMM在哪?DNN,CNN,RNN各種NN在哪?它們都是用來做一件事,将輸入的特征轉換成發射機率(實際上是p(隐狀态|觀測值)的條件機率,再經過貝葉斯公式轉換成p(觀測值|隐狀态)),也就是機率密度函數模型,GMM混合高斯模型前幾十年都被廣泛應用,即使是使用各種NN,依舊需要先訓練GMM,千萬别以為萬能的神經網絡是取代整個HMM-GMM,它沒那麼萬能。GMM不多說,成熟的東西網上一萬篇,不差我這一篇,我隻說一個問題:為什麼需要GMM機率密度函數的模組化?原因很簡單,聲學特征是連續的,而HMM的觀測序列是離散的,HMM不可能窮舉所有觀測集合,如果還不懂,多思考下。

神經網絡在語音識别裡的應用也隻是取代了GMM(CTC端到端的方案就是另一回事了),因為其拟合性更好;各種NN咱也不說了,“博文千萬條,不差我這條”,隻說一個問題,NN的輸入是特征,輸出的條件機率,而我們在做監督訓練時都需要事先給出标注,往往标注都是直接給的文本,對應聲學也就是拼音,那我們的标注是如何轉換成機率值的?同一個發音“啊”,有人一秒就啊完了,有的人要啊上好幾秒(比如日本人),标注都是一個字“啊”,此時的标注到底怎麼玩的?不多述,有興趣可以多查閱下資料,可以關注FA, viterbi強制對齊等…

注:本文隻簡述,算法公式千萬篇,天下文章抄抄抄,沒必要再次抄一份,我隻論述可能的誤區,以及輸入輸出層面的東西,讓了解更貼合工程。

語言

N-GRAM,一個字(詞)與且僅與前面N個字(詞)相關,條件機率問題,拿一大堆語料來做機率統計,然後統計出各自出現的頻數(語料夠多,大數定理你懂的),然後條件機率公式除除除就完事了,網上随便翻翻就是千萬篇,相比聲學,語言模型确實容易了解得多,在此隻說兩點:

1.有基于字的,有基于詞的,如果是基于詞的,需要先用分詞模型進行分詞,然後分詞模型又是一大堆:N-GRAM統計分詞模型、HMM、viterbi、詞典等等;先用N-GRAM基于字來訓練分詞模型,再用該分詞模型去分詞語料,再訓練詞的N-GRAM,繞了點…再者HMM、viterbi、詞典這套有向圖分詞的可以參考jieba分詞,有源碼喲。

2.你可以了解為求條件機率,然後除除除,但絕不是除除除就完事,水也很深,比如一個詞的詞性,前面、後面能接的詞的類别、數量,未出現在預料中的詞,等等,水深淹死人。

WFST

有限狀态轉換器,整合聲學模型與語言模型,建構一個巨巨巨大的HCLG解碼網絡,無論聲學還是語言,都是狀态機率模型,自頂向下,語言模型被展開成文字序列,進一步拼音序列,音素序列,狀态序列,整個網絡無比龐大,wfst就是将整個網絡連接配接并展開,再根據DNN輸出的狀态序列(并非一個序列,也是一個網絡,因為一個特征輸入對應的輸出是條件機率向量,是一組值,而非一個)最終在網絡中尋徑解碼。具體可參考kaldi HCLG,Openfst。

總結

本文隻是部落客簡單論述,談談大概的了解,純手打,HMM-GMM語音識别技術已經發展成熟了三十年了,技術棧文章随處索引,是以本文不講各公式,要求讀者掃過基本的技術知識點比如基本HMM的概念、三個問題、混合高斯、貝葉斯、viterbi、神經網絡基礎等,不然本文對你沒用。

主要細說了一下聲學,因為相比語言和wfst,前者了解會稍微難一些,後兩者其他技術部落格都論述的比較清晰了;聲學裡詳細論述了輸入輸出層面的一些東西,更切合實際工程的了解,特别是差別于孤立詞或者一些想當然的了解,或許你看完一些部落格後有很多靈光一閃的瞬間感覺自己好像catch到點了,然後細想之後又會出現困惑,希望這篇文章能幫你解惑。

版權聲明:本文為部落客原創文章,歡迎轉載,轉載請說明出處,部落客聯系方式qq:944131033或者微信:lawer979011

繼續閱讀