# ASR 语音识别问题修复总结 ## 🔍 问题诊断 ### 错误信息 ``` Expected URL scheme 'http' or 'https' but was 'file' ``` ### 问题根源 经过详细分析,发现了两个主要问题: #### 1. 后端 OSS URL 生成问题(已修复) **位置**: `lover/oss_utils.py` **问题**: 当配置了 `ALIYUN_OSS_CDN_DOMAIN` 时,如果 CDN 域名没有包含协议前缀(http:// 或 https://),生成的 URL 会缺少协议,导致 DashScope ASR 无法识别。 **修复**: ```python # 修复前 file_url = f"{settings.ALIYUN_OSS_CDN_DOMAIN.rstrip('/')}/{object_key}" # 修复后 cdn_domain = settings.ALIYUN_OSS_CDN_DOMAIN.rstrip('/') # 确保 CDN 域名包含协议 if not cdn_domain.startswith('http://') and not cdn_domain.startswith('https://'): cdn_domain = f"https://{cdn_domain}" file_url = f"{cdn_domain}/{object_key}" ``` #### 2. 前端 baseURLPy 未定义问题(已修复) **位置**: `xuniYou/pages/chat/phone.vue` **问题**: 在 `sendAudioToASR` 方法中使用了 `this.baseURLPy`,但该属性没有在 data 中定义,导致 URL 构建失败。 **修复**: ```javascript // 在 data() 中添加 data() { return { // ... 其他属性 baseURLPy: baseURLPy // 添加 baseURLPy 到 data } } ``` ## ✅ 修复验证 ### 1. OSS URL 生成测试 ```bash python test_oss_url_fix.py ``` **结果**: ``` ✅ OSS 连接成功 ✅ 文件上传成功 📍 生成的 URL: https://hello12312312.oss-cn-hangzhou.aliyuncs.com/voice_call/xxx.mp3 ✅ URL 格式正确(包含协议) ✅ URL 包含 Bucket 名称 ✅ 测试文件已删除 🎉 OSS URL 生成测试通过! ``` ### 2. DashScope ASR 完整测试 ```bash python test_dashscope_asr_complete.py ``` **结果**: ``` ✅ 上传成功 ✅ 任务创建成功 ❌ 识别失败: SUCCESS_WITH_NO_VALID_FRAGMENT 💡 原因: 测试音频是正弦波,不包含有效语音 ``` **说明**: 这是预期结果,因为测试音频不包含真实语音。使用真实录音应该可以正常识别。 ## 📋 DashScope ASR 官方文档要求 根据测试和官方文档,ASR 服务要求: ### 1. 文件 URL 要求 - ✅ 必须使用 HTTPS 或 HTTP 协议 - ✅ URL 必须可公开访问 - ✅ 文件必须存储在 OSS 或其他云存储服务 ### 2. 音频格式要求 - ✅ 支持格式: WAV, MP3, PCM, OPUS, SPEEX, AMR - ✅ 推荐采样率: 16kHz - ✅ 推荐声道: 单声道 - ✅ 推荐编码: 16-bit PCM ### 3. 音频内容要求 - ⚠️ 必须包含有效的语音内容 - ⚠️ 音频时长建议 1-60 秒 - ⚠️ 避免过多背景噪音 ### 4. API 调用流程 ```python # 1. 上传音频到 OSS file_url = upload_audio_file(audio_data, "wav") # 2. 创建 ASR 任务 task_response = Transcription.async_call( model='paraformer-v2', file_urls=[file_url], parameters={ 'format': 'wav', 'sample_rate': 16000, 'enable_words': False } ) # 3. 等待识别完成 result = Transcription.wait(task=task_id) # 4. 解析结果 if result.output.task_status == "SUCCEEDED": # 下载转录结果 transcription_url = result.output.results[0]['transcription_url'] response = requests.get(transcription_url) transcription_data = response.json() text = transcription_data['transcripts'][0]['text'] ``` ## 🔧 常见错误码 ### SUCCESS_WITH_NO_VALID_FRAGMENT **含义**: 音频中未检测到有效语音片段 **可能原因**: - 音频时长太短(< 0.5秒) - 音频内容是纯音乐或噪音 - 音频音量太小 - 音频格式损坏 **解决方案**: - 确保录音时长 > 1 秒 - 在安静环境录音 - 靠近麦克风说话 - 检查录音设备 ### FILE_DOWNLOAD_FAILED **含义**: DashScope 无法下载音频文件 **可能原因**: - OSS Bucket 权限设置不正确 - 文件 URL 不可公开访问 - 网络连接问题 **解决方案**: - 检查 OSS Bucket 的公共读权限 - 确保文件 URL 可以在浏览器中直接访问 - 检查防火墙设置 ### DECODE_ERROR **含义**: 音频格式解码失败 **可能原因**: - 音频格式不正确 - 文件头信息损坏 - 编码参数不匹配 **解决方案**: - 使用标准的 WAV 或 MP3 格式 - 确保采样率为 8kHz 或 16kHz - 使用单声道录音 ## 🚀 下一步测试 ### 1. 前端测试 1. 重新编译前端应用 2. 打开语音通话页面 3. 按住"按住说话"按钮 4. 说话 2-3 秒:"你好,今天天气怎么样" 5. 松开按钮 6. 查看识别结果 ### 2. 预期结果 **前端控制台**: ``` 📁 开始处理录音文件 ✅ 文件读取成功,开始发送到ASR 📤 发送ASR请求... ✅ ASR响应: {text: "你好,今天天气怎么样"} ``` **后端日志**: ``` INFO - 收到 JSON ASR 请求,格式: wav INFO - 解码音频数据成功,大小: XXX 字节 INFO - 上传 WAV 文件到 OSS... INFO - 文件上传成功: https://... INFO - 调用 DashScope ASR... INFO - ASR 任务已创建: xxx INFO - ASR 识别成功 INFO - 最终 ASR 识别结果: 你好,今天天气怎么样 ``` ## 📝 配置检查清单 ### 环境变量 (.env) ```bash # DashScope API Key DASHSCOPE_API_KEY=sk-xxx # OSS 配置 ALIYUN_OSS_ACCESS_KEY_ID=xxx ALIYUN_OSS_ACCESS_KEY_SECRET=xxx ALIYUN_OSS_BUCKET_NAME=xxx ALIYUN_OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com ALIYUN_OSS_CDN_DOMAIN=https://xxx.oss-cn-hangzhou.aliyuncs.com # ASR 配置 VOICE_CALL_ASR_MODEL=paraformer-realtime-v2 VOICE_CALL_ASR_SAMPLE_RATE=16000 ``` ### OSS Bucket 权限 - ✅ 公共读权限已开启 - ✅ 跨域配置已设置(如需要) - ✅ AccessKey 有上传和删除权限 ### 网络配置 - ✅ 后端服务运行在 0.0.0.0:30102 - ✅ 防火墙允许 30102 端口 - ✅ 前端配置正确的后端地址 ## 🎯 总结 ### 已修复的问题 1. ✅ OSS URL 生成缺少协议前缀 2. ✅ 前端 baseURLPy 未定义 3. ✅ URL 格式验证逻辑 ### 验证通过的功能 1. ✅ OSS 连接和文件上传 2. ✅ URL 格式正确性 3. ✅ DashScope ASR API 调用流程 ### 待真实录音测试 1. ⏳ 前端录音功能 2. ⏳ 完整的 ASR 识别流程 3. ⏳ 识别结果展示 --- **最后更新**: 2026-03-05 **修复版本**: v1.1