自2010年Google的搜索引擎等服務(wù)退出中國(guó)之后,它也曾嘗試了多種途徑重返中國(guó)市場(chǎng),比如推出中國(guó)版的Google Play應(yīng)用商店,卻沒(méi)有取得明顯的成功。即便是在目前中國(guó)已經(jīng)成為最大的Android智能手機(jī)市場(chǎng)的大勢(shì)下,也并沒(méi)有使用Google的服務(wù)。
而在7年之際,谷歌再次試圖重返中國(guó),這次打出的“王牌”是它的人工智能系統(tǒng)開(kāi)發(fā)框架TensorFlow。
雖然Google的云服務(wù)并沒(méi)有入駐中國(guó)市場(chǎng),但中國(guó)卻有著亞洲增長(zhǎng)最快的 TensorFlow開(kāi)發(fā)者社區(qū)。目前谷歌正在中國(guó)積極推廣TensorFlow,希望借此重回龐大的中國(guó)AI市場(chǎng)。據(jù)了解,已有多名Google美國(guó)工程師出席了至少三個(gè)在北京和上海舉行的 TensorFlow開(kāi)發(fā)者會(huì)議,其中兩場(chǎng)會(huì)議是閉門(mén)會(huì)議,出席者不允許拍照、記錄甚至寫(xiě)博客。
TensorFlow最初由Google Brain團(tuán)隊(duì)開(kāi)發(fā)用于Google的研究和生產(chǎn),2015年11月9日在A(yíng)pache 2.0開(kāi)源許可證下發(fā)布。自發(fā)布至今,已經(jīng)被下載了超過(guò)790萬(wàn)次。
今天,讓我們通過(guò)硅谷數(shù)據(jù)工程師Matthew Rubashkin和Matt Mollison所寫(xiě)的TensorFlow RNN教程,來(lái)先了解一下如何借助TensorFlow框架訓(xùn)練語(yǔ)音識(shí)別的RNN;教程包含了全部代碼片段,你可以找到相應(yīng)的 GitHub 項(xiàng)目,該教程中使用的軟件就是源于現(xiàn)有的開(kāi)源項(xiàng)目的代碼。
▲ 以上視頻是1906年愛(ài)迪生留聲機(jī)廣告的機(jī)器語(yǔ)音識(shí)別的視頻示例,視頻中包含了聲音振幅的運(yùn)行軌跡,提取的頻譜圖和預(yù)測(cè)文本
語(yǔ)音識(shí)別:音頻與副本(transcriptions)
2010年基于語(yǔ)音的方法成為語(yǔ)音識(shí)別模型的最新技術(shù),包括發(fā)音,聲學(xué)和語(yǔ)言模型的獨(dú)立組件。而從過(guò)去到現(xiàn)在的語(yǔ)音識(shí)別都依賴(lài)于使用傅立葉變換公式將聲波分解成頻率和振幅,并產(chǎn)生如下所示的頻譜圖:
為傳統(tǒng)語(yǔ)音識(shí)別流水線(xiàn)而訓(xùn)練隱馬爾可夫模型(HMM)的聲學(xué)模型,需要涉及語(yǔ)音、文本數(shù)據(jù),以及一個(gè)從單詞到音素的字典。HMM是用于順序數(shù)據(jù)生成的概率模型,多用于測(cè)量字符串中的差異的字符串度量,并且通常使用Levenshtein word error distance來(lái)評(píng)估。
這些模型可以通過(guò)與音素副本對(duì)應(yīng)的語(yǔ)音數(shù)據(jù)進(jìn)行簡(jiǎn)化和精準(zhǔn)化,但這是一個(gè)非常繁瑣的工作。因此,相較于音素級(jí)別的副本,詞級(jí)的副本更可能存在大量的語(yǔ)音數(shù)據(jù)集。
Connectionist Temporal Classification(CTC)損失函數(shù)
當(dāng)使用神經(jīng)網(wǎng)絡(luò)進(jìn)行語(yǔ)音識(shí)別時(shí),我們可以先拋開(kāi)音素的概念,而使用允許預(yù)測(cè)字符級(jí)副本的基于神經(jīng)網(wǎng)絡(luò)的時(shí)序分類(lèi)(CTC)的目標(biāo)函數(shù)。簡(jiǎn)而言之,CTC能夠?qū)崿F(xiàn)多個(gè)序列概率的計(jì)算,這里的序列是指語(yǔ)音樣本的所有可能的字符級(jí)副本的集合。而網(wǎng)絡(luò)使用目標(biāo)函數(shù),則可以最大化字符序列的概率(即可以選擇可能性最大的副本),并且通過(guò)計(jì)算預(yù)測(cè)結(jié)果與實(shí)際副本之間的誤差從而更新訓(xùn)練期間的網(wǎng)絡(luò)權(quán)重。
值得注意的是,CTC損失函數(shù)使用的字符級(jí)誤差與傳統(tǒng)語(yǔ)音識(shí)別模型中經(jīng)常使用的Levenshtein word error distance不同。對(duì)于字符生成的RNN模型而言,字符和單詞之間的誤差與在諸如Esperonto和Croatian的語(yǔ)音語(yǔ)言中類(lèi)似,不同的聲音會(huì)對(duì)應(yīng)于不同的字符。相反,對(duì)于非語(yǔ)音語(yǔ)言(如英語(yǔ)),字符與單詞之間的誤差就非常不同了。
為了進(jìn)一步利用為傳統(tǒng)或深度學(xué)習(xí)語(yǔ)音識(shí)別模型而開(kāi)發(fā)的算法,我們的團(tuán)隊(duì)構(gòu)建了模塊化和快速原型的語(yǔ)音識(shí)別平臺(tái):
數(shù)據(jù)的重要性
毫無(wú)疑問(wèn),創(chuàng)建一個(gè)將語(yǔ)音轉(zhuǎn)成文本的系統(tǒng),需要數(shù)字音頻文件和文字的副本。而由于該模型將適用于解碼任何新的語(yǔ)音樣本,因此,在系統(tǒng)中供我們進(jìn)行訓(xùn)練的樣本越多,模型的表現(xiàn)也就越好。
對(duì)此,我們研究了可免費(fèi)獲取的英語(yǔ)演講錄音,包括了LibriSpeech(1000小時(shí)),TED-LIUM(118小時(shí))和VoxForge(130小時(shí))等不同的樣本,以供訓(xùn)練使用。
▲圖表展現(xiàn)了這些數(shù)據(jù)集的信息,包括總時(shí)長(zhǎng)、采樣率和注釋
為了方便地從任何數(shù)據(jù)源中訪(fǎng)問(wèn)數(shù)據(jù),我們以扁平的格式存儲(chǔ)所有數(shù)據(jù),如.wav格式和.txt格式。
舉個(gè)例子,你可以在我們的GitHub repo中找到Librispeech訓(xùn)練數(shù)據(jù)集中的“211-122425-0059”數(shù)據(jù)所對(duì)應(yīng)的文件,例如211-122425-0059.wav和211-122425-0059.txt。這些數(shù)據(jù)文件名使用數(shù)據(jù)集對(duì)象類(lèi)加載到TensorFlow圖中,這有助于TensorFlow有效地加載、預(yù)處理數(shù)據(jù),并將各批數(shù)據(jù)從CPU加載到GPU內(nèi)存中。
▲以上是數(shù)據(jù)集對(duì)象中數(shù)據(jù)字段的示例
特征表征(representation)
為了使機(jī)器更好地識(shí)別音頻數(shù)據(jù),數(shù)據(jù)必須先從時(shí)域轉(zhuǎn)換到頻域。這里有幾種方法可以創(chuàng)建用于提取機(jī)器學(xué)習(xí)特征的音頻數(shù)據(jù),包括通過(guò)任意頻率分級(jí)(如每100Hz),以及通過(guò)使用人耳能夠聽(tīng)到的頻率波段分級(jí)。這種典型的以人為中心的語(yǔ)音數(shù)據(jù)轉(zhuǎn)換是計(jì)算13位或26位不同倒譜特征的梅爾頻率倒譜系數(shù)(MFCC)的,它可以作為模型的輸入。經(jīng)過(guò)轉(zhuǎn)換,數(shù)據(jù)將被存儲(chǔ)在一個(gè)頻率系數(shù)(行)隨時(shí)間(列)的矩陣中。
由于語(yǔ)音不會(huì)孤立地產(chǎn)生,并且沒(méi)有一對(duì)一映射到字符,所以我們可以通過(guò)在當(dāng)前的時(shí)間索引之前和之后捕獲聲音的重疊窗口(10s)上訓(xùn)練網(wǎng)絡(luò),從而捕獲共同作用的影響(通過(guò)影響一個(gè)聲音影響另一個(gè)發(fā)音)。
▲以上是如何獲取MFCC功能以及如何創(chuàng)建音頻數(shù)據(jù)的窗口的示例代碼
對(duì)于RNN 示例來(lái)說(shuō),我們使用之前的9個(gè)時(shí)間片段和之后的9個(gè)時(shí)間片段,每個(gè)窗口總共包括了19個(gè)時(shí)間點(diǎn)。當(dāng)?shù)棺V系數(shù)為26的情況下,每25毫秒會(huì)有494個(gè)數(shù)據(jù)點(diǎn)。而根據(jù)數(shù)據(jù)的采樣率,我們建議對(duì)于16000Hz使用26個(gè)倒譜特征,對(duì)8000Hz使用13個(gè)倒譜特征。
▲以上是8,000 Hz數(shù)據(jù)的加載窗口示例
語(yǔ)音的序列性建模
長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)層是一種循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)架構(gòu),可用于對(duì)具有長(zhǎng)期順序依賴(lài)性的數(shù)據(jù)進(jìn)行建模。由于它們從根本上記住了當(dāng)前時(shí)間點(diǎn)的歷史信息,而這些信息會(huì)影響結(jié)果的輸出,因此它們對(duì)于時(shí)間序列數(shù)據(jù)非常重要。 而也正因這樣的時(shí)態(tài)特征,使得上下文具有了聯(lián)系性,這對(duì)于語(yǔ)音識(shí)別非常有效。
▲以上展示了深度語(yǔ)音啟發(fā)(DeepSpeech-inspired)的雙向神經(jīng)網(wǎng)絡(luò)(BiRNN)中 LSTM 層的示例代碼
網(wǎng)絡(luò)訓(xùn)練與監(jiān)控
通過(guò)使用Tensorflow訓(xùn)練網(wǎng)絡(luò),我們花很少的精力就可以實(shí)現(xiàn)計(jì)算圖表的可視化,同時(shí)也可以使用TensorBoard從門(mén)戶(hù)網(wǎng)站上進(jìn)行監(jiān)視訓(xùn)練、驗(yàn)證以及性能測(cè)試。根據(jù)Dandelion Mane在2017年Tensorflow發(fā)展峰會(huì)上做演講中提到的技巧,我們使用tf.name_scope來(lái)增加節(jié)點(diǎn)和層名,并將總結(jié)寫(xiě)到了文件中。
其結(jié)果是自動(dòng)生成的,并且是可理解的計(jì)算圖表。以雙向神經(jīng)網(wǎng)絡(luò)(BiRNN)為例(如下圖),數(shù)據(jù)在左下方到右上方的不同操作間進(jìn)行傳遞。為了更清楚地展現(xiàn),可以為不同的節(jié)點(diǎn)做標(biāo)注,并使用命名空間對(duì)節(jié)點(diǎn)進(jìn)行著色。在這個(gè)例子中,青色的“fc”盒子對(duì)應(yīng)全連接層,而綠色 的'“b”和“h”盒子分別對(duì)應(yīng)偏移量和權(quán)重。
我們使用TensorFlow提供的tf.train.AdamOptimizer來(lái)控制學(xué)習(xí)率。 而AdamOptimizer則通過(guò)使用動(dòng)量(參數(shù)的移動(dòng)平均值)來(lái)改善傳統(tǒng)梯度下降,從而促進(jìn)超參數(shù)的有效動(dòng)態(tài)調(diào)整。此外,我們還可以通過(guò)創(chuàng)建標(biāo)簽錯(cuò)誤率的摘要標(biāo)量來(lái)跟蹤丟失和錯(cuò)誤率:
如何改進(jìn)RNN
現(xiàn)在我們已經(jīng)建立了一個(gè)簡(jiǎn)單的LSTM RNN網(wǎng)絡(luò),那么,如何降低其中的錯(cuò)誤率呢?非常幸運(yùn)的是,對(duì)于開(kāi)源社區(qū)而言,許多大公司都已經(jīng)發(fā)布了他們表現(xiàn)最好的語(yǔ)音識(shí)別模型的背后的數(shù)學(xué)模型。早在2016年9月,微軟就發(fā)布了一篇文章,描述了他們?nèi)绾卧贜IST 200交換機(jī)數(shù)據(jù)上將錯(cuò)誤率降到6.9%。他們?cè)诰矸e+遞歸神經(jīng)網(wǎng)絡(luò)之上使用了幾種不同的聲學(xué)和語(yǔ)言模型。
微軟團(tuán)隊(duì)和其他研究人員在過(guò)去4年中所做的幾項(xiàng)重大改進(jìn)包括:
值得注意的是,在過(guò)去幾十年的傳統(tǒng)語(yǔ)音識(shí)別模型中率先開(kāi)發(fā)的語(yǔ)言模型,在深度學(xué)習(xí)語(yǔ)音識(shí)別模型中再次被證明是有價(jià)值的。
▲改進(jìn)來(lái)自:A
Historical Perspective of Speech Recognition, Xuedong Huang, James
Baker, Raj Reddy Communications of the ACM, Vol. 57 No. 1, Pages 94-103,
2014
訓(xùn)練你的第一個(gè)RNN
我們提供了一個(gè) GitHub項(xiàng)目(GitHub repository),該項(xiàng)目的腳本提供了一個(gè)用RNNs和CTC損失函數(shù)(在TensorFlow中),訓(xùn)練端到端語(yǔ)音識(shí)別系統(tǒng)的簡(jiǎn)單易行執(zhí)行方案。GitHub庫(kù)中包含了來(lái)自L(fǎng)ibriVox 語(yǔ)料庫(kù)(LibriVox corpus )示例數(shù)據(jù),這些數(shù)據(jù)被分為如下幾個(gè)文件夾:
訓(xùn)練:train-clean-100-wav(5個(gè)示例)
測(cè)試:test-clean-wav(2個(gè)示例)
Dev: dev-clean-wav (2個(gè)示例)
當(dāng)訓(xùn)練這幾個(gè)示例時(shí),你會(huì)很快注意到訓(xùn)練數(shù)據(jù)會(huì)過(guò)度擬合(overfit),這使得錯(cuò)詞率(WER)約為0%,而測(cè)試集和Dev數(shù)據(jù)集的WER大約能達(dá)到85%。測(cè)試錯(cuò)誤率之所以不是100%,是因?yàn)闄C(jī)器需要在29個(gè)可能的字符間做選擇(a-z,省略號(hào),空格鍵,空白),但網(wǎng)絡(luò)將很快學(xué)習(xí)到:
某些字符(e,a,空格鍵,r, s, t)更常見(jiàn)
輔音-元音-輔音在英語(yǔ)中是一種模式
MFCC輸入聲音特征增加的信號(hào)幅度對(duì)應(yīng)著字符a - z
在GitHub庫(kù)中使用默認(rèn)設(shè)置做訓(xùn)練,運(yùn)行結(jié)果如下圖所示:
如果你想訓(xùn)練一個(gè)高性能的模型,還可以在文件夾中添加額外的.wav和.txt文件,或者創(chuàng)建一個(gè)新的文件夾,并用文件夾位置更新`configs / neural_network.ini`。需要注意的是,即使使用強(qiáng)大的GPU,在僅僅幾百個(gè)小時(shí)的音頻上做處理和訓(xùn)練也需要非常大的計(jì)算能力。
-END-