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

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


outline:

1、背景

2、通俗易懂版

3、進階版

4、多音字的處理能力

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

1、背景

GB 2312標準共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個。對於人名、古漢語等方面出現的罕用字,GB 2312不能處理,這導致了後來GBK及GB 18030漢字字符集的出現。漢語的聲母共有23個,韻母24個。普通話的讀音共有420個左右,即使考慮聲調,總數也遠小於漢字的個數。

漢字中的同音字現象這裡也無需多費口舌來介紹,直接呈上我國著名語言學家、「現代語言學之父」趙元任先生的兩篇文章。

《施氏食獅史》

石室詩士施氏,嗜獅,誓食十獅。施氏時時適市視獅。十時,適十獅市。是時,適施氏適市。施氏視十獅,恃矢勢,使是十獅逝世。氏拾是十獅屍,適石室。石室濕,施氏使侍拭石室。石室拭,施氏始試食十獅屍。食時,始識十獅實十石獅屍。試釋是事。

《季姬擊雞記》

季姬寂,集雞,雞即棘雞。棘雞飢嘰,季姬及箕稷濟雞。雞既濟,躋姬笈,季姬忌,急咭雞,雞急,繼圾幾,季姬急,即籍箕擊雞,箕疾擊幾伎,伎即齏,雞嘰集幾基,季姬急極屐擊雞,雞既殛,季姬激,即記《季姬擊雞記》。

(網圖,侵刪)

這兩篇文章通篇都是同音字,儘管只有聲調的差異,但是想通暢的讀下來,還是需要認真練習幾遍。下面我們就來聊聊這樣的同音字文章,語音識別是否可以搞定。

2、通俗易懂版

語音識別處理同音字的方法,一句話來概括就是根據上下文關係。

下面舉例來說明這個過程。比如有一段語音,共有四個字,我們依次來看每個字的發音。

  • a)首先我們聽到第一個音「wǔ」。人來判斷的話,這個字的可能性也是很多的,可以是{五、午、舞、武、吾、捂}等等等等,實在不好做出選擇。
  • b)聽到第二個音之後,語音變成「wǔ·rén」的時候,選擇就發生了變化。有些字開頭從來沒見過這種組合,所以就被排除了。現在組合可能是{五人、武人、舞人、五仁}等等等等。這個時候如果非要給出一個選擇,我們可能會選擇一個最常見的,比如「五人」。
  • c)當這段語音的第三個音出現的時候,語音變成了「wǔ·rén·yuè」。這時候選擇又發生了變化,一些不大可能的組合被排除掉,一些可能性更大的組合被放到了前面。現在組合可能是{舞人月、無人月、無人約、武人月、伍仁月}等等。有些組合可能聲調不對卻仍然被列在了候選中,這是因為識別的時候其它聲調也有一些可能性,不能完全排除,萬一是人發錯了音呢。
  • d) 這段語音所有的字都給出之後,語音變成「wǔ·rén·yuè·bìng」。這時候,大多數人的第一反應大概就是「五仁月餅」。當然其它的可能性也不是沒有,但要比這個漢字組合的可能性小。

如果用拼音輸入法,依次輸入上述拼音的時候,可以看到候選項的變化如下。當然每個人的候選是不相同的,它會根據個人的習慣改變候選排序。

使用語音輸入法,通常給出的都是可能性最大的一個結果,所以看不到候選。但可以通過輸入的語音,觀察隨著語音長度變化,識別結果的變化。

3、進階版

先祭出公式:

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

聲學模型可以理解為是對發聲的建模,因此它能夠把語音輸入轉換成聲學表示的輸出,或者簡單的理解成拼音的輸出。如果給定了唯一的拼音序列,要求解漢字序列,那麼這個問題就簡化成了同拼音輸入法類似的問題。當然聲學模型的輸出不是唯一的拼音序列,而是很多種拼音序列組成的網格(lattice),所以聲學模型的解碼要比輸入法的設計複雜。

拋開聲學模型,我們假定已經知道了唯一的拼音序列,現在只需求解漢字序列,問題簡化成了通俗易懂版本。下面我們來看語言模型如何在發揮作用,排除多音字的干擾。

關於語言模型,目前最常見的是N-Gram語言模型和基於RNN的語言模型,這裡先介紹下N-gram的語言模型。

首先考慮給定一句話:

s=w_1w_2w_3...w_m

其中 w_i 是統計基元,可以是字、詞、短語等。這個句子的概率有下面的公式來計算:

P(s)=P(w_1)	imes P(w_2|w_1)	imes P(w_3|w_1w_2)	imes ... 	imes P(w_m|w_1w_2...w_{m-1})\ =prod _{i-1} ^mP(w_i|w_1...w_{i-1})

從公式中可以看到 w_i 的概率由 w_1...w_{i-1} 決定,由特定的一組 w_1...w_{i-1} 構成的序列,稱為 w_i 的歷史。

隨著歷史基元數量的增加,不同的「歷史」(路徑)按指數級增長。對於第 i ( i &>1 ) 個統計基元,歷史基元的個數 , i-1,如果共有 L 個不同的基元,如辭彙表,理論上每一個單詞都有可能出現在1到 i-1的每一個位置上,那麼, i 基元就有 L^{i-1} 種不同的歷史情況。我們必須考慮在所有的 L^{i-1} 種不同歷史情況下產生第 i 個基元的概率。那麼中有 L^m 個自由參數。 如果 L=5000, m = 3, 自由參數的數目為 1250 億。這個參數量顯然是無法接受的。

為了減少參數,我們考慮n階馬爾科夫鏈,即認為當前詞只跟它之前出現的n個詞有關係,那麼對於單個詞的概率則由 P(w_m|w_1...w_{m-1}) 變成 P(w_m|w_{m-n+1}...w_{m-1})

  • a)當 n=1 時,即出現在第 i 位上的基元 wi 獨立於歷史, n-gram 被稱為一階馬爾柯夫鏈(uni-gram 或monogram)
  • b)當 n=2 時, n-gram 被稱為2階馬爾柯夫鏈(bi-gram)
  • c)當 n=3 時, n-gram 被稱為3階馬爾柯夫鏈(tri-gram)
  • 。。。。。。

為了保證條件概率在 i=1 時有意義,同時為了保證句子內所有字元串的概率和為 1,可以在句子首尾兩端增加兩個標誌:& w1 w2 … wm &。據此,對於n&>2 的 n-gram,上述整句的概率就簡化成了如下面的形式:

P(s)=prod_{i=1} ^{m+1}P(w_i|w_{i-n+1}^{i-1})

利用bi-gram來計算前面例子中「五仁月餅」的概率:

P(五仁月餅)=P(五|&)×P(仁|五)×P(月|仁)×P(餅|月)×P(&|餅)

同理,其他漢字序列的概率也可以由此公式計算得到。最終在輸入法的列表中給出概率最大的幾個選項即可。對於識別也是一樣,如果識別結果只有一個,那麼就給出概率最大的一個結果;如果識別結果是N-best那麼就根據概率給出可能性最大的N個識別結果。

對於RNN的語言模型,參數量並不會隨著句子序列長度的增加而發生變化,因此不需要馬爾柯夫鏈的前提假設。因此它是對整句進行的概率計算:

P(s)=prod_{i=1}^mP(w_i|w_1...w_{i-1})

其中每一次概率計算 p(w_m|w_1...w_{i-1}) 都是一次RNN的前向計算。

對於如何計算P(仁|五)就是語言模型的構建的問題了,這裡就不再詳細介紹,感興趣的同學可以自行學習。對N-gram語言模型感興趣的同學,可以參考宗成慶老師的《統計自然語言處理》;對RNN語言模型感興趣的同學可以閱讀這篇文章[Rafal Jozefowicz, 2016]。

4、多音字的處理能力

最後我們回到背景介紹中的問題。現在的語音識別系統能否識別漢字中的多音字問題呢?答案是在一定程度上可以,比如正常的說話通常可以正確識別。但結果是依據統計學給出的概率上最可能的結果。

對於趙元任老先生的這2篇文章是否可以識別呢?還是直接來看訊飛手機輸入法的識別結果。普通話好的各位同學自行嘗試。

參考文獻:

1、信息交換用漢字編碼字符集:

http://baike.baidu.com/item/信息交換用漢字編碼字符集/8074272

2、普通話音節表:

http://humanum.arts.cuhk.edu.hk/Lexis/lexi-mf/mandarin_syllables.php

3、《統計自然語言處理》宗成慶

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

想知道更多關於語音識別、機器學習的研究成果應用。

歡迎關注Rokid知乎機構號:知乎 - 知乎

未經允許,請勿轉載


一般都是機器學習模型算概率,概率最大的結果就是最終結果。

打個形象點的比方,比如你說的內容是:我的鑰匙呢。

語音識別演算法通過聲學模型,得到一組特徵,如果不好理解的話,你可以認為是拼音吧:

wo de yao shi ne

比如我們用2-gram特徵,把數據變成這樣:

wo de/de yao/yao shi/shi ne

然後用這些特徵在歷史語音-文字型檔裡面尋找歷史,得到候選集:

沃德要使呢

我的鑰匙呢

我得要是呢

我的要使呢

……

然後使用機器學習模型去給所有的句子打分(根據人肉標記好的語音識別語料),最終我們發現:

「我的鑰匙呢」的概率最大,是0.83,好,那識別結果就是:

我的鑰匙呢

是不是有點像輸入法?的確有點像,的確是類似的方法,只不過實際上輸入的並不是拼音,而是聲學特徵,這個特徵是聲音信號的一種邏輯抽象,而不是真正的拼音。


語音識別一般包括聲學模型和語言學模型。聲學模型將特徵識別為因素,現在用lstm進行聲學建模效果比較好;語言學模型將因素轉換為英文或者中文,用的一般是n-gram。


聲學模型沒啥特別的,主要是語言模型的wfst,如果不加處理無法確定話,通常會在同音字/詞後面加#1,#2,#3...加以區別,確定話之後再去掉這些符號。


推薦閱讀:

ICML2017 優化領域有什麼值得關注的論文?
Siri 的回答是由蘋果公司的工作人員手動輸入進去的嗎?如果是,工作量是不是很大?
為什麼 Siri 的中文化這麼差?
語音喚醒技術的原理是什麼?

TAG:人工智慧 | 語音識別 |