🔊
【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公式の仕様ドキュメントと解説動画はこちら:
- 📘 Apple公式ドキュメント: AVAudioVoiceProcessingOtherAudioDuckingConfiguration
- 🎥 WWDC23 セッション: Tune voice processing for audio input and output
解決した構成(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