6.0 KiB
6.0 KiB
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 无法识别。
修复:
# 修复前
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 构建失败。
修复:
// 在 data() 中添加
data() {
return {
// ... 其他属性
baseURLPy: baseURLPy // 添加 baseURLPy 到 data
}
}
✅ 修复验证
1. OSS URL 生成测试
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 完整测试
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 调用流程
# 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. 前端测试
- 重新编译前端应用
- 打开语音通话页面
- 按住"按住说话"按钮
- 说话 2-3 秒:"你好,今天天气怎么样"
- 松开按钮
- 查看识别结果
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)
# 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 端口
- ✅ 前端配置正确的后端地址
🎯 总结
已修复的问题
- ✅ OSS URL 生成缺少协议前缀
- ✅ 前端 baseURLPy 未定义
- ✅ URL 格式验证逻辑
验证通过的功能
- ✅ OSS 连接和文件上传
- ✅ URL 格式正确性
- ✅ DashScope ASR API 调用流程
待真实录音测试
- ⏳ 前端录音功能
- ⏳ 完整的 ASR 识别流程
- ⏳ 识别结果展示
最后更新: 2026-03-05 修复版本: v1.1