Il mio viaggio con SoundAnalysis
Non sono un maestro, ma sono disposto a conoscere l'analisi del suono!
In questa Macro Challenge, il mio team decide di realizzare Komka, un'applicazione per aiutare i bambini con sindrome di Down a migliorare la loro capacità di comunicazione espressiva. Una delle caratteristiche di Komka è Sound Practice. Questa funzione ha una barra di avanzamento circolare che aumenterà in base alla somiglianza di come il bambino pronuncia la parola.
Proverò a spiegare come il mio team ha creato questa funzione!
Prima di tutto, il mio team addestra il modello utilizzando createML. Dopo aver ottenuto il modello, iniziamo a configurare la nostra funzione.
La prima cosa che faccio è creare una classe per il gestore di flussi audio che importa AVFoundation . AVFoundation è un framework in iOS che ti consente di ispezionare, riprodurre, acquisire ed elaborare supporti audiovisivi su piattaforme Apple.
Queste sono variabili che dobbiamo creare.
private var audioEngine: AVAudioEngine?
private var soundAnalyzer: SNAudioStreamAnalyzer?
private var soundClassifierRequest: SNClassifySoundRequest?
Dobbiamo anche creare una funzione per interrompere la sessione audio quando non vogliamo più rilevare i suoni. L'uso di una sessione audio consiste nel comunicare al sistema operativo la natura generale dell'audio dell'app senza dettagliare il comportamento specifico o le interazioni richieste con l'hardware audio.
func stopAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
try? audioSession.setActive(false)
}
Abbiamo anche bisogno di fare un'altra funzione per fermare la registrazione audio dal vivo che è collegata al finale audio. Quindi dobbiamo assicurarci di rimuovere il nodo del motore audio.
func stopLiveRecord(){
guard let audioEngine = audioEngine else {
print("ERROR: AudioEngine Unavailable")
return
}
audioEngine.inputNode.removeTap(onBus: 0)
stopAudioSession()
}
La funzione seguente è la funzione per preparare il soundClassifier utilizzando il modello che è stato creato in precedenza.
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)
}
Infine per il gestore del flusso audio. Realizzeremo la funzione per avviare la registrazione dal vivo
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)")
}
}
Per verificare il livello di confidenza del tuo modello, puoi creare un'altra classe che utilizzi SNResultObserving .
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)
}
}
}
}
Questo è tutto ciò che ho fatto per creare la funzione Sound Practice che utilizzava Sound Analyzer! Dopotutto, questo è solo il passaggio fondamentale per padroneggiare il viaggio di Sound Analyzer
Grazie per il tuo tempo dedicato alla lettura di questo articolo, spero che ti aiuti nel tuo viaggio verso la padronanza di Sound Analyzer!

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































