logo

Vue实现AI问答小助手(3):录音与语音转文字全流程解析

作者:起个名字好难2025.09.23 13:31浏览量:0

简介:本文详细讲解在Vue项目中实现录音功能及语音转文字的核心技术,包含浏览器API调用、WebRTC优化、第三方服务集成及错误处理方案,适合中高级开发者参考。

Vue实现AI问答小助手(3):录音与语音转文字全流程解析

一、技术选型与前置条件

在Vue项目中实现录音与语音转文字功能,需综合考虑浏览器兼容性、性能优化及服务稳定性。推荐技术栈如下:

  1. 录音功能:基于浏览器MediaRecorder API实现原生录音,兼容Chrome/Firefox/Edge等现代浏览器
  2. 语音转文字:采用WebRTC的SpeechRecognition接口(仅Chrome支持)或集成第三方ASR服务
  3. 音频处理:使用Web Audio API进行音频可视化及预处理
  4. 文件格式:优先生成WAV格式(无损)或OPUS格式(高压缩率)

环境要求

  • Vue 3.x + Composition API
  • 浏览器需支持getUserMediaMediaRecorder
  • HTTPS环境(本地开发可用localhost

二、录音功能实现

2.1 权限申请与设备初始化

  1. // src/utils/audioRecorder.js
  2. const initAudio = async () => {
  3. try {
  4. const stream = await navigator.mediaDevices.getUserMedia({
  5. audio: {
  6. echoCancellation: true,
  7. noiseSuppression: true,
  8. sampleRate: 16000 // 推荐16kHz采样率
  9. }
  10. });
  11. return stream;
  12. } catch (err) {
  13. console.error('音频设备访问失败:', err);
  14. throw new Error('需要麦克风权限');
  15. }
  16. };

关键点

  • 必须处理用户拒绝权限的场景
  • 建议添加设备选择下拉框(通过mediaDevices.enumerateDevices()
  • 采样率建议16kHz(语音识别标准)

2.2 录音核心实现

  1. export class AudioRecorder {
  2. constructor(options = {}) {
  3. this.mediaRecorder = null;
  4. this.audioChunks = [];
  5. this.recording = false;
  6. this.config = {
  7. mimeType: 'audio/webm', // 兼容性最好的格式
  8. bitsPerSecond: 128000,
  9. ...options
  10. };
  11. }
  12. async startRecording() {
  13. if (this.recording) return;
  14. const stream = await initAudio();
  15. this.mediaRecorder = new MediaRecorder(stream, this.config);
  16. this.mediaRecorder.ondataavailable = (event) => {
  17. if (event.data.size > 0) {
  18. this.audioChunks.push(event.data);
  19. }
  20. };
  21. this.mediaRecorder.onstop = () => {
  22. const audioBlob = new Blob(this.audioChunks, { type: this.config.mimeType });
  23. this.emit('complete', audioBlob);
  24. this.audioChunks = [];
  25. };
  26. this.mediaRecorder.start(100); // 每100ms收集一次数据
  27. this.recording = true;
  28. }
  29. stopRecording() {
  30. if (!this.recording) return;
  31. this.mediaRecorder.stop();
  32. this.recording = false;
  33. }
  34. }

优化建议

  • 添加最大录音时长限制(如60秒)
  • 实现暂停/继续功能
  • 添加音量可视化(通过AnalyserNode

三、语音转文字实现方案

方案1:浏览器原生API(仅Chrome)

  1. // 使用Web Speech API
  2. const recognizeSpeech = () => {
  3. const recognition = new (window.SpeechRecognition ||
  4. window.webkitSpeechRecognition)();
  5. recognition.continuous = false;
  6. recognition.interimResults = false;
  7. recognition.lang = 'zh-CN'; // 中文识别
  8. recognition.onresult = (event) => {
  9. const transcript = event.results[0][0].transcript;
  10. console.log('识别结果:', transcript);
  11. };
  12. recognition.onerror = (event) => {
  13. console.error('识别错误:', event.error);
  14. };
  15. recognition.start();
  16. return recognition;
  17. };

局限性

  • 仅支持Chrome浏览器
  • 无法控制识别引擎参数
  • 缺少专业领域词汇支持

方案2:集成第三方ASR服务(推荐)

以阿里云/腾讯云ASR为例(避免特定厂商暗示):

  1. // 伪代码示例
  2. async function transcribeAudio(audioBlob) {
  3. // 1. 音频预处理(转成16kHz PCM)
  4. const audioBuffer = await convertBlobToBuffer(audioBlob);
  5. const resampledData = resampleAudio(audioBuffer, 16000);
  6. // 2. 生成Base64或上传文件
  7. const audioBase64 = arrayBufferToBase64(resampledData);
  8. // 3. 调用ASR API
  9. const response = await fetch('YOUR_ASR_API_ENDPOINT', {
  10. method: 'POST',
  11. headers: {
  12. 'Content-Type': 'application/json',
  13. 'Authorization': 'Bearer YOUR_API_KEY'
  14. },
  15. body: JSON.stringify({
  16. audio: audioBase64,
  17. format: 'pcm',
  18. rate: 16000,
  19. language: 'zh-CN'
  20. })
  21. });
  22. return response.json();
  23. }

关键处理

  • 音频格式转换(必须符合API要求)
  • 网络错误重试机制
  • 实时识别流式处理(对于长音频)

四、Vue组件集成示例

  1. <template>
  2. <div class="voice-assistant">
  3. <div class="controls">
  4. <button @click="startRecording" :disabled="isRecording">
  5. {{ isRecording ? '录音中...' : '开始录音' }}
  6. </button>
  7. <button @click="stopRecording" :disabled="!isRecording">
  8. 停止
  9. </button>
  10. </div>
  11. <div v-if="isRecording" class="visualizer">
  12. <canvas ref="visualizer"></canvas>
  13. </div>
  14. <div v-if="transcript" class="result">
  15. 识别结果:<span>{{ transcript }}</span>
  16. </div>
  17. </div>
  18. </template>
  19. <script setup>
  20. import { ref, onMounted, onUnmounted } from 'vue';
  21. import { AudioRecorder } from '@/utils/audioRecorder';
  22. const isRecording = ref(false);
  23. const transcript = ref('');
  24. const recorder = new AudioRecorder();
  25. const audioContext = new (window.AudioContext || window.webkitAudioContext)();
  26. let analyser = null;
  27. // 音频可视化
  28. const setupVisualizer = (stream) => {
  29. const source = audioContext.createMediaStreamSource(stream);
  30. analyser = audioContext.createAnalyser();
  31. analyser.fftSize = 256;
  32. source.connect(analyser);
  33. const canvas = document.querySelector('#visualizer');
  34. // 实现可视化逻辑...
  35. };
  36. const startRecording = async () => {
  37. try {
  38. const stream = await recorder.initStream();
  39. if (analyser) setupVisualizer(stream);
  40. recorder.startRecording();
  41. isRecording.value = true;
  42. } catch (err) {
  43. console.error('录音启动失败:', err);
  44. }
  45. };
  46. const stopRecording = async () => {
  47. recorder.stopRecording();
  48. isRecording.value = false;
  49. // 获取录音Blob并转换
  50. const blob = await new Promise(resolve => {
  51. recorder.once('complete', resolve);
  52. });
  53. // 调用语音转文字
  54. const result = await transcribeAudio(blob);
  55. transcript.value = result.text;
  56. };
  57. onUnmounted(() => {
  58. if (analyser) analyser.disconnect();
  59. });
  60. </script>

五、常见问题处理

5.1 浏览器兼容性问题

  1. // 检测API支持
  2. const checkBrowserSupport = () => {
  3. if (!navigator.mediaDevices?.getUserMedia) {
  4. return '浏览器不支持录音功能';
  5. }
  6. if (!(MediaRecorder && MediaRecorder.isTypeSupported)) {
  7. return '浏览器不支持MediaRecorder';
  8. }
  9. return null;
  10. };

5.2 音频处理优化

  • 降噪:使用Web Audio API的ConvolverNode
  • 断点续传:大文件分片上传
  • 格式转换:推荐使用ffmpeg.wasm进行客户端转换

5.3 性能优化

  • 录音数据分片传输(避免内存溢出)
  • 防抖处理频繁的识别请求
  • 缓存常用识别结果

六、扩展功能建议

  1. 多语言支持:动态切换识别语言
  2. 领域适配:上传专业术语词典
  3. 实时反馈:显示识别置信度
  4. 历史记录:保存问答对话
  5. 离线模式:使用TensorFlow.js本地模型

七、完整实现路线图

  1. 第一阶段:完成基础录音功能(2天)
  2. 第二阶段:集成ASR服务(3天)
  3. 第三阶段:优化用户体验(2天)
  4. 第四阶段:安全与性能测试(2天)

推荐学习资源

  • MDN Web Docs: MediaRecorder API
  • WebRTC规范文档
  • 各云服务商ASR API文档

通过以上实现方案,开发者可以在Vue项目中构建出稳定可靠的语音交互功能。实际开发时建议先实现核心录音功能,再逐步集成语音识别服务,最后进行性能调优。对于企业级应用,建议采用成熟的ASR服务以获得更好的识别准确率和稳定性。

相关文章推荐

发表评论

活动