一、本周工作概述

本周主要完成了以下三项核心工作:

  1. 云数据库申请与配置:为项目后续的健康评估模块准备数据环境

  2. 大模型 API 迁移:从 DashScope通义千问迁移至 SophNet 平台 Qwen-max

  3. 音频特征提取优化:将原始声学数值转换为模型易理解的自然语言描述

二、云数据库申请与配置

在腾讯云申请 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.0requests 默认是 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 迁移、特征提取优化等关键技术工作。核心收获是认识到:通用大模型无法直接理解原始声学数据,需要将数据“翻译”成模型能理解的自然语言

目前系统已具备完整的音频上传 → 特征提取 → 情绪识别链路,为后续健康评估模块的开发奠定了基础。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐