一、功能需求与技术选型分析
1.1 核心功能需求
本方案需要实现三个核心功能:
- 录音控制:支持长按或点击触发录音,可随时停止
- 实时转换:录音过程中实时将音频流转换为文字
- 文件上传:支持上传已有音频文件进行转换
1.2 技术选型依据
选择Vue3作为前端框架的原因:
- 组合式API更利于状态管理
- 响应式系统适合实时数据更新
- 组件化开发提高代码复用率
选择百度语音识别API的优势:
- 高准确率的语音识别能力
- 支持实时流式识别
- 提供完善的Web接口文档
二、录音功能实现方案
2.1 Web Audio API基础实现
// 初始化音频上下文const audioContext = new (window.AudioContext || window.webkitAudioContext)();let mediaRecorder;let audioChunks = [];// 获取麦克风权限const startRecording = async () => {try {const stream = await navigator.mediaDevices.getUserMedia({ audio: true });mediaRecorder = new MediaRecorder(stream);mediaRecorder.ondataavailable = (event) => {audioChunks.push(event.data);};mediaRecorder.start(100); // 每100ms收集一次数据} catch (err) {console.error('录音错误:', err);}};
2.2 长按事件处理实现
<template><div@mousedown="startRecord"@mouseup="stopRecord"@touchstart="startRecord"@touchend="stopRecord">长按或点击录音</div></template><script setup>import { ref } from 'vue';const isRecording = ref(false);let recordTimeout;const startRecord = () => {recordTimeout = setTimeout(() => {isRecording.value = true;// 实际录音启动逻辑startRecording();}, 500); // 500ms判定为长按};const stopRecord = () => {clearTimeout(recordTimeout);if (isRecording.value) {stopRecording();}isRecording.value = false;};</script>
三、百度语音识别API集成
3.1 API接入准备
- 登录百度智能云控制台
- 创建语音识别应用
- 获取API Key和Secret Key
- 生成Access Token
// 获取Access Tokenconst getAccessToken = async (apiKey, secretKey) => {const authUrl = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${apiKey}&client_secret=${secretKey}`;const response = await fetch(authUrl);const data = await response.json();return data.access_token;};
3.2 实时语音识别实现
// 实时语音识别const realTimeRecognition = async (audioData) => {const token = await getAccessToken(API_KEY, SECRET_KEY);const wsUrl = `wss://vop.baidu.com/websocket_stream?token=${token}&cuid=YOUR_DEVICE_ID&codec=pcm&format=16000_1`;const ws = new WebSocket(wsUrl);ws.onopen = () => {// 发送配置信息const config = {format: 'pcm',rate: 16000,channel: 1,cuid: 'YOUR_DEVICE_ID',token: token};ws.send(JSON.stringify({...config, type: 'START'}));};ws.onmessage = (event) => {const data = JSON.parse(event.data);if (data.result) {// 实时更新识别结果recognitionResult.value = data.result;}};// 发送音频数据setInterval(() => {if (audioChunks.length > 0) {const blob = new Blob(audioChunks, { type: 'audio/pcm' });ws.send(blob);audioChunks = [];}}, 100);};
四、文件上传与转换实现
4.1 文件上传组件
<template><inputtype="file"accept="audio/*"@change="handleFileUpload"/></template><script setup>const handleFileUpload = (event) => {const file = event.target.files[0];if (!file) return;const reader = new FileReader();reader.onload = async (e) => {const arrayBuffer = e.target.result;await convertAudioToText(arrayBuffer);};reader.readAsArrayBuffer(file);};</script>
4.2 音频文件转换
const convertAudioToText = async (audioBuffer) => {const token = await getAccessToken(API_KEY, SECRET_KEY);const apiUrl = `https://vop.baidu.com/server_api?dev_pid=1537&token=${token}`;const formData = new FormData();const blob = new Blob([audioBuffer], { type: 'audio/wav' });formData.append('audio', blob, 'recording.wav');try {const response = await fetch(apiUrl, {method: 'POST',body: formData});const result = await response.json();if (result.result) {recognitionResult.value = result.result.join('');}} catch (error) {console.error('转换失败:', error);}};
五、完整功能整合与优化
5.1 状态管理方案
使用Vue3的ref和reactive管理状态:
import { ref, reactive } from 'vue';const state = reactive({isRecording: false,recognitionResult: '',uploadProgress: 0});const toggleRecording = () => {state.isRecording = !state.isRecording;if (state.isRecording) {startRecording();} else {stopRecording();}};
5.2 性能优化策略
- 音频数据分块传输(每100ms)
- 防抖处理识别结果更新
- 错误重试机制
- 内存管理(及时清理音频块)
5.3 错误处理机制
const handleError = (error) => {switch (error.type) {case 'permission_denied':showToast('请授予麦克风权限');break;case 'network_error':showToast('网络连接失败,请重试');break;case 'api_error':showToast(`识别失败: ${error.message}`);break;default:showToast('发生未知错误');}};
六、部署与测试要点
6.1 跨域问题处理
在百度云控制台配置CORS规则:
- 允许来源:
https://yourdomain.com - 允许方法:POST, GET, OPTIONS
- 允许头:Content-Type, Authorization
6.2 兼容性测试
需测试的浏览器环境:
- Chrome 80+
- Firefox 75+
- Safari 14+
- 移动端Chrome/Safari
6.3 性能测试指标
- 实时识别延迟:<500ms
- 大文件转换时间:<文件时长的1.5倍
- 内存占用:<100MB
七、进阶功能扩展建议
- 多语言支持:通过API参数切换识别语言
- 标点预测:启用百度API的标点预测功能
- 说话人分离:使用更高级的API版本
- 热词优化:上传自定义词汇表提高准确率
- 离线缓存:使用IndexedDB存储历史记录
八、安全与隐私考虑
- 录音前明确告知用户并获取授权
- 敏感操作需要二次确认
- 音频数据传输使用WSS加密
- 遵循GDPR等数据保护法规
- 提供数据删除功能
通过以上技术方案,开发者可以在Vue3项目中高效实现录音转文字功能,充分利用百度语音识别API的强大能力。实际开发中需注意处理各种边界情况和错误场景,确保应用的稳定性和用户体验。