我想知道如何正确让我的iPhone说出一个句子,而我的应用程序处于后台但后来又回到以前播放的任何内容。
我的问题与AVSpeechSynthesizer in background mode非常相似,但又有一点不同,我希望能够"说些什么"在背景中没有必须停止正在播放的音乐。因此,当我的AVSpeechSynthesizer
说话时,音乐应该暂停(或者声音稍微不大)但是应该恢复。即使我的应用程序目前处于后台。
我想要存档的是在我的健身应用中进行GPS跟踪时跟踪统计的语音摘要。很有可能你听音乐很高,而且我不想打扰用户...
答案 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'
}
}
}
}
}