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