還記得machine learning is fun嗎?本文是該系列文章的第六部分,博主通俗細緻地講解了神經網絡語音識別的整個過程, 是篇很是不錯的入門級文章。算法
語音識別正闖入咱們的生活。它內置於咱們的手機、遊戲機和智能手錶。它甚至正在讓咱們的家庭變得自動化。只須要 50 美圓,你就能夠買到亞馬遜的 Echo Dot——一個能容許你訂購比薩餅,得到天氣報告,甚至購買垃圾袋的魔法盒——只要你大聲說:「Alexa,訂購一個大披薩!」數據庫
Alexa, order a large pizza!數組
Echo Dot 在這個假期很受歡迎,亞馬遜彷佛沒有 Echo Dot 的庫存了。網絡
語音識別已經存在數十年了,可是爲何如今纔剛剛開始成爲主流呢?緣由是深度學習讓語音識別足夠準確,可以讓語音識別在須要精心控制的環境以外中使用。機器學習
吳恩達早就預測,當語音識別的準確率從 95%達到 99%時,語音識別將成爲人與計算機交互的主要方式。4%的準確性差距就至關於「難以容忍的不可靠」到「使人難以置信的有用性」之間的差別。因爲有深度學習,咱們正在走向頂峯。ide
讓咱們學習怎樣利用深度學習進行語音識別!post
機器學習並不老是黑箱學習
若是你知道神經網絡機器翻譯怎樣工做,你可能會猜到:咱們能夠簡單地將聲音錄音輸入神經網絡,而後訓練神經網絡來生成文本:大數據
這是用深度學習進行語音識別的核心,但咱們尚未徹底作到(至少在我寫這篇文章的時候沒作到——我打賭,在將來的幾年咱們能夠作到)。
最大的問題是語音會隨着速度變化。一我的可能很快地說出「Hello!」,而另一我的可能會很緩慢說「heeeelllllllllllllooooo!」。這就產生了一個更長的聲音文件和更多的數據。這兩個聲音文件本應該被識別爲徹底相同的文本「hello!」而事實證實,把各類長度的音頻文件自動對齊到一個固定長度的文本是很難的一件事情。
爲了解決這個問題,咱們必須使用一些特殊的技巧和一些除了深度神經網絡之外的額外處理。讓咱們看看它是如何工做的吧!
將聲音轉換成「字節」
語音識別的第一步是很顯而易見的——咱們須要將聲波輸入到計算機。
在第 3 章中(https://medium.com/@ageitgey/machine-learning-is-fun-part-3-deep-learning-and-convolutional-neural-networks-f40359318721#.tvzicp8bh),咱們學習瞭如何把圖像處理成數字序列,以便咱們能直接將其輸入進神經網絡進行圖像識別:
圖像僅是圖片中每一個像素值的數字編碼數組
聲音以波的形式傳播。咱們怎樣將聲波轉換成數字呢?讓咱們使用我說的「hello」這個聲音片斷做爲例子:
音頻「Hello」的波形
聲波是一維的。在每一個時刻,它有單一的高度值對應。讓咱們放大聲波的一個小部分,看看:
爲了將這個聲波轉換成數值,咱們只記錄波在等間隔點的高度值:
聲波採樣
這被稱爲「採樣」。咱們採起每秒讀取數千次的方式,並把聲波在對應時刻的高度值記錄下來。這基本上是一個未被壓縮的.wav 音頻文件。
「CD 音質」以 44.1kHZ(每秒讀取 44100 次)進行採樣。可是對於語音識別,16kHz 的採樣頻率足以覆蓋人類語言的頻率範圍。
讓咱們用 16kHz 的方式對「Hello」音頻採樣,這是前 100 個樣本:
每一個數字表明聲波在第 1/16000 間隔處時刻的高度值。
數字採樣快速入門助手
你可能會認爲:採樣只是對原始聲波的粗略近似,由於它只是間歇性讀取數據,咱們的讀數之間有差距,因此咱們丟失了數據,對嗎?
數字採樣可否完美重現原始聲波?如何處理那些間距?
借鑑奈奎斯特定理 (Nyquist theorem),咱們能夠利用數學從間隔的採樣中完美地重建原始聲波——只要以咱們但願獲得的最高頻率的兩倍來進行採樣就能夠實現。
我提到這一點,是由於幾乎每一個人都會犯這個錯誤:認爲使用更高的採樣率老是能得到更好的音頻質量。
採樣聲音數據的預處理
咱們如今有一個數值數組,每一個數值表明聲波在間隔爲 1 / 16,000 秒的時刻時的高度值(振幅)。
咱們能夠將這些數值輸入神經網絡。可是試圖經過直接處理這些樣原本識別語音模式是困難的。相反,咱們能夠經過對音頻數據預處理來簡化問題。
讓咱們將採樣的音頻以 20 毫秒時間段長進行分組。這是咱們第一個 20 毫秒的樣本音頻,即咱們的前 320 個樣本。
將這些數值繪製爲簡單的線圖,給出了對於 20 毫秒時間段的原始聲波的粗略近似:
雖然這段錄音只有 1/50 秒的時長,但即便這樣短暫的時長也包含不一樣頻率的聲音。有低音、中音,甚至高音混在一塊兒。但總的來講,這些不一樣頻率的聲音混合在一塊兒構成了人類複雜的語音。
爲了使這些數據更容易進行神經網絡處理,咱們將這複雜的聲波分紅不一樣部分。咱們將一步步分離低音部分,下一個最低音部分,以此類推。而後經過將每一個頻帶(從低到高)中的能量相加,咱們就爲各個類別(音調)的音頻片斷建立了一個指紋。
想象你有一段某人在鋼琴上彈奏 C 大調的音頻。這段音頻是由三個音符組合而成的 - C,E 和 G – 他們混合在一塊兒組成一個複雜的音頻。咱們想把這個複雜的音頻分解成單獨的音符:C,E 和 G。這和咱們語音識別的想法同樣。
咱們可使用數學中的傅里葉變換來完成。傅里葉變換將複雜的聲波分解成簡單的聲波,一旦咱們獲得了這些簡單聲波,咱們將每個聲波包含的能量加在一塊兒。
最終結果是從低音(即低音音符)到高音,每一個頻率範圍的重要程度。下面的每一個數字表示在咱們的 20 毫秒音頻剪輯中每一個 50Hz 頻帶中的能量:
表中的每一個數值表示每一個 50Hz 頻帶中的能量
當你把它以圖表形式畫出,你更容易看出:
你能夠看出,咱們的 20 毫秒的聲音片斷中有不少低頻能量,高頻能量較少。這是典型的「男性」的聲音。
若是咱們以每 20 毫秒的音頻塊重複這個過程,咱們最終會獲得一個頻譜圖(每一列從左到右都是一個 20 毫秒的塊):
「hello」聲音片斷的完整頻譜圖
頻譜圖很棒,由於你能夠從音頻數據中看到音符和其餘音高模式。相比於原始聲波,神經網絡能夠更加容易地從這種數據中找到規律。所以,這(頻譜圖)就是咱們將實際輸入到神經網絡的數據表徵方式。
從短聲音中識別字符
有了易於處理音頻形式,咱們將把它輸入到深度神經網絡。神經網絡的輸入是 20 毫秒的音頻塊,對於每一個小的音頻切片,神經網絡都會試圖找出與聲音對應的字母。
咱們將使用循環神經網絡——便是具備能影響將來預測的記憶的神經網絡。由於它預測的每一個字母都將影響它對下一個字母的預測。例如,若是咱們已經說出「HEL」,那麼接下來咱們極可能說出「LO」以說出「Hello」。咱們不太可能會說像「XYZ」這種根本沒法發音的詞。所以,具備先前預測的記憶將有助於神經網絡對將來進行更準確的預測。
當咱們在神經網絡上運行咱們的整個音頻剪輯(一次一塊)後,咱們最終將獲得與每一個音頻塊最可能對應的字符的一個映射。這是一個看起來像是我說」Hello」時的映射:
咱們的神經網絡可能預測到我說的是「HHHEE_LL_LLLOOO」,也多是「HHHUU_LL_LLLOOO」或甚至「AAAUU_LL_LLLOOO」。
咱們用幾個步驟來整理輸出結果。首先,咱們會用單個字符替換重複的的字符:
-
HHHEE_LL_LLLOOO becomes HE_L_LO
-
HHHUU_LL_LLLOOO becomes HU_L_LO
-
AAAUU_LL_LLLOOO becomes 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」那又怎麼樣?「Hullo」是一個有效的詞。也許「Hello」是錯誤的轉錄!
固然實際上可能有人說的是「Hullo」而不是「Hello」。可是這樣的語音識別系統(基於美式英語訓練)基本上不會將「Hullo」做爲轉錄。相比」Hello「,用戶不太可能說「Hullo」,便是你在說」Hullo「ullo,它也老是會認爲你在說「Hello」,不管你發「U」的聲音有多重。
試試看!若是你的手機設置爲美式英語,嘗試讓你的手機的數字助理識別「Hullo」。你不能達到目標!它會拒絕!它老是會理解爲「Hello」。
不識別「Hullo」是合理的,但有時你會發現使人討厭的狀況:你的手機就是不能理解你說的語句。這就是爲何這些語音識別模型總須要更多的數據訓練來處理這些少數狀況。
我能創建本身的語音識別系統嗎?
機器學習最酷的事情之一就是它有時看起來十分簡單。你獲得一堆數據,將把它輸入到機器學習算法當中去,而後就能神奇的獲得一個運行在你的遊戲筆記本電腦顯卡上的世界級人工智能系統... 對吧?
有些狀況下的確是這樣,可是語音識別卻並不如此簡單。語音識別是一個難題,你必須克服無限的挑戰:質量差的麥克風、背景噪聲、混響和回聲、口音變化等等。這些問題都須要呈如今你的訓練數據中,以確保神經網絡能夠處理它們。
還有另外一個例子:你知道當你在一個大房間裏說話時,你會不自覺地提升你的音調以便掩蓋噪音嗎?人類在什麼狀況下均可以理解你,但神經網絡須要特殊訓練來處理這些狀況。因此你須要獲得人們在噪音中大聲說話的訓練數據!
要構建一個達到 Siri、Google Now!或 Alexa 等水平的語音識別系統,你須要獲得大量的訓練數據,若是沒有僱傭成百上千的人爲你記錄數據,你很難作到。用戶對低質量語音識別系統的容忍度很低,所以你不能吝嗇語音數據。沒有人想要一個只有 80% 的時間有效的語音識別系統。
像谷歌或亞馬遜這樣的公司,現實生活中記錄的成千上萬小時的口語音頻,對他們來講就是「黃金」。這就是將他們世界級語音識別系統與你本身的系統拉開差距的法寶。在手機上無償使用 Google Now! 和 Siri 或是不收取轉錄費且售價 50 美圓的 Alexa,都是爲了讓你儘量地使用它們。你說的每句話都將被這些系統所記錄,而後這些數據將被用於訓練將來的語音識別算法。
不相信我?若是你有一部安裝了 Google Now!的安卓手機,點擊這裏去收聽你對它說過的每一句話:
你能夠經過 Alexa 在亞馬遜上找到相同的東西。然而不幸的是,蘋果手機並不容許你利用你的 Siri 語音數據。
因此,若是你正在尋找創業的想法,我不建議你創建本身的語音識別系統與 Google 競爭。相反,你應該找到一種能讓人們將他們幾個小時的錄音給予你的方法。這種數據能夠是你的產品。
學習更多
這個被用來處理不一樣長度音頻的算法被稱爲 Connectionist Temporal Classification(CTC)。你能夠閱讀來自 2006 年的原始文章:
http://www.cs.toronto.edu/~graves/icml_2006.pdf。
百度的 Adam Coates 在灣區深度學習學校作了關於「用深度學習作語音識別」的精彩演講。你能夠在 YouTube 上觀看這段視頻(https://youtu.be/9dXiAecyJrY?t=13874,他的演講從 3 分 51 秒開始)。強烈推薦。
原文連接:https://medium.com/@ageitgey/machine-learning-is-fun-part-6-how-to-do-speech-recognition-with-deep-learning-28293c162f7a#.34p9sntcc
評論
共有0條評論,點擊展開