253 lines
6.0 KiB
Markdown
253 lines
6.0 KiB
Markdown
|
|
# 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
|