薛輝
(商洛學(xué)院教務(wù)處,陜西商洛 726000)
課堂筆記是學(xué)生學(xué)習(xí)過程中的重要資料,許多學(xué)生在上課時一邊聽講一邊記筆記。由于人寫字的速度比說話的速度慢,所以學(xué)生記筆記的速度往往跟不上教師講課的速度,造成筆記內(nèi)容不完整,另外,一邊聽講一邊記筆記也影響學(xué)生對講課內(nèi)容的理解和吸收。如今語音識別技術(shù)已經(jīng)比較成熟,已經(jīng)有許多基于語音識別技術(shù)的軟件被開發(fā)出來,但應(yīng)用于課堂筆記的系統(tǒng)還很少,基于語音識別技術(shù)自動生成課堂筆記[1],可以把學(xué)生從記筆記中解放出來,使學(xué)生專注于課堂聽講,課后對自動生成的筆記稍加整理即可,能達到事半功倍的效果[2]。
語音識別技術(shù)是人工智能的一個分支,經(jīng)過多年的發(fā)展,如今已經(jīng)比較成熟[3]。語音識別技術(shù)的原理如圖1 所示。語音信號經(jīng)過去噪音、端點檢測等預(yù)處理之后,提取它的聲學(xué)特征[4],經(jīng)過訓(xùn)練生成模板庫,識別的時候?qū)⑿枰R別的語音的特征與模板庫進行匹配,分析出語音對應(yīng)的文字,然后經(jīng)過后處理,輸出最終的識別結(jié)果[5]。
圖1 語音識別技術(shù)的原理
如今,谷歌、百度、訊飛等公司都研究了自己的語音識別技術(shù),其中訊飛公司的語音識別技術(shù)在中文語音識別領(lǐng)域達到了世界領(lǐng)先的水平[6],因此本文應(yīng)用訊飛的語音識別技術(shù)實現(xiàn)課堂筆記系統(tǒng)。
訊飛的語音識別技術(shù)分為語音聽寫、語音轉(zhuǎn)寫、語音喚醒和離線命令詞識別等。語音聽寫是基于語言處理技術(shù),將語音音頻轉(zhuǎn)換為文本的技術(shù),適合于少量語句的識別。語音轉(zhuǎn)寫可以將連續(xù)的音頻流識別出來,輸出相應(yīng)的文字,適合于連續(xù)語句的識別。語音喚醒是識別音頻中特定的詞語,喚醒程序或機器,執(zhí)行下一步動作。離線命令詞識別是根據(jù)語法規(guī)則,將符合語法的自然語言轉(zhuǎn)換為文本輸出。記筆記需要連續(xù)識別語音流,因此選擇語音轉(zhuǎn)寫技術(shù)比較合適。訊飛的語音轉(zhuǎn)寫技術(shù)又分為非實時轉(zhuǎn)寫和實時轉(zhuǎn)寫,非實時轉(zhuǎn)寫是先錄制音頻,錄完之后將音頻上傳到服務(wù)器轉(zhuǎn)換為文字,而實時轉(zhuǎn)寫是一邊錄制一邊轉(zhuǎn)換,語音錄制完之后文字也就輸出了。為了方便用戶使用,本系統(tǒng)采用實時語音轉(zhuǎn)寫技術(shù)。
訊飛的實時語音轉(zhuǎn)寫是基于深度卷積神經(jīng)網(wǎng)絡(luò)技術(shù)[7],通過WebSocket 協(xié)議建立客戶端與服務(wù)器端的長連接,將連續(xù)的語音內(nèi)容即時上傳,服務(wù)器端實時進行語音識別,并返回對應(yīng)的文字信息。
在實時語音轉(zhuǎn)寫中,用戶的客戶端與訊飛服務(wù)器端的交互可以分為握手階段和實時通信階段,如圖2 所示,在握手階段建立客戶端與服務(wù)器端的長連接,在實時通信階段將語音上傳到服務(wù)器端進行識別。
圖2 實時語音轉(zhuǎn)寫的流程圖
2.2.1 握手階段
1)客戶端用appid 和當(dāng)前時間戳ts 組成base-String,其中appid 是訊飛開放平臺的應(yīng)用ID,在注冊應(yīng)用時由平臺分配。
2)對組成的baseString 進行 MD5 加密。
3)以apiKey 為密鑰,在MD5 加密的基礎(chǔ)上再進行HmacSHA1 加密,其中apiKey 是接口密鑰,在應(yīng)用中添加實時語音轉(zhuǎn)寫服務(wù)時會自動生成。
4)對加密后的字符串進行base64 編碼,形成signa,以方便網(wǎng)絡(luò)傳輸。
5)將 appid、ts、signa 和 punc 作為參數(shù)傳遞給服務(wù)器端。
6)服務(wù)器端對客戶端的IP 地址進行驗證和過濾,只接收來自合法IP 地址的客戶端傳遞的參數(shù)。
7)服務(wù)器端根據(jù)接收到的參數(shù)識別APP,建立與客戶端的連接并生成json 格式的返回值。
8)客戶端接收服務(wù)器端返回的json 格式字符串,從json 字符串中分離出action,action 的值為“started”說明握手成功,連接建立。
2.2.2 實時通信階段
1)客戶端錄制pcm 格式的音頻。
2)將音頻數(shù)據(jù)以二進制的形式不斷上傳給服務(wù)器,每40 ms 發(fā)送1280 字節(jié)。
3)服務(wù)器端驗證客戶端的IP 地址,只接收合法客戶端上傳的數(shù)據(jù)。
4)服務(wù)器端對接收到的數(shù)據(jù)進行語音識別,并連續(xù)生成json 格式的text message。
5)客戶端接收服務(wù)器端返回的json 格式字符串,從中分離出action。
6)如果 action 的值為“error”表示發(fā)生錯誤,需要按錯誤碼排除錯誤。
7)如果 action 的值為“result”,則從 json 字符串中分離出data。
8)從data 中分離出識別結(jié)果,將結(jié)果按seg_id的順序連成語句。
服務(wù)器端將語音識別的結(jié)果以json 格式寫在 text message 里,包含 5 個參數(shù),action、code、desc、sid 和 data,其中 action 是結(jié)果標(biāo)識,用來區(qū)分握手、結(jié)果和異常;code 是錯誤碼,指出錯誤的類型以便于調(diào)試;desc 是對結(jié)果的文字描述;sid是會話ID,它可以在調(diào)試時幫忙追查錯誤;data是識別的結(jié)果字符,其中ws 表示詞組,cw 表示中文分詞,w 表示單詞,通過循環(huán)連接可以把詞組成短句,把短句連起來形成句子。提取data 中識別結(jié)果的關(guān)鍵代碼如下:
在課堂上聽課時,可以使用手機作為語音識別的客戶端,通過手機錄音并上傳到服務(wù)器端,把語音轉(zhuǎn)換為文字并生成筆記,課后對生成的筆記稍加整理即可[8]。
系統(tǒng)的功能模塊如圖3 所示,主要分為采集模塊、語音轉(zhuǎn)換模塊和編輯模塊三部分。采集模塊通過調(diào)用收音機錄制教師講課的聲音,通過調(diào)用照相機拍攝教師講課過程中的一些圖片。語音轉(zhuǎn)換模塊包括語音上傳、數(shù)據(jù)接收和結(jié)果轉(zhuǎn)換三個功能,其中語音上傳功能把錄制的音頻上傳給服務(wù)器,服務(wù)器返回的信息通過數(shù)據(jù)接收功能來接收,然后通過結(jié)果轉(zhuǎn)換功能把數(shù)據(jù)轉(zhuǎn)換為文字。轉(zhuǎn)換的結(jié)果可以在編輯模塊適當(dāng)排版、修改、插入圖片等,最終完成筆記的記錄[9]。
本系統(tǒng)基于Andriod 平臺開發(fā),實現(xiàn)的關(guān)鍵是保障手機端與服務(wù)器端進行穩(wěn)定的WebSocket 通信[10]。目前,已經(jīng)有一些成熟的框架支持在Android 平臺使用Websocket 協(xié)議,其中,Java-WebSocket 是一個優(yōu)秀的開源框架,本文使用此框架來實現(xiàn)手機端與服務(wù)器端的WebSocket通信。
1)連接前準(zhǔn)備:建立WebSocket 連接前應(yīng)先判斷當(dāng)前是否可以連接,比如當(dāng)前網(wǎng)絡(luò)是否可用,用戶是否登陸,當(dāng)前是不是已經(jīng)處于連接狀態(tài)等,條件都滿足了才可以發(fā)起連接。此外,還要準(zhǔn)備好連接的地址。訊飛的語音實時轉(zhuǎn)寫的服務(wù)器地址是固定的,因此可以將該url 保存起來,APP 啟動的時候連接該地址,并且在APP 內(nèi)部保存一個WebSocket 狀態(tài),發(fā)送請求和需要重新連接的時候可以使用該狀態(tài)。
2)建立連接:建立連接時先在項目的build.gradle 中加入Java-WebSocket,然后加上網(wǎng)絡(luò)權(quán)限,再新建一個繼承WebSocketClient 的客戶端類,實現(xiàn)它的四個抽象方法和構(gòu)造函數(shù),用URI.create()方法給它傳入訊飛服務(wù)器的地址和appid、ts、signa 和punc 四個參數(shù),然后進行初始化,接下來就可以進行連接了。連接時可以使用connect()方法或connectBlocking()方法,這里選用connectBlocking()方法,因為 connectBlocking()方法比connect()方法多了一個等待,會先連接再發(fā)送。當(dāng)看到客戶端執(zhí)行了onOpen()方法,就表示已經(jīng)建立好了Websocket 連接。
3)發(fā)送消息:發(fā)送消息時,使用send()方法把音頻文件用RandomAccessFile 類以二進制流的方式發(fā)送給服務(wù)器端,每隔40 ms 發(fā)送一次數(shù)據(jù),每次發(fā)送1280 字節(jié),不能發(fā)送過快,發(fā)送過快可能導(dǎo)致引擎出錯。音頻結(jié)束時給服務(wù)器端發(fā)送end 值為“true”的消息,表示上傳結(jié)束。
4)接收消息:接收消息時,使用客戶端類的onMessage()方法。為了使接收到的消息處理起來方便,可以在初始化時重寫onMessage()方法。當(dāng)連接成功建立時,在onMessage()方法中接收到的action 的值為“started”;當(dāng)接收到語音轉(zhuǎn)寫的結(jié)果時,在onMessage()方法中接收到的action 的值為“result”,data 的值為轉(zhuǎn)寫結(jié)果的 json 字符串;如果在onMessage()方法中接收到的action 的值為“error”,說明發(fā)生異常,需要查看錯誤碼查找問題并進行調(diào)試。
5)失敗重連:建立連接有時會失敗,如果接收到連接失敗的消息,就需要重連;此外,如果網(wǎng)絡(luò)狀態(tài)改變,比如手機信號從wifi 改變?yōu)?G,連接會斷開,也需要重連;當(dāng)應(yīng)用回到前臺的時候,如果連接斷開了,也需要重連;還有連續(xù)多次心跳檢測失敗的時候,也需要重連。為了取得較好的重連效果,可以定義一個重連間隔時間t,令t 等于最小重連時間間隔最小值(min),當(dāng)重連次數(shù)n≤3 時,每隔 t 時間重連一次,當(dāng) n>3 時,令 t=min(n-2),當(dāng)t 大于最大重連時間間隔最大值(max)時放棄重連。
經(jīng)測試,在網(wǎng)絡(luò)穩(wěn)定的情況下,該系統(tǒng)能夠連續(xù)識別課堂語音,穩(wěn)定輸出教師講解的文字。訊飛的語音識別準(zhǔn)確率是極高的,在該應(yīng)用中語音識別準(zhǔn)確率高低一是取決于教室雜音的大小,二是取決于授課教師的普通話發(fā)音是否標(biāo)準(zhǔn)。當(dāng)接收語音信號的手機附近比較嘈雜時,會降低識別的準(zhǔn)確率,如果授課教師的普通話發(fā)音不太標(biāo)準(zhǔn),也會影響識別的準(zhǔn)確率。一般來說,在課堂里說話的學(xué)生是比較少的,即使說話也是小聲說,絕大多數(shù)教師的普通話也比較標(biāo)準(zhǔn),所以這兩者的影響都比較小。本研究將本系統(tǒng)在安靜的課堂(低噪音)與有學(xué)生小聲說話的課堂(中等噪音)分別進行了測試,結(jié)果如表1 所示。從表1 可見,本系統(tǒng)識別的正確率是比較高的。文科課堂上講解的幾乎是純語言,識別效果較好,對于理科課堂中講解的公式、函數(shù)等本系統(tǒng)無法識別,可以拍成照片在課后整理筆記時插入。
表1 語音識別正確率測試
本文基于訊飛語音識別技術(shù),設(shè)計并實現(xiàn)了一款課堂筆記系統(tǒng),可以通過手機自動記錄教師講課的內(nèi)容,能夠把學(xué)生從繁瑣的記錄工作中解放出來,使學(xué)生專心進行課堂聽講,課后對自動生成的文字稍微加以整理和編輯即可形成課堂筆記,使用起來比較方便。與其他語音識別系統(tǒng)相比,本系統(tǒng)易于擴展和改進,加以修改也可用于會議記錄、演講記錄等其他場合,給人們的學(xué)習(xí)和工作帶來更多的便利。