WWDC Quick Look 💓 By SwiftGGTeam
Enhance your app’s audio recording capabilities

Enhance your app’s audio recording capabilities

元の動画を見る

Highlight

iOS 26 では、録音系 app に向けて 4 つの機能が追加されました。app 内でのマイク切り替え、AirPods による高品質 Bluetooth 録音、AVAssetWriter での Spatial Audio 録音、そして再生時に Audio Mix で音声と環境音のバランスを調整する機能です。


主要内容

録音 app には長年、ある不便がつきまとっていました。ユーザーが新しいマイクを接続しても、いったん app を抜けて「設定」からデバイスを選び、再び app に戻る必要があったのです。AirPods も同様に扱いづらく、Bluetooth リンクが通話向けに最適化されているため、録れた音声はフラットになり、背景音ばかりが目立つ仕上がりになっていました。Spatial Audio はさらに別の問題を抱えており、iOS 18 では AVCaptureMovieFileOutput でしか録音できず、Voice Memos のような純粋なオーディオ app から Spatial Audio を録ろうにも API が存在しませんでした。

iOS 26 はこれら 4 つの課題に一気に応えています。AVInputPickerInteraction は入力デバイスの選択を app 内部に持ち込み、リアルタイムの音量メーターやマイクモードも備え、システムは選択を記憶します。bluetoothHighQualityRecording は AirPods 向けにコンテンツ制作用にチューニングされた Bluetooth リンクを開き、音声と環境音のバランスを取ります。AVAssetWriter は Spatial Audio 仕様に準拠した .qta ファイル(AAC ステレオトラック 1 本、APAC Spatial Audio トラック 1 本、加えて metadata トラック)を書き出せるようになりました。再生側では Cinematic フレームワークが Audio Mix を公開し、Photos app で Spatial Audio ビデオを編集するときと同じ機能を提供します。Cinematic / Studio / In-Frame の 3 種類のスタイルを切り替え、強度スライダーで前景と背景の比率を調整できます。


詳細

入力デバイスの選択(02:10)。 AVInputPickerInteractionNSObject のサブクラスで、任意の UIView に取り付けるだけで入力選択 UI を表示できます。Audio Session を先に設定しておかないとリストが正しく表示されない点に注意してください。

import AVKit

class AppViewController {

    // Configure AudioSession

    // AVInputPickerInteraction is a NSObject subclass that presents an input picker
    let inputPickerInteraction = AVInputPickerInteraction()
    inputPickerInteraction.delegate = self

    // connect the PickerInteraction to a UI element for displaying the picker
    @IBOutlet weak var selectMicButton: UIButton!
    self.selectMicButton.addInteraction(self.inputPickerInteraction)

    // button press callback: present input picker UI
    @IBAction func handleSelectMicButton(_ sender: UIButton) {
        inputPickerInteraction.present()
    }
}

ポイント:

  • AVInputPickerInteraction() で picker のインスタンスを生成します。delegate には picker を保持する view controller を必ず設定します。
  • addInteraction で実際の UI 要素(ここでは UIButton)に取り付けます。
  • present() をユーザーのタップで呼び出すと、利用可能なデバイス一覧、リアルタイム音量メーター、マイクモードビューを含む選択メニューが表示されます。
  • 呼び出し前に audio session の設定を済ませておかないと、picker に表示されるデバイス集合が正しくなりません。

AirPods 高品質録音(03:57)。 これはコンテンツ制作向けにチューニングされた Bluetooth リンクで、LAV マイクと同等レベルで音声と環境音のバランスを取ります。AVAudioSession では category option から、AVCaptureSession では capture session のプロパティから有効化します。

// AVAudioSession clients opt-in - session category option
AVAudioSessionCategoryOptions.bluetoothHighQualityRecording

// AVCaptureSession clients opt-in - captureSession property
session.configuresApplicationAudioSessionForBluetoothHighQualityRecording = true

ポイント:

  • bluetoothHighQualityRecordingAVAudioSessionCategoryOptions に追加された新しいオプションで、既存の allowBluetoothHFP と併存します。両方を有効にした場合、高品質モードがデフォルトとなり、HFP がフォールバックになります。
  • configuresApplicationAudioSessionForBluetoothHighQualityRecording = true を指定すると、capture session が audio session の設定を自動で引き受けるため、手動設定が不要になります。
  • 有効化すると、システムレベルの入力メニューにあるデバイス一覧に「高品質 AirPods」項目が現れます。

Spatial Audio キャプチャ(05:11 以降)。 iOS 26 では AVAssetWriter 経由で Spatial Audio を書き出せるようになりました。仕様に準拠した Spatial Audio ファイルは、オーディオトラック 2 本(AAC ステレオ + APAC FOA)と、最低 1 本の metadata トラックを含みます。FOA(First Order Ambisonics)は 4 チャンネル構成で、全方向成分 1 つに加え、X / Y / Z 各軸を向いた双極性成分が 3 つあります。

実装上の主な API は以下のとおりです:

  • AVCaptureDeviceInput.multichannelAudioMode = .firstOrderAmbisonics でマイクアレイを FOA モードに切り替えます。
  • AVCaptureSession は FOA モード時に最大 2 つの AudioDataOutput を接続でき、それぞれ FOA とステレオを出力して 2 本のオーディオトラックに対応します。
  • 新しいプロパティ spatialAudioChannelLayoutTag が、各 ADO の出力フォーマット(ステレオまたは FOA)を決定します。
  • AVCaptureSpatialAudioMetadataSampleGenerator は FOA buffer を受け取り、録音終了時にタイムスタンプ付きの metadata sample を生成して 3 つ目の AVAssetWriterInput に書き込みます。
  • iOS 26 では AVCaptureMovieFileOutputAVAudioDataOutput を同時に動かせるため、ファイル保存とリアルタイム波形描画やエフェクト処理を並行して行えます。

Audio Mix による再生(13:26)。 Audio Mix は強度(0〜1)とスタイル enum で、音声と環境音の比率をコントロールします。

import Cinematic

// Audio Mix parameters (consider using UI elements to change these values)
var intensity: Float32 = 0.5 // values between 0.0 and 1.0
var style = CNSpatialAudioRenderingStyle.cinematic

// Initializes an instance of CNAssetAudioInfo for an AVAsset asynchronously
let audioInfo = try await CNAssetSpatialAudioInfo(asset: myAVAsset)

// Returns an AVAudioMix with effect intensity and rendering style.
let newAudioMix: AVAudioMix = audioInfo.audioMix(effectIntensity: intensity,
                                                 renderingStyle: style)

// Set the new AVAudioMix on your AVPlayerItem
myAVPlayerItem.audioMix = newAudioMix

ポイント:

  • CNAssetSpatialAudioInfo(asset:) は asset から Spatial Audio のメタ情報を非同期に取得します。
  • audioMix(effectIntensity:renderingStyle:)AVAudioMix を返し、そのまま AVPlayerItem.audioMix に設定して再生できます。
  • CNSpatialAudioRenderingStyle には Photos app と同じ Cinematic / Studio / In-Frame に加え、音声のみ mono stem や環境音のみ FOA stem などの 6 つのモードが含まれます。
  • intensity は UI スライダーでリアルタイムに駆動する形式が推奨されます。デモのスライダー操作と同じ体験になります。

低レベル: 入力ファイルから remix metadata を取得する(16:45)。 AUAudioMix AudioUnit 経路を使う場合、録音時に埋め込まれたチューニングパラメータを AU に渡す必要があります。

// Get Spatial Audio remix metadata from input AVAsset

let audioInfo = try await CNAssetSpatialAudioInfo(asset: myAVAsset)

// extract the remix metadata. Set on AUAudioMix with AudioUnitSetProperty()
let remixMetadata = audioInfo.spatialAudioMixMetadata as CFData

ポイント:

  • spatialAudioMixMetadata は録音時にファイルへ書き込まれたチューニングパラメータを CFData として返します。
  • これを AudioUnitSetProperty()AUAudioMix に設定することで、AU が録音時のチューニング通りに動作します。設定しない場合、効果は録音時の意図からずれてしまいます。
  • カスタムレンダリンググラフ内で Audio Mix を細かく制御したい app に向いた経路です。通常の再生用途であれば、上記の AVPlayer 経路の方が手軽です。

重要ポイント

  • やること: 録音 / ポッドキャスト app に「マイクを選ぶ」ボタンを追加し、AVInputPickerInteraction を呼び出します。

    • なぜ価値があるか: ユーザーが録音を諦める典型的な場面が「マイクをつないだのに切り替えられない」というケースです。システム設定への往復を 1 回省くだけで、録音機会を 1 回守れます。
    • 始め方: まず audio session の設定を関数として切り出し、既存の録音ツールバーのいずれかのボタンに picker を取り付けます。実装は 02:10 の 4 行のコードに従ってください。
  • やること: AirPods を使うすべての録音フローで bluetoothHighQualityRecording を有効にします。

    • なぜ価値があるか: コード変更は option を 1 つ、あるいは bool を 1 つ追加するだけですが、音質は「通話レベル」から「コンテンツ制作レベル」へと一気に跳ね上がります。インタビュー、ポッドキャスト、Vlog のナレーションなどで効果は特に顕著です。
    • 始め方: app 内のすべての AVAudioSessionCategoryOptions の組み合わせを洗い出し、HFP と高品質を並べて指定します。AVCaptureSession 経路では configuresApplicationAudioSessionForBluetoothHighQualityRecording = true を設定し、システムによる HFP へのフォールバックに任せます。
  • やること: Voice Memos のような純粋なオーディオ app を Spatial Audio 録音対応にアップグレードします。

    • なぜ価値があるか: iOS 26 になって初めて AVAssetWriter が仕様準拠の .qta を書き出せるようになりました。先行して対応した app は、Audio Mix や AirPods のヘッドトラッキングなど、下流で使える機能から得られる恩恵を先取りできます。
    • 始め方: サンプルプロジェクト「Capturing Spatial Audio in your iOS app」を骨組みとして参照してください。FOA AudioDataOutput 1 つ + ステレオ AudioDataOutput 1 つ + metadata generator + 3 つの AVAssetWriterInput という構成で、TN3177 に従って alternate track group を設定します。
  • やること: 既存の Spatial Audio プレーヤーに「音声 / 環境」スライダーを追加します。

    • なぜ価値があるか: 騒がしい場所で録った素材を、ユーザー自身の手で救えるようになります。ノイズを理由に保存を諦めてしまうコンテンツを減らせます。
    • 始め方: CNAssetSpatialAudioInfo + audioMix(effectIntensity:renderingStyle:) の経路を使い、UI には 3 つのスタイルとスライダーを 1 本配置して、intensity を直接駆動します。詳細は 13:26 を参照してください。
  • やること: 録音とリアルタイムの波形 / エフェクトを 1 つの AVCaptureSession にまとめます。

    • なぜ価値があるか: iOS 26 から MovieFileOutputAudioDataOutput を共存させられるため、二重 session の同期にまつわる手間が消え、CPU 消費も半分で済みます。
    • 始め方: 既存の 2 系統のパイプラインを統合し、AudioDataOutput は UI フィードバックのみを担当、MovieFileOutput はファイル保存に専念させます。

関連セッション

コメント

GitHub Issues · utterances