Meine Reise mit SoundAnalysis
Ich bin kein Meister, aber ich bin bereit, etwas über Klanganalyse zu lernen!
Bei dieser Makro-Herausforderung beschließt mein Team, Komka zu erstellen, eine Anwendung, die Kindern mit Down-Syndrom helfen soll, ihre ausdrucksstarken Kommunikationsfähigkeiten zu verbessern. Eines der Merkmale von Komka ist Sound Practice. Diese Funktion hat einen kreisförmigen Fortschrittsbalken, der sich entsprechend der Ähnlichkeit der Wortaussprache des Kindes erhöht.
Ich werde versuchen zu erklären, wie mein Team diese Funktion entwickelt hat!
Zunächst trainiert mein Team das Modell mit createML. Nachdem wir das Modell haben, beginnen wir mit dem Setup für unser Feature.
Als erstes mache ich eine Klasse für den Audio Stream Manager, der AVFoundation importiert . AVFoundation ist ein Framework in iOS, mit dem Sie audiovisuelle Medien auf Apple-Plattformen prüfen, wiedergeben, erfassen und verarbeiten können.
Dies sind Variablen, die wir erstellen müssen.
private var audioEngine: AVAudioEngine?
private var soundAnalyzer: SNAudioStreamAnalyzer?
private var soundClassifierRequest: SNClassifySoundRequest?
Wir müssen auch eine Funktion zum Beenden der Audiositzung erstellen, wenn wir die Geräusche nicht mehr erkennen möchten. Die Verwendung einer Audiositzung dient dazu, dem Betriebssystem die allgemeine Art des Audios Ihrer App mitzuteilen, ohne das spezifische Verhalten oder die erforderlichen Interaktionen mit der Audiohardware zu beschreiben.
func stopAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
try? audioSession.setActive(false)
}
Wir müssen auch eine andere Funktion machen, um die Live-Audioaufnahme zu stoppen, die mit dem Audio-Ende verbunden ist. Wir müssen also sicherstellen, dass der Knoten der Audio-Engine entfernt wird.
func stopLiveRecord(){
guard let audioEngine = audioEngine else {
print("ERROR: AudioEngine Unavailable")
return
}
audioEngine.inputNode.removeTap(onBus: 0)
stopAudioSession()
}
Die folgende Funktion ist die Funktion zum Vorbereiten des SoundClassifiers unter Verwendung des zuvor erstellten Modells.
private func prepareSoundClassifier(){
let config = MLModelConfiguration()
let soundClassifier = try? SoundPracticeModel_Rev(configuration: config)
guard let soundClassifier = soundClassifier else{
print("ERROR: Model doesn't Exist")
return
}
soundClassifierRequest = try? SNClassifySoundRequest(mlModel: soundClassifier.model)
}
Zuletzt für den Audio-Stream-Manager. Wir werden die Funktion zum Starten der Live-Aufzeichnung erstellen
func startLiveRecord(){
stopLiveRecord()
do {
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.record, options: .mixWithOthers)
try audioSession.setActive(true)
} catch {
stopAudioSession()
print("ERROR: Stop Live record")
}
do{
let newAudioEngine = AVAudioEngine()
let busIndex = AVAudioNodeBus(0)
let audioFormat = newAudioEngine.inputNode.inputFormat(forBus: busIndex)
soundAnalyzer = SNAudioStreamAnalyzer(format: audioFormat)
newAudioEngine.inputNode.removeTap(onBus: busIndex)
newAudioEngine.inputNode.installTap(onBus: busIndex, bufferSize: 1024, format: audioFormat) {
(buffer, time) in
DispatchQueue.main.async {
self.soundAnalyzer?.analyze(buffer, atAudioFramePosition: time.sampleTime)
}
}
try newAudioEngine.start()
prepareSoundClassifier()
}
catch {
print("ERROR: \(error)")
}
}
Um das Konfidenzniveau Ihres Modells zu überprüfen, können Sie eine andere Klasse erstellen, die SNResultObserving verwendet .
class SoundAnalyzer: NSObject, ObservableObject, SNResultsObserving {
var confidence: Double?
var confidencePublisher = PublishSubject<Double>()
var currentWord: String = ""
func request(_ request: SNRequest, didProduce result: SNResult) {
guard let result = result as? SNClassificationResult else{
return
}
guard let highestResult = result.classifications.first else{
return
}
DispatchQueue.main.async {
if(self.currentWord == highestResult.identifier){
self.confidence = highestResult.confidence
self.confidencePublisher.onNext(self.confidence ?? 0)
}
}
}
}
Das ist alles, was ich getan habe, um die Sound Practice-Funktion zu erstellen, die den Sound Analyzer verwendet! Schließlich ist dies nur der grundlegende Schritt, um die Reise von Sound Analyzer zu meistern
Vielen Dank, dass Sie sich die Zeit genommen haben, diesen Artikel zu lesen. Ich hoffe, er hilft Ihnen auf Ihrem Weg zur Beherrschung von Sound Analyzer!

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































