Ai_GirlFriend/ASR问题修复总结.md

253 lines
6.0 KiB
Markdown
Raw Normal View History

2026-03-05 13:34:40 +08:00
# 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