AVAudioEngineの新機能 – WWDC2019

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

Session概要

AVAudioEngineは、オーディオのリアルタイムキャプチャ、処理、再生を可能にします。
音声処理や空間レンダリングモードの選択など、独自のオーディオAppでAVAudioEngine APIの強化点を活用する方法について

AVAudioEngineの新機能

  • Voice Processing サポート
  • 2つのNodeの追加
    • AVAudioSinkNode
    • AVAudioSourceNode
  • 空間オーディオレンダリングの改善

Voice Processingモード

  • ユースケースとしてはエコーキャンセレーション、VoIPアプリケーションで使用する
  • 有効にすると、入力されるオーディオ上でシグナルプロセッシングが余分に適用され、デバイスから出る全てのオーディオが消される。
    • 有効にするためにはinput/outputの両方でVoice Processingモードを設定している必要がある。両方設定されている場合のみAVAudioEngineがVoice Processingモードに切り替える。
  • Voice Processingモードが利用出来るのはオーディオデバイスでのレンダリング時のみで、手動のレンダリングモードでは利用不可

Voice Processingモードの設定方法

  • setVoiceProcessingEnabled で設定
    • 設定時にはAVAudioEngineが停止している必要があり、動的には有効に出来ない
公式サンプルコード
https://developer.apple.com/documentation/avfoundation/audio_playback_recording_and_processing/avaudioengine/using_voice_processing

AVAudioEngineの新しいNode

  • AVAudioSourceNode
  • AVAudioSinkNode

    両Nodeがユーザ定義のブロックをwrapするとアプリケーションがAVAudioEngineと送受信出来るようになる。
    オーディオデバイスへのレンダリング中ブロックはリアルタイムで動作するため、ブロック内でメモリアロケーションやLibdispatchの呼び出しがあってはならない。

AVAudioSourceNode

  • AVAudioSourceNodeを使用してNodeにブロックを渡し、オーディオデータを出力先に送るため、AVAudioUnitを作る必要がない。
  • リアルタイムと手動レンダリングモードで使用可能
  • Linear PCM変換をサポート
  • outputが1つで、inputはない
Sample code
AVAudioSourceNodeの作り方

公式サンプル
https://developer.apple.com/documentation/avfoundation/audio_playback_recording_and_processing/avaudioengine/building_a_signal_generator

AVAudioSinkNode

  • AVAudioSourceNodeの対となるNode
  • inputにつながるNodeチェインから入力オーディオを受信するブロックをwrapする
  • inputチェインのみに制限されており、入力Nodeのダウンストリームである必要がある
  • フォーマット変換はサポートしていない
    • そのため、ハードウェアの入力フォーマットと同じでなければならない
VoIPアプリケーションや入力のリアルタイム処理にも便利

Sample code

空間レンダリングの改善点

  • 自動の空間レンダリングアルゴリズムの導入
    • AVAudioPlayerNodeはマルチチャンネルのオーディオコンテンツの空間化に対応
    • 利用することでヘッドホンやスピーカーの設定を基にどのアルゴリズムが最適かを考えなくて良い
    • ヘッドホン用に Near-FieldIn-Headレンダリングが追加
    • 内蔵スピーカーのバーチャルサラウンドがiOSで利用可能

リアルタイムモードに限り自動での出力タイプ設定が可能。

マルチチャンネルストリームの空間化によりPoint-SourceとAmbienceBedレンダリングをサポートする
  • spatializeIfMono: レガシー挙動
  • bypass: 通過か出力フォーマットへのDownミックスを意味する
  • pointSource: オーディオはMono出力しプレーヤーノード位置でレンダリング
  • ambienceBed: オーディオは3Dに固定、プレーヤーノード位置からリスナー方向に回転可能

    自動レンダリングモードを用いた ambienceBed の例

AVAudioSessionの新機能

  • AVAudioSessionPromptStyle
    • スタイル修正の音声プロンプトを表示
      • 例えば、Siriが話してる時や電話中は音声ナビゲーションは不必要なのでプロンプトを無効にするなど
    • .none: プロンプトを完全に無効
    • .short: 短縮されたプロンプト
    • .normal: 標準プロンプト
  • Defaultではオーディオレコーディング中hapticsとシステム音をミュートにするが、新しいプロパティではレコーディング中にも許可することが可能
    • allowHpticsAndSystemSoundsDuringRecording propertyで設定
最新情報をチェックしよう!