基于Vue3与百度语音识别API的录音转文字功能实现指南

一、功能需求与技术选型分析

1.1 核心功能需求

本方案需要实现三个核心功能:

  • 录音控制:支持长按或点击触发录音,可随时停止
  • 实时转换:录音过程中实时将音频流转换为文字
  • 文件上传:支持上传已有音频文件进行转换

1.2 技术选型依据

选择Vue3作为前端框架的原因:

  • 组合式API更利于状态管理
  • 响应式系统适合实时数据更新
  • 组件化开发提高代码复用率

选择百度语音识别API的优势:

  • 高准确率的语音识别能力
  • 支持实时流式识别
  • 提供完善的Web接口文档

二、录音功能实现方案

2.1 Web Audio API基础实现

  1. // 初始化音频上下文
  2. const audioContext = new (window.AudioContext || window.webkitAudioContext)();
  3. let mediaRecorder;
  4. let audioChunks = [];
  5. // 获取麦克风权限
  6. const startRecording = async () => {
  7. try {
  8. const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  9. mediaRecorder = new MediaRecorder(stream);
  10. mediaRecorder.ondataavailable = (event) => {
  11. audioChunks.push(event.data);
  12. };
  13. mediaRecorder.start(100); // 每100ms收集一次数据
  14. } catch (err) {
  15. console.error('录音错误:', err);
  16. }
  17. };

2.2 长按事件处理实现

  1. <template>
  2. <div
  3. @mousedown="startRecord"
  4. @mouseup="stopRecord"
  5. @touchstart="startRecord"
  6. @touchend="stopRecord"
  7. >
  8. 长按或点击录音
  9. </div>
  10. </template>
  11. <script setup>
  12. import { ref } from 'vue';
  13. const isRecording = ref(false);
  14. let recordTimeout;
  15. const startRecord = () => {
  16. recordTimeout = setTimeout(() => {
  17. isRecording.value = true;
  18. // 实际录音启动逻辑
  19. startRecording();
  20. }, 500); // 500ms判定为长按
  21. };
  22. const stopRecord = () => {
  23. clearTimeout(recordTimeout);
  24. if (isRecording.value) {
  25. stopRecording();
  26. }
  27. isRecording.value = false;
  28. };
  29. </script>

三、百度语音识别API集成

3.1 API接入准备

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

3.2 实时语音识别实现

  1. // 实时语音识别
  2. const realTimeRecognition = async (audioData) => {
  3. const token = await getAccessToken(API_KEY, SECRET_KEY);
  4. const wsUrl = `wss://vop.baidu.com/websocket_stream?token=${token}&cuid=YOUR_DEVICE_ID&codec=pcm&format=16000_1`;
  5. const ws = new WebSocket(wsUrl);
  6. ws.onopen = () => {
  7. // 发送配置信息
  8. const config = {
  9. format: 'pcm',
  10. rate: 16000,
  11. channel: 1,
  12. cuid: 'YOUR_DEVICE_ID',
  13. token: token
  14. };
  15. ws.send(JSON.stringify({...config, type: 'START'}));
  16. };
  17. ws.onmessage = (event) => {
  18. const data = JSON.parse(event.data);
  19. if (data.result) {
  20. // 实时更新识别结果
  21. recognitionResult.value = data.result;
  22. }
  23. };
  24. // 发送音频数据
  25. setInterval(() => {
  26. if (audioChunks.length > 0) {
  27. const blob = new Blob(audioChunks, { type: 'audio/pcm' });
  28. ws.send(blob);
  29. audioChunks = [];
  30. }
  31. }, 100);
  32. };

四、文件上传与转换实现

4.1 文件上传组件

  1. <template>
  2. <input
  3. type="file"
  4. accept="audio/*"
  5. @change="handleFileUpload"
  6. />
  7. </template>
  8. <script setup>
  9. const handleFileUpload = (event) => {
  10. const file = event.target.files[0];
  11. if (!file) return;
  12. const reader = new FileReader();
  13. reader.onload = async (e) => {
  14. const arrayBuffer = e.target.result;
  15. await convertAudioToText(arrayBuffer);
  16. };
  17. reader.readAsArrayBuffer(file);
  18. };
  19. </script>

4.2 音频文件转换

  1. const convertAudioToText = async (audioBuffer) => {
  2. const token = await getAccessToken(API_KEY, SECRET_KEY);
  3. const apiUrl = `https://vop.baidu.com/server_api?dev_pid=1537&token=${token}`;
  4. const formData = new FormData();
  5. const blob = new Blob([audioBuffer], { type: 'audio/wav' });
  6. formData.append('audio', blob, 'recording.wav');
  7. try {
  8. const response = await fetch(apiUrl, {
  9. method: 'POST',
  10. body: formData
  11. });
  12. const result = await response.json();
  13. if (result.result) {
  14. recognitionResult.value = result.result.join('');
  15. }
  16. } catch (error) {
  17. console.error('转换失败:', error);
  18. }
  19. };

五、完整功能整合与优化

5.1 状态管理方案

使用Vue3的ref和reactive管理状态:

  1. import { ref, reactive } from 'vue';
  2. const state = reactive({
  3. isRecording: false,
  4. recognitionResult: '',
  5. uploadProgress: 0
  6. });
  7. const toggleRecording = () => {
  8. state.isRecording = !state.isRecording;
  9. if (state.isRecording) {
  10. startRecording();
  11. } else {
  12. stopRecording();
  13. }
  14. };

5.2 性能优化策略

  1. 音频数据分块传输(每100ms)
  2. 防抖处理识别结果更新
  3. 错误重试机制
  4. 内存管理(及时清理音频块)

5.3 错误处理机制

  1. const handleError = (error) => {
  2. switch (error.type) {
  3. case 'permission_denied':
  4. showToast('请授予麦克风权限');
  5. break;
  6. case 'network_error':
  7. showToast('网络连接失败,请重试');
  8. break;
  9. case 'api_error':
  10. showToast(`识别失败: ${error.message}`);
  11. break;
  12. default:
  13. showToast('发生未知错误');
  14. }
  15. };

六、部署与测试要点

6.1 跨域问题处理

在百度云控制台配置CORS规则:

  • 允许来源:https://yourdomain.com
  • 允许方法:POST, GET, OPTIONS
  • 允许头:Content-Type, Authorization

6.2 兼容性测试

需测试的浏览器环境:

  • Chrome 80+
  • Firefox 75+
  • Safari 14+
  • 移动端Chrome/Safari

6.3 性能测试指标

  1. 实时识别延迟:<500ms
  2. 大文件转换时间:<文件时长的1.5倍
  3. 内存占用:<100MB

七、进阶功能扩展建议

  1. 多语言支持:通过API参数切换识别语言
  2. 标点预测:启用百度API的标点预测功能
  3. 说话人分离:使用更高级的API版本
  4. 热词优化:上传自定义词汇表提高准确率
  5. 离线缓存:使用IndexedDB存储历史记录

八、安全与隐私考虑

  1. 录音前明确告知用户并获取授权
  2. 敏感操作需要二次确认
  3. 音频数据传输使用WSS加密
  4. 遵循GDPR等数据保护法规
  5. 提供数据删除功能

通过以上技术方案,开发者可以在Vue3项目中高效实现录音转文字功能,充分利用百度语音识别API的强大能力。实际开发中需注意处理各种边界情况和错误场景,确保应用的稳定性和用户体验。