麦克风语音活动检测
从麦克风驱动 OBS。这是经典的 VTuber “说话→动画、静默→休息”循环,完全在引擎内实现。插件通过 OBS InputVolumeMeters 监视输入的音频电平,经过防抖迟滞检测器处理(使用起音/释放时间,避免短暂停顿导致状态闪烁),并在输入跨越说话 ⟷ 静默时触发事件。
用法
UInhyeongOBSSubsystem* OBS = GetGameInstance()->GetSubsystem<UInhyeongOBSSubsystem>();
// Start detecting. ThresholdDb / Attack / Release default to sensible voice values.
OBS->EnableMicActivityDetection(TEXT("Mic/Aux"), /*ThresholdDb=*/-40.f, /*Attack=*/0.05f, /*Release=*/0.5f);
// React to talking <-> idle transitions
OBS->OnMicActivityChanged.AddDynamic(this, &AMyActor::HandleMicActivity);
// ...or poll on demand
bool bTalking = OBS->IsMicActive(TEXT("Mic/Aux"));
// Stop detecting (leaves the underlying meter subscription on for other consumers)
OBS->DisableMicActivityDetection(TEXT("Mic/Aux"));
API
| 成员 | 说明 |
|---|---|
EnableMicActivityDetection(Input, ThresholdDb=-40, Attack=0.05, Release=0.5) | 开始对指定输入进行检测,自动启用该输入的音量表。 |
DisableMicActivityDetection(Input) | 停止检测。保留底层音量表订阅,因为其他使用方可能仍依赖它。 |
IsMicActive(Input) | 轮询当前说话/静默状态。 |
OnMicActivityChanged | 每次说话 ⟷ 静默切换时触发。 |
参数
- ThresholdDb:将输入判定为”说话”的峰值 dB 电平阈值。
- Attack:电平持续高于阈值多少秒后切换为说话状态。
- Release:电平持续低于阈值多少秒后切换回静默状态(延迟覆盖短暂停顿,避免状态闪烁)。
工作原理
EnableMicActivityDetection 会自动将输入的音量表纳入监视,无需手动管理订阅。如果只需要原始电平(例如游戏内 VU 表),可调用 SetVolumeMetersEnabled(true) 并直接绑定 OnInputVolumeMeters。详见音频指南。
说话/静默状态也可作为 Trigger Volume 条件使用。详见 OBS Trigger Volume。
注意: OBS 对静音输入发送空电平,因此检测仅在未静音且有声音的来源上激活。
另请参阅
- 音频指南:音量表、静音/音量控制与原始电平流。
- OBS Trigger Volume:基于说话/静默状态对空间触发器进行门控。