基于Vue3与百度语音识别API的录音转文字实现方案

一、技术选型与需求分析

在智能办公和移动应用场景中,语音转文字功能已成为提升效率的关键工具。本方案采用Vue3作为前端框架,结合百度语音识别API实现核心功能。技术选型依据如下:

  1. 前端框架选择:Vue3的Composition API提供更灵活的代码组织方式,响应式系统性能优于Vue2,适合处理实时数据更新场景。
  2. 语音识别服务:百度语音识别API提供高精度的实时语音转文字服务,支持中英文混合识别,接口响应速度快,适合移动端应用。
  3. 录音功能实现:Web Audio API结合MediaRecorder API可实现浏览器端录音,无需依赖原生应用,降低开发成本。

二、录音功能实现细节

1. 录音权限处理

在移动端实现录音功能,首要解决权限问题。Vue3中可通过以下方式处理:

  1. const checkPermission = async () => {
  2. try {
  3. const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  4. stream.getTracks().forEach(track => track.stop());
  5. return true;
  6. } catch (err) {
  7. console.error('录音权限被拒绝:', err);
  8. return false;
  9. }
  10. };

2. 长按录音交互设计

移动端长按触发录音需结合touch事件:

  1. let recordTimer = null;
  2. const startRecord = () => {
  3. const pressTime = Date.now();
  4. const touchStart = (e) => {
  5. if (Date.now() - pressTime > 500) { // 长按500ms触发
  6. initRecorder();
  7. document.removeEventListener('touchmove', touchMove);
  8. document.removeEventListener('touchend', touchEnd);
  9. }
  10. };
  11. const touchMove = () => { /* 移动时取消长按 */ };
  12. const touchEnd = () => { /* 短按不触发 */ };
  13. document.addEventListener('touchmove', touchMove);
  14. document.addEventListener('touchend', touchEnd);
  15. document.addEventListener('touchstart', touchStart, { once: true });
  16. };

3. 录音数据采集

使用MediaRecorder API实现录音:

  1. let mediaRecorder = null;
  2. let audioChunks = [];
  3. const initRecorder = async () => {
  4. const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  5. mediaRecorder = new MediaRecorder(stream);
  6. mediaRecorder.ondataavailable = (event) => {
  7. audioChunks.push(event.data);
  8. };
  9. mediaRecorder.onstop = async () => {
  10. const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
  11. await uploadAndConvert(audioBlob);
  12. audioChunks = [];
  13. };
  14. mediaRecorder.start(1000); // 每1秒收集一次数据
  15. };

三、百度语音识别API集成

1. API准备与配置

  1. 登录百度智能云控制台,创建语音识别应用
  2. 获取API Key和Secret Key
  3. 生成Access Token(有效期30天):
    1. const getAccessToken = async (apiKey, secretKey) => {
    2. const authUrl = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${apiKey}&client_secret=${secretKey}`;
    3. const response = await fetch(authUrl);
    4. return await response.json();
    5. };

2. 实时语音识别实现

百度语音识别提供两种模式:

  1. 流式识别:适合长语音实时转写
  2. 一次性识别:适合短语音识别

本方案采用流式识别实现实时转写:

  1. const streamRecognize = async (audioBlob) => {
  2. const token = await getAccessToken('your_api_key', 'your_secret_key');
  3. const formData = new FormData();
  4. formData.append('audio', audioBlob);
  5. formData.append('format', 'wav');
  6. formData.append('rate', 16000);
  7. formData.append('channel', 1);
  8. formData.append('token', token.access_token);
  9. const response = await fetch('https://vop.baidu.com/server_api', {
  10. method: 'POST',
  11. body: formData,
  12. headers: {
  13. 'Content-Type': 'multipart/form-data'
  14. }
  15. });
  16. const result = await response.json();
  17. return result.result;
  18. };

3. 文件上传与识别

对于已录制的音频文件,可采用以下方式处理:

  1. const uploadAndConvert = async (audioBlob) => {
  2. try {
  3. // 如果是短音频,可直接识别
  4. const text = await streamRecognize(audioBlob);
  5. updateTranscript(text);
  6. // 或者上传到服务器后识别(适用于大文件)
  7. /*
  8. const formData = new FormData();
  9. formData.append('file', audioBlob, 'recording.wav');
  10. const uploadRes = await fetch('/api/upload', { method: 'POST', body: formData });
  11. const fileUrl = await uploadRes.json();
  12. */
  13. } catch (error) {
  14. console.error('识别失败:', error);
  15. }
  16. };

四、Vue3组件实现

1. 录音按钮组件

  1. <template>
  2. <div class="record-container">
  3. <button
  4. @touchstart="handleTouchStart"
  5. @touchend="handleTouchEnd"
  6. :class="{ 'recording': isRecording }"
  7. >
  8. {{ isRecording ? '松开结束' : '长按录音' }}
  9. </button>
  10. <div class="transcript">{{ transcript }}</div>
  11. </div>
  12. </template>
  13. <script setup>
  14. import { ref } from 'vue';
  15. const isRecording = ref(false);
  16. const transcript = ref('');
  17. const handleTouchStart = async () => {
  18. if (await checkPermission()) {
  19. isRecording.value = true;
  20. initRecorder();
  21. }
  22. };
  23. const handleTouchEnd = () => {
  24. if (isRecording.value) {
  25. mediaRecorder.stop();
  26. isRecording.value = false;
  27. }
  28. };
  29. const updateTranscript = (text) => {
  30. transcript.value = text;
  31. };
  32. </script>

2. 实时转写展示优化

为提升用户体验,可添加以下功能:

  1. 时间戳标记:在转写文本中插入时间点
  2. 说话人识别:结合声纹识别区分不同说话人
  3. 标点预测:通过NLP模型自动添加标点

五、性能优化与异常处理

1. 录音质量优化

  1. 设置合适的采样率(推荐16kHz)
  2. 控制录音时长(建议单次不超过5分钟)
  3. 使用WebAssembly优化音频处理

2. 错误处理机制

  1. const errorHandler = (error) => {
  2. switch (error.code) {
  3. case 'NOT_ALLOWED_ERR':
  4. showToast('请允许麦克风权限');
  5. break;
  6. case 'OVERCONSTRAINED_ERR':
  7. showToast('设备不支持录音');
  8. break;
  9. default:
  10. showToast('录音失败,请重试');
  11. }
  12. };

3. 离线缓存策略

  1. 使用IndexedDB存储未识别的音频
  2. 网络恢复后自动重试识别
  3. 提供本地识别备用方案(如Web Speech API)

六、部署与测试要点

  1. 跨平台测试:在iOS/Android不同版本上验证兼容性
  2. 压力测试:模拟连续录音1小时测试稳定性
  3. 弱网测试:在3G网络下验证识别成功率
  4. 安全审计:确保Access Token不会泄露

七、扩展功能建议

  1. 多语言支持:通过API参数切换识别语言
  2. 行业术语库:上传专业词汇表提升识别准确率
  3. 实时编辑:在转写过程中允许用户修正错误
  4. 导出功能:支持TXT/DOCX格式导出

本方案通过Vue3与百度语音识别API的结合,实现了移动端高效的语音转文字功能。实际开发中需注意权限管理、错误处理和性能优化等关键点。根据业务需求,可进一步扩展为完整的智能会议记录系统或语音笔记应用。