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

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

一、技术选型与前置条件

在Vue项目中实现录音与语音转文字功能,需明确技术栈与运行环境要求。录音功能依赖浏览器提供的MediaRecorder API或第三方库(如Recorder.js),而语音转文字可通过Web Speech API或调用云端语音识别服务(如阿里云、腾讯云等)实现。

1. 浏览器兼容性

  • MediaRecorder API:支持Chrome、Firefox、Edge等现代浏览器,但Safari需14.0+版本。
  • Web Speech API:仅Chrome和Edge支持语音识别,Firefox和Safari暂未实现。
  • 第三方库:如Recorder.js可兼容旧版浏览器,但需额外引入。

2. 云端服务对比

服务 准确率 延迟 费用 适用场景
阿里云ASR 按量计费 企业级高并发场景
腾讯云ASR 中高 免费额度 中小规模应用
Web Speech 免费 快速原型开发

建议:开发阶段使用Web Speech API快速验证,上线后切换至云端服务保障稳定性。

二、录音功能实现

1. 使用MediaRecorder API

  1. // 录音组件核心逻辑
  2. export default {
  3. data() {
  4. return {
  5. mediaRecorder: null,
  6. audioChunks: [],
  7. isRecording: false
  8. };
  9. },
  10. methods: {
  11. async startRecording() {
  12. try {
  13. const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  14. this.mediaRecorder = new MediaRecorder(stream);
  15. this.audioChunks = [];
  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: 'audio/wav' });
  23. this.uploadAudio(audioBlob); // 上传至服务器或转文字
  24. };
  25. this.mediaRecorder.start();
  26. this.isRecording = true;
  27. } catch (error) {
  28. console.error('录音失败:', error);
  29. }
  30. },
  31. stopRecording() {
  32. if (this.mediaRecorder && this.isRecording) {
  33. this.mediaRecorder.stop();
  34. this.isRecording = false;
  35. }
  36. }
  37. }
  38. };

2. 第三方库集成(Recorder.js)

  1. <!-- 引入Recorder.js -->
  2. <script src="https://cdn.jsdelivr.net/npm/recorderjs@1.2.0/recorder.min.js"></script>
  3. <script>
  4. export default {
  5. methods: {
  6. initRecorder() {
  7. const AudioContext = window.AudioContext || window.webkitAudioContext;
  8. const audioContext = new AudioContext();
  9. const recorder = new Recorder(audioContext.createMediaStreamSource(stream));
  10. recorder.record();
  11. setTimeout(() => {
  12. recorder.stop();
  13. recorder.exportWAV((blob) => {
  14. this.uploadAudio(blob);
  15. });
  16. }, 3000); // 录制3秒
  17. }
  18. }
  19. };
  20. </script>

3. 常见问题处理

  • 权限拒绝:监听navigator.mediaDevices.getUserMediaPromise.reject,提示用户开启麦克风权限。
  • 采样率兼容:通过AudioContext.createMediaStreamSource统一采样率至16kHz(ASR服务常用)。
  • 内存泄漏:在beforeDestroy生命周期中关闭音频流:
    1. beforeDestroy() {
    2. if (this.mediaRecorder?.stream) {
    3. this.mediaRecorder.stream.getTracks().forEach(track => track.stop());
    4. }
    5. }

三、语音转文字实现

1. Web Speech API(客户端)

  1. // 语音识别组件
  2. export default {
  3. methods: {
  4. startSpeechRecognition() {
  5. const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
  6. recognition.lang = 'zh-CN';
  7. recognition.interimResults = true;
  8. recognition.onresult = (event) => {
  9. const transcript = Array.from(event.results)
  10. .map(result => result[0].transcript)
  11. .join('');
  12. this.$emit('transcript', transcript);
  13. };
  14. recognition.start();
  15. this.$emit('status', 'listening');
  16. }
  17. }
  18. };

2. 云端ASR服务集成(以阿里云为例)

  1. // 调用阿里云语音识别API
  2. async function transcribeAudio(audioBlob) {
  3. const formData = new FormData();
  4. formData.append('audio', audioBlob, 'recording.wav');
  5. const response = await fetch('https://your-asr-endpoint.com/api', {
  6. method: 'POST',
  7. headers: {
  8. 'Authorization': 'Bearer YOUR_API_KEY',
  9. 'X-App-Id': 'YOUR_APP_ID'
  10. },
  11. body: formData
  12. });
  13. return response.json();
  14. }
  15. // Vue组件中使用
  16. export default {
  17. methods: {
  18. async handleAudioUpload(blob) {
  19. const result = await transcribeAudio(blob);
  20. this.question = result.transcript;
  21. this.submitToAI(); // 提交至AI问答模块
  22. }
  23. }
  24. };

3. 性能优化策略

  • 分片上传:对超过10MB的音频文件分片上传,避免单次请求超时。
  • Web Worker处理:将音频解码任务移至Web Worker,避免阻塞UI线程。
  • 缓存机制:对重复音频片段(如“嗯”“啊”)建立哈希缓存,减少ASR调用次数。

四、完整流程示例

  1. <template>
  2. <div>
  3. <button @click="startRecording" :disabled="isRecording">开始录音</button>
  4. <button @click="stopRecording" :disabled="!isRecording">停止录音</button>
  5. <div v-if="transcript">{{ transcript }}</div>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. mediaRecorder: null,
  13. audioChunks: [],
  14. isRecording: false,
  15. transcript: ''
  16. };
  17. },
  18. methods: {
  19. async startRecording() {
  20. try {
  21. const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  22. this.mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });
  23. this.audioChunks = [];
  24. this.mediaRecorder.ondataavailable = (event) => {
  25. this.audioChunks.push(event.data);
  26. };
  27. this.mediaRecorder.onstop = async () => {
  28. const audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' });
  29. this.transcript = await this.transcribeAudio(audioBlob);
  30. stream.getTracks().forEach(track => track.stop());
  31. };
  32. this.mediaRecorder.start(100); // 每100ms收集一次数据
  33. this.isRecording = true;
  34. } catch (error) {
  35. console.error('录音失败:', error);
  36. }
  37. },
  38. stopRecording() {
  39. if (this.mediaRecorder) {
  40. this.mediaRecorder.stop();
  41. this.isRecording = false;
  42. }
  43. },
  44. async transcribeAudio(blob) {
  45. // 实际项目中替换为云端ASR调用
  46. return new Promise(resolve => {
  47. setTimeout(() => {
  48. resolve('这是模拟的语音转文字结果');
  49. }, 800);
  50. });
  51. }
  52. }
  53. };
  54. </script>

五、进阶优化方向

  1. 实时语音转文字:通过WebSocket建立长连接,实现边录音边转文字。
  2. 多语言支持:动态切换ASR服务的语言参数(如en-USja-JP)。
  3. 噪声抑制:使用WebRTC的AudioContext添加降噪滤波器。
  4. 端到端加密:对录音数据加密后上传,保障用户隐私。

通过以上技术实现,Vue项目可构建出具备专业级录音与语音转文字能力的AI问答小助手,满足从原型开发到生产部署的全流程需求。