語音交互(一)—— 語音識別

語音交互(一)—— 語音識別

來自專欄 AI-龍門陣

通訊主要靠吼。

導讀:前面的文章《人工智慧是個啥》—— 人工智慧應用現狀 介紹了人工智慧帶來了交互技術的變革,語音交互是其中很重要的一部分。目前我工作的公司主要提供語音交互相關的技術方案,所以會在未來幾章中將展開語音交互相關的技術,本章就以語音識別開始。


一,一切始於一聲「吼」

科技發展的真快,在曾經的那個年代,我們是這樣過日子的。

出門基本靠走;

取暖基本靠抖;

治安基本靠狗;

通訊主要靠吼。

路見不平一聲吼呀,通訊這就開始了呀,語音交互也就開始了啊。

對於機器來說要完成語音交互,就需要做幾件事。

  • 他吼啥?ASR(Automatic Speech Recognition):語音識別,聽見你說的是什麼,轉化成文字。
  • 啥意思?NLU(Natural Language Understanding):自然語言理解,知道你想幹什麼,理解你話中的意圖。
  • 我也說,你好。NLG(Natural Language Generation):自然語言生成,輸出內容發音標註。
  • 反吼回去。TTS(Text To Speech):語音合成,機器合成輸出語音。

通過這個簡單的模型就能完成最基本的語音交互,但是有個問題沒有解決,為什麼我要回答「你好」而不是「哈嘍」,「不好」或者「你也好」,如果他又問了「你叫什麼名字」怎麼辦,他如果不問了又怎麼辦?所以在整個交互的背後有一個對話引擎CE(Conversation Engine),決定機器針對每種輸出的響應是什麼樣的,如此組成了一個完整的語音交互模型。

語音交互模型

人們希望使用自然語言交流同機器交流,機器能夠 聽見,聽懂,並表達。我們常常對外說我們在做語音識別,而其實語音交互或者VUI(Voice User Interface)是更為準確的辭彙,ASR,NLU,NLG,TTS加CE構成了VUI的主要框架,而狹義的語音識別只是其中的一部分,主要指 讓機器通過識別和理解,把語音信號轉變為相應的文本或命令。


二、語音識別原理

回顧人類發展史,不難看出,隨著人的不斷進化,從最初通過手掌、肢體使用簡單工具、傳遞簡單信息,發展到控制發聲並通過耳朵接收,形成了一個以語音為載體的快速信息傳遞通道和收發閉環,成為人類間最自然、最重要的信息交互手段。聲波作為一種音頻信號,和視頻信號、無線電信號一樣是,非接觸方式的傳播,也是人類唯一可以不藉助工具就可自由掌控的一種天然「無線」資源。要讓機器能夠聽見,首先要做的事情是我們需要將聲波輸入到計算機中。

  • 信號處理,聲學特徵提取

我們都知道聲音信號是連續的模擬信號,要讓計算機處理首先要轉換成離散的數字信號,進行採樣處理。正常人聽覺的頻率範圍大約在20Hz~20KHz之間,為了保證音頻不失真影響識別,同時數據又不會太大,通常的採樣率為16KHz。

語音採樣

在數字化的過程中,我們首先要判斷端頭,確定語音的開始和結束,然後要進行降噪和過濾處理(除了人聲之外,存在很多的噪音),保證讓計算機識別的是過濾後的語音信息。獲得了離散的數字信號之後,為了進一步的處理我們還需要對音頻信號 分幀。因為離散的信號單獨計算數據量太大了,按點去處理容易出現毛刺,同時從微觀上來看一段時間內人的語音信號一般是比較平穩的,稱為 短時平穩性,所以會需要將語音信號分幀,便於處理。

我們的每一個發音,稱為一個 音素,是語音中的最小單位,比如普通話發音中的母音,輔音。不同的發音變化是由於人口腔肌肉的變化導致的,這種口腔肌肉運動相對於語音頻率來說是非常緩慢的,所以我們為了保證信號的短時平穩性,分幀的長度應當小於一個音素的長度,當然也不能太小否則分幀沒有意義。

通常一幀為20~50毫秒,同時幀與幀之間有交疊冗餘,避免一幀的信號在兩個端頭被削弱了影響識別精度。常見的比如 幀長為25毫秒,兩幀之間交疊15毫秒,也就是說每隔25-15=10毫秒取一幀,幀移為10毫秒,分幀完成之後,信號處理部分算是完結了。

隨後進行的就是整個過程中極為關鍵的特徵提取。將原始波形進行識別並不能取得很好的識別效果,而需要進行頻域變換後提取的特徵參數用於識別。常見的一種變換方法是提取MFCC特徵,根據人耳的生理特性,把每一幀波形變成一個多維向量,可以簡單地理解為這個向量包含了這幀語音的內容信息。

實際應用中,這一步有很多細節,聲學特徵也不止有MFCC這一種,具體這裡不講,但是各種特徵提取方法的核心目的都是統一的:盡量描述語音的根本特徵,盡量對數據進行壓縮。

比如下圖示例中,每一幀f1,f2,f3…轉換為了14維的特徵向量,然後整個語音轉換為了14*N(N為幀數)的向量矩陣。

分幀示意圖

一幀一幀的向量如果不太直觀,還可以用下圖的頻譜圖表示語音,每一列從左到右都是一個25毫秒的塊,相比於原始聲波,從這種數據中尋找規律要容易得多。

發音Robert的頻譜圖

不過頻譜圖主要用作語音研究,語音識別還是需要用一幀一幀的特徵向量。

  • 識別字元,組成文本

特徵提取完成之後,就進入了特徵識別,字元生成環節。這部分的核心工作就是從 每一幀當中找出當前說的音素,再由多個音素組成單詞,再由單片語成文本句子。 其中最難的當然是從每一幀中找出當前說的音素,因為我們每一幀是小於一個音素的,多個幀才能構成一個音素,如果最開始就錯了則後續很難糾正。

怎麼判斷每一個幀屬於哪個音素了?最容易實現的辦法就是概率,看哪個音素的概率最大,則這個幀就屬於哪個音素。那如果每一幀有多個音素的概率相同怎麼辦,畢竟這是可能的,每個人口音、語速、語氣都不同,人也很難聽清楚你說的到底是Hello還是Hallo。而我們語音識別的文本結果只有一個,不可能還讓人參與選擇進行糾正。

這時候多個音素組成單詞的統計決策,單片語成文本的統計決策就發揮了作用,它們也是同樣的基於概率:音素概率相同的情況下,再比較組成單詞的概率,單片語成之後再比較句子的概率。

比如以上那個詞很有可能是「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是最可能的,所以輸出Hello的文本。上面的例子很明確的描述怎麼從幀到音素,再從音素到單詞,概率決定一切,那這些概率是怎麼獲得的了?難道為了識別一種語言我們把人類幾千上百年說過的所有音素,單詞,句子都統計出來,然後再計算概率?傻子都知道這是不可能的,那怎麼辦,這時我們就需要模型:

  • 聲學模型

發聲的基本音素狀態和概率,盡量獲得不同人、不同年紀、性別、口音、語速的發聲語料,同時盡量採集多種場景安靜的,嘈雜的,遠距離的發聲語料生成聲學模型。為了達到更好的效果,針對不同的語言,不同的方言會用不同的聲學模型,在提高精度的同時降低計算量。

  • 語言模型

單詞和語句的概率,使用大量的文本訓練出來。如果模型中只有兩句話「今天星期一」和「明天星期二」,那我們就只能識別出這兩句,而我們想要識別更多,只需要涵蓋足夠的語料就行,不過隨之而來的就是模型增大,計算量增大。所以我們實際應用中的模型通常是限定應用域的,同比如智能家居的,導航的,智能音箱的,個人助理的,醫療的等等,降低計算量的同時還能提高精度,

  • 辭彙模型

針對語言模型的補充,語言詞典和不同的發音標註。比如定期更新的地名,人名,歌曲名稱,熱詞,某些領域的特殊辭彙等等。

語言模型和聲學模型可以說是語音識別中最重要的兩個部分,語音識別中一個很重要的工作就是訓練模型,有不識別的句子我們就加進去重新訓練。不過我們在訓練和計算概率時會發現一個問題,假設某條句子S出現的概率為P(S),其中單詞序列為W1,W2,W3 …, Wn

P(S) = P(W1,W2,W3 …, Wn) 展開為每個詞出現的條件概率相乘

= P(W1)·P(W2|W1)·P(W3|W1,W2)···P(Wn|W1,W2,W3 …, Wn-1)

從計算上看第一個詞的條件概率P(W1)很好計算,第二個詞P(W2|W1)在已知第一個詞的情況下,還不太麻煩,第三個詞開始變得很難了,因為涉及到三個變數W1,W2,W3,每一個詞都可能是一種語言字典的大小,到了Wn基本無法估計了,計算量太大了。

這時我們有很多簡化但是有效的方法進行計算,比如說HMM隱馬爾科夫模型Hidden Markov Model。

隱馬爾科夫模型基於了兩個最大的假設:一是內部狀態的轉移只與上一狀態有關,另一是輸出值只與當前狀態(或當前的狀態轉移)有關。就把問題簡化了,

也就是說一個句子中某個單詞序列出現的概率只和前面的一個單詞有關,這樣計算量就被大大簡化了。

P(S) = P(W1)·P(W2|W1)·P(W3|W2)···P(Wn|Wn-1)

如上圖示例,基於隱馬爾科夫演算法生成語言模型。我們只要按照實際要求構造出對應的模型,模型中涵蓋足夠的語料,就能解決各種語音識別問題。

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

如此一來整個語音識別的流程就很清晰了,再來回顧以下整個步驟:

  • 信號處理:模數轉換,識別端頭,降噪等等。
  • 信號表徵:信號分幀,特徵提取,向量化等等。
  • 模式識別:尋找最優概率路徑,聲學模型識別音素,辭彙模型和語言模型識別單詞和句子。

ASR語音識別模型

最後將語音識別成文本。


三,賈里尼克的貢獻

語音識別發展早期的20多年,即從20世紀50年代到70年代,是科學家們走彎路的階段,全世界的科學家對計算機完成語音識別這類只有人才能做的事情,認為必須先讓計算機理解自然語言,這就局限在人類學習語言的方式上了,也就是用電腦模擬人腦,這20多年的研究成果近乎為零。

直到1970年後,統計語言學的出現才使語音識別重獲新生,並取得了今天的飛凡成就。推動這個技術路線轉變的關鍵人物是德里克·賈里尼克(Frederick Jelinek)和他領導的IBM華生實驗室(T.J.Watson),開始使用統計方法。

採用統計的方法,IBM將當時的語音識別率從70%提升到90%,同時語音識別的規模從幾百單詞上升到幾萬單詞,這樣語音識別就有了從實驗室走向實際應用的可能。在賈里尼克之前,科學家們把語音識別問題當作人工智慧和模式匹配問題,而賈里尼克將它當作通信問題,並用兩個隱含馬爾可夫模型(聲學模型和語言模型)把語音識別概括得清清楚楚。

這個框架結構至今仍對語音識別影響深遠,它不僅從根本上使得語音識別有使用的可能,而且奠定了今天自然語言處理的基礎。賈里尼克後來也因此當選美國工程院院士,並被Technology雜誌評為20世紀100名發明家之一。

賈里尼克

賈里尼克相當於憑藉一己之力把語音識別給救了回來,從根本上使得語音識別有實用的可能,在70多歲以後仍然頭腦敏銳,並且每天按時上班。2010年9月14日,他在辦公桌前因心臟病發作而不幸離世。他在別人退休、安度晚年的年齡開始創立當今世界學術界最大的語音和語言處理中心,並且工作到了生命的最後一天。

賈里尼克一直認為學習是一輩子的事情,他也確實做到了,由於他有大量的學生和朋友在Google工作,這些人和Google公司為約翰·霍普金斯大學捐贈了一筆錢,創立了賈里尼克獎學金支持希望在語音識別領域深入專業的學生。

敬禮!緬懷!

在大數據時代到來後,隱馬爾可夫模型在語音識別上也出現了局限,即數據量提升時,它帶來的表現提升沒有深度神經網路那麼大。如果沒有深度神經網路,但是有大數據,隱馬爾可夫模型也可以做到實用,但深度神經網路是讓其做得最好,降低了門檻,讓更多的人可以加入進來,不過本質上他們都屬於統計模式識別。

獲得的數據越多樣本越大,則統計的概率就能夠越逼近,模型越精確,識別率就能夠進一步的提高。


四,未來的挑戰

目前大多的語音識別應用都開放了用戶反饋功能,希望用戶能夠幫助改進語音的識別率,

一方面將用戶的識別語音上傳到雲端,提升聲學模型的多樣性;

另一方面會鼓勵用戶積極反饋識別錯誤的語句,研究人員會進行篩選標記,進一步完善模型。

比如,小米的小愛同學所有的語音記錄都對用戶開放,用戶可以隨時反饋識別是否有問題。

小愛中的錯誤反饋界面

最近,國內各大廠商百度、訊飛等層都公布了自己ASR的識別率超過了97%,對外宣稱已經達到了普通人的識別水平,在這裡識別率通常指的是「WER(詞錯誤率,Word Error Rate)」

WER:為了使識別出來的詞序列和標準的詞序列之間保持一致,需要進行替換、刪除或者插入某些詞,這些插入、替換或刪除的詞的總個數,除以標準的詞序列中詞的總個數的百分比,即為WER。

· Substitution——替換

· Deletion——刪除

· Insertion——插入

· N——單詞數目

而實際上這個識別率的參考價值並不大,沒有告訴語料規模,就像不知道分母的概率統計都是耍流氓,重點班的高考升學率95%都是985和211,然而呢。

況且這個也是理論測試環境上的值,不同口音,不同信噪比狀態下的識別率(車載場景中信噪比模擬不同車速、車窗、空調狀態等)也不會相同,你找個福建人再找個河北人出來的識別率肯定不同。

所以最重要的還是實際應用的情況,針對於各個專有場景的優化做得怎麼樣,而語音識別目前來說還是存在著很多的挑戰:

  • 遠場識別

只有明確說話人的方位後,才可以定向的拾音,做降噪處理,同時對說話人進行語音增強,所以很多語音識別都要求靠近麥克風。但是遠場識別的場景很多,在較大的空間都會用到(教室、會議室、飯店、車載等等),這種場景下雜訊、混響、回聲等等會導致聲學模型和近場識別時完全不同,很難判定目標人聲。通常採用的方式是,在前端通過麥克風陣列的相關技術,通過聲源定位及自適應波束形成做語音增強;在後端的語音識別上,還需要結合基於大數據訓練、針對遠場環境的聲學模型,這樣才能較好解決識別率的問題。

  • 複雜雜訊環境

比如上方提到的車載環境,不同速度,不同車型,開窗,不開窗,打開空調,不開空調等等不同場景下噪音不同,導致很難構造聲學模型。再比如針對飯店的場景,人聲,盤碟的聲音,腳步聲,笑聲等等各種噪音疊加在一起非常嘈雜,而如果有人在叫我們的名字,人能夠迅速的反應,但是機器卻非常困難。

  • 特異性口音

每個人說話的速度,語氣的輕重,男人和女人,不同的年紀都會存在差異,再加上不同地區的口音,導致識別難度加大,比如普通話的識別,我們就不能光考慮標準普通話,各種方言普通話都要考慮,什麼川普,長沙塑料普通話,廣普等等,而且還要採集盡量多差異化的語音。

總的來說ASR目前已經比較成熟,主要還是需要在應用領域上不斷的完善,所以各大廠商的路子都是提前布局,深耕領域,收集反饋,優化閉環,再持續改進。


歡迎關注,參閱本專欄其他文章:

1、《人工智慧是個啥》—— 人工智慧新紀元

2、《人工智慧是個啥》—— 人工智慧簡史

3、《人工智慧是個啥》—— 機器學習

4、 《人工智慧是個啥》—— 人工智慧應用現狀


推薦閱讀:

F#周報 2018第33周-F#4.5 &VS 15.8發布
AI小項目
清華-中國工程院知識智能聯合實驗室發布2018NLP研究報告
為什麼谷歌人工智慧擊敗圍棋冠軍這事如此重要?

TAG:語音識別 | 人工智慧 | 機器學習 |