# NO_VALID_AUDIO_ERROR 调试步骤 ## 🔍 问题分析 从日志来看,ASR 连接已打开,但是报错 `NO_VALID_AUDIO_ERROR`,说明服务器没有收到有效的音频数据。 ## ✅ 已完成的修复 1. ✅ 添加了 `ptt_on` 信号发送(在 `startTalking` 方法中) 2. ✅ 添加了 `frameSize: 5` 参数(启用实时音频帧传输) 3. ✅ 已有 `onFrameRecorded` 回调(实时发送音频帧) 4. ✅ 已有 `onStop` 回调(作为备用方案,发送完整文件) ## 📋 重新编译和测试 ### 1. 重新编译项目 在 HBuilderX 中: 1. 停止当前运行 2. 清理缓存:菜单 -> 运行 -> 清理缓存 3. 重新运行到手机/模拟器 ### 2. 测试步骤 1. 打开 App,进入语音通话页面 2. 按住"按住说话"按钮 3. 说话 3-5 秒 4. 松开按钮 5. 观察日志 ### 3. 预期日志(成功的情况) ``` ✅ 开始说话, isTalking 设置为: true 📤 发送 ptt_on 信号 ✅ ptt_on 信号发送成功 录音未启动,开始启动录音 === startRecording 被调用 === ✅ 录音已开始 🎤 收到音频帧 #1, isTalking: true, frameBuffer size: 3200 ✅ 发送音频帧到服务器, 帧号: 1 ✅ 音频帧发送成功, 帧号: 1 🎤 收到音频帧 #2, isTalking: true, frameBuffer size: 3200 ... === stopTalking 被调用 === ❌ 停止说话, isTalking 设置为: false 🛑 停止录音并准备发送... ⏹️ 录音已停止 ``` ### 4. 如果还是没有 "🎤 收到音频帧" 日志 说明 `onFrameRecorded` 在你的设备上不支持,这时会自动降级到 `onStop` 方案: **预期日志(降级方案):** ``` ✅ 开始说话, isTalking 设置为: true 📤 发送 ptt_on 信号 ✅ ptt_on 信号发送成功 录音未启动,开始启动录音 ✅ 录音已开始 === stopTalking 被调用 === 🛑 停止录音并准备发送... ⏹️ 录音已停止 📁 文件路径: /xxx/recorder/xxx.pcm ✅ 文件读取成功 📊 是否为 ArrayBuffer: true 📊 文件大小: 160000 bytes 📦 开始分片发送 📤 发送第 1 片,大小: 3200 bytes ✅ 第 1 片发送成功 ... ✅ 所有音频片段发送完成 ✅ ptt_off 信号发送成功 ``` ## 🐛 如果还是报错 ### 检查点 1:确认 ptt_on 信号是否发送 在日志中搜索: - `📤 发送 ptt_on 信号` - `✅ ptt_on 信号发送成功` 如果没有这些日志,说明代码没有重新编译。 ### 检查点 2:确认音频数据是否发送 在日志中搜索: - `🎤 收到音频帧`(实时方案) - 或 `📤 发送第 X 片`(降级方案) 如果没有这些日志,说明音频数据没有发送到服务器。 ### 检查点 3:WebSocket 连接状态 确认日志中有: ``` WebSocket onOpen ``` 并且在发送音频前,WebSocket 状态为 1(OPEN)。 ## 🔧 临时调试方案 如果上述都正常,但还是报错,可以尝试: ### 方案 1:增加延迟 在发送 `ptt_on` 后,等待 500ms 再开始录音: ```javascript // 发送 ptt_on 信号 this.socketTask.send({ data: 'ptt_on' }) // 等待 500ms,让服务器准备好 await new Promise(resolve => setTimeout(resolve, 500)) // 开始录音 if (!this.isRecording) { this.startRecording() } ``` ### 方案 2:检查服务器日志 查看服务器日志中是否有: ``` INFO - ASR connection opened INFO - mic_enabled set to True ``` 如果没有 "mic_enabled set to True",说明服务器没有收到 `ptt_on` 信号。 ### 方案 3:手动测试 WebSocket 使用 WebSocket 测试工具(如 Postman)连接到: ``` ws://你的服务器地址/voice/call?token=你的token&ptt=true ``` 然后手动发送: 1. 文本消息:`ptt_on` 2. 二进制消息:一些音频数据 3. 文本消息:`ptt_off` 看服务器是否正常响应。 ## 📞 联系支持 如果以上步骤都无法解决,请提供: 1. 完整的客户端日志(从连接到报错) 2. 完整的服务器日志(从连接到报错) 3. 设备信息(Android 版本、手机型号) 4. uni-app 版本和 HBuilderX 版本