SoundAnalysis ile Yolculuğum
Usta değilim ama Ses Analizi hakkında bilgi edinmek istiyorum!
Bu Macro Challenge'da ekibim, Down Sendromlu Çocukların ifade edici iletişim becerilerini geliştirmelerine yardımcı olacak bir uygulama olan Komka'yı yapmaya karar verdi. Komka'nın sahip olduğu özelliklerden biri de Ses Alıştırmasıdır. Bu özellik, çocuğun kelimeyi nasıl telaffuz ettiğinin benzerliğine göre artacak dairesel bir ilerleme çubuğuna sahiptir.
Ekibimin bu özelliği nasıl oluşturduğunu açıklamaya çalışacağım!
Her şeyden önce, ekibim modeli createML kullanarak eğitiyor. Modelimize sahip olduktan sonra, özelliğimiz için kurulum yapmaya başlıyoruz.
Yaptığım ilk şey, AVFoundation'ı içe aktaran ses akışı yöneticisi için sınıf oluşturmak . AVFoundation , Apple platformlarında görsel-işitsel medyayı incelemenizi, oynatmanızı, yakalamanızı ve işlemenizi sağlayan bir iOS çerçevesidir.
Bunlar yapmamız gereken değişkenler.
private var audioEngine: AVAudioEngine?
private var soundAnalyzer: SNAudioStreamAnalyzer?
private var soundClassifierRequest: SNClassifySoundRequest?
Artık sesleri algılamak istemediğimizde ses oturumunu durdurmak için de işlev yapmalıyız. Bir ses oturumunun kullanımı, belirli davranışı veya ses donanımıyla gerekli etkileşimleri ayrıntılandırmadan uygulamanızın sesinin genel yapısını işletim sistemine iletmek içindir.
func stopAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
try? audioSession.setActive(false)
}
Ayrıca ses bitişine bağlı olan canlı ses kaydını durdurmak için başka bir işlev yapmamız gerekiyor. Bu yüzden, ses motorunun düğümünü kaldırdığımızdan emin olmalıyız.
func stopLiveRecord(){
guard let audioEngine = audioEngine else {
print("ERROR: AudioEngine Unavailable")
return
}
audioEngine.inputNode.removeTap(onBus: 0)
stopAudioSession()
}
Aşağıdaki fonksiyon daha önce yapılmış olan modeli kullanarak soundClassifier hazırlama fonksiyonudur.
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)
}
Son olarak ses akışı yöneticisi için. Canlı kaydı başlatmak için işlevi yapacağız
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)")
}
}
Modelinizin güven düzeyini kontrol etmek için SNResultObserving kullanan başka bir sınıf oluşturabilirsiniz .
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)
}
}
}
}
Ses analizörünü kullanan Ses Alıştırması özelliğini oluşturmak için yaptığım tek şey buydu! Ne de olsa bu, Sound Analyzer yolculuğunda ustalaşmak için yalnızca temel adımdır.
Bu makaleyi okumak için zaman ayırdığınız için teşekkür ederiz, Sound Analyzer'da uzmanlaşma yolculuğunuzda size yardımcı olacağını umuyoruz!

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































