在當今快節奏的工作環境中,會議記錄是每個職場人士都必須要面對的任務。傳統的手動記錄方式不僅效率低下,而且容易遺漏重要信息。隨著Web技術的發展,基于瀏覽器的實時語音轉寫技術為會議記錄提供了全新的解決方案。本文將詳細介紹如何利用WebSocket、WebRTC和訊飛開放平臺的實時語音轉寫API,構建一個高效的會議記錄系統。
一、系統架構概述
我們的會議記錄系統主要包含以下幾個核心模塊:
前端界面:基于Vue.js框架構建的用戶界面
錄音模塊:使用Recorder.js實現瀏覽器端語音采集
實時傳輸模塊:基于WebSocket協議的語音數據傳輸
語音轉寫模塊:對接訊飛開放平臺的實時語音轉寫服務
結果展示模塊:實時顯示轉寫結果的文本區域
系統工作流程如下:
用戶點擊"長時會議記錄"按鈕開始錄音
系統建立WebSocket連接并開始采集語音
語音數據通過WebSocket實時傳輸到轉寫服務
轉寫結果實時返回并顯示在文本區域
用戶點擊"停止記錄"按鈕結束整個過程
二、關鍵技術實現
1. 語音采集與處理
我們使用Recorder.js庫來實現瀏覽器端的語音采集功能。這是一個輕量級的JavaScript庫,支持多種音頻格式的錄制和處理。
let recorder = new Recorder("../../recorder") recorder.start({sampleRate: 16000,frameSize: 1280, });
關鍵參數說明:
sampleRate
: 采樣率設置為16000Hz,這是語音識別常用的采樣率frameSize
: 每幀大小設置為1280字節,平衡實時性和網絡負載
錄音過程中,我們通過onFrameRecorded
回調函數處理音頻數據:
recorder.onFrameRecorded = ({isLastFrame, frameBuffer}) => {if (!isLastFrame && wsFlag) {wsTask.send(new Int8Array(frameBuffer))} else {if (wsFlag) {wsTask.send('{"end": true}')}} }
這種分幀傳輸的方式確保了語音數據的實時性,同時減輕了網絡壓力。
2. WebSocket連接管理
WebSocket是實現實時通信的關鍵技術。我們封裝了WebSocket的初始化和管理邏輯:
async wsInit() {let reqeustUrl = await this.getWebSocketUrl()wsTask = new WebSocket(reqeustUrl);wsTask.onopen = function() {wsFlag = truerecorder.start({sampleRate: 16000,frameSize: 1280,});}wsTask.onmessage = function(message) {this.renderResult(message.data)}// 其他事件處理... }
需要注意的是,WebSocket連接需要處理各種狀態變化和異常情況,包括連接建立、消息接收、連接關閉和錯誤處理等。
3. 訊飛API鑒權與連接
與訊飛開放平臺的連接需要進行鑒權,我們實現了完整的鑒權流程:
getWebSocketUrl() {var appId = atob(this.user.appid);var secretKey = "861ae0b4f7d7c1c0875a4b7153d9997d";var ts = Math.floor(new Date().getTime() / 1000);var signa = hex_md5(appId + ts);var signatureSha = CryptoJSNew.HmacSHA1(signa, secretKey);var signature = CryptoJS.enc.Base64.stringify(signatureSha);signature = encodeURIComponent(signature);return `${this.URL}?appid=${appId}&ts=${ts}&signa=${signature}`; }
鑒權過程包括:
獲取應用ID和密鑰
生成時間戳
計算簽名
構造完整的WebSocket連接URL
4. 轉寫結果處理
訊飛API返回的轉寫結果需要經過解析才能顯示給用戶:
renderResult(resultData) {let jsonData = JSON.parse(resultData);if (jsonData.action == "result") {const data = JSON.parse(jsonData.data)let resultTextTemp = ""data.cn.st.rt.forEach((j) => {j.ws.forEach((k) => {k.cw.forEach((l) => {resultTextTemp += l.w;});});});if (data.cn.st.type == 0) {this.text += resultTextTemp;}} }
結果處理邏輯解析了訊飛API返回的JSON結構,提取出實際的轉寫文本并追加到顯示區域。
三、前端界面設計
系統界面簡潔實用,主要包含以下幾個部分:
<div class="Meeting-container"><!-- 轉寫結果顯示區域 --><textarea v-model="text"placeholder="請點擊長時會議記錄,會把會議說的話記錄成文字,方便會后整理紀要"style="height: 560px;"></textarea><!-- 控制按鈕 --><div><el-button @click="voiceSend"><i class="el-icon-microphone"></i>長時會議記錄</el-button><el-button @click="stopVoice">停止記錄</el-button></div> </div>
界面設計考慮點:
大文本區域方便查看長文本內容
醒目的操作按鈕
簡潔的提示信息
響應式布局適應不同設備
四、系統優化與擴展
1. 性能優化
音頻數據處理優化:使用TypedArray處理二進制數據,提高處理效率
網絡傳輸優化:合理設置分幀大小,平衡實時性和網絡負載
內存管理:及時清理不再需要的音頻數據,避免內存泄漏
2. 功能擴展
多語言支持:擴展支持英語等其他語言的轉寫
說話人分離:識別不同說話人并標注
關鍵詞標記:自動識別并標記會議中的關鍵信息
云端存儲:將轉寫結果自動保存到云端
3. 錯誤處理與日志
完善的錯誤處理機制:
wsTask.onerror = function() {console.log('發生錯誤...')// 可以添加更詳細的錯誤處理和用戶提示this.$message.error("連接發生錯誤,請檢查網絡后重試"); }
建議添加日志記錄功能,便于問題排查和系統維護。
五、部署與使用指南
1. 系統部署
準備Web服務器(如Nginx)
部署前端代碼
配置HTTPS(WebRTC和WebSocket通常需要安全上下文)
配置域名和SSL證書
2. 使用說明
打開系統頁面
點擊"長時會議記錄"按鈕開始
系統會提示"已開始記錄會議..."
進行正常會議,系統會自動轉寫語音
會議結束后點擊"停止記錄"按鈕
復制或導出轉寫結果
六、常見問題與解決方案
瀏覽器兼容性問題
解決方案:明確說明支持的瀏覽器及版本,提供檢測腳本
麥克風權限問題
解決方案:添加明確的權限請求提示和引導
網絡不穩定導致中斷
解決方案:實現自動重連機制和斷點續傳
長時錄音的內存問題
解決方案:定期清理緩存,添加內存監控
結語
本文詳細介紹了一個基于Web技術的實時語音會議記錄系統的設計與實現。通過結合WebSocket、WebRTC和語音識別API,我們構建了一個高效、實用的會議輔助工具。系統具有良好的實時性和可用性,能夠顯著提高會議記錄的效率和質量。
未來,我們可以進一步擴展系統的功能,如添加編輯標記、智能摘要生成、多設備同步等功能,使其成為更完善的會議協作平臺。