🔊

【iOS】AVAudioEngine でできること - AudioRecoderとの違い

2024/01/30に公開

AudioEngine クラスの概要

AudioEngineNSObject を継承したクラスで、Swiftで音声を録音するための基本的な機能を提供します。このクラスでは、AVAudioEngineAVAudioFile を使用して録音を行い、生成されたオーディオファイルを保存します。

https://developer.apple.com/documentation/avfaudio/avaudioengine

録音の開始

録音を開始するには、startRecording メソッドを使用します。このメソッドは以下の手順で録音を行います:

  1. AVAudioSession を録音モードに設定します。
  2. 録音用のファイルURLを生成します。
  3. AVAudioEngine の入力ノードからオーディオデータを取得し、指定されたファイルに書き込みます。
  4. オーディオエンジンを開始して録音を開始します。

録音の停止

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