🔊

【Swift】AVAudioSessionのvoiceChatモードで再生音量が小さくなる問題の解決策

に公開

はじめに

Swift でオーディオの再生と録音を同時に行うiOSアプリを開発しているときに、以下のような状況に直面しました。

  • 録音中のエコーキャンセリング(AEC)を効かせるために AVAudioSession.voiceChat モードを使用
  • しかし、スピーカーから再生される音量が異常に小さい
  • AVAudioPlayerNode.volume を最大にしたり、overrideOutputAudioPort(.speaker) を明示的に呼んだりしても 再生音量は変わらなかった

本記事ではこの問題に対する具体的な解決策を紹介します。

voiceChat モードとは?

AVAudioSession.Mode.voiceChat は Apple が提供する 音声通話向けのオーディオモードです。
このモードでは自動的に以下の音声処理が有効になります。

  • ✅ AEC(エコーキャンセリング)
  • ✅ NS(ノイズ抑制)
  • ✅ AGC(自動ゲイン制御)

基本的には音声通話向けのモードですが、今回のようにオーディオを再生しながらAECを効かせた録音を行いたいケースにも向いています。

問題:再生音量が極端に小さくなる

voiceChat モードでは、iOSが自動で再生音に対して“ダッキング”処理(音量抑制)を行います。
これは音声通話中の音声活動を優先させるために、プレイヤーによる再生音などの他のオーディオを自動で下げる処理が動作してしまいます。
そのため、スピーカーからの再生音が小さくなる現象が発生します。

解決策:AVAudioVoiceProcessingOtherAudioDuckingConfiguration を使う

iOS 17 以降では、AVAudioEngine を使って音声処理をしている場合、AVAudioInputNode に対して以下のプロパティが利用可能になります:

inputNode.voiceProcessingOtherAudioDuckingConfiguration

これにより、Voice Processing I/O の“他のオーディオに対するダッキング挙動”を制御できます。

Ducking Configuration の構造体

AVAudioVoiceProcessingOtherAudioDuckingConfiguration(
    enableAdvancedDucking: Bool,
    duckingLevel: AVAudioVoiceProcessingOtherAudioDuckingLevel
)

パラメータの意味

パラメータ 説明
enableAdvancedDucking 高度なダッキング制御を有効にするかどうか
true の場合、通話中の音声活動に応じて自動でダッキングレベルを制御)
duckingLevel 音量をどの程度下げるかの指定(enum)

duckingLevel の種類

効果
.default iOSのデフォルト設定(結構下がる)
.min 最小限のダッキング(ほぼ下がらない)
.mid 中程度のダッキング
.max 最も強いダッキング(音がほとんど聞こえない)



Apple公式の仕様ドキュメントと解説動画はこちら:

解決した構成(AudioEngine使用時のコード)

private let engine = AVAudioEngine()
let inputNode = engine.inputNode

do {
    try inputNode.setVoiceProcessingEnabled(true)
} catch {
    print("❌ Error setting voice processing enabled: \(error)")
}

// ✅ ダッキングを最小限に抑える設定
let duckingConfig = AVAudioVoiceProcessingOtherAudioDuckingConfiguration(
    enableAdvancedDucking: false,
    duckingLevel: .min
)
inputNode.voiceProcessingOtherAudioDuckingConfiguration = duckingConfig

この設定をすることで、スピーカー再生時の音量抑制がほぼ無効化され、
voiceChatモードでも通常の音量に近いオーディオを再生できるようになりました。

まとめ

  • voiceChat モードではエコーキャンセリングは効くが、 ダッキング処理により再生音が抑制される
  • AVAudioVoiceProcessingOtherAudioDuckingConfiguration を使えば、再生音の抑制を防げる!
  • .min を使うのがもっとも効果的

動作環境

  • iOS 17.0 以降
  • Swift 5.9+
  • AVFoundation + AVAudioEngine

おわりに

音声通話系アプリやオーディオの再生・録音を行うアプリを作っている方で、
「なぜか再生音が小さい…」という方は、ぜひこの設定を試してみてください!

Discussion