🔊
【iOS】AVAudioEngine でできること - AudioRecoderとの違い
AudioEngine クラスの概要
AudioEngine
は NSObject
を継承したクラスで、Swiftで音声を録音するための基本的な機能を提供します。このクラスでは、AVAudioEngine
と AVAudioFile
を使用して録音を行い、生成されたオーディオファイルを保存します。
録音の開始
録音を開始するには、startRecording
メソッドを使用します。このメソッドは以下の手順で録音を行います:
-
AVAudioSession
を録音モードに設定します。 - 録音用のファイルURLを生成します。
-
AVAudioEngine
の入力ノードからオーディオデータを取得し、指定されたファイルに書き込みます。 - オーディオエンジンを開始して録音を開始します。
録音の停止
stopRecording
メソッドは、録音を終了するために使用します。このメソッドはエンジンからの入力タップを削除し、エンジンを停止して録音を停止します。さらに、AVAudioSession
を非アクティブに設定します。
実装例
func startRecording() throws -> URL {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.record, mode: .voicePrompt, options: [])
try audioSession.setActive(true)
} catch {
print("Error setting up audio session: \(error.localizedDescription)")
throw error
}
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let recordingName = "audioRecording.caf"
recordingURL = documentsDirectory.appendingPathComponent(recordingName)
do {
let format = audioEngine.inputNode.outputFormat(forBus: 0)
audioFile = try AVAudioFile(forWriting: recordingURL!, settings: format.settings)
audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: format) { (buffer, time) in
do {
try self.audioFile?.write(from: buffer)
} catch {
print("Error writing to audio file: \(error.localizedDescription)")
}
}
audioEngine.prepare()
try audioEngine.start()
} catch {
print("Error starting audio engine: \(error.localizedDescription)")
throw error
}
return recordingURL!
}
AudioEngineでしかできないこと - AudioRecoderとの違い
AudioEngine
を利用することで、音声の途中に処理を加えることが可能です。
例えば下記のように音声認識の処理などを入れて取得した音声をそのまま音声認識に渡すということが可能です。
AudioRecoderを利用する場合はバッファ単位で処理ができないので途中処理をしたい場合は必ずAudioEngineを利用することが必要です。
これ以外にもエフェクトをかけるなど途中の処理をすることができます試してみてください。
inputNode.installTap(onBus: 0, bufferSize: 1024, format: nil) { (buffer: AVAudioPCMBuffer, _: AVAudioTime) in
self.recognitionRequest?.append(buffer) // 認識リクエストに取得した音声を加える
self.buffers.append(buffer)
self.waveFormHeights.append(buffer.waveFormHeight)
do {
// audioFileにバッファを書き込む
try audioFile.write(from: buffer)
} catch let error {
Logger.shared.logError("audioFile.writeFromBuffer error:" + error.localizedDescription)
print("audioFile.writeFromBuffer error:", error)
continuation.finish(throwing: error)
}
}
Discussion