Mon parcours avec SoundAnalysis
Je ne suis pas un maître, mais je suis prêt à en apprendre davantage sur l'analyse sonore !
Dans ce Macro Challenge, mon équipe décide de créer Komka, une application pour aider les enfants trisomiques à améliorer leurs compétences en communication expressive. L'une des caractéristiques de Komka est Sound Practice. Cette fonctionnalité a une barre de progression circulaire qui augmentera en fonction de la similitude de la façon dont l'enfant prononce le mot.
Je vais essayer d'expliquer comment mon équipe a construit cette fonctionnalité !
Tout d'abord, mon équipe forme le modèle à l'aide de createML. Une fois que nous avons le modèle, nous commençons à configurer notre fonctionnalité.
La première chose que je fais est de créer une classe pour le gestionnaire de flux audio qui importe AVFoundation . AVFoundation est un framework dans iOS qui vous permet d'inspecter, de lire, de capturer et de traiter des médias audiovisuels sur les plates-formes Apple.
Ce sont des variables que nous devons faire.
private var audioEngine: AVAudioEngine?
private var soundAnalyzer: SNAudioStreamAnalyzer?
private var soundClassifierRequest: SNClassifySoundRequest?
Nous devons également créer une fonction pour arrêter la session audio lorsque nous ne voulons plus détecter les sons. L'utilisation d'une session audio consiste à communiquer au système d'exploitation la nature générale de l'audio de votre application sans détailler le comportement spécifique ou les interactions requises avec le matériel audio.
func stopAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
try? audioSession.setActive(false)
}
Nous devons également créer une autre fonction pour arrêter l'enregistrement audio en direct qui est connecté à la fin audio. Nous devons donc nous assurer de supprimer le nœud du moteur audio.
func stopLiveRecord(){
guard let audioEngine = audioEngine else {
print("ERROR: AudioEngine Unavailable")
return
}
audioEngine.inputNode.removeTap(onBus: 0)
stopAudioSession()
}
La fonction ci-dessous est la fonction pour préparer le soundClassifier en utilisant le modèle qui a été créé auparavant.
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)
}
Enfin pour le gestionnaire de flux audio. Nous allons créer la fonction pour démarrer l'enregistrement en direct
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)")
}
}
Pour vérifier le niveau de confiance de votre modèle, vous pouvez créer une autre classe qui utilise 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)
}
}
}
}
C'est tout ce que j'ai fait pour créer la fonctionnalité Sound Practice qui utilisait l'analyseur de son ! Après tout, ce n'est que l'étape de base pour maîtriser le parcours de Sound Analyzer
Merci d'avoir pris le temps de lire cet article, j'espère qu'il vous aidera dans votre cheminement vers la maîtrise de Sound Analyzer !
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































