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