Ai_GirlFriend/ASR问题修复总结.md
2026-03-05 13:34:40 +08:00

6.0 KiB
Raw Blame History

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. 前端测试

  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)

# 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