アプリで「BGMや効果音を同時に複数鳴らしたい」「音声をリアルタイムで加工したい」「マイク入力をエフェクトしたい」
そんな高度なサウンド機能を実現したいときに欠かせないのが AVAudioEngine です。
AVAudioEngineは、音声処理をブロック(ノード)単位で組み合わせて自在に音をコントロールできるオーディオフレームワークです。
よりクリエイティブな音声アプリ・音楽アプリ・レコーダー・エフェクターなどに最適です。
AVAudioEngineとは?
AVAudioEngine は、Appleが提供するリアルタイムオーディオ処理のための強力なクラスです。
単純な音声再生にとどまらず、音の流れ(オーディオパス)を自由に設計・合成できる「音のパイプライン」を作ることができます。
音声データの再生・録音・ミキシング・エフェクト付与・フォーマット変換・分析まで、あらゆる音声処理に使えるプロ仕様のフレームワークです。
主な特徴
- ノード(Node)という単位で音声処理を分割
- 再生用・録音用・ミキサー・エフェクト・入出力など様々なノードを自由に接続可能
- 効果音やBGMの多重再生、音声の録音と再生の同時処理
- リアルタイムエフェクトや波形解析も可能
- マイクや外部入力を通して録音・再生・加工もOK
どういう時に使うのが便利?
AVAudioPlayerのような「単一音声ファイルの再生」では物足りない、もっと高度な音声処理をしたい時に
例えば下記のような用途に特に便利です。
- BGM・効果音の同時再生(多重発音)
ゲームアプリや音楽制作アプリでよくある「BGMと複数SEを同時に鳴らしたい」ニーズに最適です。 - 音声エフェクトやリアルタイム加工
リバーブ・ディレイ・イコライザー・ピッチ変更・ボイスチェンジなど、リアルタイムで音を変化させられます。 - マイク入力の録音・再生・波形表示
音声認識・録音アプリや、マイクを通したリアルタイム解析も柔軟に対応。 - 複雑なサウンドルーティング
複数の入力→合成→エフェクト→出力、という自由な音声経路を設計可能。 - 複数音源のミックスや自作シンセ
同時に複数トラックを合成したり、オリジナル音源を生成するアプリにも活用できます。
基本的な使い方
1. BGM+効果音の同時再生
たとえば、BGMを再生しながら効果音も鳴らしたい場合、AVAudioEngineなら次のように複数のプレイヤーノードを用意し、同じミキサーにつなぐことで実現できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
let engine = AVAudioEngine() let bgmPlayer = AVAudioPlayerNode() let sePlayer = AVAudioPlayerNode() engine.attach(bgmPlayer) engine.attach(sePlayer) let mainMixer = engine.mainMixerNode engine.connect(bgmPlayer, to: mainMixer, format: nil) engine.connect(sePlayer, to: mainMixer, format: nil) try? engine.start() // BGMとSEを別々に再生できる // BGM if let bgmURL = Bundle.main.url(forResource: "bgm", withExtension: "mp3"), let bgmFile = try? AVAudioFile(forReading: bgmURL) { bgmPlayer.scheduleFile(bgmFile, at: nil, completionHandler: nil) bgmPlayer.play() } // 効果音 if let seURL = Bundle.main.url(forResource: "se", withExtension: "wav"), let seFile = try? AVAudioFile(forReading: seURL) { sePlayer.scheduleFile(seFile, at: nil, completionHandler: nil) sePlayer.play() } |
このように、複数の音声プレイヤー(ノード)を同時に使えるのがAVAudioEngineの強みです。
2. リアルタイムエフェクト(例:リバーブ)
音にエフェクトをかけるのも簡単です。
例えば「リバーブ(残響)」をBGMにかけたい場合、次のようにノードを追加します。
1 2 3 4 5 6 7 8 |
let reverb = AVAudioUnitReverb() reverb.loadFactoryPreset(.largeHall) reverb.wetDryMix = 50 // エフェクトの強さ engine.attach(reverb) engine.connect(bgmPlayer, to: reverb, format: nil) engine.connect(reverb, to: engine.mainMixerNode, format: nil) |
これだけで、BGMにリアルなホールの残響を追加できます。
3. マイク入力の録音・エフェクト加工
マイクの音声にエフェクトをかけて録音したり、リアルタイム再生したりも可能です。
1 2 3 4 5 6 7 8 |
let input = engine.inputNode let effect = AVAudioUnitDistortion() engine.attach(effect) engine.connect(input, to: effect, format: nil) engine.connect(effect, to: engine.mainMixerNode, format: nil) try? engine.start() // これでマイクにディストーション(歪み)効果をかけられる |
活用シーンと実践例
- ゲームアプリ:BGM+複数効果音+ボイスを同時に扱いたい時
- 音楽制作・シンセアプリ:自作音源・多重トラック・ミックス・リアルタイム加工
- 録音・ナレーションアプリ:マイク入力の録音と同時再生、リアルタイムエフェクト
- ボイスチェンジャー:ピッチ変更・リバーブ・イコライザーの組み合わせ
- 音声認識・可視化:マイク入力を解析して波形やスペクトラム表示
注意点
AVAudioEngineはAVAudioPlayerより設計が複雑なので、最初はシンプルな構成から始めるのがおすすめです。
多重ノードや高負荷の処理では端末のメモリ・CPUリソースをよく考える必要があります。
また、ノード接続ミスやストップ忘れがバグの原因になりやすいので、全体構成をしっかり意識して設計しましょう。
音声ファイルやマイクのアクセスにはユーザーの許可も必要です。
まとめ
AVAudioEngineは、音声再生から録音、エフェクト、ミキシング、リアルタイム加工まで、本格的なオーディオ機能を実現できるパワフルなクラスです。
AVAudioPlayerの枠を超えたサウンド体験を目指すなら、ぜひAVAudioEngineの仕組みと使い方をマスターしてみてください。