logo

在uniapp中使用百度语音识别技术创建简易录音器

作者:KAKAKA2025.09.19 17:45浏览量:0

简介:本文详细介绍了在uniapp框架中集成百度语音识别API,实现一个支持录音与语音转文字功能的简易录音器,涵盖环境准备、权限配置、录音实现、语音识别调用及完整代码示例。

一、引言

随着移动应用对语音交互需求的增长,语音识别技术已成为提升用户体验的关键功能。uniapp作为跨平台开发框架,结合百度语音识别API,可快速实现录音与语音转文字功能。本文将详细介绍如何在uniapp中集成百度语音识别技术,构建一个支持录音、播放及实时转文字的简易录音器。

二、技术准备

1. 百度语音识别API申请

首先需在百度智能云平台申请语音识别服务:

  • 注册并登录百度智能云账号
  • 进入「语音技术」-「语音识别」服务
  • 创建应用获取API Key和Secret Key
  • 记录「接口地址」(如wss://vop.baidu.com/websocket_asr

2. uniapp项目配置

  1. 创建uniapp项目:通过HBuilderX新建uniapp项目,选择基础模板。
  2. 安装依赖
    1. npm install @dcloudio/uni-ui --save
    2. npm install js-base64 --save # 用于Base64编码
  3. 配置manifest.json
    • 在「App权限配置」中添加录音权限:
      1. "app-plus": {
      2. "permissions": ["record"]
      3. }
    • iOS需在Xcode中配置NSMicrophoneUsageDescription权限描述。

三、核心功能实现

1. 录音功能实现

uniapp通过plus.audio.getRecorderAPI实现录音:

  1. // 录音配置
  2. const recorderOptions = {
  3. filename: '_doc/audio/record.wav', // 录音文件路径
  4. format: 'wav', // 格式支持wav/amr
  5. samplerate: 16000 // 采样率(百度API要求16k或8k)
  6. };
  7. // 开始录音
  8. function startRecord() {
  9. return new Promise((resolve, reject) => {
  10. const recorder = plus.audio.getRecorder();
  11. recorder.record(recorderOptions,
  12. () => resolve(recorder),
  13. (error) => reject(error)
  14. );
  15. });
  16. }
  17. // 停止录音
  18. function stopRecord(recorder) {
  19. return new Promise((resolve) => {
  20. recorder.stop(() => {
  21. const filePath = recorderOptions.filename;
  22. resolve(filePath);
  23. });
  24. });
  25. }

2. 百度语音识别集成

2.1 WebSocket连接

百度语音识别通过WebSocket协议传输音频数据:

  1. // 生成鉴权Token
  2. async function getAccessToken(apiKey, secretKey) {
  3. const res = await uni.request({
  4. url: `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${apiKey}&client_secret=${secretKey}`
  5. });
  6. return res.data.access_token;
  7. }
  8. // 建立WebSocket连接
  9. async function connectWebSocket(token) {
  10. const socketUrl = `wss://vop.baidu.com/websocket_asr?token=${token}&cuid=${plus.device.uuid}&server=1`;
  11. return new Promise((resolve) => {
  12. const socketTask = uni.connectSocket({ url: socketUrl });
  13. socketTask.onOpen(() => resolve(socketTask));
  14. });
  15. }

2.2 音频数据传输

需将录音文件转为Base64并分片发送:

  1. // 读取音频文件并分片发送
  2. async function sendAudioData(socketTask, filePath) {
  3. const fileContent = await plus.io.readFile({ filePath });
  4. const base64Data = uni.base64ToArrayBuffer(fileContent);
  5. // 发送开始标记
  6. socketTask.send({
  7. data: JSON.stringify({
  8. format: 'wav',
  9. rate: 16000,
  10. channel: 1,
  11. cuid: plus.device.uuid,
  12. token: await getAccessToken(API_KEY, SECRET_KEY)
  13. })
  14. });
  15. // 分片发送音频数据(每1280字节)
  16. const chunkSize = 1280;
  17. for (let i = 0; i < base64Data.byteLength; i += chunkSize) {
  18. const chunk = base64Data.slice(i, i + chunkSize);
  19. socketTask.send({ data: chunk });
  20. }
  21. // 发送结束标记
  22. socketTask.send({ data: JSON.stringify({ end: true }) });
  23. }

3. 实时识别结果处理

通过WebSocket消息回调获取识别结果:

  1. function setupWebSocketListeners(socketTask) {
  2. let finalResult = '';
  3. socketTask.onMessage((res) => {
  4. const data = JSON.parse(res.data);
  5. if (data.result) {
  6. finalResult += data.result[0]; // 累加中间结果
  7. }
  8. if (data.result_type === 'final_result') {
  9. console.log('最终结果:', finalResult);
  10. // 更新UI显示
  11. uni.showToast({ title: `识别完成: ${finalResult}` });
  12. }
  13. });
  14. }

四、完整实现示例

  1. export default {
  2. data() {
  3. return {
  4. isRecording: false,
  5. recognitionResult: '',
  6. API_KEY: '你的API_KEY',
  7. SECRET_KEY: '你的SECRET_KEY'
  8. };
  9. },
  10. methods: {
  11. async startRecording() {
  12. try {
  13. this.isRecording = true;
  14. const recorder = await startRecord();
  15. const token = await getAccessToken(this.API_KEY, this.SECRET_KEY);
  16. const socketTask = await connectWebSocket(token);
  17. setupWebSocketListeners(socketTask);
  18. // 5秒后停止录音(示例)
  19. setTimeout(async () => {
  20. const filePath = await stopRecord(recorder);
  21. sendAudioData(socketTask, filePath);
  22. this.isRecording = false;
  23. }, 5000);
  24. } catch (error) {
  25. console.error('录音失败:', error);
  26. }
  27. }
  28. }
  29. };

五、优化与注意事项

  1. 错误处理

    • 添加网络状态检测(uni.getNetworkType
    • 处理WebSocket断开重连逻辑
  2. 性能优化

    • 使用Worker线程处理音频数据
    • 实现音频压缩(如Opus编码)
  3. 平台差异

    • Android需动态申请录音权限
    • iOS需配置后台运行模式
  4. 安全建议

    • 不要在前端硬编码API密钥
    • 通过后端服务中转鉴权请求

六、总结

通过uniapp结合百度语音识别API,开发者可快速实现跨平台语音交互功能。本文提供的实现方案覆盖了录音管理、WebSocket通信、实时结果处理等核心环节,实际开发中可根据需求扩展文件上传、多语言识别等高级功能。建议参考百度官方文档[1]和uniapp插件市场[2]中的相关组件,进一步提升开发效率。

[1] 百度语音识别API文档:https://cloud.baidu.com/doc/SPEECH/s/5k38y0wab
[2] uniapp插件市场:https://ext.dcloud.net.cn/

相关文章推荐

发表评论