Nikko Strom,現任亞馬遜首席科學家,是 Echo 和 Alexa 項目的創始成員,在語音識別技術相關領域有著資深的研究及從業經驗:
● 1997 年于瑞典皇家理工學院語音通信實驗室獲得博士學位,后擔任MIT計算機科學實驗室研究員;
● 2000 年加入語音技術初創公司 Tellme Networks;
● 2007 年隨著 Tellme Networks 被微軟收購,加入微軟,推進商業語音識別技術的前沿研究;
● 2011 年加入亞馬遜,擔任首席科學家,領導語音識別及相關領域的深度學習項目。
以下是 Nikko Strom 在本次大會上的演講。
先簡單介紹下我們的產品。如果你買了 Amazon Echo,意味著你可以通過 Alexa 語音識別系統控制它,并與它對話,而且不需要拿遙控器。左邊(下圖)是 Holiday Season,是我們新加入的白色Echo和Dot,相信在座應該有很多人比較偏愛白色的電子產品。
Echo 還可以與沒有內置 Alexa 系統的家電進行連接,如燈具、咖啡機、恒溫器等,只需要喚醒Alexa,就可以讓這些家電設備執行一些命令。此外,開發者還可以通過工具包 Alexa Skills Kit,打造個性化的功能。
現如今,Echo已經進入了數百萬用戶的家中,每天它都在被大量地使用著,也讓我們得到了無法想象的數據量。
深度學習基礎框架
事實上,人耳并非每時每刻都在搜集語音信息,真正在“聽”的時間大約只占 10%,所以一個人成長到 16歲時,他/她所聽到的語音訓練時間大概有 14016 個小時。
回到 Alexa,我們把數千個小時的真實語音訓練數據存儲到 S3 中,使用 EC2 云上的分布式 GPU 集群來訓練深度學習模型。
訓練模型的過程中發現,用 MapReduce 的方法效果并不理想,因為節點之間需要頻繁地保持同步更新,不能再通過增加更多的節點來加速運算。也可以這樣理解,就是GPU集群更新模型的計算速度非常之快,每秒都會更新幾次,每次的更新大約是模型本身的大小。也就是說,每一個線程(Worker)都要跟其它線程同步更新幾百兆的量,而這在一秒鐘的時間里要發生很多次。所以,MapReduce的方法效果并不是很好。
我們在 Alexa 里的解決方法就是,使用幾個逼近算法(Approximations)來減少更新規模,將其壓縮 3個量級。這里是我們一篇 2015 年論文里的圖表,可以看到,隨著GPU線程的增加,訓練速度加快。到 40 個 GUP 線程時,幾乎成直線上升,然后增速有點放緩。80 GPU 線程對應著大約 55 萬幀/秒的速度,每一秒的語音大約包含 100 幀,也就是說這時的一秒鐘可以處理大約90分鐘的語音。前面我提到一個人要花 16 年的時間來學習 1.4 萬小時的語音,而用我們的系統,大約 3 個小時就可以學習完成。
這就是 Alexa 大致的深度學習基礎架構。
聲學模型
大家都知道,語音識別系統框架主要包括四大塊:信號處理、聲學模型、解碼器和后處理。
首先我們會將從麥克風收集來的聲音,進行一些信號處理,將語音信號轉化到頻域,從每 10 毫秒的語音中提出一個特征向量,提供給后面的聲學模型。聲學模型負責把音頻分類成不同的音素。接下來就是解碼器,可以得出概率最高一串詞串,最后一步是后處理,就是把單詞組合成容易讀取的文本。
在這幾個步驟中,或多或少都會用到機器學習和深度學習的方法。我今天主要講一下聲學模型的部分。
聲學模型就是一個分類器(classifier),輸入的是向量,輸出的是語音類別的概率。這是一個典型的神經網絡。底部是輸入的信息,隱藏層將向量轉化到最后一層里的音素概率。
這里是一個美式英語的 Alexa 語音識別系統,所以就會輸出美式英語中的各個音素。在 Echo 初始發布的時候,我們錄了幾千個小時的美式英語語音來訓練神經網絡模型,這個成本是很高的。當然,世界上還有很多其它的語言,比如我們在2016年9月發行了德語版的Echo,如果再重頭來一遍用幾千個小時的德語語音來訓練,成本是很高的。所以,這個神經網絡模型一個有趣的地方就是可以“遷移學習”,你可以保持原有網絡中其它層不變,只把最后的一層換成德語。
兩種不同的語言,音素有很多是不一樣的,但仍然有很多相同的部分。所以,你可以只使用少量的德語的訓練數據,在稍作改變的模型上就可以最終得到不錯的德語結果。
“錨定嵌入”
在一個充滿很多人的空間里,Alexa 需要弄清楚到底誰在說話。開始的部分比較簡單,用戶說一句喚醒詞“Alexa”,Echo上的對應方向的麥克風就會開啟,但接下來的部分就比較困難了。比如,在一個雞尾酒派對中,一個人說“Alexa,來一點爵士樂”,但如果他/她的旁邊緊挨著同伴一起交談,在很短的時間里都說話,那么要弄清楚到底是誰在發出指令就比較困難了。
這個問題的解決方案來自于2016年的一份論文《錨定語音檢測》(Anchored Speech Detection)。一開始,我們得到喚醒詞“Alexa”,我們使用一個RNN從中提取一個“錨定嵌入”(Anchor embedding),這代表了喚醒詞里包含語音特征。接下來,我們用了另一個不同的RNN,從后續的請求語句中提取語音特征,基于此得出一個端點決策。這就是我們解決雞尾酒派對難題的方法。
“雙連音片段”
Alexa里的語音合成技術,也用在了Polly里。語音合成的步驟一般包括:
第一步,將文本規范化。如果你還記得的話,這一步驟恰是對“語音識別”里的最后一個步驟的逆向操作。 第二步,把字素轉換成音素,由此得到音素串。 第三步是關鍵的一步,也是最難的一步,就是將音素生成波形,也就是真正的聲音。 最后,就可以把音頻播放出來了。
Alexa擁有連續的語音合成。我們錄下了數小時人的自然發音的音頻,然后將其切割成非常小的片段,由此組成一個數據庫。這些被切割的片段被稱為“雙連音片段”(Di-phone segment),雙連音由一個音素的后半段和另一個音素的前半段組成,當最終把語音整合起來時,聲音聽起來的效果就比較好。
創建這個數據庫時,要高度細致,保證整個數據庫里片段的一致性。另外一個重要環節是算法方面的,如何選擇最佳片段序列結合在一起形成最終的波形。首先要弄清楚目標函數是什么,來確保得到最合適的“雙連音片段”,以及如何從龐大的數據庫里搜索到這些片段。比如,我們會把這些片段標簽上屬性,我今天會談到三個屬性,分別是音高(pitch)、時長(duration)和密度(intensity),我們也要用RNN為這些特征找到目標值。之后,我們在數據庫中,搜索到最佳片段組合序列,然后播放出來。
(審核編輯: 林靜)
分享