陳風(fēng)駕
(上海微創(chuàng)軟件股份有限公司,上海200241)
為了解決英語口語練習(xí)問題,通過構(gòu)建一個語音對話系統(tǒng)應(yīng)用讓學(xué)習(xí)者可以使用英語溝通。
語音對話系統(tǒng)通常由語音識別、對話管理和語音生成組成,在語音識別和語音生成上神經(jīng)網(wǎng)絡(luò)模型表現(xiàn)已經(jīng)比傳統(tǒng)機(jī)器學(xué)習(xí)模型優(yōu)秀,因此本系統(tǒng)基于神經(jīng)網(wǎng)絡(luò)模型來構(gòu)建語音對話系統(tǒng),在特定語音對話環(huán)境中能滿足用戶需求,實(shí)現(xiàn)鍛煉英語口語的目的。本文將對系統(tǒng)實(shí)現(xiàn)的關(guān)鍵技術(shù)給出描述。
本文使用tensorflow2 開源庫來訓(xùn)練語音識別和語音合成模型,tensorflow 2 支持多種神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練,例如卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)和深度神經(jīng)網(wǎng)絡(luò)等。
循環(huán)神經(jīng)網(wǎng)絡(luò)是一種特殊的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),其通將上一時刻狀態(tài)傳入到當(dāng)前時刻的運(yùn)算中去,但是由于收斂函數(shù),通常是梯度下降算法存在著梯度消失或者爆炸問題文獻(xiàn)導(dǎo)致模型失真。Hochreater 和Schmidhuber[1-2]在1997 年提出了一種新的網(wǎng)絡(luò)結(jié)構(gòu)來解決梯度消失或者爆炸的問題,叫做長短時記憶神經(jīng)網(wǎng)絡(luò)即LSTM。
LSTM 網(wǎng)絡(luò)通過添加了3 個控制門:遺忘門、輸入門和輸出門,將上一時刻的輸出通過更加復(fù)雜的函數(shù)來和邏輯處,LSTM模型基本結(jié)構(gòu)如圖1 所示。
圖1 LSTM 模型結(jié)構(gòu)
公式(1)中ft叫做遺忘門,表示ct-1的哪些特征因子被用于計(jì)算ct。遺忘門是最重要的門,其決定了哪些特征因子會被記憶并傳遞到后序時刻,哪些因子應(yīng)該被丟棄不應(yīng)該影響后序時刻的狀態(tài)。
根據(jù)公式(5)可以計(jì)算出輸出門向量,而公式(6)就會得到最后的輸出結(jié)果,同時該輸出ht也會作為隱含節(jié)點(diǎn)最為輸入迭代到下一時刻的計(jì)算中。
在語音識別領(lǐng)域是一個典型的時序應(yīng)用場景,LSTM 結(jié)合傳統(tǒng)聲學(xué)模型隱馬爾科夫模型在該領(lǐng)域表現(xiàn)十分出色。隱馬爾科夫模型將音頻信號轉(zhuǎn)換成數(shù)字信號并提取特征,并將其輸入到LSTM 模型進(jìn)行解碼,并最終得到語音識別的結(jié)果。
卷積神經(jīng)網(wǎng)絡(luò)即CNN[3-4]是一種前饋神經(jīng)網(wǎng)絡(luò),卷積神經(jīng)網(wǎng)絡(luò)由一個或多個卷積層和頂端的全連通層(對應(yīng)經(jīng)典的神經(jīng)網(wǎng)絡(luò))組成,同時也包括關(guān)聯(lián)權(quán)重和池化層(pooling layer)。這一結(jié)構(gòu)使得卷積神經(jīng)網(wǎng)絡(luò)能夠利用輸入數(shù)據(jù)的二維結(jié)構(gòu)。與其它深度學(xué)習(xí)結(jié)構(gòu)相比,卷積神經(jīng)網(wǎng)絡(luò)在圖像和語音識別方面能夠給出更好的結(jié)果。
在語音合成方面,語音的時長很難固定,而在傳統(tǒng)CNN 模型中無法保存長時間周期信息處理,為了解決這個問題Google在2016 年提出了Wavenet 模型[4],它是一種CNN 模型,它添加一個擴(kuò)大因果卷積( dilated causal convolution)模型結(jié)構(gòu),使得每個卷積層都對前一層進(jìn)行卷積,卷積核越大,層數(shù)越多,時域上的感知能力越強(qiáng),感知范圍越大。
在生成過程中,通過公式(7)可以得知每生成一個點(diǎn),把該點(diǎn)放到輸入層最后一個點(diǎn)繼續(xù)迭代生成。通過使用因果卷積,Wavenet 可以確保模型在對數(shù)據(jù)建模的時候不會違反數(shù)據(jù)的順序:模型在t 時刻輸出的預(yù)測結(jié)果p 不會依賴任何一個未來時刻的數(shù)據(jù)。因此單一模型的WaveNet 可以以相同的保真度捕獲很多說話人的特征,并可以在語音生成中還原人的說話特征,讓生成的語音聽起來與人類說話并無區(qū)別。訓(xùn)練時對于音頻這樣的一維數(shù)據(jù)來說,將正常卷積的輸出偏移幾個時間步驟即可。此外由于使用因果卷積的模型中沒有循環(huán)連接,通常訓(xùn)練起來比RNN 更快,特別是對于長句子的訓(xùn)練。因此使用Wavenet 模型作為該系統(tǒng)的語音合成模型。
系統(tǒng)構(gòu)建分為業(yè)務(wù)實(shí)現(xiàn)和模型實(shí)現(xiàn),其中模型實(shí)現(xiàn)更加重要,業(yè)務(wù)實(shí)現(xiàn)為模型直接的調(diào)用關(guān)系,模型實(shí)現(xiàn)為構(gòu)建所述LSTM 和Wavenet 模型。
語音對話系統(tǒng)由3 個部分組成,分別是語音識別、對話管理和語音合成。
圖2 語音對話系統(tǒng)結(jié)構(gòu)
如圖2 所示,語音識別部分中使用了LSTM 和隱馬爾科夫模型,通過終端麥克風(fēng)收集語音信號通過隱馬爾科夫模型轉(zhuǎn)換成聲學(xué)模型,再由LSTM 預(yù)測輸出文本,通過調(diào)用對話管理模塊接口將文本輸入到對話管理模塊,對話管理使用知識圖譜管理上下文應(yīng)答,通過預(yù)先設(shè)定的場景,可以挑選出足夠合理有效的回答語句作為輸出,最終語音合成模塊將輸出的文本直接生成語音。
TensorFlow 2 是tensorflow 的第二代版本,它依舊是基于圖運(yùn)算,同時也對一些常用的訓(xùn)練函數(shù)進(jìn)行了封裝,也將Keras(TensorFlow 和Theano 的深度學(xué)習(xí)庫)的部分功能直接添加TensorFlow 2.0 中,因此在使用TensorFlow 2 構(gòu)建LSTM 模型可以直接使用Keras 封裝好的API。系統(tǒng)訓(xùn)練數(shù)據(jù)集采用librispeech,其包含超過1000 小時16Hz 的語音素材,并且已經(jīng)校驗(yàn)對齊,在TensorFlow2.0 中也有Datasets 可以預(yù)處理librispeech,將語音數(shù)據(jù)轉(zhuǎn)換成可以用于訓(xùn)練的數(shù)據(jù)。tf.data.Dataset 接口可以輸入相應(yīng)的參數(shù)對應(yīng)不同的數(shù)據(jù)集,tensorflow會幫我們下載到本地硬盤和裝配到內(nèi)存,可以直接用于訓(xùn)練。
導(dǎo)入TensorFlow 2.0 包后可使用LSTM 的兩個API 接口:tf.keras.layers.LSTM()和tf.keras.layers.LSTMCell()。其中tf.keras.layers.LSTMCell () 繼承自LSTM 的,可以根據(jù)需要來定義每個LSTM 結(jié)構(gòu)體的構(gòu)造,并將其傳入RNN 鏈中就可以形成一個LSTM 模型,如下代碼所示rnn = tf.keras.layers.RNN(
tf.keras.layers.LSTMCell(4),
return_sequences=True,
return_state=True)
將模型設(shè)定加載到rnn,然后執(zhí)行rnn 就可以得到模型。
在tensorflow 2.0 中CNN 模型被封裝成了一個接口,通過調(diào)用接口可以直接訓(xùn)練CNN 模型
該接口提供了眾多參數(shù)用于設(shè)定模型的結(jié)構(gòu)和細(xì)節(jié),其中padding 參數(shù)等于“causal”時,它會將output[t]不依賴于output[t-1],直接對上一層結(jié)果進(jìn)行卷積計(jì)算,從而轉(zhuǎn)變成Wavenet 這種特殊的CNN 模型。
對于Tensorflow 2.0 使用感受相比tensorflow 來說進(jìn)步很多,在構(gòu)建系統(tǒng)中更多精力在于調(diào)配模型參數(shù),而不是寫很多代碼預(yù)先處理數(shù)據(jù),相對于流圖模式,kerasAPI 更加讓人容易理解代碼塊的含義,也可以構(gòu)建更加復(fù)雜的混合模型。經(jīng)測試該語音對話系統(tǒng)能夠在較短的時間內(nèi)反饋,同時也可以進(jìn)行多輪對話,基本滿足英語學(xué)習(xí)者學(xué)習(xí)口語的需求。