在后台使用AVSpeechSynthesizer而不停止f.e.音乐应用

时间:2017-07-26 14:51:53

标签: ios avspeechsynthesizer

我想知道如何正确让我的iPhone说出一个句子,而我的应用程序处于后台但后来又回到以前播放的任何内容。

我的问题与AVSpeechSynthesizer in background mode非常相似,但又有一点不同,我希望能够"说些什么"在背景中没有必须停止正在播放的音乐。因此,当我的AVSpeechSynthesizer说话时,音乐应该暂停(或者声音稍微不大)但是应该恢复。即使我的应用程序目前处于后台。

我想要存档的是在我的健身应用中进行GPS跟踪时跟踪统计的语音摘要。很有可能你听音乐很高,而且我不想打扰用户...

5 个答案:

答案 0 :(得分:5)

我自己找到了答案......

重要的部分是使用AVAudioSession选项配置.duckOthers

let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(AVAudioSessionCategoryPlayback, with: .duckOthers)

这将播放f.e.音乐不那么响亮,但即使讲话完毕,这也会让它保持不那么响亮。这就是为什么你需要为AVSpeechSynthesizer设置一个委托,然后像这样处理它:

func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
    guard !synthesizer.isSpeaking else { return }

    let audioSession = AVAudioSession.sharedInstance()
    try? audioSession.setActive(false)
}

这样,语音完成后,音乐将以正常音量继续播放。

另外,在发言之前,我激活我的audioSession只是为了确保(不确定是否真的有必要,但是因为我这样做,我没有其他问题......)

答案 1 :(得分:3)

对于swift 3,导入AVKit然后添加

try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)

答案 2 :(得分:1)

用于Swift 4.2 / Xcode 10

不幸的是,

.duckOthers不再可用;我设法使它像这样工作:

    let audioSession = AVAudioSession.sharedInstance()
    try! audioSession.setCategory(AVAudioSession.Category.ambient, mode: .default)

答案 3 :(得分:0)

通过这两行代码之前,通常的文本到语音代码,背景音乐不会停止,并且即使在静音模式下,您的单词声音甚至可以在电话中播放:

let audioSession = AVAudioSession.sharedInstance()
try!audioSession.setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.mixWithOthers)

答案 4 :(得分:0)

Swift 5.0

    ...
    gradle.taskGraph.beforeTask { Task task ->
        if (task.name ==~ /process.*GoogleServices/) {
            android.applicationVariants.all { variant ->
                if (task.name ==~ /(?i)process${variant.flavorName}(Debug|Release)GoogleServices/) {
                    copy {
                        from "src/tenants/${variant.flavorName}"
                        include 'google-services.json'
                        into '.'
                    }
                }
            }
        }
    }

    gradle.taskGraph.afterTask { Task task ->
        if (task.name ==~ /process.*GoogleServices/) {
            android.applicationVariants.all { variant ->
                if (task.name ==~ /(?i)process${variant.flavorName}(Debug|Release)GoogleServices/) {
                    delete fileTree(".").matching {
                        include 'google-services.json'
                    }
                }
            }
        }
    }