WWDC Quick Look 💓 By SwiftGGTeam
Discover built-in sound classification in SoundAnalysis

Discover built-in sound classification in SoundAnalysis

观看原视频

Highlight

SoundAnalysis 框架内置了 300+ 类别的声音分类器,几行代码即可识别音频中的特定声音,无需训练自定义模型。

核心内容

2019 年,Apple 通过 CreateML 让开发者可以训练自己的声音分类模型。但收集数据、训练模型、调优参数,这些门槛挡住了很多人。

WWDC2021 把这个问题彻底简化了。SoundAnalysis 框架现在内置了一个预训练的声音分类器,覆盖 300 多种声音类别。开发者不需要懂机器学习,也不需要准备训练数据。

演示中,Jon 用 Mac 的麦克风实时检测环境中的声音。播放音乐时,分类器同时识别出”音乐”和”歌唱”。泡茶时,检测到”倒水”的声音。所有计算都在本地完成,音频不会上传到云端。

Kevin 展示了一个更实用的场景:他有一堆视频素材,想找其中包含”牛铃”声音的片段。他用内置分类器写了一个程序,配合 macOS 的快捷指令,自动扫描所有视频文件,找到目标声音后截取对应片段。整个过程自动化完成。

详细内容

获取内置分类器支持的声音列表

使用 SNClassifySoundRequest 的新初始化方法,可以查询内置分类器支持的所有声音类别。

func getListOfRecognizedSounds() throws -> [String] {
    let request = try SNClassifySoundRequest(classifierIdentifier: .version1)
    return request.knownClassifications
}

关键点:

  • classifierIdentifier: .version1 选择内置分类器
  • knownClassifications 返回所有支持的声音标签,共 300+ 个
  • 涵盖动物、乐器、人声、交通工具、警报、工具、液体等类别

对音频文件进行分类

创建分类请求和分析器,对指定音频文件执行分类。

let request = try SNClassifySoundRequest(classifierIdentifier: .version1)

let analyzer = try SNAudioFileAnalyzer(url: url)

var observer: SNResultsObserving // TODO

try analyzer.add(request, withObserver: observer)
analyzer.analyze()

关键点:

  • SNAudioFileAnalyzer 用于分析音频文件(08:59)
  • add(_:withObserver:) 将请求和观察者绑定到分析器
  • analyze() 开始异步分析

实现结果观察者

观察者接收分类结果,判断目标声音是否被检测到。

class FirstDetectionObserver: NSObject, SNResultsObserving {
    var firstDetectionTime = CMTime.invalid
    var label: String

    init(label: String) {
        self.label = label
    }

    func request(_ request: SNRequest, didProduce result: SNResult) {
        if let result = result as? SNClassificationResult,
           let classification = result.classification(forIdentifier: label),
           classification.confidence > 0.5,
           firstDetectionTime == CMTime.invalid {
                firstDetectionTime = result.timeRange.start
        }
    }
}

关键点:

  • 继承 NSObject 并遵循 SNResultsObserving 协议(09:52)
  • SNClassificationResult 包含多个分类及其置信度
  • classification(forIdentifier:) 提取指定标签的结果
  • 置信度阈值设为 0.5 是示例值,实际应根据场景调整
  • result.timeRange.start 记录声音发生的时间点

窗口时长与检测精度

音频信号被切分成重叠的时间窗口进行分析。窗口时长影响检测精度。

// 设置窗口时长
request.windowDuration = CMTime(seconds: 1.0, preferredTimescale: 1)

// 查询支持的窗口时长范围
let constraint = request.windowDurationConstraint

关键点:

  • 短窗口(如 0.5 秒)适合检测鼓点等短促声音,时间定位更精确(12:06)
  • 长窗口(如数秒)适合检测警笛等持续变化的声音,包含更多特征信息(12:38)
  • 内置分类器支持 0.5 秒到 15 秒的窗口时长(13:28)
  • 1 秒或更长是推荐的起点

置信度阈值的选择

内置分类器的置信度是独立的,不同声音可以设置不同阈值。

关键点:

  • 内置分类器的标签置信度相加为 1,各标签独立评分(14:21)
  • 高阈值减少误检,但可能漏检弱信号(14:44)
  • 不同声音可设置不同阈值
  • 修改窗口时长会影响置信度分数(15:06)

Audio Feature Print:自定义模型的特征提取器

CreateML 训练自定义声音分类模型时,默认使用内置分类器的特征提取器 Audio Feature Print。

关键点:

  • Audio Feature Print 将音频波形转换为低维特征向量(16:41)
  • 声学相似的声音在特征空间中距离更近
  • 比上一代特征提取器更小、更快、更准确(17:47)
  • 支持 0.5 秒到 15 秒的灵活窗口时长(18:01)
  • CreateML 中默认窗口时长为 3 秒,可调整(18:24)

核心启发

  1. 视频内容检索:为视频库添加基于声音的搜索功能。用户搜索”婴儿哭声”,系统自动定位到对应片段。

  2. 实时环境感知:为视障用户开发辅助应用,检测门铃、警报、婴儿哭声等关键声音并发出提醒。

  3. 智能家居自动化:结合 Shortcuts,当检测到特定声音(如玻璃破碎、烟雾报警)时触发自动化流程。

  4. 音频内容审核:直播或语音聊天应用中,实时检测不当声音内容。

  5. 自定义声音检测:用 CreateML 训练特定场景的声音模型(如工厂设备异常声音),借助 Audio Feature Print 获得更高精度。

关联 Session

评论

GitHub Issues · utterances