AVSpeechSynthesizer in background mode
- You must set "Audio and AirPlay" in background modes.
- You have to configure the audio session:
NSError *error = NULL;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
if(error) {
// Do some error handling
}
[session setActive:YES error:&error];
if (error) {
// Do some error handling
}
This code works for me in Swift 5
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: AVAudioSession.CategoryOptions.mixWithOthers)
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}
let utterance = AVSpeechUtterance(string: voiceOutdata)
let synth = AVSpeechSynthesizer()
synth.speak(utterance)
According to https://forums.developer.apple.com/thread/38917
AVAudioSessionCategoryOptionMixWithOthers is added along with the Playback Category when the session is mixable there are some internal checks as to the "why" an application is awake before it is allowed to play audio.
For swift 3, import AVKit (or AVFoundation) then add
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
to viewWillAppear(). This allows audio to play regardless of the mute switch status and in the background with the screen off.
*Edit: AVAudioSession is defined in AVFoundation and is also available with AVKit
*Edit 2: Screenshot of auto complete showing that AVAudioSession is available in AVKit