作者:語音技術大師 語音科學及技術是我博士論文所在的領域,目前在技術市場上又出現再次的熱潮,因此將我的部分拙見貢獻出來探討。這是復雜的領域,因此做法也有很多、一篇短文也只能提綱挈領,觀點和做法不同之處,僅供參考、看官海涵。 近期我在一處的回帖里說:語音互動技術的2大瓶頸是:(1)自然語言理解;(2)環境干擾音的抑制。這是不談及內部技術、不講為什么的說法,也是高度概括的說法。下面稍微擴展開來點說。 語音識別技術本身的結構和算法最近20年來進展緩慢,本身沒有根本提升,學術界仍然在做艱難改進,對總體提升微小。像若干深入技術一樣,語音識別的技術仍然是以“算法”形勢存在,也就是說,尚未成為優秀成熟穩定的東西固化在芯片里面、讓工程上和產品里能夠方便使用。這套算法,主要包括對于輸入語音信號的“前處理”來提取最有用最濃縮的“特征”參數,以及用這些參數來進行的統計計算決策,這2個大的步驟。目標是找到所說“內容”的最佳估計,而不理睬語音中其它信息如說話者身份、情緒等。而這統計決策的機理,最成功的系統采用的是2種數學結構之一:“隱式馬爾科夫模型”(HMM)或“人工神經網”(ANN),目前都仍在使用或改進中。前者的結構比較統一,簡單說就是將語音信號參數的出現,作為一個隨機過程對外的“觀察”,因此也就有了一個觀察概率,另外還有一個馬爾科夫鏈自身各態間的“轉移概率”。實際使用包括“訓練”和“識別”兩個過程,前者使用若干數學方法(稱為參數估計),從大量標注的實際語音數據(叫做語料)中獲取信息,例如說a的發音對應怎樣一系列的觀察參數,并將這些參數寫進事先定好結構的模型參數里。當然了,這里需要面對大量不同的語音、不同說話者、在不同上下文中的語音的特征,也就體現了“統計”的強大。而在識別時,未知語音信號,經過同樣的參數提取,用來進入部分語音模型中,進行概率計算,而(一個短語的)總“分數”最高對應的那個序列的模型,就輸出為識別的結果,例如一個單詞序列,或一個控制指令等。人工神經網的內部結構不是一種,而是很多種,最常用的有“帶時延的多層感知器”等,但總的原理仍然是將大量語料中的變化信息,存入固定結構的模型參數中;而參數估計又各有不同的算法,尋求某種局部最優,最后用語音識別的實踐來驗證其優良與否。也有一些“自適應”系統,能夠在識別過程中自動進行對于自身參數的改善、作增量式的小規模再估計,這也就是人們常說的“自動學習機理”。 以上這類基本模型,稱為“語音模型”。進而,因為人們說的每句話,是屬于一種語言(如中文)巨大單詞的可能組合之一,但這不是說“任何組合”都是允許的。這里就用到我們人類自己學習語言時也在用的一類結構,叫做“語法”,就是規定哪些詞可以跟隨哪些詞。這樣,組合的可能就不那么繁多了,也就給大規模連續語音識別系統的“搜索”帶來的巨大的簡化。在語音識別系統中的用來限定的語法,稱為“語言模型”;它本身也需要若干深層數學的指導,才會達到能夠從大量語料、但仍然缺少部分數據的語料中,高效正確地獲取模型參數;并且,對于人類自然語言中的語法,采用規范語言(如編程語言)語法的方式多數不可行。工程上,通常語音識別器構建時,需要對所需不同場景,以及場景間的銜接,進行人工的編輯,而場景中的每一個時段,對應一些固定的語法,也就是說,到了那個“菜單”,系統僅能聽懂那一些單詞、以及那些單詞的那些固定序列。在識別這個層面,有若干模式,此處不一一列舉。總之,語音模型和語言模型,發源于科學家們對于自然的語言對話過程的部分理解,因此想要在計算機算法里學習使用這樣的過程,因此就使用了這些模型。但這些模型都基于實際人類的過程,做了大量的簡化。所以說,在計算機算法中的語音識別,只是很少部分類比了人類的自然過程。說實話,科學家對于人類自身如何理解語言,也遠沒有達到完全的了解呢。但是,工程產品上已經想要使用,不想再等了。 順便提一下早期的人工智能方法,也曾經用來做語音識別,但是一直是失敗的。早期人工智能用于語音識別,是想找出所有“什么話對應什么信號”的規則,然后在存儲了這樣大量規則的系統中,搜尋出未知信號屬于哪個語句。失敗的原因就是語音信號與內容的對應關系遠不是一一對應、其中混雜了太多來源的不確定性(同一句話,即使同一個人說N次,也是N個非常不同的信號,更何況不同人說同樣話、在不同場景或環境說等),因此完美的規則一直無法獲取、表達、或被搜索,而不完整的規則集帶來的只是在非常小規模語音識別中的滿意結果。所以,上述HMM等統計的方法才會勝出;不是因為它更加準確,而正是因為面對混雜的物理現實,需要用不那么精確的模型和參數,去保存只有統計意義下正確的信息,然后去做不那么黑白分明的“軟決策”,反而成功了。而統計方法是否會獲得最終的勝利,或者統計+規則的某種結合會勝出,也是少部分科學家仍在探索的方向。 目前的人工智能已經前進了很多,并且似乎仍有人認為語音技術是由該領域所發展起來。需要澄清的就是,如今的主流語音識別機自然語言理解技術,都不是早期人工智能的方法所支持。但如果僅從應用角度上看,都是解決讓計算機看上去像人的行為這樣一個目標,那么語音可以納入人工智能范圍,但內部結構基礎完全不屬于同一類了。 世界上語音識別和互動技術的發展,除了古代那些僅有概念(描述型的模型)的說法以外,近代主要是由美國國防項目開始于上世紀80年代。早期的發展歷史很有意思,除了上述的規則-統計基本思想之爭而外,實際上絕大多數后來可行并主導的結構和算法,都是在其支撐理論不成熟甚至完全不存在的情況下、由搞計算機的人“鼓搗”出來的。大家熟知的創新工場李開復,就是當年這些編程高手之一:他在CMU大學的博士論文后來被發表為一本書,而他是早期成功實現大規模連續語音識別的人之一。以后的15年左右,世界上有最多20幾處(大學或公司或研究所)的獨立團隊在做語音識別;除了學術論文豐富,還有幾次的世界范圍的比賽:統一發送相同的識別任務,在1-2周內發回結果,包括準確率、實時性、抗干擾性等逐漸深入的指標。這一時期的擁有內部語音識別技術、并以語音為主營的公司也有10多家。但,根本來說還是這一領域的復雜性艱難性,使他們當時的商務目標全都失敗了、都沒有靠語音賺到錢,多數公司都關閉了。其中留下來的最大和最好的一家是美國的nuance公司,及其若干合作方式。在某個階段,它除了提供最好最大的識別技術內部的“引擎”,還為了下游公司方便開發應用,提供很多“開發平臺”以及企業級應用方案。在美國歐洲也都出現了電話網絡上成功運營的全語音互動咨詢服務(自動坐席)、面對一個有限的應用范圍,如飛機航班、**信息等、達到了相當自然的對話程度、并絕大多數時間能夠滿意地自動應答獲得信息。但最后的10多年來,并沒有出現突破這些“有限范圍”服務局限的新發展。筆者了解到國內幾年前的水平,同樣是采用國外大公司提供的語音引擎、開發平臺,以及(國內外)語音板卡硬件以運行于電信級環境,擁有號稱幾百人開發團隊的自動坐席技術提供公司,所開發出的服務,只是將現有“選A請按3”類的分類菜單操作,平移改為死板的語音指令輸入而已,沒有給用戶提供任何提升的體驗,自然也就沒有任何發展前景。可見一斑:即使是僅僅外部的應用層工程開發,語音互動技術也還是需要相當深入的多學科基礎的,否則就只能是對該技術的簡單濫用了。值得一提的國內科大訊飛公司多年的積累,在首先成功獲得語音合成(中文版)的市場主導地位以后,近年來也開發成功大型語音識別引擎及系統及方案。 上面雖然提到語音識別系統內部所用的、用于限制范圍的語音模型,這還遠不是走向類似人類那樣完全自然方式對話的工作。解決這個問題的領域叫做“自然語言處理”(NLP),簡單說是在語音識別得出單詞序列以后、再進行的“理解”并達到對話過程的控制引導、和直接執行服務中的動作的巨大研究領域;當然了,識別出的單詞會有錯誤,所以真實的系統不是這樣硬性分離識別和理解這2個步驟的。或者說,自然語言處理是處理“文字”的,而非直接處理語音格式的信息。這個領域與自動翻譯系統有很大重疊。這里面也同樣有規則vs統計的基礎方法問題,或者上升到哲學層面(這類的領域,哲學指導是真真實實需要的喔),就是人類“理性主義”和“經驗主義”的對決和融合。方興未艾、按下不提。 除了艱難的學術探索和內核技術提升,蘋果的iris走的是另外的道路:應用導向。也就是說,從應用角度來連接現有模塊所能夠達到的最好程度、并佐以自家開發的模塊來共同構筑對于能夠提升用戶總體體驗的新服務。Iris被蘋果購進之前,據說也是基于國防項目的一個實時信息管理軟件、并由幾個能人做成手機上的服務應用。可以說,這里面語音識別和互動僅僅是一小部分而已。總體目標是一個能夠根據實時動態廣泛的網絡上的信息,來提供信息服務的“個人助理”。也就是說,不僅它的語音識別和自然語言理解的計算,是基于云平臺上的巨大計算資源來達到更加精確,而所用信息也是通過云不斷采集和分析擴展的。也就是說,你在手機上說出的搜索單詞,是上傳到服務器的巨大主機上去進行運算、并獲取那里擁有的歷史及實時信息,再將識別或查詢結果傳回到手機上,所以手機只是這個過程的應用界面和接口,使用時會因為網絡原因而略顯延遲。而它自身的自然語言處理模塊,也是結合進了實時采集到的信息分析結果的特征,來更好地猜想用意、收集習慣歷史、引導對話等,是一種非常貼近實際的NLP開發方式。它的初步成果再一次說明了:面對艱難的跨學科技術,從應用角度入手,而不是等待它發展到完美,是一條可行的道路。而這些“應用層”中部分不得已添加的模塊,也許有些后來會成為對于語音識別和自然語言理解領域的、尚不完善理論的巨大補充和新的發展方向;就像早期語音識別技術被“大膽”的軟件工程師搞成功一樣。自然語言理解旨在令系統達到能夠接近人類自然方式的對話、并完成服務中的任務。所以,這個領域的發展,也同樣需要理論和實踐兩個方面的營養;會是未來幾十年的工作。這也是如今熱起來的云計算和“大數據”領域中很好的方向。 另外一個方面的挑戰是信號層面的干擾:當語音互動系統,在用于遠距離“免提”方式時,MIC采集到的信號中會存在諸多嚴重干擾(嘴巴貼近MIC時,環境干擾音相對會成為很小,因此除了超大強度的噪音,使用雙MIC對話都不再是問題)。畢竟在很多環境的應用中,人們還是希望能夠免提操作的,就像科幻電影中的那樣,人在室內任何地方隨時發出語音指令、而系統回答,而不是手持一個裝置貼近嘴巴!首先,困難的來源是統計語音模型的參數對于所有外界變化都非常敏感,以至于“干凈”環境中訓練出來的模型,直接用到了干擾環境中,識別率會大大下降到完全無用的程度。一個封閉環境(如客廳)中的干擾,主要包括環境噪音(加性)、回聲混響(卷積)、和競爭語音(如電視機里的播音會干擾你的語音指令)這三種;當然它們的組合就會更加困難,例如競爭語音以及所需要識別的指令語音,同時也是經過嚴重混響的。混響是指通過不同墻壁家具等平面反射而混合的信號,其中包含諸多相位混亂版本信號的組合!雖然人類仍可以完全聽清,算法卻因為缺少這部分的知識能力而大大影響識別。目前對所有這些遠距離信號的處理,基本采用進入識別系統之前的“凈化”處理,多采用多個MIC的結構。MIC本身和采集電路成本都很低,目前很多高檔手機都從2個到3個MIC了;但復雜的是它們后面的處理算法、遠沒有達到成熟的程度。微軟的視頻互動硬件Kinect系統(主要用于體感游戲中的視頻識別)中已經集成了多個MIC和集成進芯片的部分語音增強算法,而這顆芯片是一家以色列公司提供的專有技術。從外部開發算法的方向,粗略的分類目前主要有“盲源分離”(BSS)和“盲消混響”(BD),并且每個具體的算法、以及應用方式,是與說話者數量、移動情況、MIC數量、位置和增強信號處理的目標有關;雖然已達到部分增強所要識別的語音的程度,但尚有巨大挑戰要面對。未來一旦某算法獲得成功、能夠在某個方面對于某類應用提供關鍵性的提升,就可以進一步將那個算法用快速DSP芯片來實現,并在系統中集成進這顆DSP,如此作為某個抗干擾語音互動系統的初期系統架構(硬件成本會有較大的增加)。值得一提的是:車載導航和娛樂系統中,語音互動有著非常重要的作用,就是提高駕駛員駕車的安全性(連國內也開始為開車打手機罰款了),但車里的噪音也是這類系統的挑戰之一。所以同樣地,多MIC設置(MIC陣列)加處理算法是未來的方向。 大的投入或者說持續的學術努力,在識別方面有引進更多的基于語音分類(如方言習慣)的模型結構細化、“深度連接神經網”上的新結構和新算法、將更加深入的統計信號處理方法(包括神經網和機器學習)用于上述的BSS和BD等。值得關注的一點是,由于神經網類的算法要在并行硬件的計算結構上才能夠更加高效地發揮作用、或者說同樣的運算資源成本,運行本來比HMM更加復雜的基本結構和算法,能夠達到比HMM更好的識別效果,因此一種新的硬件架構GPU就開始被用于這類計算。GPU雖然本身是為圖形渲染而設計,但近年來也已經被廣泛用于科學計算,大到超級計算機、小至智能手機平板電腦(集成進主應用處理器的GPU核),其實都可以將部分處理用的運算算法任務,交予GPU來做,它正好提供大量簡單單元的巨量并行連接。這也是未來方向,有些讓人感覺又可以開發一些此前運算量太大、CPU或DSP都“自不量力”的信號處理復雜算法了。 語音識別和自然語言處理,這樣一個學科發展到如今,已經到了巨大投入只能換來微小改善的階段、或者是在等待一個全新架構的突破。。。 順便介紹一下:筆者曾親自開發出一款低成本、完全基于DSP的語音互動+控制的硬件模塊,主要用于智能玩具的小詞匯量的語音互動,它也仍在發展中。已經包含了一些簡單的抗噪功能,并且能夠識別非特定人的連續語音(用戶無須訓練、也無須提供語音資料,只提供文本腳本即可),以及包含一些簡單初步的語音理解功能。這是完全“從頭”開發出來的東西,當然不建議任何人都這樣從頭去做,我自己之所以做,部分是興趣使然、測試一下這樣做的可行性。結果是:一款僅幾十MIPS的DSP可以做到這樣,并且包含了對外控制等功能,提供了很大的可擴展性,以及為下游用戶提供了產品開發的最大的方便(且不是死板語句的識別),應該說,是業界中少有的成果了。它包括硬件模塊以及相應的開發工具鏈,并為客戶提供設計協助。 如果任何公司或個人發燒友對于語音識別或互動有興趣探討或開發,可以隨時聯系我;在此處的提問回帖我也會一一作答。這里一并建議:(1)想好自己的應用,因為語音技術尚沒有達到可以應對“任何”應用的程度,然后選好運行平臺,這是成本等問題;(2)如果在電腦上、網絡上或者智能手機平板電腦上通過操作系統來運行語音服務軟件,可以采用的語音識別內部引擎有:微軟、IBM等,以及眾多被修改簡化了的算法軟件:以開發SDK或者完整應用程序的方式提供。因為語音技術本身沒有給誰賺錢,也就基本沒有人還繼續拿它賣錢了,所以免費的就很多;但是識別質量、運行環境、接口、開發方式等,就要你自己搞明白了。如果它有個“演示”程序或免費試用版什么的,可以逐漸做起來。如果有興趣更深入地去做,也可以使用劍橋的非常好的免費軟件工具平臺HTK,但這個需要你自己建立所有模型、編輯和使用語料進行訓練等。如果做好了,識別率也是很高的;(3)即使你不做語音技術的內部,對于它的外部邏輯,還是要有充分的理解,才好開始開發這些互動應用;也就是說,除了普通的軟件工程問題,還要從“一個人如何對話”這方面去理解一下問題本身,對于你的應用軟件設計是非常重要的。這是因為,語音對話是人類太想當然的動作了,對于它的內部動作,例如“在哪個菜單”的設計考慮,就會忽略忘記;(4)如有理論或架構上的切磋,非常歡迎!討論結果也許是未來博文的來源之一。 |