跨模态情绪分析引擎

情绪是每次客户对话中的隐藏变量。一个礼貌打字的沮丧客户即将升级。一个声音颤抖的焦虑来电者需要立即关注。情绪分析引擎检测文本或语音单独无法揭示的内容 — 通过同时分析两个通道并随时间关联其信号。


1. 问题:单模态盲区

当前情绪分析工具存在一个根本性限制:一次只分析一种模态。

  • 纯文本工具(IBM Watson NLU、Google Cloud NL)从文字中检测情感但遗漏声音线索 — 客户用紧张的声音说”没事”会被识别为正面
  • 纯语音工具(Cogito、Beyond Verbal)检测声音模式但遗漏文本上下文 — 一个平静地提出的技术问题可能有沮丧的文本历史
  • 没有工具 能将两种模态融合到带有升级追踪的连续会话状态中

情绪分析引擎是首个将文本和语音作为并行信号通道处理、实时关联并产生统一会话状态的产品。


2. 文本情绪架构

评分模型

文本情绪评分使用多特征方法而非单一 ML 模型,确保透明性和校准可控:

文本情绪评分
1
关键词词典
加权词表:沮丧词(愤怒、不可接受、荒谬)、困惑词(迷惑、不清楚、搞不懂)、紧急词(立即、尽快、紧急)、平静词(好的、谢谢、没问题)
2
标点分析
感叹号(!!!)将沮丧度提升 1.5 倍。问号(???)提升困惑度。全大写提升紧急度。重复词表示强调。
3
强度融合
关键词权重 * 标点乘数 = 每个维度的原始强度。应用 sigmoid 归一化到 [0, 1]。
4
主导分类
最高得分维度成为 dominant_emotion。置信度 = 最高分 - 次高分。输出:TextEmotionScores。

输出契约

@dataclass(frozen=True)
class TextEmotionScores:
    frustration: float    # 0.0 - 1.0
    confusion: float      # 0.0 - 1.0
    urgency: float        # 0.0 - 1.0
    calm: float           # 0.0 - 1.0
    dominant_emotion: str  # 最高得分维度
    confidence: float     # 分类置信度

3. 语音情绪架构

声学特征提取

语音情绪分析从音频帧中提取声学特征开始:

能量特征
energy_mean — 帧内平均振幅energy_variance — 振幅稳定性度量intensity_drift — 滑动窗口内的趋势方向
基频特征
pitch_mean_hz — 平均说话频率pitch_variance — 频率稳定性(关键压力指标)pitch_range — 最低与最高音高之差
时间特征
speaking_rate — 估计每秒词数silence_ratio — 帧内静音比例speech_continuity — 流畅度分数(1.0=连续,0.0=碎片化)
派生评分
agitation = f(energy_variance, pitch_variance)stress = f(pitch_mean, speaking_rate, energy_drift)calm = 1 - max(agitation, stress)hesitation = f(silence_ratio, 1 - continuity)

语音情绪评分

@dataclass(frozen=True)
class VoiceEmotionScores:
    agitation: float       # 0.0 - 1.0
    stress: float          # 0.0 - 1.0
    calm: float            # 0.0 - 1.0
    hesitation: float      # 0.0 - 1.0
    dominant_emotion: str
    confidence: float

4. 情绪持续追踪

单次情绪评分是快照。情绪追踪器将其转换为连续时间线:

情绪变化检测
1
历史状态
上一个已知 EmotionEvent,包含评分和类型(detected/escalation/deescalation)
2
当前评分
来自最新输入的 TextEmotionScores 或 VoiceEmotionScores
3
差值计算
计算每个维度的差值。如果任何负面维度增加 > 0.15,标记为潜在升级。
4
事件分类
escalation(负面差值 > 阈值)、deescalation(正面差值 > 阈值)、或 detected(正常范围内)
5
EmotionEvent 发射
发射带有 correlation_id 链接到会话的类型化事件,包含差值和原因码

原因码

每个情绪事件都携带原因码以确保可审计:

  • TEXT_FRUSTRATION_SPIKE — 沮丧度跳升 > 0.2
  • VOICE_HIGH_ENERGY — 语音能量超过激动阈值
  • TEXT_NEUTRAL — 文本分析未显示强烈情绪
  • VOICE_PITCH_RISE — 音高变化表明压力增加

5. 证据包

证据包将所有会话数据打包供事后审查:

会话元数据
session_idduration_mschannel(语音/聊天)接入适配器
情绪漂移
文本情绪时间线语音情绪时间线跨通道漂移曲线升级事件
AMD 卡片
判定结果(人类/机器/蜂鸣)置信度分数特征值决策原因
转录文本
带时间戳的片段说话人标签语言检测置信度分数
升级摘要
原因码升级次数干预点解决结果
会话状态
当前状态 + 基础转换历史已采取的策略操作校准版本

6. 实现指标

指标数量
voice_intelligence.py 中的冻结契约10
voice_intelligence/ 中的纯域模块9
情绪相关内核测试85
共享层测试45
支持的接入适配器3(Twilio、RTP、SIPREC)
API 端点12
OctopusOS
有什么可以帮您?