¿Cómo capturar muestras de audio en iOS con Swift?

He encontrado muchos ejemplos en línea para trabajar con audio en iOS, pero la mayoría de ellos son bastante anticuados y no se aplican a lo que estoy tratando de lograr. Aquí está mi proyecto:

Necesito capturar muestras de audio de dos fonts: input de micrófono y files de audio almacenados. Necesito realizar FFT en estas muestras para producir una "huella digital" para todo el clip, así como aplicar algunos filters adicionales. El objective final es crear una especie de software de reconocimiento de canciones similar al Shazam, etc.

¿Cuál es la mejor manera de capturar las muestras de audio individuales en iOS 8 para realizar una transformación rápida de Fourier? Imagino terminar con una gran variedad de ellos, pero sospecho que podría no funcionar así. En segundo lugar, ¿cómo puedo usar el framework Accelerate para procesar el audio? Parece ser la forma más eficiente de realizar análisis complejos de audio en iOS.

Todos los ejemplos que he visto en línea están utilizando versiones anteriores de iOS y Objective-C, y no he podido traducirlos con éxito a Swift. ¿IOS 8 proporciona algunos frameworks nuevos para este tipo de cosas?

rápido

Grabación en iOS:

  • Cree y mantenga una instancia de AVAudioRecorder , como en var audioRecorder: AVAudioRecorder? = nil var audioRecorder: AVAudioRecorder? = nil
  • Inicialice su AVAudioRecorder con una URL para almacenar las muestras y algunas configuraciones de grabación

La secuencia de la session de grabación:

  1. invoque prepareToRecord()
  2. invocar record()
  3. Invocar stop()

Ejemplo completo de Swift / AVAudioRecorder

En el corazón de su método de grabación, podría tener:

 func record() { self.prepareToRecord() if let recorder = self.audioRecorder { recorder.record() } } 

Para preparar la grabación (transmisión a un file ), podría tener:

 func prepareToRecord() { var error: NSError? let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString let soundFileURL: NSURL? = NSURL.fileURLWithPath("\(documentsPath)/recording.caf") self.audioRecorder = AVAudioRecorder(URL: soundFileURL, settings: recordSettings as [NSObject : AnyObject], error: &error) if let recorder = self.audioRecorder { recorder.prepareToRecord() } } 

Finalmente, para detener la grabación, use esto:

 func stopRecording() { if let recorder = self.audioRecorder { recorder.stop() } } 

El ejemplo anterior también necesita import AVFoundation y algunos recordSettings , a la izquierda de su elección. Un ejemplo de recordSettings puede verse así:

 let recordSettings = [ AVFormatIDKey: kAudioFormatAppleLossless, AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue, AVEncoderBitRateKey : 320000, AVNumberOfChannelsKey: 2, AVSampleRateKey : 44100.0 ] 

Haz esto, ya has terminado.


También es posible que desee consultar esta respuesta de desbordamiento de stack , que incluye un proyecto de demostración .