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)
核心启发
-
视频内容检索:为视频库添加基于声音的搜索功能。用户搜索”婴儿哭声”,系统自动定位到对应片段。
-
实时环境感知:为视障用户开发辅助应用,检测门铃、警报、婴儿哭声等关键声音并发出提醒。
-
智能家居自动化:结合 Shortcuts,当检测到特定声音(如玻璃破碎、烟雾报警)时触发自动化流程。
-
音频内容审核:直播或语音聊天应用中,实时检测不当声音内容。
-
自定义声音检测:用 CreateML 训练特定场景的声音模型(如工厂设备异常声音),借助 Audio Feature Print 获得更高精度。
关联 Session
- Training Sound Classification Models in Create ML — WWDC19 的 CreateML 声音分类训练指南
- Meet Shortcuts for macOS — 将声音分类集成到 macOS 快捷指令工作流
- Explore structured concurrency in Swift — 用 Swift 并发处理音频分析任务
- Protect mutable state with Swift actors — 在多线程音频处理中保护共享状态
评论
GitHub Issues · utterances