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

一、方案概述

在需要快速记录语音内容的场景中(如会议纪要、语音笔记、客服对话等),通过浏览器录音功能采集音频数据,结合百度语音识别API实现实时或离线的语音转文字功能,能显著提升信息处理效率。本方案基于Vue3框架,封装可复用的录音组件,支持长按触发录音,并通过WebSocket或HTTP接口与百度语音识别API交互,实现音频数据的实时上传与文本结果的动态展示。

二、核心功能实现

1. 录音功能封装

1.1 录音权限与设备选择

使用Web Audio API和MediaRecorder API实现浏览器端录音,需先请求用户麦克风权限:

  1. const startRecording = async () => {
  2. try {
  3. const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  4. const mediaRecorder = new MediaRecorder(stream);
  5. // 录音逻辑...
  6. } catch (err) {
  7. console.error('录音权限错误:', err);
  8. }
  9. };

通过navigator.mediaDevices.enumerateDevices()可获取可用音频设备列表,允许用户切换输入源。

1.2 长按触发录音

通过监听mousedownmouseup事件实现长按逻辑:

  1. let recordTimer;
  2. const handleMouseDown = () => {
  3. recordTimer = setTimeout(() => {
  4. startRecording(); // 长按1秒后开始录音
  5. }, 1000);
  6. };
  7. const handleMouseUp = () => {
  8. clearTimeout(recordTimer);
  9. // 停止录音...
  10. };

1.3 音频数据采集与分块

使用MediaRecorder.ondataavailable事件获取音频Blob数据,并通过chunks数组暂存:

  1. let chunks = [];
  2. mediaRecorder.ondataavailable = (e) => {
  3. chunks.push(e.data);
  4. // 实时上传或本地暂存...
  5. };

2. 百度语音识别API集成

2.1 API准备与鉴权

在百度智能云控制台开通语音识别服务,获取API Key和Secret Key,生成访问令牌(Access Token):

  1. const getAccessToken = async () => {
  2. const response = await fetch('https://aip.baidubce.com/oauth/2.0/token', {
  3. method: 'POST',
  4. body: new URLSearchParams({
  5. grant_type: 'client_credentials',
  6. client_id: 'YOUR_API_KEY',
  7. client_secret: 'YOUR_SECRET_KEY',
  8. }),
  9. });
  10. return await response.json();
  11. };

2.2 实时语音识别(WebSocket)

百度语音识别API支持WebSocket协议实现流式识别,适合长语音或实时场景:

  1. const startRealTimeRecognition = async (token) => {
  2. const ws = new WebSocket(
  3. `wss://vop.baidu.com/websocket_sock/json?token=${token}&cuid=YOUR_DEVICE_ID`
  4. );
  5. ws.onopen = () => {
  6. // 发送配置信息
  7. ws.send(JSON.stringify({
  8. format: 'wav',
  9. rate: 16000,
  10. channel: 1,
  11. token: token,
  12. cuid: 'YOUR_DEVICE_ID',
  13. }));
  14. };
  15. ws.onmessage = (event) => {
  16. const data = JSON.parse(event.data);
  17. if (data.result) {
  18. // 更新实时文本
  19. realTimeText.value += data.result;
  20. }
  21. };
  22. // 发送音频数据...
  23. };

2.3 离线文件识别(HTTP)

对于已录制的音频文件,可通过HTTP接口上传识别:

  1. const recognizeAudioFile = async (audioBlob, token) => {
  2. const formData = new FormData();
  3. formData.append('audio', audioBlob, 'recording.wav');
  4. const response = await fetch('https://vop.baidu.com/server_api', {
  5. method: 'POST',
  6. headers: {
  7. 'Content-Type': 'multipart/form-data',
  8. },
  9. body: formData,
  10. });
  11. return await response.json();
  12. };

3. Vue3组件实现

3.1 录音按钮组件

封装<RecordButton>组件,支持长按/点击触发:

  1. <template>
  2. <button
  3. @mousedown="handleMouseDown"
  4. @mouseup="handleMouseUp"
  5. @touchstart="handleTouchStart"
  6. @touchend="handleTouchEnd"
  7. >
  8. {{ isRecording ? '录音中...' : '长按录音' }}
  9. </button>
  10. </template>
  11. <script setup>
  12. import { ref } from 'vue';
  13. const isRecording = ref(false);
  14. const handleMouseDown = () => { /* ... */ };
  15. const handleMouseUp = () => { /* ... */ };
  16. </script>

3.2 文本展示区域

使用<textarea>或可编辑<div>展示识别结果:

  1. <template>
  2. <div class="text-display">
  3. {{ recognitionText }}
  4. </div>
  5. </template>
  6. <script setup>
  7. import { ref, watch } from 'vue';
  8. const recognitionText = ref('');
  9. // 监听API返回更新文本...
  10. </script>

三、优化与注意事项

  1. 音频格式兼容性:百度语音识别API支持PCM/WAV/AMR等格式,建议统一转换为16kHz、16bit的单声道PCM或WAV格式。
  2. 实时性优化:通过WebSocket分块发送音频数据,减少延迟;设置合理的interval参数控制发送频率。
  3. 错误处理:捕获API调用错误(如配额不足、音频质量差),提供用户友好的提示。
  4. 隐私与安全:明确告知用户录音用途,避免存储敏感音频数据;使用HTTPS加密传输。

四、完整流程示例

  1. 用户长按录音按钮,触发startRecording()
  2. 采集音频数据并分块,通过WebSocket发送至百度API。
  3. API返回实时识别结果,更新Vue组件中的recognitionText
  4. 用户松开按钮后,停止录音并发送最终请求(如需要)。
  5. 展示完整文本,提供复制/导出功能。

五、扩展功能

  • 多语言支持:通过API参数切换识别语言(中文、英文等)。
  • 标点预测:启用百度API的标点符号预测功能,提升文本可读性。
  • 历史记录:将录音与文本存储至本地IndexedDB或后端数据库。

通过以上方案,开发者可快速构建基于Vue3和百度语音识别API的录音转文字应用,满足多样化场景需求。