车载语音情感识别:从舱内麦克风到驾驶员压力检测的技术路线

论文信息

  • 标题: Global-Local-Feature-Fused Driver Speech Emotion Detection for Intelligent Cockpit in Automated Driving
  • 期刊: IEEE Transactions on Intelligent Vehicles
  • 链接: https://ieeexplore.ieee.org/document/10077759
  • 发表日期: 2023年(2026年引用更新)
  • 相关研究: AISHELL-5 (Interspeech 2025)、语音压力检测系统综述 (2021-2025)

核心创新

首次提出全局-局部特征融合的驾驶员语音情感检测框架,专门针对智能座舱自动驾驶场景。系统通过车内麦克风采集驾驶员语音,识别6种情绪状态(中性、快乐、悲伤、愤怒、恐惧、惊讶),为自动驾驶系统提供驾驶员状态参考。

关键背景:

  • 2026年四大车载语音助手(Google Gemini, Amazon Alexa+, Cerence xUI, SoundHound Chat AI)均搭载LLM
  • Euro NCAP 2026年1月协议将语音列为安全功能替代输入
  • 语音情感检测可补充DMS的视觉疲劳/分心检测

方法详解

1. 车载语音情感检测架构

2. 核心代码复现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import torch
import torch.nn as nn
import torchaudio
from typing import Tuple

class DriverSpeechEmotionDetector(nn.Module):
"""
驾驶员语音情感检测器

论文: IEEE Trans. Intelligent Vehicles
架构: 全局(CNN) + 局部(LSTM) 特征融合

情绪类别: neutral, happy, sad, angry, fear, surprise
"""

def __init__(self, num_emotions=6, sample_rate=16000):
super().__init__()
self.sample_rate = sample_rate

# 音频预处理
self.mel_transform = torchaudio.transforms.MelSpectrogram(
sample_rate=sample_rate,
n_fft=1024,
hop_length=512,
n_mels=80
)

# 全局分支:CNN处理频谱图
self.global_branch = nn.Sequential(
nn.Conv2d(1, 32, 3, padding=1),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2),

nn.Conv2d(32, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2),

nn.Conv2d(64, 128, 3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(),
nn.AdaptiveAvgPool2d((1, 1))
)

# 局部分支:LSTM处理时序特征
self.local_branch = nn.LSTM(
input_size=80, # mel bands
hidden_size=128,
num_layers=2,
batch_first=True,
bidirectional=True,
dropout=0.3
)

# 融合+分类
self.classifier = nn.Sequential(
nn.Linear(128 + 256, 256), # global + local
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(256, 128),
nn.ReLU(),
nn.Linear(128, num_emotions)
)

# 压力等级回归(0-1)
self.stress_regressor = nn.Sequential(
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 1),
nn.Sigmoid()
)

def forward(self, audio: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
"""
Args:
audio: 音频波形, shape=(B, 1, samples)

Returns:
emotion_logits: (B, num_emotions)
stress_level: (B, 1) 0-1
"""
# 提取Mel频谱图
mel = self.mel_transform(audio.squeeze(1)) # (B, n_mels, time)
mel = torch.log(mel + 1e-9) # log-mel

# 全局特征
mel_2d = mel.unsqueeze(1) # (B, 1, n_mels, time)
global_feat = self.global_branch(mel_2d) # (B, 128, 1, 1)
global_feat = global_feat.flatten(1) # (B, 128)

# 局部特征
mel_t = mel.transpose(1, 2) # (B, time, n_mels)
local_out, _ = self.local_branch(mel_t) # (B, time, 256)
local_feat = local_out[:, -1, :] # 取最后时刻 (B, 256)

# 融合
fused = torch.cat([global_feat, local_feat], dim=1) # (B, 384)

# 分类
emotion_logits = self.classifier(fused)
stress_level = self.stress_regressor(fused[:, :128])

return emotion_logits, stress_level


class CabinVoicePipeline:
"""
车载语音情感检测完整管道

挑战:
1. 车内噪声(发动机/风/路面)
2. 远场采集(1-2米距离)
3. EV座舱声学不同于燃油车
4. 多乘员干扰
"""

# 情绪→IMS状态映射
EMOTION_TO_STATE = {
'neutral': {'stress': 0.2, 'alert': True, 'action': 'none'},
'happy': {'stress': 0.1, 'alert': True, 'action': 'none'},
'sad': {'stress': 0.4, 'alert': False, 'action': 'monitor'},
'angry': {'stress': 0.8, 'alert': True, 'action': 'warn'},
'fear': {'stress': 0.9, 'alert': True, 'action': 'alert'},
'surprise': {'stress': 0.6, 'alert': True, 'action': 'monitor'},
}

def __init__(self):
self.model = DriverSpeechEmotionDetector()
self.model.eval()

# 车内噪声阈值
self.SNR_THRESHOLD = 5 # 最低5dB信噪比

# EV特有问题:低频路面噪声与男性语音重叠
self.ROAD_NOISE_BAND = (100, 500) # Hz

def process_utterance(self, audio: np.ndarray,
speaker_location: str = 'driver') -> dict:
"""
处理一段语音

Args:
audio: 音频波形
speaker_location: 'driver'/'passenger'/'rear'

Returns:
dict: 情绪+压力+IMS建议
"""
if speaker_location != 'driver':
return {'skip': True, 'reason': 'non_driver_speech'}

# SNR检查
snr = self._compute_snr(audio)
if snr < self.SNR_THRESHOLD:
return {'skip': True, 'reason': f'low_snr_{snr:.1f}dB'}

# 推理
with torch.no_grad():
audio_t = torch.FloatTensor(audio).unsqueeze(0).unsqueeze(0)
emotion_logits, stress = self.model(audio_t)

emotion_probs = torch.softmax(emotion_logits, dim=1)
emotion_idx = emotion_probs.argmax(1).item()
emotions = ['neutral', 'happy', 'sad', 'angry', 'fear', 'surprise']
emotion = emotions[emotion_idx]

state = self.EMOTION_TO_STATE[emotion]

return {
'emotion': emotion,
'emotion_confidence': emotion_probs[0, emotion_idx].item(),
'stress_level': stress.item(),
'ims_action': state['action'],
'alert': state['alert'],
'snr_db': snr
}

def _compute_snr(self, audio: np.ndarray) -> float:
"""计算信噪比"""
# 简化版:假设前100ms为噪声
if len(audio) < 1600:
return 0
noise = audio[:1600]
signal = audio[1600:]

noise_power = np.mean(noise**2)
signal_power = np.mean(signal**2)

if noise_power == 0:
return 100

return 10 * np.log10(signal_power / noise_power)

3. 车载语音数据集对比

数据集 语言 时长 场景 通道 年份
AISHELL-5 中文 100+小时 60+真实驾驶场景 4远场 2025
ICMC-ASR 中文 1000+小时 多人多通道 多通道 2024
CI-AVSR 粤语 - 车载 - -
AVICAR 英文 - 车载(2004年车) 多通道 2004
SPEECHDAT-CAR 多语 - 车载(2000年车) - 2000
EMO-DB 德文 535句 录音室 近场 2005
IEMOCAP 英文 12小时 录音室 近场 2008

关键问题: 公开车载语音数据集几乎全是中文,欧洲语言严重缺乏。

4. EV座舱声学挑战

挑战 燃油车 EV 影响
发动机噪声 宽带掩盖 无 EV更安静但路面噪声更突出
路面噪声 100-500Hz 100-500Hz 与男性语音基频重叠
风噪 200-1000Hz 200-1000Hz 随车速增加
HVAC噪声 中等 中等 相似
主动降噪(ANC) 无 有 影响ASR前端
Lombard效应 中等 显著 噪声中人声提高+频谱偏移

5. Euro NCAP 2026语音安全要求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Euro NCAP 2026 语音相关要求
ENCAP_VOICE_REQUIREMENTS = {
'touchscreen_penalty': '核心功能仅触屏→扣分',
'voice_accepted': '语音是接受的替代输入',
'recognition_quality': '识别质量=安全话题',
'implementation': '语音命令不得需要驾驶员低头看屏幕',
}

# EU AI Act 对情感识别的规定
EU_AI_ACT = {
'emotion_recognition_ban': '工作场所和教育场景禁止',
'safety_exception': '疲劳检测用于事故预防不在此定义内',
'recital_18': '检测疲劳等物理状态→事故预防→豁免',
'cabin_systems': '需项目级法律分类',
'requirements': ['知情同意', '透明度', '数据最小化', 'GDPR合规']
}

IMS开发启示

1. 语音情感在DMS中的角色

DMS信号 检测什么 语音补充什么
PERCLOS 疲劳 压力/情绪(疲劳的人不一定有情绪)
视线 分心 愤怒/恐惧(分心的人不一定情绪化)
HRV 认知负荷 情绪类型(HRV无法区分愤怒和恐惧)
语音 情绪+压力 唯一非接触情绪信号

2. 多模态融合方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class MultimodalDriverState:
"""
视觉+语音+生理多模态驾驶员状态

语音补充视觉无法检测的情绪维度
"""

def __init__(self):
self.weights = {
'visual_fatigue': 0.35, # PERCLOS
'visual_distraction': 0.20, # 视线偏离
'voice_emotion': 0.15, # 语音情绪
'voice_stress': 0.15, # 语音压力
'hrv': 0.15 # 心率变异性
}

def assess(self, visual_fatigue, visual_distraction,
voice_emotion, voice_stress, hrv):
"""
多模态评估

Returns:
state: 'normal'|'stressed'|'fatigued'|'dangerous'
"""
scores = {
'visual_fatigue': visual_fatigue,
'visual_distraction': visual_distraction,
'voice_emotion': voice_emotion,
'voice_stress': voice_stress,
'hrv': hrv
}

total = sum(self.weights[k] * scores[k] for k in scores)

if total > 0.7:
return 'dangerous'
elif total > 0.5:
return 'stressed'
elif total > 0.3:
return 'fatigued'
else:
return 'normal'

3. 部署优先级

优先级 功能 技术方案 周期
P0 语音活动检测(VAD) WebRTC VAD 1个月
P1 降噪+说话人识别 深度学习降噪 3个月
P1 压力等级回归 CNN+LSTM 6个月
P2 6类情绪分类 全局-局部融合 12个月
P2 多乘员区分 多区域麦克风 12个月
P3 方言/多语言 预训练模型微调 18个月

4. 硬件参考

组件 型号 参数 成本
麦克风阵列 4-MEMS阵列 16kHz, SNR>65dB ~$10
音频处理DSP 专用或NPU 16kHz处理 现有
扬声器分区 4区域 驾驶员/副驾/后排 ~$20
ANC集成 现有ANC 复用噪声参考 现有

5. 车载语音助手生态对比

平台 厂商 搭载品牌 语言数 情感识别
Gemini built-in Google Volvo, Polestar 多语 ❌
Alexa+ Amazon BMW iX3 德英2种 ❌
xUI + CaLLM Cerence VW, Audi, BYD 5+8种 ⚠️ 部分
Chat AI SoundHound Stellantis等 多语 ❌

IMS机会: 现有车载助手均不做情感识别——IMS可填补这个空白。

总结

语音情感识别在座舱中处于早期阶段,但有其独特价值——唯一非接触的情绪信号通道。

对IMS的5条可执行建议:

  1. 语音是视觉DMS的补充而非替代——情绪维度无法从摄像头获得
  2. 压力检测比情绪分类更实用——二分类(正常/压力)准确率更高
  3. EV座舱声学是新的工程挑战——路面噪声与语音重叠
  4. AISHELL-5是最佳训练参考——2025年最新真实驾驶场景
  5. Euro NCAP将语音列为安全功能——识别质量直接影响安全评分

论文链接: https://ieeexplore.ieee.org/document/10077759
数据集: AISHELL-5 (Interspeech 2025)