2026山东大学软件学院项目实训-宠物情绪识别(五)
一、本周工作概述
本周主要完成了以下三项核心工作:
-
云数据库申请与配置:为项目后续的健康评估模块准备数据环境
-
大模型 API 迁移:从 DashScope通义千问迁移至 SophNet 平台 Qwen-max
-
音频特征提取优化:将原始声学数值转换为模型易理解的自然语言描述
二、云数据库申请与配置
在腾讯云申请 MySQL 实例:
-
外网开启

-
验证连接成功并在环境内完成数据表初始设置:

三、大模型API 迁移
1.API配置
SophNet 提供 OpenAI 兼容的 API 格式,支持通义千问、DeepSeek、GLM 等多种模型。
# backend/config.py
class Config:
# SophNet 平台配置
SOPHNET_API_KEY = "新API Key"
SOPHNET_BASE_URL = "https://www.sophnet.com/api/open-apis/v1"
2.客户端封装
def __init__(self, model="qwen-turbo"):
self.model = model
self.api_key = Config.SOPHNET_API_KEY
self.api_url = "https://www.sophnet.com/api/open-apis/v1/chat/completions"
self.prompt_template = """
你是专业的宠物情绪分析专家。请根据下面的音频特征分析宠物的情绪状态。
{features}
【判断规则】
1. 情绪类型只能从【兴奋、焦虑、痛苦、平静】中选择一个
2. 置信度:0-1之间,越接近1越确定
3. 分析依据:结合特征描述说明为什么这样判断
【判断参考】
- 音量很大 + 音调剧烈波动 + 声音尖锐 → 可能是兴奋或痛苦
- 声音变化非常快 + 音调波动明显 + 音色剧烈变化 → 可能是焦虑
- 音量低 + 声音平稳 + 变化缓慢 → 可能是平静
只返回标准JSON,格式如下:
{{"emotion": "情绪", "confidence": 0.xx, "analysis": "分析依据"}}
""".strip()
3.情绪分析器重构
def analyze(self, audio_features):
prompt = self.prompt_template.format(features=audio_features)
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json",
"User-Agent": "curl/7.68.0", # 新增:伪装成 curl
"Accept": "application/json",
}
data = {
"model": self.model,
"messages": [{"role": "user", "content": prompt}]
}
try:
response = requests.post(self.api_url, headers=headers, json=data, timeout=20)
# ---------- 新增调试信息开始 ----------
print(f"[DEBUG] API 响应状态码: {response.status_code}")
if response.status_code != 200:
print(f"[DEBUG] API 错误响应内容: {response.text}")
# ---------- 新增调试信息结束 ----------
if response.status_code != 200:
# 这里把错误信息原样抛出,方便上层看到
raise RuntimeError(f"API 请求失败,状态码: {response.status_code}, 响应: {response.text}")
resp = response.json()
content = resp["choices"][0]["message"]["content"].strip()
# 清理格式
if content.startswith("```json"):
content = content.lstrip("```json").rstrip("```").strip()
elif content.startswith("```"):
content = content.lstrip("```").rstrip("```").strip()
result = json.loads(content)
print(f"[DEBUG] 解析成功,情绪结果: {result}") # 打印成功结果
return result
except Exception as e:
# 打印完整的异常堆栈,方便定位问题
import traceback
traceback.print_exc()
raise RuntimeError(f"情绪分析失败:{str(e)}")
四、音频特征提取优化
1.优化前的问题
原特征提取器直接输出原始数值:
MFCC前5维均值:[-364.6, 59.1, -29.2, -4.8, 11.4] 能量均值:0.0423 过零率均值:0.1683
通用大模型无法理解这些声学数值的含义,导致无法做出有效判断,所以迁移后模型返回的情绪结果全部相同(均为“平静”)。
2.优化方案
新增自然语言转换层,将数值映射为可读描述:
# 能量描述
if energy_mean < 0.02:
energy_desc = "音量很低,声音微弱"
elif energy_mean < 0.05:
energy_desc = "音量适中,正常响度"
elif energy_mean < 0.1:
energy_desc = "音量较大,声音明显"
else:
energy_desc = "音量很大,声音响亮"
3.优化后输出示例

4.进一步优化
原先的模型对特征值识别分析效果有待进一步提高,所以我继续对比了qwen其他大模型对提取出的特征值的情绪分析效果,最终决定选用qwen-max实现预期效果:
def __init__(self, model="qwen-max"):
self.model = model
self.api_key = Config.SOPHNET_API_KEY
self.api_url = "https://www.sophnet.com/api/open-apis/v1/chat/completions"
self.prompt_template = """
你是专业的宠物情绪分析专家。请根据下面的音频特征分析宠物的情绪状态。
{features}
【判断规则】
1. 情绪类型只能从【兴奋、焦虑、痛苦、平静】中选择一个
2. 置信度:0-1之间,越接近1越确定
3. 分析依据:结合特征描述说明为什么这样判断
【判断参考】
- 音量很大 + 音调剧烈波动 + 声音尖锐 → 可能是兴奋或痛苦
- 声音变化非常快 + 音调波动明显 + 音色剧烈变化 → 可能是焦虑
- 音量低 + 声音平稳 + 变化缓慢 → 可能是平静
只返回标准JSON,格式如下:
{{"emotion": "情绪", "confidence": 0.xx, "analysis": "分析依据"}}
""".strip()
之后也将继续对比其他模型并不断训练,找出能力范围内最优的模型。
五、错误处理与调试
错误一:
现象:无论上传什么音频文件,模型都返回相同结果。
排查过程:
| 步骤 | 操作 | 结果 |
|---|---|---|
| 1 | 打印 API 响应状态码 | 200,请求成功 |
| 2 | 打印请求的 prompt 内容 | 确认特征数据已正确传入 |
| 3 | 用不同音频测试,打印特征数据 | 每次特征数据确实不同 |
| 4 | 在 audio.py 中添加特征打印 |
确认特征提取器工作正常 |
| 5 | 直接复制特征数据到平台 Web 界面测试 | 模型仍返回“平静” |
根因:
通用大语言模型无法理解原始声学数值。模型看到 np.float32(-364.6261) 这种数字时,不知道这意味着什么,只能返回最“安全”的默认结果。
解决方案:
将原始数值转换为自然语言描述。
错误二:API 请求返回 500 错误
现象:平台提供的 curl 命令可以正常调用,Python requests 调用返回 HTTP 500。
排查过程:
添加调试日志,打印请求和响应详情:
print(f"[DEBUG] 请求 URL: {self.api_url}")
print(f"[DEBUG] 请求头: {headers}")
print(f"[DEBUG] 响应状态码: {response.status_code}")
print(f"[DEBUG] 响应内容: {response.text}")
对比curl和 requests 的差异:
curl 有 User-Agent: curl/7.68.0,requests 默认是 User-Agent: python-requests/2.x.x。
根因:
SophNet API 网关对 User-Agent 头有检查,拒绝了 Python 默认的请求头。
解决方案:
在请求头中伪装成 curl:
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json",
"User-Agent": "curl/7.68.0", # 关键修复
}
六、运行效果验证
-
前端 Demo 可完整调通
-
音频上传 → 特征提取 → Qwen-Turbo 分析 → 前端展示

七、下周计划
-
对接腾讯云 MySQL 健康评估记录存储
-
完成历史记录模块前后端联调
-
开始养护建议生成功能开发
八、总结
本周完成了 API 迁移、特征提取优化等关键技术工作。核心收获是认识到:通用大模型无法直接理解原始声学数据,需要将数据“翻译”成模型能理解的自然语言。
目前系统已具备完整的音频上传 → 特征提取 → 情绪识别链路,为后续健康评估模块的开发奠定了基础。
更多推荐





所有评论(0)