華東理工大學 劉峻宇 劉逸捷 岳川夢真 王憲偉 劉金琳
伴隨著深度神經網絡的的到來,機器學習與人工智能技術在人們的日常生活中逐漸得到了廣泛運用,尤其是諸如人臉識別,身份認證,物體識別等圖像識別以及計算機視覺相關的技術。雖然深度神經網絡對于語音識別模塊的推進狀況不如圖像識別,但是迄今為止仍然在不斷涌現的技術允許語音識別變得逐漸快速,準確。為了推動語音識別技術在人們生活中的普及,本文提出了一種醫療方向上的語音識別以及與正在發展的電子病歷系統結合的系統,并在其上就語音識別和說話人識別,基于語音識別工具包Kaldi進行了一系列研究和探索,針對語音識別修改thchs30的語音模型,獲得了一個專門針對醫療語音識別的模型,通過對案例sre16/v2的學習獲得了基于xvector的文本無關說人識別模型,最后基于對已經識別出來的語音的正則提取處理,構建了一個手機語音問診app系統。
語音識別是一個十分復雜的過程,其包括語音的采集,前端處理,解碼器以及最后的文字處理部分。首先,語音采集也許是所有步驟中看起來最沒有技術含量的一個步驟,但這并不意味著這個步驟無足輕重,在韓紀慶等人所著的《語音信號處理》藝術中就闡述了一個良好,全面的語音素材,對于語音信號處理可以起到極大的簡化作用,好的語音采集同樣對于建立良好的語音模型十分有幫助。然后是前端處理,在這個部分,需要做的包括:端點檢測,語音降噪,語音篩選,片段截取。這同樣是個工作量十分大而且還需要一定技術支持的步驟,良好的語音降噪和端點檢測對于一個用于訓練語音模型的語音素材十分重要,加上對于語音內容的篩選,這有利于建立識別度高,有針對性的語音模型。而片段截取則是有利于縮短模型的訓練時間,同時也一定的有利于模型適應度。接下來就是本文主要研究的兩個部分,解碼器和文字信息處理兩個部分,解碼器有兩個部分組成,分別是通過語音數據和文本數據訓練出的聲學模型和語言模型,由于訓練聲學模型需要大量好的語音資源來訓練,由于不具備這個條件,本論文的探索的技術主要在于修正通過其他語料尋來出來的模型使其適應醫療領域從而達到針對醫療語音識別這個目的。最后,文字信息處理部分其實主要在app框架之中,對于語音識別出來的信息,通過正則表達式將需要的關鍵信息提取或轉化,填入預先設定好的電子病歷之中。
要設計針對與醫療方向的語音識別,就需要先假設擁有這樣一款產品。倘若有這樣一個產品,客戶會需要其擁有什么樣的性能呢?首先需要其擁有與一般語音識別軟件一樣的功能,其次,與平常語音識別不同的是,首先,需要其能夠快速且準確的識別出問診時候的專業詞匯。最有,由于病人和醫生在問診時,存在一問一答的對話模式,所以需要其具有良好的說話人識別功能,以便于之后的電子病歷填寫。本文之后的探索與研究皆圍繞此兩點進行。
Tri-gram語言模型:
Tri-Gram是一種基于統計語言模型的算法。它的基本思想是將文本里面的內容按照字節進行大小為3的滑動窗口操作,形成了長度是3的字節片段序列。
每一個字節片段稱為gram,對所有gram的出現頻度進行統計,并且按照事先設定好的閾值進行過濾,形成關鍵gram列表,也就是這個文本的向量特征空間,列表中的每一種gram就是一個特征向量維度。
該模型基于這樣一種假設,第3個詞的出現只與前面2個詞相關,而與其它任何詞都不相關,整句的概率就是各個詞出現概率的乘積。這些概率可以通過直接從語料中統計3個詞同時出現的次數得到。

圖1 DNN-HMM聲學模型
DNN-HMM聲學模型:
DNN:深度神經網絡,HMM:隱馬爾科夫模型,DNN-HMM框架原理示意圖所示,與DNN-HMM相比較,將DNN替換GMM,計算的是多個幀的特征的概率值,即每個狀態的后驗概率。從圖中可以很明顯看出,DNN的訓練會產生大量的參數,使用CPU進行DNN的訓練會消耗非常多的時間,因此在DNN的訓練中使用GPU可以節省大量的時間,提高運算速度。具體實現如圖1所示。
語音識別主要使用工具:
主要是用SRILM和Kaldi工具,其中使用SRILM訓練語言模型,使用Kaldi訓練聲學模型。
SRILM是一個用來構建和測試語言模型的工具。SRILM包含C++類庫,基于這些類庫的訓練以及測試語言模型的可執行的封裝好的程序,以及事先準備好的任務腳本。因此可以通過SRILM非常簡單地通過訓練數據得到一個語言模型,這當中包括最大似然估計也可以通過相應的平滑算法使模型更加平衡。
Kaldi與構建操作隱馬爾可夫模型的HTK工具相似,用于構建語音識別模型,但是在其基礎之上,Kaldi的易于修改和易于擴展體現了代碼的靈活性,同時Kaldi運行穩定,且支持一些目前流行的如深度神經網絡等的高階模型,極大程度上便利了語音識別方面的研究。
模型訓練:
(1)數據準備
數據參考了清華大學thchs-30[23]在Kaldi平臺上訓練語音識別模型的語言模型的訓練數據,在其基礎之上對其語料進行了一定程度的擴充,從而增加語言模型在疝病問診方面的識別效率。同時,將瑞金醫院的疝病問診的對話記錄通過人工處理,得到新的訓練文本,用于訓練新的語言模型。
訓練聲學模型時,數據的準備主要分為兩個部分,一個是語音數據,即與數據集相關的錄音以及一些記錄了錄音信息的文件;另一個是語言數據,即與語言本身更相關的發音字典、音素集合等關于音素的額外的信息。
字典文件的準備上,本研究準備繼續使用清華的thchs30中的“lexicon.txt”字典和“lexiconp.txt”概率字典,但是在其基礎之上,增加醫療專用詞匯,同時調整詞匯出現的概率,以實現模型的領域化。如圖2所示。

圖2 數據分布
(2)訓練模型
首先是訓練語言模型Tri-gram,通過對瑞金醫院疝病問診的文本集合進行訓練得到一個相對而言較小的3-gram語言模型,new_word_3gram.lm。將thchs30中的word.3gram.lm模型和new_word_3gram.lm通過SRILM中自帶的compute-best-mix腳本,計算出合適的比例,進行合并,得到最終的基于詞的語言模型final_word.3gram.lm。
其次是聲學模型,利用Kaldi,結合使用SRILM訓練出來的語言模型,訓練出基礎的隱馬爾可夫模型語音識別模型,在此基礎模型之上進行深度神經網絡的訓練,與此同時可以利用Kaldi這個平臺,對比多個算法的優劣,對模型進行調整,得到最終的模型。最終模型的生成流程如圖3模型生成流程圖所示。對于DNNHMM的訓練主要有五個步驟,包括特征提取、處理語言材料、單音素GMM-HMM訓練、三音素GMM-HMM訓練以及最后的DNN-HMM模型訓練。具體過程如圖4所示。

圖3 模型關系
(3)調整參數
對于三音素模型的訓練,使用了step/train_deltas.sh腳本進行訓練。step/train_deltas.sh腳本有幾個重要的參數,包括葉子節點數、總的高斯數目以及存放數據、音素對齊結果等數據的目錄路徑。

表1 參數調整方法
模型效果對比:
在本次研究中,主要改進集中在對語言模型的改進當中。通過對語料和詞典的擴充,增強語言模型在醫療領域的識別效率。首先,本次研究在使用了添加了新的語料的語言模型的基礎之上訓練了單音素GMM-HMM、三音素GMM-HMM以及DNN-HMM。
其中,與單音素模型不僅僅只有上下文的區別,三音素模型在訓練的過程中,還加入了LDA、MLLT等參數調整以及說話人自適應等過程。

表2 模型識別率
通過得到的數據,對比了一下這三者之間的區別,在整體的識別率上,如表2模型識別率所示,和預期一樣,經過了參數調整的三音素GMM-HMM的識別率極大程度優于單音素GMM-HMM,可見三音素模型確實擁有比單音素模型更佳的效果。而DNN-HMM則是小幅度優于三音素GMM-HMM。然后,本次試驗通還將修改語言模型前后,三種模型在詞和音素的識別率分別進行了對比。

表3 因素GMM-HMM對比
首先是修改語言模型前后,單音素GMM-HMM的對比,如表格3單音素GMM-HMM對比所示,從表格中的數據可以看出,對語言模型進行修改之后,在相同的測試集中,識別率也略有提升,且詞的識別率提升較因素的識別率提升更多,原因是對于單音素模型而言,雖然對語言模型的修改對于識別率的提升并沒有多大的作用,但是由于更豐富的語言模型構成了更加完善解碼網絡,因此會對詞和音素的識別都略有提升。
而修改之后的單音素模型在詞的識別上起到好的作用,則是因為更加完善的詞的語言模型即使使用了醫療領域的對話文本,文本中也包含了日常的用詞,故而在普通領域的測試集中,識別率也會有提升。

表4 單因素GMM-HMM對比
對于三音素GMM-HMM和DNN-HMM的識別,如表4三音素GMM-HMM對比和表格5 DNN-HMM對比所示,修改語言模型的效果則不那么明顯,原因是因為對于三音素模型而言,會使用單音素模型的對齊序列,而DNN-HMM模型會使用GMM-HMM進行初始化,因此效果的提升會有一定程度的削弱。

表5 DNN-HMM對比
xvector系統:
Xvector系統是一個深度神經網絡系統,可以通過變長的語音片段來計算語音中嵌入的說話人這是kaldi工具欄中公共的體系結構。如下表格展示了xvector拓展網絡的結構。其主要功能可以分為三塊,如圖4所示:第一組包括一到九層,是TDNN(一維卷積)和密集層的集合。卷積的層次結構提供了一種有效的方式來處理數量減少的230ms擴展輸入上下文。給定一系列F維的T個輸入特征,此塊將23×F個特征的塊映射到T個高維向量(1500dim)序列中。第二組,即第10層,通過計算每個維度上的均值和標準差,對該序列執行時間合并操作。這兩個統計量被串聯在一起,成為大小為3000的固定維向量,該向量總結了整個輸入記錄。第三組,即第12層至第13層,是具有瓶頸層的前饋網絡,并用作分類器,為訓練說話者輸出后驗概率。在ReLU非線性之前,先從層11中提取x向量。網絡的瓶頸結構用于實現嵌入尺寸的減小(512尺寸)。實驗中使用的DNN的參數總數(使用7,168名訓練者)約為800萬,其中僅需要400萬即可提取x矢量。

圖4 xvector實現
Xvector的優勢:訓練速度十分快;無需特定的語種設置一個embedding層進行提取特征直接進行plda打分;識別率十分可觀
模型測試:
我們通過運用的數據集是AISHELL中文普通話開源數據,總共178 h,400個人講,其中訓練集340個人,測試解20個人,驗證集40個人,每個人大概講三百多句話,每個人講的話都放在一個文件夾里面。復現了xvector說話人識別。

圖5 邏輯流程圖

圖6 系統界面
我們選用app inventor進行開發,它是一個非常直觀的可視化編程環境,將代碼功能模塊化,使用積木拼圖式編程,程序員通過拖拽具有所需功能的模塊,通過拼接即可實現各種功能。以及系統的邏輯流程圖設計圖如圖5所示。
系統界面如圖6所示,可以看到從左到右依次有四個按鈕“開始錄音”“開始提取”“確認信息”“重新開始”,其實這也是使用系統的流程。
下面我們從醫生角度解釋系統使用的流程。
(1)醫生點擊按鈕“開始錄音”后即可開始問診,系統開始錄音并進行語音識別,錄音過程中系統界面。
(2)問診接收后,醫生只需說聲“結束”,系統識別“結束”后即中斷錄音,并將識別好的內容顯示在界面上方的文本框中,鑒于識別結果可能并不準確,醫生可修改識別結果。

圖7 年齡的結構化規則

圖8 疼痛時長的結構化規則

圖9 腫塊位置的結構化規則
(3)醫生確認識別結果無誤后,點擊“開始提取”,系統開始從文本中提取電子病歷所需信息并顯示在下方表格中。
(4)提取結束并顯示后,即問診結束,醫生點擊“確認信息”即自動上傳電子病歷到數據庫中,系統的本次使用結束,點擊“重新開始”即可開始下一次問診。
規則結構化,提取相應字段返回結果,結構化中主要有三方面問題需要處理,分別是:
年齡的結構化規則:
對于年齡的結構化規則如圖7所示,針對不同的語言習慣,考慮到了兩種詢問方式,主要為“多少歲”和“多大”兩種,對于回答則是考慮到了語音識別的過程中,會直接將數字轉換成阿拉伯數字,因此在該基礎之上,不用考慮中文的數字的問題,直接使用正則中的數字表達即可對所有情況進行提取。
疼痛時長的結構化規則:
疼痛時長的結構化規則如圖8疼痛時長的正則化規則所示,針對疝病的具體情況,病人的回答可能不僅僅只有數字,而是涉及到去年、前年等詞,因此在正則化的過程中需要考慮到這些情況,故而對于疼痛時長的正則規則相對其他的字段的規則會復雜很多。
首先在提問方面,有兩種情況,對于這兩種情況都提取關鍵字后30個字符作為下一個正則提取的語句,這樣就可以極大程度上避免“答非所問”的情況。對于新的語句,首先判斷有沒有阿拉伯數字,有則直接作為最后結果輸出,沒有則判斷是否有中文數字,有則直接提取并輸出,沒有則判斷是否存在“去”、“今”和“前”等關鍵字,有則提取之后轉換成相應的數字,例如“去年”會被轉換成“一年”,若還是沒有這些關鍵字,則判斷是否有“幾”字存在,該字的存在也表明了病人對具體時間的不確定,因此可以通過將“幾年”轉換成“數年”的方式來表達。
腫塊位置的結構化規則:
對于腫塊位置的結構化規則如圖9腫塊位置的正則化規則所示,針對疝病的具體情況,腫塊的位置主要集中在左、中、右三個部位,因此醫生詢問病人的時候會引導病人回答左、中、右這樣的關鍵詞,故而相對于其他幾個字段的結構化規則而言,腫塊位置的正則化規則看上去非常簡單。
本文在語音醫療語音識別上進行了探索,綜合判斷挑選了有針對性的技術解決對應的問題,并且在這些領域做了研究和探索。首先,對于問診對話中常出現醫療詞匯的情況,本文基于清華的thchs30中的“lexicon.txt”字典和“lexiconp.txt”概率字典,增加醫療專用詞匯,同時調整詞匯出現的概率,以達到快速,準確識別醫療詞匯的效果;針對說話人識別,本文探索了目前在訓練速度,識別率,適用性各方面綜合下來最優的xvector系統,基于kaldi工具包訓練了模型。最后,本文提出了一種語音問診智能電子病歷app系統的功能流程與框架設計,這些技術探索和研究,都將有助于今后的醫療語音系統開發。