Real-Time Speech, Audio, and Facial Analysis in Production AI Systems

Real-Time Speech, Audio, and Facial Analysis in Production AI Systems

实时语音、音频与面部分析在生产AI系统中的应用

https://ift.tt/nt14wre

上一个帖子覆盖了多模态融合、时序对齐和冲突解决,在架构层面。本篇将进入实际的模态处理——如何在实时生产系统中处理语音、音频情绪与面部分析。

Voice Activity Detection — 一切之先
大多数团队直接跳到 Whisper 进行语音转文本。在生产环境中,先需要 VAD。
语音活动检测用于判断谁在说话、何时是静音、何时是背景噪音。没有它,你会把静音音频块发送给 Whisper,浪费计算资源并得到幻觉式转写。Whisper 因此而臭名昭著——输入静音,它会自信地转写从未说过的话。

Silero VAD 是首选的轻量级选项。在 CPU 上运行,推理亚毫秒级,处理你需要的分段——何时开始说话、何时结束、以及之间的一切需要忽略的部分。

流水线顺序很重要:原始音频 → VAD → 仅对说话段落进行转写的模型。这本身就能够将 Whisper 的计算量降低 30–60%,这取决于你的音频流中有多少静默与空白。在远程医疗或呼叫中心场景,这些“空话”量会很大。

Speech-to-Text in Production
Whisper 是默认选择。但到底使用哪种 Whisper?
Whisper large-v3——最高准确率,模型约 1.5GB,若在单个 GPU 上处理多个并发流,Real-time 实时性太慢。
Distil-Whisper——蒸馏版本,参数减少 49%,推理速度提升 6 倍,对英语的准确度损失极小。这是大多数生产系统应当从此开始的。

Faster-Whisper——CTranslate2 后端,速度比 OpenAI 实现快最多 4 倍,且保持同等准确性。默认使用整型量化(int8)。如果你自行部署 Whisper,请使用 Faster-Whisper,而不是原始仓库。

对于实时流媒体,不能等到完整话语结束再进行转写。你需要分块处理——通常是 2–5 秒的窗口并有重叠。就像你在说话时,屏幕上就会出现你所说的话。

取舍在这里:更短的块会带来更快的响应时间,但在词边界上的准确度较差。较长的块提高准确性,但增加延迟。

实际设置:3 秒块,0.5 秒重叠,使用 Faster-Whisper 结合 VAD 预过滤。这样就达到了上一篇预算中的 300–500ms 延迟目标。

Handling Disfluencies
真实语言是混乱的。“I feel, um, like, you know, pretty good I guess.” 生产系统需要决定——要保留口吃还是去除?

对临床应用,保留。犹豫模式、填充词和自我更正带有诊断信号。口吃增加可能表明认知负荷、焦虑或神经系统变化。专业环境不一定需要(大多数情况下)但并非没有敏感领域。

对一般应用,在后处理阶段去除。在轻量级的文本清理模型或正则表达式规则下即可去除填充词而不丢失意义。

Audio Emotion Analysis
这部分基于原始音频信号,与转写分离。你不是在分析说了什么——是在分析他们是如何说的。

Feature Extraction
音频中承载情感信号的核心特征:
– Prosodic features(韵律特征)——音高(F0)、音高变异、说话速率、节奏模式。音高平坦、语速慢通常对应悲伤或疲劳。音高变异高、语速快对应兴奋或激动。
– Spectral features(谱特征)—— MFCCs(梅尔频谱系数)、谱质心、谱流。捕捉声音的音色与音调质量。颤抖的声音具有与稳定声音不同的谱特征。
– Voice quality features(嗓音质量特征)—— jitter(音高扰动)、 shimmer(幅度扰动)、HNR(谐波与噪声比)。这些捕捉声带的生理张力。应力与焦虑会显著增加 jitter 与 shimmer。

Model Options
– wav2vec 2.0——自监督的语音表示模型。对情感标注音频数据集(IEMOCAP、RAVDESS、MSP-IMPROV)进行微调。这是生产情感检测的强基线。
– HuBERT——与 wav2vec 2.0 类似的架构,通常在下游情感任务上略好一些。起源于 Facebook/Meta 研究。
– SpeechBrain——开源工具包,封装了这些模型并提供已有的情感识别配方。从零到能工作的情感分类器是最快的路径。
– Custom CNN on spectrograms——将音频转换成梅尔谱图,将情感检测视为图像分类问题。训练和调试更简单。比基于变换器的方法上限低,但在区分如 distress 与 no-distress 的二元分类上出乎意料地有效。

Practical Consideration
在 acted 数据集(RAVDESS、IEMOCAP 的大部分)上训练的情感模型,在真实世界的自发语音上表现较差,差距明显。被演绎的愤怒与真实愤怒听起来不同。如果你部署在临床或客服场景,需要在自然数据上进行微调,否则精度会很差。

Facial Analysis
面部分析分为三个层级,具有不同的计算成本与信号价值。

Face Detection
在分析任何内容之前,先在画面中找到人脸。MTCNN 和 RetinaFace 是标准。RetinaFace 在部分遮挡(口罩、手遮脸)下更准确。对于实时场景,5–10 帧检测一次,而不是每帧——因为人脸不会在帧间瞬移。使用轻量级跟踪器如 SORT 或 ByteTrack 在检测之间进行跟踪。

Facial Landmark Detection
68 点或 478 点(MediaPipe)标志检测。映射脸部几何结构——眉毛位置、嘴角、眼睛张合、下颚紧张度。这是后续表情分析所依赖的。

MediaPipe Face Mesh——478 个 3D 标志点,在 CPU 上运行,甚至在移动设备上也能实现实时。这是大多数团队的生产默认。由 Google 维护,文档完备,鲁棒性出人意料。

dlib——68 个标志点,较老但经过实战考验。略不如 MediaPipe 准确,但故障模式更可预测。

Facial Expression Recognition
– Action Unit(AU)检测——面部表情编码系统 FACS 将表情分解为单独的肌肉运动。AU4(眉毛下压)+ AU15(嘴角下拉)= 悲伤模式。这比分类情感标签更细粒度、临床更有用。模型:OpenFace 2.0、JAA-Net,或对 AU 标注数据集(BP4D、DISFA)微调的 ResNet。
– Categorical emotion classification——直接将面部映射到情感标签(高兴、悲伤、愤怒、恐惧、惊讶、厌恶、中性)。实现简单但失去细微差别。强制微笑和真实微笑都被分类为“高兴”——AU 检测能够区分它们(真实微笑包含 AU6,颊部抬升;强制微笑则不包含)。

对于临床应用,使用 AU 检测。肌肉层面的粒度是诊断价值所在。

Frame Rate and Processing
不需要处理每一帧。与视频帧率相比,面部表情变化较慢。每处理第 3 或第 5 帧(30fps)可获得每秒 6–10 次分析——足以捕捉表情转变。

这是一个重大的成本优化。在 30fps 时,每个患者每分钟要处理 1800 帧。若每第 5 帧处理一次,降至 360 帧。同样的信号,少 80% 的计算量。

Model Serving Strategy
同时运行 Whisper、情感模型和面部模型,会带来一个实际问题:每个模型放在哪里?
GPU 分配——Whisper(尤其是 large-v3)需要 GPU。音频情感模型如果使用特征提取+轻量分类器,CPU 就足够。面部检测与标志提取(MediaPipe)在 CPU 上运行良好。情感识别模型需要 GPU 但若量化后也可在 CPU 上以可接受的延迟运行。

大多数团队的实际拆分:
Whisper 放在 GPU,音频情感在 CPU,面部分析在 CPU(MediaPipe + 量化后的表情模型)。这样就能在单个 GPU 实例上同时服务三种模态,而不是三个。

Quantization——INT8 量化通过 ONNX Runtime,在大多数情感与表情模型上将推理时间缩短 2–3 倍,精度损失极小。Whisper 也受益于此——Faster-Whisper 使用的 CTranslate2 默认就应用了量化。

Batch size tuning——若你在处理多并发会话,将推理请求打包到 GPU 上驻留的模型。4–8 个 Whisper 块一起处理,要比 4–8 次逐一推理高效得多。这是同一硬件上支持 10 个并发会话与 50 个之间的差异。

When to use ONNX Runtime vs native PyTorch——ONNX 用于生产推理中的任意模型。PyTorch 用于训练与实验。ONNX Runtime 搭配 TensorRT(NVIDIA GPU 的执行提供者)提供最佳推理性能。转换步骤初看复杂,但对延迟和吞吐量带来即时回报。

Putting It Together
单一音视频输入的全模态流水线:
Raw audio → VAD(CPU,<1ms)→ 说话段落 → Whisper(GPU,300–500ms)→ 转写+时间戳 Raw audio → 特征提取(CPU,50ms)→ 情感模型(CPU,100–200ms)→ 情感标签+置信度 Video frames → 每第 5 帧进行人脸检测(CPU,20ms)→ 标志提取(CPU,10ms)→ 表情/AU 模型(CPU/GPU,50–100ms)→ 表情标签+置信度 三者并行运行。结果输入到来自上一篇的融合层(fusion layer)。总的时钟时间保持在 2 秒预算之内,因为没有等待任何一个环节。 这是实现层(implementation layer)。 下一篇将讨论评估、监控,以及这些模型在生产中退化时会发生什么。到时再见。 (附:原文图片链接略) April 13, 2026 at 10:39PM