What's new in voice processing
System & Services 进阶 20m

语音处理的新变化

What's new in voice processing

2023年6月5日

在 Apple 官方观看视频

一句话判断

两个新 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