前言:想要寫(xiě)出一篇引人入勝的文章?我們特意為您整理了Node.js的英語(yǔ)口語(yǔ)考試平臺(tái)探析范文,希望能給你帶來(lái)靈感和參考,敬請(qǐng)閱讀。
摘要:針對(duì)國(guó)內(nèi)高校英語(yǔ)口語(yǔ)考試形式過(guò)于單一且效率較低的問(wèn)題,提出并設(shè)計(jì)了一種基于Node.js的英語(yǔ)口語(yǔ)考試平臺(tái),在Node.js運(yùn)行環(huán)境下采用Node.Webkit兼容框架利用JavaScript進(jìn)行軟件開(kāi)發(fā)。通過(guò)采集、編碼、緩存等環(huán)節(jié)對(duì)參試人員的音頻進(jìn)行處理,實(shí)現(xiàn)了在線口語(yǔ)考試的功能。測(cè)試結(jié)果表明,平臺(tái)運(yùn)行穩(wěn)定、抗壓能力強(qiáng),能夠大幅提高口語(yǔ)考試的效率,適用于在高校推廣應(yīng)用。
關(guān)鍵詞:Node.js;口語(yǔ)考試;Node.Webkit;編碼
0引言
當(dāng)前國(guó)內(nèi)高校英語(yǔ)口語(yǔ)考試的過(guò)程較為復(fù)雜,在人力、物力等方面都造成了一定程度的浪費(fèi)[1-3]。為此,本文提出并設(shè)計(jì)了一種基于Node.js的英語(yǔ)口語(yǔ)考試平臺(tái),充分利用了Node.js在非瀏覽器應(yīng)用程序開(kāi)發(fā)方面的通用性和Node.Webkit框架的多語(yǔ)言兼容性,利用JavaScript實(shí)現(xiàn)平臺(tái)的開(kāi)發(fā),在具體應(yīng)用上,通過(guò)采集、編碼、緩存等多個(gè)環(huán)節(jié)處理學(xué)生的口語(yǔ)音頻,從而實(shí)現(xiàn)了英語(yǔ)口語(yǔ)考試的在線操作。
1平臺(tái)整體設(shè)計(jì)
1.1平臺(tái)功能設(shè)計(jì)
英語(yǔ)口語(yǔ)考試平臺(tái)的用戶為高校的教師和學(xué)生,因此平臺(tái)客戶端分為學(xué)生客戶端和教師客戶端兩種形式,分別用于學(xué)生錄制考試音頻和教師對(duì)其口語(yǔ)水平進(jìn)行評(píng)定。平臺(tái)基于Socket.io實(shí)現(xiàn)兩種客戶端之間的通信。平臺(tái)的核心功能是采集和處理學(xué)生參加口語(yǔ)考試的音頻數(shù)據(jù),其余則是一些教師客戶端管理功能,即查看用戶的登錄狀態(tài)、控制考試過(guò)程、試題管理、音頻管理等。在考試的過(guò)程中,首先由教師通過(guò)客戶端對(duì)當(dāng)次考試的試題進(jìn)行選定,然后每一臺(tái)監(jiān)考計(jì)算機(jī)在為考試所組建的局域網(wǎng)內(nèi)向所有考試計(jì)算機(jī)廣播自己的IP地址,參考學(xué)生能夠在考試計(jì)算機(jī)的平臺(tái)客戶端中查看到監(jiān)考計(jì)算機(jī)列表并進(jìn)行選擇,與其建立數(shù)據(jù)連接,當(dāng)有學(xué)生申請(qǐng)登錄和考試時(shí),教師客戶端接收其請(qǐng)求,獲取批準(zhǔn)后學(xué)生測(cè)試考試用設(shè)備,如果沒(méi)有問(wèn)題即可開(kāi)始考試,學(xué)生用口語(yǔ)回答試題,由平臺(tái)全程錄制音頻。
1.2平臺(tái)技術(shù)架構(gòu)
由于口語(yǔ)考試并不是所有學(xué)生都同步進(jìn)行的,所以平臺(tái)充分利用了Node.js的異步特性,為每一項(xiàng)異步操作植入監(jiān)聽(tīng)器,從而有效提高平臺(tái)的并發(fā)處理能力,因此本平臺(tái)利用Node.js的Soket.io技術(shù)實(shí)現(xiàn)通信功能。對(duì)于平臺(tái)的客戶端界面,為了滿足根據(jù)不同試題內(nèi)容進(jìn)行自適應(yīng)變化的需求,采用了響應(yīng)式漸進(jìn)框架Vue.js實(shí)現(xiàn)MVVM模式的客戶端界面。平臺(tái)具體的技術(shù)框架,如圖1所示。英語(yǔ)口語(yǔ)考試平臺(tái)在Vue.js的基礎(chǔ)上以組件化的方式進(jìn)行開(kāi)發(fā),所有組件文件均為“.vue”的形式,每一個(gè)文件中都包括局部CSS代碼、Vue.js邏輯腳本和HTML模板[4]。這種開(kāi)發(fā)方式實(shí)現(xiàn)了命名空間隔離、組件復(fù)用和松散耦合,無(wú)需對(duì)客戶端的每一種界面進(jìn)行單獨(dú)的開(kāi)發(fā),進(jìn)行具體操作時(shí)只需將多個(gè)子組件進(jìn)行功能性的融合,從而避免了命名空間的污染。因此本平臺(tái)設(shè)計(jì)過(guò)程中將客戶端界面分解為多個(gè)子組件,并分別將WebSocket通信和音頻處理封裝成單獨(dú)的組件,利用Webpack進(jìn)行整體打包,從而在各種資源間建立組合關(guān)系并在有需求的情況下將其合并為執(zhí)行文件。
2平臺(tái)實(shí)現(xiàn)
2.1客戶端界面
組件分解的目的是簡(jiǎn)化和分解客戶端界面結(jié)構(gòu),使功能與形式相同的組件能夠在組件引用的過(guò)程中重復(fù)使用。平臺(tái)客戶端的每一種界面都被分解為多個(gè)單獨(dú)的組件,如運(yùn)行進(jìn)度條、倒計(jì)時(shí)顯示模塊、試題標(biāo)題欄、用戶信息框等,從而將功能界面逐層分解。在進(jìn)行后臺(tái)程序開(kāi)發(fā)的過(guò)程中,對(duì)應(yīng)每一個(gè)組件創(chuàng)建一個(gè)單獨(dú)的“.vue”文件,模塊樣式、JavaScript邏輯和DOM結(jié)構(gòu)全部包含于其中,組件間的通信利用Vue.js中的props接口進(jìn)行,以便在復(fù)合組件和各子組件之間傳遞參數(shù)。平臺(tái)設(shè)計(jì)過(guò)程中創(chuàng)建的所有組件都需要根據(jù)客戶端界面的不同結(jié)構(gòu)進(jìn)行分類(lèi),并將復(fù)合組件及其引用的各個(gè)子組件按界面的層級(jí)進(jìn)行有序排列,即在代碼中建立對(duì)應(yīng)的引用關(guān)系。本平臺(tái)的組件文件基于ES6(ECMAScript6)語(yǔ)法進(jìn)行開(kāi)發(fā),該語(yǔ)法支持import、export導(dǎo)入導(dǎo)出命令并以此支持各種組件的隨意組合。這種靜態(tài)編譯的方式能夠在代碼運(yùn)行之前就對(duì)所引用的模塊進(jìn)行編譯,相對(duì)于運(yùn)行過(guò)程中的加載具有更高的執(zhí)行效率。在平臺(tái)運(yùn)行的過(guò)程中,利用Webpack工具,從執(zhí)行第一個(gè)文件起逐層明確所需調(diào)用的資源,建立各組件的依賴關(guān)系,將需要組合的組件統(tǒng)一封裝到JavaScript文件中。平臺(tái)客戶端需要在不同的計(jì)算機(jī)顯示器上都能夠正常顯示,程序運(yùn)行過(guò)程中Node-Webkit從package.json配置文件中讀取客戶端界面的窗口分辨率等參數(shù)信息,從而能夠?qū)Ψ直媛蔬M(jìn)行設(shè)置,與顯示器的分辨率進(jìn)行匹配,以此來(lái)保證界面的正常顯示。所有子組件中都完成了CSS3的flex屬性設(shè)置,集成了的flex屬性值的子元素能夠按既定的規(guī)則進(jìn)行排列以實(shí)現(xiàn)界面的縮放,由此便可構(gòu)建客戶端的自適應(yīng)界面。
2.2網(wǎng)絡(luò)通信
英語(yǔ)口語(yǔ)考試過(guò)程中的考試機(jī)與監(jiān)考機(jī)連接、試題下載、答題音頻上傳等環(huán)節(jié)都要依靠考試局域網(wǎng)的通信進(jìn)行,本平臺(tái)基于Socket.io對(duì)上述操作請(qǐng)求進(jìn)行注冊(cè)和監(jiān)聽(tīng),實(shí)現(xiàn)考試過(guò)程中的通信功能[5]。Socket.io是利用WebSocket技術(shù)構(gòu)建而成的信息庫(kù),其所建立的連接必須通過(guò)準(zhǔn)確的IP地址實(shí)現(xiàn),因而學(xué)生客戶端需要在雷達(dá)嗅探的模式下搜索教師客戶端以完成考試。教師客戶端在考試局域網(wǎng)內(nèi)基于UDP通信方式廣播其所在監(jiān)考機(jī)的IP地址,學(xué)生客戶端搜索到這些地址并選擇其中一個(gè)進(jìn)行連接,在這個(gè)過(guò)程中,通過(guò)Node.js中udp4和dgram模塊的調(diào)用,學(xué)生客戶端可以隨時(shí)監(jiān)聽(tīng)教師客戶端的廣播信息,基于回調(diào)函數(shù)將接收到的IP地址緩存到全局?jǐn)?shù)組中,此時(shí)Node.js的connect啟動(dòng)與學(xué)生所選擇的IP地址建立WebSocket連接,與此同時(shí),Socket.io向其余的監(jiān)考機(jī)發(fā)出信號(hào),中斷它們與已建立連接的考試機(jī)的通信。學(xué)生客戶端與教師客戶端建立連接后進(jìn)入考試界面,教師客戶端能夠顯示所有參加當(dāng)次考試的學(xué)生信息,學(xué)生登錄的同時(shí)其客戶端向教師客戶端發(fā)出Socket.io中的login請(qǐng)求,該請(qǐng)求的信息中包含testId等變量,教師客戶端接收到該請(qǐng)求后將其中的ID信息與參考人員信息進(jìn)行比對(duì),若存在相同信息則允許學(xué)生登錄并開(kāi)始考試。英語(yǔ)口語(yǔ)考試試題中包含兩部分內(nèi)容,聽(tīng)力試題的音頻及其所對(duì)應(yīng)的圖文信息。聽(tīng)力試題的音頻以HTTP地址的形式發(fā)送給參考的學(xué)生由其在線收聽(tīng),由此來(lái)簡(jiǎn)化考試過(guò)程,降低平臺(tái)的運(yùn)行壓力,圖文內(nèi)容則由包含HTML模板的組件提供。除此之外,還要向?qū)W生發(fā)送包含試卷名稱(chēng)、題目數(shù)量、題目ID、答題時(shí)間等考試信息的.json文件。學(xué)生完成答題后,為了保證答題音頻的完整性,平臺(tái)首先將其以base64保存在考試機(jī)的answer.json文件中,然后再將這些編碼導(dǎo)入全局?jǐn)?shù)組,同時(shí)向教師客戶端發(fā)送file_to_teacher請(qǐng)求,得到回應(yīng)后音頻將被分別上傳至監(jiān)考機(jī)中。
2.3音頻處理
平臺(tái)采集到學(xué)生答題的語(yǔ)音信號(hào)后,需要將其傳遞給Lame.js以完成MP3音頻的編碼,為了避免編碼過(guò)程中的主線程阻塞,平臺(tái)采用WebWokers子線程來(lái)保證編碼的效率。編碼前需要將采集到的語(yǔ)音模擬信號(hào)進(jìn)行預(yù)處理,將原始信號(hào)數(shù)據(jù)進(jìn)行壓縮并將其轉(zhuǎn)換為PCM數(shù)字信號(hào)。音頻編碼的具體實(shí)現(xiàn)過(guò)程為:(1)基于importScrips的方式將Lame.js注入到WebWokers中,選擇聲道數(shù)、比特率、采樣率等參數(shù)完成初始化,構(gòu)建Lame編碼器;(2)利用緩沖器方法先將冗余數(shù)據(jù)存放在數(shù)組對(duì)象中,編碼完成后即清除;(3)采用convert方法對(duì)數(shù)據(jù)進(jìn)行壓縮和轉(zhuǎn)換,設(shè)定信號(hào)壓縮比后在模擬信號(hào)中搜索與壓縮比相同的值,通過(guò)持續(xù)的取反操作使數(shù)據(jù)間隔均為整數(shù)值,然后將32位浮點(diǎn)數(shù)據(jù)壓縮成16位整形數(shù)據(jù),以控制振幅值的方式去除壓縮數(shù)據(jù)中的噪聲,由此得到16位的PCM數(shù)字信號(hào);(4)調(diào)用編碼函數(shù)處理接收到的encode編碼信號(hào),將獲取的聲道依次發(fā)送到所構(gòu)建Lame.js的MP3Encoder中,完成編碼并將其存儲(chǔ)與緩沖區(qū);(5)將緩沖區(qū)中的數(shù)據(jù)全部發(fā)送給主線程。平臺(tái)將音頻處理模塊的邏輯封裝為一個(gè)類(lèi)庫(kù),即具有全局性質(zhì)的Recorder類(lèi),創(chuàng)建這個(gè)類(lèi)時(shí)需要在其中集成包含比特率、聲道數(shù)、緩沖區(qū)空間等信息的options配置項(xiàng),在確認(rèn)對(duì)象和方法具有一定的兼容性后可根據(jù)具體的邏輯輸出為布爾型的support變量[6]。為了滿足封裝要求,Recorder類(lèi)中包括以下幾種接口:(1)int(初始化)接口,由得到的support變量判斷設(shè)備與平臺(tái)的兼容性,接下來(lái)從WebWokers中調(diào)用錄音轉(zhuǎn)碼腳本,然后利用worker對(duì)象引入監(jiān)聽(tīng)函數(shù)并用以接收初始化函數(shù);(2)start(開(kāi)始錄音)接口,連接成功后持續(xù)監(jiān)聽(tīng)process事件,利用回調(diào)函數(shù)獲取不同聲道的數(shù)據(jù)并發(fā)送給WebWokers腳本;(3)pause(暫停錄音)接口,中止執(zhí)行音頻采集代碼,保存現(xiàn)有數(shù)據(jù);(4)resume(恢復(fù)錄音)接口,繼續(xù)錄音并添加到原數(shù)據(jù)中;(5)stop(停止錄音)接口,關(guān)閉音頻采集設(shè)備,終止WebWokers轉(zhuǎn)碼。
3平臺(tái)應(yīng)用測(cè)試
3.1平臺(tái)性能測(cè)試
為了對(duì)平臺(tái)的性能與工作可靠性進(jìn)行驗(yàn)證,在華北理工大學(xué)對(duì)本平臺(tái)進(jìn)行試運(yùn)行,邀請(qǐng)?jiān)撔=ㄖこ虒W(xué)院大二年級(jí)的275名學(xué)生使用本平臺(tái)參加英語(yǔ)口語(yǔ)模擬考試。學(xué)院機(jī)房共配備60臺(tái)計(jì)算機(jī),包含4種不同型號(hào),其主要硬件配置如表1所示。英語(yǔ)口語(yǔ)模擬考試共分為5個(gè)批次進(jìn)行,每批次參考學(xué)生數(shù)量為55人??荚囘^(guò)程完全按照高校的口語(yǔ)考試流程進(jìn)行,機(jī)房中每個(gè)型號(hào)的計(jì)算機(jī)均安裝了本平臺(tái)的測(cè)試客戶端。每個(gè)批次的學(xué)生使用不同的口語(yǔ)考試試題,準(zhǔn)備工作完畢后,監(jiān)考教師通過(guò)教師客戶端對(duì)當(dāng)次考試的試題進(jìn)行選定,然后監(jiān)考計(jì)算開(kāi)始向所有考試計(jì)算機(jī)廣播自己的IP地址,參考學(xué)生通過(guò)考試計(jì)算機(jī)中安裝的學(xué)生客戶端查看監(jiān)考計(jì)算機(jī)列表并進(jìn)行選擇,與其建立數(shù)據(jù)連接并申請(qǐng)開(kāi)始考試,教師客戶端接收其請(qǐng)求并批準(zhǔn),學(xué)生用口語(yǔ)回答試題,由平臺(tái)全程錄制音頻。在考試過(guò)程中分別記錄了客戶端運(yùn)行時(shí)每種配置的計(jì)算機(jī)的資源占用情況,具體資源占用數(shù)據(jù),如圖2所示。由圖2可見(jiàn),不同配置的計(jì)算機(jī)在平臺(tái)運(yùn)行過(guò)程中的資源占用率各不相同,4種配置條件下CPU占用率均低于25%,內(nèi)存占用率均低于45%,且CPU主頻和內(nèi)存頻率越高,資源占用率越小。分別通過(guò)單線程和多線程的方式進(jìn)行答題錄音,研究不同線程條件下錄音時(shí)長(zhǎng)與MP3文件生成時(shí)間的對(duì)應(yīng)關(guān)系。測(cè)試結(jié)果可知,線程數(shù)量不同的條件下,錄音時(shí)長(zhǎng)與MP3生成時(shí)間均成正比例關(guān)系,但相較于單線程錄音,采用多線程錄音時(shí)MP3的生成延時(shí)可減少50ms。
3.2平臺(tái)壓力測(cè)試
在口語(yǔ)考試并發(fā)用戶數(shù)量較多的情況下,平臺(tái)的數(shù)據(jù)吞吐量較大,此時(shí)平臺(tái)程序是否能夠穩(wěn)定運(yùn)行,平臺(tái)功能能否正常實(shí)現(xiàn)決定了平臺(tái)是否具備投入使用的條件。采用Web-SocketBench作為壓力測(cè)試工具,測(cè)試過(guò)程中將Socket連接的數(shù)量從0逐步增加到1000,發(fā)送不同類(lèi)型、不同大小的數(shù)據(jù)以模擬不同的參試人員數(shù)量和試題內(nèi)容,最終得到的發(fā)送成功率數(shù)據(jù),如圖3所示。由圖3可見(jiàn),連接到平臺(tái)的用戶數(shù)量越多(超過(guò)500個(gè)時(shí)),發(fā)送的數(shù)據(jù)越大(超過(guò)10MB時(shí)),消息發(fā)送的成功率會(huì)有所降低,但在實(shí)際應(yīng)用中,考試學(xué)生數(shù)量和所生成的音頻文件幾乎不會(huì)超過(guò)這兩個(gè)數(shù)值,在此條件下發(fā)送消息的成功率能夠達(dá)到100%且測(cè)試過(guò)程中未出現(xiàn)宕機(jī)和程序中止運(yùn)行的情況,可見(jiàn)平臺(tái)能夠滿足當(dāng)前高校教學(xué)過(guò)程中的英語(yǔ)口語(yǔ)考試需求。
4總結(jié)
當(dāng)前多數(shù)國(guó)內(nèi)高校的英語(yǔ)口語(yǔ)考試仍以傳統(tǒng)的方式進(jìn)行,對(duì)有限的教學(xué)資源造成了較大的浪費(fèi),為此,本文提出并設(shè)計(jì)了一種基于Node.js的英語(yǔ)口語(yǔ)考試平臺(tái),介紹了平臺(tái)的功能結(jié)構(gòu)和技術(shù)架構(gòu),分別闡述了客戶端界面、網(wǎng)絡(luò)通信模塊、音頻處理模塊的設(shè)計(jì)思路,并對(duì)平臺(tái)的性能和抗壓性進(jìn)行了測(cè)試。測(cè)試結(jié)果表明,本文所設(shè)計(jì)的平臺(tái)功能完善、抗壓能力強(qiáng),對(duì)于高校的英語(yǔ)口語(yǔ)考試具有很強(qiáng)的實(shí)用性。
作者:顏娟 單位:西安交通工程學(xué)院