当前位置: 首页 > news >正文

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-一分钟音频转文字

在当今AI技术飞速发展的时代,语音识别技术已经成为人机交互的重要方式之一。本文将详细介绍如何基于WebSocket协议实现一个实时语音转文字的前端应用,该应用能够将用户的语音实时转换为文字显示在文本框中,并支持短语音识别和手动停止功能。

一、技术架构概述

本实现主要采用了以下核心技术:

  1. WebSocket协议:用于建立客户端与语音识别服务器之间的全双工通信通道

  2. Recorder.js:前端录音库,用于捕获用户的语音输入

  3. 科大讯飞开放平台:提供语音识别(IAT)的API服务

  4. Vue.js框架:前端MVVM框架,用于构建用户界面

  5. Element UI:提供美观的UI组件

整个技术栈构成了一个完整的前端语音识别解决方案,实现了从语音采集、实时传输到文字转换的全流程。

二、核心代码解析

2.1 前端界面设计

界面设计简洁明了,主要包含以下几个部分:

<template><div class="Iat-container" style="padding: 10px;margin-bottom:50px;"><!-- 聊天窗口开始 --><div style="height: 150px;"><textarea v-model="text" placeholder="请点击短语音文字并朗读,会把实时说话语音转成文字"style="height: 460px;width: 100%;padding: 20px; border: none;border-top: 1px solid #ccc;border-bottom: 1px solid #ccc;outline: none"></textarea></div><div style="text-align: left;padding-right: 10px;margin-top: 340px;"><el-button type="primary" size="medium" @click="voiceSend"><i class="el-icon-microphone"></i>短语音文字</el-button><el-button type="danger" size="medium" @click="stopVoice">停止朗读</el-button></div></div>
</template>
  • textarea:用于显示实时转换的文字结果

  • 两个按钮:分别用于开始录音和停止录音

  • 样式设计采用简洁风格,突出核心功能

2.2 录音功能实现

录音功能使用Recorder.js库实现,这是一个强大的前端录音解决方案:

import Recorder from '../../public/recorder/index.umd.js'// 初始化录音工具
let recorder = new Recorder("../../recorder")
recorder.onStart = () => {console.log("开始录音了")
}
recorder.onStop = () => {console.log("结束录音了")
}

录音的核心配置包括采样率和帧大小:

javascript

复制

下载

recorder.start({sampleRate: 16000,  // 采样率16kHzframeSize: 1280,    // 帧大小
});

这里选择16kHz采样率是因为它在语音识别中既能保证识别质量,又能减少数据量。帧大小设置为1280字节,这是一个经验值,可以在实时性和性能之间取得平衡。

2.3 WebSocket连接管理

与语音识别服务器的通信通过WebSocket实现:

wsTask = new WebSocket(reqeustUrl);// WebSocket事件处理
wsTask.onopen = function() {console.log('ws已经打开...')wsFlag = true// 发送第一帧数据...
}wsTask.onmessage = function(message) {// 处理服务器返回的识别结果...
}wsTask.onclose = function() {console.log('ws已关闭...')
}wsTask.onerror = function() {console.log('发生错误...')
}

WebSocket连接建立后,需要按照协议发送不同状态的数据帧:

  1. 第0帧:初始化参数,包含appid、语言配置等

  2. 第1帧:中间语音数据帧,实时传输录音数据

  3. 第2帧:结束帧,通知服务器语音结束

2.4 语音数据处理

录音数据通过onFrameRecorded事件处理:

recorder.onFrameRecorded = ({isLastFrame, frameBuffer}) => {if (!isLastFrame && wsFlag) {// 发送中间帧const params = {data: {status: 1,format: "audio/L16;rate=16000",encoding: "raw",audio: toBase64(frameBuffer),},};wsTask.send(JSON.stringify(params))} else {// 发送最后一帧const params = {data: {status: 2,format: "audio/L16;rate=16000",encoding: "raw",audio: "",},};wsTask.send(JSON.stringify(params))}
}

音频数据需要转换为Base64格式传输,转换函数如下:

function toBase64(buffer) {let binary = "";let bytes = new Uint8Array(buffer);let len = bytes.byteLength;for (let i = 0; i < len; i++) {binary += String.fromCharCode(bytes[i]);}return window.btoa(binary);
}

2.5 鉴权与安全

与科大讯飞API的通信需要严格的鉴权,采用HMAC-SHA256算法:

getWebSocketUrl() {return new Promise((resolve, reject) => {var url = this.URL;var host = this.URL.host;var apiKeyName = "api_key";var date = new Date().toGMTString();var algorithm = "hmac-sha256";var headers = "host date request-line";var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2/iat HTTP/1.1`;var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, atob(this.user.apisecret));var signature = CryptoJS.enc.Base64.stringify(signatureSha);var authorizationOrigin =`${apiKeyName}="${atob(this.user.apikey)}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;var authorization = base64.encode(authorizationOrigin);url = `${url}?authorization=${authorization}&date=${encodeURI(date)}&host=${host}`;resolve(url);});
}

三、关键技术点详解

3.1 实时语音处理流程

  1. 语音采集:通过浏览器API获取麦克风权限并录制音频

  2. 分帧处理:将连续的语音流分割为小的音频帧

  3. 实时传输:通过WebSocket将音频帧实时发送到服务器

  4. 结果接收:异步接收服务器返回的识别结果

  5. 结果展示:动态更新界面显示识别文字

3.2 语音识别结果处理

服务器返回的识别结果采用增量返回方式,需要特殊处理:

if (jsonData.data && jsonData.data.result) {let data = jsonData.data.result;let str = "";let ws = data.ws;for (let i = 0; i < ws.length; i++) {str = str + ws[i].cw[0].w;}if (data.pgs) {if (data.pgs === "apd") {_this.resultText = _this.resultTextTemp;}_this.resultTextTemp = _this.resultText + str;} else {_this.resultText = _this.resultText + str;}_this.text = _this.resultTextTemp || _this.resultText || "";
}
  • pgs字段:表示识别结果的进度状态

  • apd值:表示追加模式,需要合并临时结果和最终结果

  • ws数组:包含识别的词语信息

3.3 自动停止机制

系统实现了两种停止识别的方式:

  1. 手动停止:用户点击停止按钮

  2. 自动停止:检测到用户2秒没有说话自动停止

if (jsonData.code === 0 && jsonData.data.status === 2) {recorder.stop();_this.$message.success("检测到您2秒没说话,自动结束识别!")wsTask.close();wsFlag = false
}

自动停止通过服务器的vad_eos参数控制,设置为2000毫秒。

四、性能优化与注意事项

4.1 性能优化点

  1. 音频压缩:采用16kHz采样率和raw格式减少数据量

  2. 帧大小优化:1280字节的帧大小平衡了实时性和性能

  3. 增量更新:只更新变化的文本部分,减少DOM操作

  4. 连接复用:保持WebSocket连接而不是每次重新建立

4.2 常见问题与解决方案

  1. 跨浏览器兼容性

    • 使用特性检测判断浏览器是否支持WebSocket

    • 提供备选方案或错误提示

  2. 麦克风权限问题

    • 明确提示用户授权麦克风

    • 处理权限被拒绝的情况

  3. 网络不稳定

    • 实现重连机制

    • 缓存未发送的音频数据

  4. 识别准确率

    • 优化录音参数

    • 添加降噪处理

    • 提供纠错接口

五、扩展与改进方向

5.1 功能扩展

  1. 多语言支持:扩展支持英语、日语等其他语言识别

  2. 语音命令:实现基于语音的交互命令

  3. 语音合成:增加文字转语音功能实现双向交互

  4. 离线识别:集成本地识别引擎减少网络依赖

5.2 技术改进

  1. WebAssembly加速:使用WASM提高音频处理效率

  2. Web Worker:将音频处理放入Worker线程避免阻塞UI

  3. 自适应码率:根据网络状况动态调整音频质量

  4. 更高效的编码:考虑使用opus等更高效的音频编码格式

六、总结

本文详细介绍了基于WebSocket的实时语音转文字前端实现方案。通过整合Recorder.js录音库、WebSocket实时通信和科大讯飞语音识别API,构建了一个高效、实时的语音识别应用。关键点包括:

  1. 完整的语音采集、传输、识别流程

  2. 实时增量结果显示处理

  3. 安全的API鉴权机制

  4. 自动与手动停止机制

  5. 性能优化与错误处理

该方案可以广泛应用于在线教育、语音笔记、实时字幕等多种场景,为人机交互提供了更加自然的方式。随着Web技术的不断发展,前端语音识别能力将会变得更加强大和普及。

http://www.xdnf.cn/news/1302085.html

相关文章:

  • Spring WebFlux 性能优化实践指南
  • 金融项目高可用分布式TCC-Transaction(开源框架)
  • 基于RobustVideoMatting(RVM)进行视频人像分割(torch、onnx版本)
  • 力扣 —— 二分查找
  • [优选算法专题二滑动窗口——无重复字符的最长子串]
  • docker 安装 使用
  • QT在Widget类下的四种QPushbutton的信号与槽的连接方式
  • Python中推导式和表达式
  • QT(事件)
  • 【机器学习深度学习】客观评估训练程度
  • AIoT浪潮之巅:AI如何赋能边缘物联网,解锁三大核心潜能
  • Spring中存在两个相同的Bean是否会报错?
  • Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与学习体验增强中的应用(399)
  • STM32F103C8T6学习——直接存储器访问(DMA)标准库实战3(ADC数据采集+DMA回传)
  • 开始回溯的学习
  • I/O多路复用特性与实现
  • 【学习嵌入式day-25-线程】
  • 扣子(Coze),开源了!Dify 天塌了
  • 无人机智能跟踪模块设计与运行分析
  • Mac Mysql 卸载
  • 【Docker】openEuler 使用docker-compose部署gitlab-ce
  • C++设计模式:类间关系
  • 企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
  • Flinksql bug: Heartbeat of TaskManager with id container_XXX timed out.
  • gitee_流水线搭配 Dockerfile 部署vue项目
  • MetaFox官方版:轻松转换视频,畅享MKV格式的便捷与高效
  • 【Linux基础知识系列】第九十六篇 - 使用history命令管理命令历史
  • std::set_symmetric_difference
  • 4. 图像识别模型与训练策略
  • 解锁AI大模型:Prompt工程全面解析