System & Services 进阶 20m
语音处理的新变化
What's new in voice processing
2023年6月5日
一句话判断
两个新 API——其他音频压低控制和静音说话检测——让你的语音通话 app 体验更上一层楼。
这场 Session 讲了什么
Apple 的语音处理 API(Voice Processing APIs)提供了一流的音频信号处理能力,包括回声消除、噪声抑制和自动增益控制等。今年带来了两个新功能。
第一个是 Other Audio Ducking(其他音频压低)API。当你的 app 使用语音处理时,系统会自动压低其他音频的音量以提高语音清晰度。新的 API 让你可以精确控制压低行为:启用高级压低模式(根据双方是否在说话动态调整)和选择四个级别的压低量(Default/Min/Mid/Max)。这类似于 FaceTime SharePlay 中媒体音量随对话动态调整的体验。
第二个是静音说话检测(Muted Talker Detection)API。当用户在静音状态下说话时,系统会通知你的 app。你可以借此提醒用户取消静音。此 API 最早在 iOS 15 引入,现在扩展到了 macOS 14 和 tvOS 17。
值得深挖的点
高级压低模式的工作方式值得理解。当任何一方的参与者开始说话时,系统会增大压低量;当双方都不说话时,压低量自动减小。这与 FaceTime SharePlay 的行为一致——媒体播放音量在不说话时保持较高,一旦有人开始说话就自动降低。
静音检测的实现需要注意一个关键点:你必须使用 AUVoiceIO 或 AVAudioEngine 的 mute API 来实现静音功能,否则检测不会工作。这是一个合理的设计——只有通过官方 API 静音时,系统才能准确判断用户是否”忘记取消静音”。
代码片段
// AUVoiceIO: 配置其他音频压低
var config = AUVoiceIOOtherAudioDuckingConfiguration()
config.enableAdvancedDucking = true
config.duckingLevel = .min
AudioUnitSetProperty(
voiceIO,
kAUVoiceIOProperty_OtherAudioDuckingConfiguration,
kAudioUnitScope_Global,
0,
&config,
UInt32(MemoryLayout.size(ofValue: config))
)
// 静音说话检测
voiceIO.setMuted(true)
voiceIO.speechActivityEventHandler = { event in
switch event {
case .speechActivityHasStarted:
// 提醒用户取消静音
showUnmutePrompt()
case .speechActivityHasEnded:
break
@unknown default:
break
}
}
// AVAudioEngine 版本
let inputNode = engine.inputNode
inputNode.isMuted = true
inputNode.setSpeechActivityEventHandler { event in
// 处理事件
}
最佳实践
- 高级压低模式适合 SharePlay 等媒体+通话场景
- 根据你的 app 类型选择合适的压低级别
- 使用官方 mute API 实现静音,确保检测功能正常
- 语音处理 API 现在支持 tvOS,可在更多平台使用
- AUVoiceIO 和 AVAudioEngine 提供相同的语音处理能力
还有什么值得关注
- 语音处理 API 首次登陆 tvOS
- 两个控制维度可以独立使用,也可以组合
- 参考 “Discover Continuity Camera for tvOS” 了解 tvOS 相关内容
WWDC 2023