Using SoundAnalysis With a Saved Audio File

May 19 2020

Classifying sounds in a saved audio file using the new SoundAnalysis framework isn't all that different from performing the classification in real-time. It's not hard either, but besides the WWDC session, there isn't much documentation available right now. Here's how to use the API:

Differences

While the real-time approach uses AVAudioEngine, we need to use SNAudioFileAnalyzer, which can be initialized with a URL. In your code you'll need to swap out url with the actual URL. Here's how to set the analyzer up:

do {
    let analyzer = try SNAudioFileAnalyzer(url: url)
    let request = try SNClassifySoundRequest(mlModel: model)
    analyzer.add(request, withObserver: self)
    analyzer.analyze()
} catch {
    print("Error: \(error.localizedDescription)")
}

Observing

To observe the results, we'll need to conform to the SNResultsObserving protocol1. Inside the request(_ request: SNRequest, didProduce result: SNResult) function we can get the results like this:

guard let classificationResult = result as? SNClassificationResult else { return }
let results = classificationResult.classifications

Each result (in results) has a confidence and an identifier.

Real-Time Analysis

If you are interested in how to run the analysis in real time, you should check out this article, which also covers how to train a model for this kind of classification in Create ML.


1 The functions request(_ request: SNRequest, didProduce result: SNResult), requestDidComplete(_ request: SNRequest) and request(_ request: SNRequest, didFailWithError error: Error) will have to be implemented.