你如何配置 AVAudioSession 来闪避音乐和暂停语音?

How can you configure AVAudioSession to duck music and pause spoken audio?

我正在开发一个使用 AVSpeechSynthesizer 来指示方向的导航应用程序。如果我正在播放播客,我希望能够在说出指示时暂停音频,然后再继续播放。这是使用以下方法成功实现的:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback
                               withOptions:AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers
                                       error:nil];

但是,如果我使用上面的代码播放音乐,指令会与音乐混合,而音乐的音量不会降低 - 很难听到指令。所以我尝试了:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback
                                 withOptions:AVAudioSessionCategoryOptionDuckOthers
                                       error:nil]; 

现在背景音乐的音量降低了,这正是我想要的,但是当我播放语音音频(即播客)时,它不再暂停,而是与指令混在一起 - 尽管音量降低了。

我真正想要的是:AVAudioSessionCategoryOptionInterruptSpokenAudioAndDuckWithOthers。然而,那是不存在的。我知道这种组合是可能的,因为其他应用程序(如 Waze)有这种行为。

我知道您可以使用以下方法检测音频何时播放:

BOOL isOtherAudioPlaying = [[AVAudioSession sharedInstance] isOtherAudioPlaying];

但是,我找不到一种方法来确定该音频是否被朗读。如果可以的话,我可以根据任何给定时间正在播放的内容进行设置。任何人都可以帮助解决这个问题,最好是 Objective C?

这是如何完成的:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback
                                 withOptions:AVAudioSessionCategoryOptionDuckOthers | AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers
                                       error:nil];

很有魅力!