KOSEN{BLOG}について

[Swift5]AVAudioEngineを使ってリアルタイム処理を行う最小実装

リアルタイムに音声を処理を行う

  • 入力をそのまま出力
  • 入力にエフェクトをかけて出力

ソースコード

class ViewController: UIViewController {

    var engine = AVAudioEngine()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupAudioSession()
        
        let input = engine.inputNode
        let output = engine.outputNode
        let format = engine.inputNode.inputFormat(forBus: 0)
        engine.connect(input, to: output, format: format)

        try! engine.start()
        
    }

func setupAudioSession() {
        do {
            let session = AVAudioSession.sharedInstance()
            try session.setCategory(.playAndRecord, options: [.defaultToSpeaker, .allowBluetooth])
            try session.setActive(true)
        } catch {
            fatalError("Failed to configure and activate session.")
        }
    }

補足1

func setupAudioSession() {
        do {
            let session = AVAudioSession.sharedInstance()
            try session.setCategory(.playAndRecord, options: [.defaultToSpeaker, .allowBluetooth])
            try session.setActive(true)
        } catch {
            fatalError("Failed to configure and activate session.")
        }
    }

これはAVAudioSessionの設定で

ステレオオーディオを録音するには、recordまたはplayAndRecordカテゴリのいずれかを使用するアプリのオーディオセッションが必要。

また、optionでiPhoneのデフォルトのスピーカーを使用することとBluetoothイヤホンで再生と録音が可能に設定。

詳しくはappleサンプルを参考にしてください!

エフェクトをかけたい場合

エフェクトをかけたい時にはノードを追加してあげると簡単にエフェクトをかけることができる。

    var engine = AVAudioEngine()
    var delay = AVAudioUnitDelay()
    var reverb = AVAudioUnitReverb()

override func viewDidLoad() {
        super.viewDidLoad()
        setupAudioSession()
        
        let input = engine.inputNode
        let output = engine.outputNode
        let format = engine.inputNode.inputFormat(forBus: 0)
        delay.delayTime = 2.0
        reverb.loadFactoryPreset(.largeHall)
        reverb.wetDryMix = 40
        
        engine.attach(delay)
        engine.attach(reverb)
        engine.connect(input, to: delay, format: format)
        engine.connect(delay, to: reverb, format: format)
        engine.connect(reverb, to: output, format: format)

        try! engine.start()
        
    }

遅延を入れてリバーブをかけるとコンサートホールにいるみたいなエフェクトになった!

他にもいろいろなエフェクトが存在している。

他のエフェクト例

  • AVAudioUnitDistortion
  • AVAudioUnitEQ

この2つも使って音遊びをしていきたい。

 

まとめ

AVAudioEngineは暗黙的にinputとoutputを持っているためノードをつなげる必要性がない。

WWDC2019に新しくAVAudioEngineが新しくなったらしいので、

このセッションを復習する。

https://developer.apple.com/videos/play/wwdc2019/510/

コメントを残す

メールアドレスが公開されることはありません。