logo

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

作者:有好多问题2025.09.23 13:09浏览量:0

简介:本文详解如何利用Vue3框架与百度语音识别API,实现长按录音、实时转文字及音频文件上传转写功能,提供完整技术方案与代码示例。

一、系统功能概述

本系统主要实现三大核心功能:长按触发录音、实时语音转文字、音频文件上传转写。采用Vue3作为前端框架,利用浏览器WebRTC API实现录音功能,通过百度语音识别API完成语音到文本的转换。系统包含实时流式识别与批量文件识别两种模式,适用于会议记录、语音输入、智能客服等场景。

1.1 技术架构选型

前端采用Vue3+Composition API构建响应式界面,使用RecordRTC库处理音频采集,通过axios与后端API交互。后端可选用Node.js或Python搭建简单代理服务,解决跨域问题并处理API密钥管理。百度语音识别API提供高精度的语音转写服务,支持中英文及多种方言识别。

二、录音功能实现

2.1 录音按钮交互设计

采用长按触发机制提升用户体验,通过touchstart和touchend事件计算按压时长:

  1. let pressTimer;
  2. const startPress = () => {
  3. pressTimer = setTimeout(() => {
  4. startRecording(); // 长按1秒后开始录音
  5. }, 1000);
  6. };
  7. const cancelPress = () => {
  8. clearTimeout(pressTimer);
  9. };
  10. // 在按钮元素上绑定
  11. <button
  12. @touchstart="startPress"
  13. @touchend="cancelPress"
  14. @mousedown="startPress"
  15. @mouseup="cancelPress"
  16. >
  17. 按住说话
  18. </button>

2.2 音频采集实现

使用RecordRTC库简化音频采集流程:

  1. import RecordRTC from 'recordrtc';
  2. let recorder;
  3. let audioStream;
  4. const startRecording = async () => {
  5. try {
  6. audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
  7. recorder = new RecordRTC(audioStream, {
  8. type: 'audio/wav',
  9. mimeType: 'audio/wav',
  10. recorderType: StereoAudioRecorder,
  11. desiredSampRate: 16000
  12. });
  13. recorder.startRecording();
  14. // 显示录音状态UI
  15. } catch (e) {
  16. console.error('录音失败:', e);
  17. }
  18. };
  19. const stopRecording = () => {
  20. if (!recorder) return;
  21. recorder.stopRecording(() => {
  22. const blob = recorder.getBlob();
  23. processAudio(blob); // 处理获取的音频Blob
  24. recorder.destroy();
  25. audioStream.getTracks().forEach(track => track.stop());
  26. });
  27. };

三、百度语音识别API集成

3.1 API准备与配置

  1. 登录百度智能云控制台
  2. 创建语音识别应用,获取API Key和Secret Key
  3. 生成Access Token(有效期30天):
    1. const getAccessToken = async () => {
    2. const result = await axios.get('https://aip.baidubce.com/oauth/2.0/token', {
    3. params: {
    4. grant_type: 'client_credentials',
    5. client_id: '您的API Key',
    6. client_secret: '您的Secret Key'
    7. }
    8. });
    9. return result.data.access_token;
    10. };

3.2 实时流式识别实现

百度API支持WebSocket长连接实现实时转写:

  1. const startRealTimeRecognition = async (audioBlob) => {
  2. const token = await getAccessToken();
  3. const wsUrl = `wss://vop.baidu.com/websocket_socket.do?token=${token}&cuid=您的设备ID&codec=wav&format=pcm&sample=16000&channel=1`;
  4. const ws = new WebSocket(wsUrl);
  5. let isFirstFrame = true;
  6. ws.onopen = () => {
  7. console.log('WebSocket连接建立');
  8. // 发送配置信息
  9. ws.send(JSON.stringify({
  10. common: { app_id: '您的应用ID' },
  11. business: {
  12. domain: 'general',
  13. language: 'zh',
  14. accent: 'mandarin'
  15. }
  16. }));
  17. };
  18. ws.onmessage = (event) => {
  19. const data = JSON.parse(event.data);
  20. if (data.result) {
  21. // 实时显示识别结果
  22. realTimeText.value += data.result.replace(/[,。?、]/g, '');
  23. }
  24. };
  25. // 音频分片发送
  26. const fileReader = new FileReader();
  27. fileReader.onload = () => {
  28. const arrayBuffer = fileReader.result;
  29. const view = new DataView(arrayBuffer);
  30. const sliceSize = 1280; // 每片1280字节
  31. for (let i = 0; i < view.byteLength; i += sliceSize) {
  32. const chunk = view.slice(i, Math.min(i + sliceSize, view.byteLength));
  33. setTimeout(() => {
  34. if (ws.readyState === WebSocket.OPEN) {
  35. ws.send(new Blob([chunk]));
  36. }
  37. }, isFirstFrame ? 0 : 100); // 首包立即发送,后续间隔100ms
  38. isFirstFrame = false;
  39. }
  40. };
  41. fileReader.readAsArrayBuffer(audioBlob);
  42. };

3.3 文件上传识别实现

对于已录制的音频文件,使用REST API进行识别:

  1. const uploadAndRecognize = async (audioBlob) => {
  2. const token = await getAccessToken();
  3. const formData = new FormData();
  4. formData.append('audio', audioBlob, 'recording.wav');
  5. formData.append('format', 'wav');
  6. formData.append('rate', 16000);
  7. formData.append('channel', 1);
  8. formData.append('token', token);
  9. formData.append('cuid', '您的设备ID');
  10. formData.append('len', audioBlob.size);
  11. try {
  12. const response = await axios.post(
  13. 'https://vop.baidu.com/server_api',
  14. formData,
  15. {
  16. headers: {
  17. 'Content-Type': 'multipart/form-data'
  18. }
  19. }
  20. );
  21. return response.data.result;
  22. } catch (error) {
  23. console.error('识别失败:', error);
  24. return '识别出错';
  25. }
  26. };

四、完整流程实现

4.1 组件化设计

创建SpeechRecognition组件:

  1. <template>
  2. <div class="speech-container">
  3. <div class="record-btn"
  4. @touchstart="startPress"
  5. @touchend="cancelPress"
  6. @mousedown="startPress"
  7. @mouseup="cancelPress">
  8. {{ recording ? '松开结束' : '按住说话' }}
  9. </div>
  10. <div class="status">{{ statusText }}</div>
  11. <div class="result">{{ recognitionResult }}</div>
  12. <input type="file" @change="handleFileUpload" accept="audio/*" />
  13. </div>
  14. </template>
  15. <script setup>
  16. import { ref } from 'vue';
  17. // 引入录音和识别函数...
  18. const recording = ref(false);
  19. const statusText = ref('');
  20. const recognitionResult = ref('');
  21. // 实现各方法...
  22. </script>

4.2 性能优化建议

  1. 音频预处理:使用Web Audio API进行降噪处理
  2. 分片传输:大文件分块上传,避免内存溢出
  3. 节流控制:实时识别时控制发送频率(建议100-200ms/次)
  4. 错误重试:网络异常时实现自动重连机制
  5. 结果缓存:本地存储历史识别记录

五、部署与注意事项

  1. 跨域处理:后端代理需配置CORS,或使用Nginx反向代理
  2. 安全策略
    • 敏感操作需用户确认(如录音权限)
    • API密钥不应暴露在前端代码中
    • 实现HTTPS确保数据传输安全
  3. 兼容性测试
    • 主流浏览器(Chrome/Firefox/Safari)
    • 移动端(iOS/Android)不同版本
    • 不同采样率音频适配

六、扩展功能建议

  1. 多语言支持:通过API参数切换识别语言
  2. 说话人分离:使用百度API的说话人 diarization 功能
  3. 热点词高亮:对专业术语进行特殊标记
  4. 实时编辑:允许用户修正识别结果并反馈优化
  5. 导出功能:支持TXT/DOCX等多种格式导出

本实现方案通过Vue3的响应式特性与百度语音识别API的高精度识别能力结合,构建了完整的语音转文字系统。实际开发中需根据具体业务场景调整参数配置,并做好异常处理和用户体验优化。建议先在小规模测试环境中验证功能,再逐步扩展到生产环境。

相关文章推荐

发表评论