蘋果揭祕“Hey Siri”的開發細節,原來不僅有兩步檢測,還能辨別説話人


雷鋒網(公眾號:雷鋒網) AI 科技評論按:蘋果的新一期機器學習開發日記來了~ 這次蘋果介紹了通過講話就能喚醒Siri的“Hey Siri”功能是如何從技術上實現的,同時也介紹了為了從用户體驗角度改善“Hey Siri”的表現,蘋果的工程師們都做了哪些取捨和調整。與之前的文章一樣,蘋果的產品開發中並沒有令人震驚的新技術,但嚴謹、細緻、以用户為中心打磨產品的態度是自始至終的。雷鋒網 AI 科技評論全文編譯如下。

iOS設備上的“Hey Siri”功能可以讓用户無需接觸設備就喚醒Siri。在iOS設備上,有一個非常小的語音識別器一直在運行着,就等着聽這兩個詞。當它檢測到用户説“Hey Siri”後,Siri 其它的部分就會把接下來的語音分解成一個控制指令或者一次查詢。“Hey Siri”檢測器中使用了一個深度神經網絡(DNN),每時每刻把你的語音模式轉換成一個不同講話聲音的概率分佈。它使用了一個時間積分的過程對聽到的語音計算一個置信度分數,判斷你説的詞語是不是“Hey Siri”。如果這個分數足夠高,Siri 就會醒來。這篇文章就簡單介紹了其中藴含的技術,它的主要目標讀者是對機器學習有一些了解但是對語音識別了解不多的研究者們。

無需觸碰就與Siri互動



如果要讓 Siri 做什麼,只需説:“Hey Siri”。當説出“Hey Siri”時不需要按設備上的任何一個按鈕,這使得 Siri 無需觸碰就可以操作。這件事看起來簡單,但是在幕後有許多的故事才能讓 Siri 喚醒得又快又高效。硬件、軟件和網絡服務無縫共同合作,提供了出色的用户體驗。


圖1, Hey Siri 功能在 iPhone上的工作流程在做飯或者開車這種雙手很忙的時候,能夠不按按鈕就使用 Siri 顯得尤其的有用,使用 Apple Watch時也是這樣。如圖1所示,整個系統包含許多組件。Siri 的大多數功能都是在雲端實現的,包括主要的自動語音識別、自然語言轉述以及各種豐富的信息服務。也有一些服務器會給手機中的檢測器提供聲學模型的更新。這篇文章重點介紹系統中運行在本地設備上的部分(比如iPhone或者Apple Watch上)。這篇文章尤其關注了檢測器:一個專用的語音識別器,它始終在聆聽,而且僅僅聽它的喚醒短語(在較為近期的iPhone上,並開啟了“Hey Siri”功能時)。

檢測器:等待聆聽“Hey Siri”
iPhone或者Apple Watch上的麥克風會把你的聲音轉化成一組短時的波形採樣流,採樣速率是每秒16000次。一個頻譜分析階段會把波形採樣留轉換成一組音頻幀,每一個幀都描述了大概0.01秒的聲音頻譜。每次會有大約20個這樣的幀(0.2秒長的音頻)送入聲學模型,這是一個深度神經網絡,把音頻樣本中的每一個都轉換成一組語言聲音類別的概率分佈:“Hey Siri”短語中用到的聲音,或者靜音和其它語音,加起來一共大約20個聲音類別。詳見圖2。

這個深度神經網絡主要由矩陣乘法和邏輯非線性組成。每一個隱含層的內容都是DNN經過訓練後發掘出的中間層表徵,最終把過濾器中每個頻道的輸入轉換為不同的聲音類別。最終的非線性階段本質上是一個Softmax函數(也就是一個一般邏輯或者正則化指數函數),不過由於蘋果的工程師們想要的是對數概率,所以實際的數學計算會比這個簡單一點。


圖2,用來檢測“Hey Siri”的深度神經網絡。其中的隱含層是全連接的。頂層進行的是一個時間集成的過程。實際的深度神經網絡是圖中虛線框圈出的部分。不同的設備上運行“Hey Siri”時有不同的運算資源,蘋果的工程師們據此為隱含層中的神經元設定不同的數目。蘋果用的網絡一般含有五個隱含層,每層都有同樣的神經元數目,根據設備的內存和能源限制,數目為32、128或者192個。在iPhone上,蘋果設計了兩個網絡,一個用於初始檢測,另一個用於第二步檢測。初始檢測中的神經元數目比第二步檢測中的少。

這個聲學模型的輸出是為每一幀計算語音類別的概率分佈。一個語音類別可以是“前有一個舌位較高的前元音、後面有一個前元音的/s/發音的第一部分”這樣的東西。

為了檢測“Hey Siri”,這個目標短語的讀音經過聲學模型之後的輸出應當在輸出序列中靠前的位置上。為了給每一幀計算單獨的分數,蘋果工程師們按照時間順序把這些局部的值累計在一個序列中。這部分就是圖2中最終層(頂層)的部分,一個循環網絡中帶有到同一個神經元和下一個神經元的連接。在每個神經元中都有一個取最大值操作和一個加法操作。


其中:

  • Fi,t是模型中狀態i的累計分數
  • qi,t是聲學模型的輸出。這個輸出是語音類別的對數分數,它與時間t附近給定語音模式的第i個狀態有關
  • si是和留在狀態i相關的開銷
  • mi是從狀態i繼續向後移動的開銷

其中si和mi都是基於訓練數據中語音分割時長和相關標籤的分析得到的。(這個過程中應用了動態編程,而且可以由隱馬爾可夫模型HMMs的思路得到)


圖3,方程的可視化描述

每一個累計分數Fi,t都和前一幀帶有狀態的標籤有關,正如一系列最大化操作結果中展示的那樣。每一幀的最終分數是Fi,t,這個語音段落的最後一個狀態是狀態i,在幀序列中一共通過N幀得到了這個結果。(N可以通過回溯最大化操作的序列得到,但實際上的做法是向前傳播幀的數目,因為這條路徑進入的是語音段落的第一個狀態)

“Hey Siri”檢測器的計算幾乎都是在這個聲學模型中完成的。這個時間積分計算的代價還比較低,所以在評估模型大小或者計算資源的時候都不需要考慮它。

看看下面的圖4,你應該能更好地理解這個檢測器是如何工作的。其中在假設使用了最小的深度神經網絡的情況下,不同階段中聲學信號是什麼樣的。在最下面是麥克風採集到的聲音的頻譜圖。在這個例子中,有人在説“Hey Siri what”,其中較亮的部分是語音段落中最響亮的部分。“Hey Siri”聲音的模式就是兩條垂直線之間的部分。


圖4,音頻樣本經過檢測器之後的樣子倒數第二個橫向圖中是把同一段語音用Mel濾波器組分析後的結果,其中根據感知測量的結果給不同的頻率賦予了權重。這個轉換同時也讓頻譜圖中能看到的細節變得更平滑,這是由於人聲中激活特性的精細結構,要麼是隨機的,比如/s/中這樣,或者是持續性的,體現為圖中的豎向條紋。

圖4中標註為H1到H5的綠色和藍色的橫條是5個隱含層中每個神經元的數值(激活狀況)。這張圖中每一層32個神經元經過了重新排列,讓具有類似輸出的神經元距離更近一些。

再網上的一個橫條(帶有黃色信號的)展示的是聲學模型的輸出。在每一幀中,語音段落中的每一個狀態都會有一個輸出,另外還有其它對應着靜音或者其它語音聲音的輸出。最終的評分顯示在最上方,是按照公式1,沿着發光的信號把每個局部的分數積分起來得到的。值得注意的是,一旦整個語音段落都輸入了系統,這個最終評分就會達到最高點。

蘋果的工程師們為最終評分設立了兩個閾值來決定是否要激活Siri。實際上,閾值並不是固定的數值。蘋果工程師們設定了一定的靈活性,在嘈雜的環境下更容易激活Siri,同時也不會顯著增加誤激活的次數。兩個閾值中一個是主閾值,或者是普通閾值,還有一個較低的閾值,達到這個較低閾值並不會像正常那樣啟動Siri。如果最終評分達到了較低的閾值但是沒有達到普通閾值,有可能確實是設備沒有識別出用户説的“Hey Siri”。當評分在這個範圍時,系統會進入一個更敏感的狀態並保持幾秒鐘,這樣如果用户重新説這句話,即便他沒有説得更大聲更清晰,Siri也會被喚醒。這種“二次機會”機制極大地提升了系統的可用性,同時還沒有讓誤喚醒率提升多少,因為設備也只會在這個非常敏感的時間保持很短的時間(下文會更多地討論準確率的測試和調節)

平衡響應性和電量消耗:兩步檢測

“Hey Siri”檢測器不僅需要檢測結果準確,還要在達到高識別速度的同時不造成明顯的電量消耗。同時還需要儘量降低對內存和處理器的需求,尤其是對於處理器需求峰值。

為了避免讓iPhone的主處理器全天運行就為了等待聽到激活短語,iPhone 6S以及之後的iPhone上都搭載了一個 Always On Processor (持續工作處理器,AOP) ,這是一個小體積、低功耗的協處理器,也就是iPhone上內置的型號M開頭的運動協處理器。它能夠獲取麥克風採集的信號。蘋果的工程師們拿出了AOP中有限的計算資源的一小部分來運行一個“Hey Siri”檢測器中的深度神經網絡的縮小版本。當評分達到了一個閾值之後,運動協處理器會喚醒主處理器,主處理器就會用一個更大的深度神經網絡分析聲音信號。在第一個帶有AOP支持的“Hey Siri”檢測器版本中,前一個協處理器中的檢測器中的5個隱含層每個隱含層有32個神經元,第二個主處理器中的檢測器中的5個隱含層每個隱含層有192個神經元。


圖5,兩步檢測在Apple Watch上實現“Hey Siri”檢測器的時候蘋果工程師們遇到了更大的困難,因為它的電池要小得多。Apple Watch用的是一個一步檢測的檢測器,其中的聲學模型大小介於剛才説到的其它iOS設備中第一步檢測和第二步檢測的模型大小之間。這個“Hey Siri”檢測器只有當手表中的運動協處理器檢測到手腕抬起動作的時候才開始工作,同時也會亮起屏幕。這時WatchOS其實要做許多的事情,喚醒電源、準備屏幕等等,整個系統只會在本來就非常有限的計算資源中分配給“Hey Siri”檢測器很小的一部分(大概5%)。及時啟動音頻採集抓住激活詞語是一項挑戰,所以蘋果也在檢測器的初始化過程中預留了一些空間,允許出現一些斷續。

個人定製化的“Hey Siri”

一直開着的“Hey Siri”檢測器可以對附近任何人説的激活短語做出響應,蘋果的工程師們最初是這樣設計的。為了減少誤激活帶來的麻煩,在iOS設備上打開“Hey Siri”功能後,用户需要進行一個簡短的註冊環節。在註冊環節中,用户需要説五個以“Hey Siri”開頭的短語,然後這些語音樣本會被保存在設備上。

未來設備上錄製到的任何“Hey Siri”語音都會和存儲的樣本做對比。(第二步)檢測器會產生時間信息,可以把語音樣本轉換成一個固定長度的向量,這個過程中會把每一幀對齊到每個狀態之後取平均。另外一個單獨的、專門訓練過的深度神經網絡會把這個向量轉換到一個“講話者空間”中去。這個設計的想法是,同一個講話者的語音樣本會較為接近,不同講話者之間的語音樣本就會離得比較遠。識別時,會把新語音和之前註冊時錄製的語音之間的距離和一個閾值進行對比,判斷觸發了檢測器的這個聲音有多大可能是來自注冊過的用户的。

這個過程不僅降低了另一個用户説的“Hey Siri”會激活iPhone的可能,同時也降低了其它聽起來接近的詞語激活Siri的可能。

進一步確認

在通過iPhone上的層層識別階段之後,這段語音會被傳到Siri服務器上去。如果服務器上的主語音識別器認為説的內容並不是“Hey Siri”(比如其實説的是 “Hey Seriously”),服務器就會給手機發回一個取消信號,讓它重新進入睡眠狀態(圖1中所示)。在有些系統中,蘋果也會在本地設備上設置一個縮減版本的主語音識別器,在更早的時候提供多一步檢查。

聲學模型:訓練

深度神經網絡的聲學模型是“Hey Siri”的核心所在。下面來詳細看看它是如何訓練的。早在推出“Hey Siri”功能之前,就有一小部分用户使用在Siri時在講命令之前先説“Hey Siri”;這時候激活Siri都是靠按下按鈕的。蘋果的工程師們就使用了這些“Hey Siri”語音用作美國英語的檢測模型的初始訓練集。他們同時還用了一些一般的語音樣本,就像訓練主語音識別用到的那樣。在這兩種情況下,蘋果都使用了訓練短語的自動文本轉錄結果。Siri團隊檢查了這些轉錄結果中的一部分,確認正確率足夠。

蘋果為不同語言單獨設計了“Hey Siri”短語的語音特徵。以美國英語為例,系統中設計了兩種變體,其中的“Siri”有兩種不同的首元音,一個像“serious”中那樣,另一個像“Syria”中那樣。他們還考慮瞭如何應對這兩個詞中間的短暫間隔,尤其是這個短語書寫的時候都經常會帶上一個逗號變成“Hey,Siri”。每個語音符號都會被分為三種語音類別(開頭,中部以及結尾),每一個在經過聲學模型後都會得到各自的輸出。

蘋果使用了一個對話語料庫來訓練這個檢測器的深度神經網絡,同時Siri的主語音識別器會給每一幀提供一個聲音類別標籤。主聲音檢測器中有數千種聲音類別,不過只有大約20種是檢測“Hey Siri”的讀音時用得到的(包括一個初始聲音),然後把所有其它的聲音都歸為一個大類就可以。訓練過程的目標是根據局部音頻樣本,讓DNN對標識了相關的狀態和音素的幀輸出的判別結果儘量接近1。訓練過程通過標準的反向傳播和隨機梯度下降調節連接權值。開發過程中,蘋果使用了許多種不同的神經網絡訓練工具包,包括Theano、Tensorflow 以及 Kaldi。

訓練過程中根據給定的局部聲學樣本估計音素和狀態的概率,但是這些估計值中會包括音素在訓練集中的出現概率(首選),它們的分佈可能不均勻,而且也和檢測器的實際應用場景關係不大,所以蘋果工程師們在應用聲學模型之前先對這些首選做了補償。

訓練一個模型通常需要花一天的時間,蘋果通常也會同步訓練好幾個模型。一般一次會訓練三個版本,一個小模型用在運動協處理器的第一步檢測上,一個大模型用在主處理器的第二步檢測上,以及一箇中等大小的模型用於Apple Watch。

“Hey Siri” 功能可以支持所有Siri支持的語言,不過讓Siri開始聆聽的指令不一定非要是“Hey Siri” 這兩個詞。比如,講法語的用户需要説 “Dis Siri”,講韓語的用户説“Siri 야”(發音類似“Siri Ya.”)在俄羅斯,用户要説“привет Siri “ (聽起來像“Privet Siri”),在泰國就是“หวัดดี Siri”.(聽起來像“Wadi Siri”)。

測試和調整



無論用户在什麼時候説“Hey Siri”,一個理想的檢測器都應該馬上啟動起來,同時不在其它的時候啟動。蘋果用兩種不同的錯誤描述檢測器的準確率,一個是在錯誤的時候啟動,一個是沒能在正確的時候啟動。前者是錯誤接受率(FAR或誤警率),是每小時平均誤啟動的數目(或者是誤啟動之間的平均間隔時間);後者錯誤拒絕率(FRR)是嘗試激活Siri的動作中失敗的比例。(值得注意的是,用來衡量FAR的單位和衡量FRR的不一樣,甚至測量的指標都不一樣。所以不存在FAR和FRR相等的狀況)

對於一個給定的聲學模型,可以在兩種錯誤率中做平衡取捨,改變激活的閾值就可以。圖6中表現的就是在兩個開發早期的模型基礎上做這種取捨的例子,做的操作就是沿着曲線改變閾值。

在開發過程中,蘋果的工程師們嘗試用一個很大的測試集估計系統的準確率,這樣的測試集採集和準備起來很花錢,但卻是必不可少的。測試集中有正例數據也有負例數據。正例數據中確實含有目標激活詞語。你可能會想,用“Hey Siri”系統本來採集到的聲音來做測試不行嗎?但其實系統並沒有捕捉到沒能激活Siri的那些語音,而蘋果的目標是提升系統表現,儘量讓以前激活失敗的聲音在現在可以激活成功。

一開始蘋果使用了一些用户在按下Home按鈕同時説的“Hey Siri”語音,但是其實這些用户並沒有試着讓Siri集中注意力聽他們説什麼(按下Home按鈕的動作就已經表達了這個意圖),而且同時麥克風也一定是在用户的一臂距離之內。相比之下,蘋果希望“Hey Siri”可以在整個房間的範圍內都有效。所以蘋果專門根據不同的環境錄製了很多語音,比如在廚房(遠近都有)、車上、卧室、餐館;蘋果分別請了把各種語言做母語的人蔘與這項錄製。

負例數據是用來測試誤激活(以及誤喚醒)的。數據集中有不同來源的共數千小時錄音,包括語音博客和Siri收到的各種語言語音中不含有“Hey Siri”的那些,它們分別代表了背景聲音(尤其是人類對話)和用户跟另一個人講話時容易出現的詞語。蘋果需要準備大量的數據,因為他們的目標誤激活率要低至每週一次(如果在標識為負例的數據中確實出現了激活詞語,這樣的情況就不算為出錯)


圖6,檢測器準確率。較小和較大的深度神經網絡中對檢出的閾值有不同取捨系統的調節在很大程度上就是一個決定用什麼閾值的過程。圖6中,較大的深度神經網絡的那條較低的權衡曲線上的兩個點,就是選出的正常閾值和“再説一次”的閾值。較小的模型(一步檢測)的工作點在最右側。圖中的曲線展示的僅僅是檢測器中兩個階段的檢出率曲線,並未包括之後的個性化階段或者後續檢查。

對於在測試集上表現較好的模型,蘋果的工程師們當然有信心認為它們確實更優秀,但把離線測試的結果轉換成對用户體驗的靠譜的預測就是另一件事情了。所以除了剛剛介紹的離線測試之外,蘋果還從最新的iOS設備和Apple Watch上對生產數據(用户真實使用狀況下的數據)進行了每週採樣,用來估計誤識別率(用户沒有説“Hey Siri”的時候Siri就啟動了)和冒名接受率(檢測器已經經過了用户語音的訓練,但是另一個人説“Hey Siri”的時候Siri也啟動了)。這些數據中並不能得到拒絕率(用户説了“Hey Siri”但Siri並沒有應答),但是這個指標可以由系統開發人員從剛好高出閾值的真實激活動作的比例,以及設備上記錄的剛好未達到閾值的事件次數中推測出來。

蘋果的工程師們用這篇文章中介紹的訓練和測試方法以及它們的變種,不斷評估、改進着“Hey Siri”功能以及在背後支持着功能的模型。訓練中總是包含了各種不同的語言,測試中也總是考慮了各種變化的條件。

下次你再對手機説出“Hey Siri”的時候,你可能會想起蘋果工程師們為了能應答這個短語而做的所有這一切,但蘋果工程師更希望的是你能覺得“it just works"!

via Apple Machine Learning Journal,雷鋒網 AI 科技評論編譯

相關文章:

蘋果的機器學習開發日記:如何設計能在Apple Watch上實時運行的中文手寫識別系統

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知


資料來源:雷鋒網

如果喜歡我們的文章,請即分享到︰