AVSpeechSynthesizer在后台运行后停止工作

时间:2014-10-21 04:38:52

标签: ios ios8 avspeechsynthesizer

我在单身中使用AVSpeechSynthesizer。在 iOS 8 中,当应用程序停顿一段时间后,当它恢复时,AVSpeechSynthesizer单身人士将不再说话。 iOS 7 上不会发生此问题。

当应用程序变为后台时,我的日志中会显示以下消息:

AVSpeechSynthesizer Audio interruption notification: {
    AVAudioSessionInterruptionTypeKey = 1;
}

我在单身人士的AVSpeechSynthesizer方法中初始化init

    self.speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
    self.speechSynthesizer.delegate = self;

我这样说utterance

AVSpeechUtterance *utt = [[AVSpeechUtterance alloc] initWithString:dialogue];
utt.voice = [AVSpeechSynthesisVoice voiceWithLanguage:voice];

utt.pitchMultiplier = pitch;
utt.rate = rate;
utt.preUtteranceDelay = preDelay;
utt.postUtteranceDelay = postDelay;
utt.volume = volumeSetting;

[self.speechSynthesizer speakUtterance:utt];

有没有人在 iOS 8 上看到过类似的内容?

3 个答案:

答案 0 :(得分:13)

我整天都在追逐这种疯狂,我想我找到了解决方案。我的问题是AVSpeechSynthesizer在前台和后台工作正常,其他音频正好在电话呼叫发生之前。

那一刻,说话会停止工作,没有任何错误。所有的对象仍然存在,但委托调用不会被调用,既不开始也不完成。

我注意到通过电话,我的应用会收到有关AudioRouteChanged的通知。因此,当发生这种情况时,我会重新创建语音设置:基本上销毁现有的AVSpeechSynthesizer并重新创建它。从那时起,演讲将继续奏效。它甚至可以在通话期间工作:)

答案 1 :(得分:2)

  1. 您必须在后台模式中设置“音频和AirPlay”。
  2. 您必须在AppDelegate中配置音频会话:

    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
    }
    
  3. (见这篇文章:https://stackoverflow.com/a/19200177/330067

答案 2 :(得分:0)

在进一步调查之后,当应用程序在后台启动时(由于后台获取或其他),似乎AVSpeechSynthesizer正在崩溃。在讲话之前检查应用程序当前是否处于活动状态的简单调用可以解决问题。

if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
    [self.speechSynthesizer speakUtterance:utt];