iOS 语音合成支持后台和锁屏情况

最近有一个需求,就是要加入语音合成,并能够在进入后台或者锁屏之后能够播报,现在最流行的应该就是科大讯飞了,功能强大,用起来简单,但是如果只要简单的TTS功能就没有必要集成其他的SDK了,iOS中提供好的API就可以了。

AVSpeechSynthesizer

这个类可以用来播放一个或者多个语音内容,播放的语音内容都是通过实例化AVSpeechUtterance而得到,对于一个或者多个AVSpeechUtterance实例,AVSpeechSynthesizer对象起到队列的作用,提供了API可以控制和监视正在进行的语音播放,首先引入头文件:

#import 

创建AVSpeechSynthesizer:

AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];

播放合成语音的相关方法:

- (void)speakUtterance:(AVSpeechUtterance *)utterance;

AVSpeechSynthesizerDelegate协议的监听方法:

@optional
// 播放开始状态
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didStartSpeechUtterance:(AVSpeechUtterance *)utterance;
// 播放结束状态
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance;
// 播放暂停状态
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance *)utterance;
// 跳出播放状态
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance *)utterance;
// 退出播放状态
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance;
// 播放状态时,当前所播放的字符串范围,及AVSpeechUtterance实例(可通过此方法监听当前播放的字或者词)
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance;

AVSpeechSynthesisUtterance

这个类的一个实例可以理解为合成的一段语音所需要的内容和设置,其中包含了文本内容,语速,音调等信息。播放合成一段最简单的“Hello!”语音如下:

// 创建 AVSpeechSynthesizer
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
// 创建 AVSpeechUtterance
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:@"Hello!"];
// 播放合成语音
[synthesizer speakUtterance:utterance];

上面是最基本的用法

// 设置合成语音的语言
    utterance.voice = voiceLanguage;
    // 语速 0.0f~1.0f
    utterance.rate = 0.5f;
    // 声音的音调 0.5f~2.0f
    utterance.pitchMultiplier = 0.8f;
    // 使播放下一句的时候有0.1秒的延迟
    utterance.postUtteranceDelay = 0.1f;

还可以设置这些属性,如果同时实例两个语音合成,那么会第一个实例播报完成之后再进行第二个实例的播报,程序不会阻塞

 

设置播报不同的语言:

AVSpeechSynthesisVoice *voiceType = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"];

这里在设置语言的时候发现一个问题,就是只能设置中文女声找不到中文男声,但是一次错误让我找到了中文男声的设置方法,@"zh-CN"是中文女生的设置方式,而@"zh-CH"就是中文男声的设置方式

苹果支持的语言类型:

  • Arabic (ar-SA)

  • Chinese (zh-CN, zh-HK, zh-TW)

  • Czech (cs-CZ)

  • Danish (da-DK)

  • Dutch (nl-BE, nl-NL)

  • English (en-AU, en-GB, en-IE, en-US, en-ZA)

  • Finnish (fi-FI)

  • French (fr-CA, fr-FR)

  • German (de-DE)

  • Greek (el-GR)

  • Hebrew (he-IL)

  • Hindi (hi-IN)

  • Hungarian (hu-HU)

  • Indonesian (id-ID)

  • Italian (it-IT)

  • Japanese (ja-JP)

  • Korean (ko-KR)

  • Norwegian (no-NO)

  • Polish (pl-PL)

  • Portuguese (pt-BR, pt-PT)

  • Romanian (ro-RO)

  • Russian (ru-RU)

  • Slovak (sk-SK)

  • Spanish (es-ES, es-MX)

  • Swedish (sv-SE)

  • Thai (th-TH)

  • Turkish (tr-TR)

如果完成上面的操作就可以正常的播报了,但是退到后台或者锁屏之后播报就会停止了,但是需求要这样的情况也要能播报啊

不要担心还有一个属性需要设置就可以了

NSLog(@"Current Category:%@", [AVAudioSession sharedInstance].category);
    NSError *error = nil;
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
    if (nil != error) {
        NSLog(@"set Option error %@", error.localizedDescription);
    }
    NSLog(@"Current Category:%@", [AVAudioSession sharedInstance].category);

通过设置上面的属性还有就是勾选后台模式就可以实现上面要达到的效果

类别 当按“静音”或者锁屏是是否静音 是否引起不支持混音的App中断 是否支持录音和播放
AVAudioSessionCategoryAmbient 只支持播放
AVAudioSessionCategoryAudioProcessing - 都不支持
AVAudioSessionCategoryMultiRoute 既可以录音也可以播放
AVAudioSessionCategoryPlayAndRecord 默认不引起 既可以录音也可以播放
AVAudioSessionCategoryPlayback 默认引起 只用于播放
AVAudioSessionCategoryRecord 只用于录音
AVAudioSessionCategorySoloAmbient 只用于播放

可以看到,其实默认的就是“AVAudioSessionCategorySoloAmbient”类别。从表中我们可以总结如下:

  • AVAudioSessionCategoryAmbient : 只用于播放音乐时,并且可以和QQ音乐同时播放,比如玩游戏的时候还想听QQ音乐的歌,那么把游戏播放背景音就设置成这种类别。同时,当用户锁屏或者静音时也会随着静音,这种类别基本使用所有App的背景场景。
  • AVAudioSessionCategorySoloAmbient: 也是只用于播放,但是和"AVAudioSessionCategoryAmbient"不同的是,用了它就别想听QQ音乐了,比如不希望QQ音乐干扰的App,类似节奏大师。同样当用户锁屏或者静音时也会随着静音,锁屏了就玩不了节奏大师了。
  • AVAudioSessionCategoryPlayback: 如果锁屏了还想听声音怎么办?用这个类别,比如App本身就是播放器,同时当App播放时,其他类似QQ音乐就不能播放了。所以这种类别一般用于播放器类App
  • AVAudioSessionCategoryRecord: 有了播放器,肯定要录音机,比如微信语音的录制,就要用到这个类别,既然要安静的录音,肯定不希望有QQ音乐了,所以其他播放声音会中断。想想微信语音的场景,就知道什么时候用他了。
  • AVAudioSessionCategoryPlayAndRecord: 如果既想播放又想录制该用什么模式呢?比如VoIP,打电话这种场景,PlayAndRecord就是专门为这样的场景设计的 。
  • AVAudioSessionCategoryMultiRoute: 想象一个DJ用的App,手机连着HDMI到扬声器播放当前的音乐,然后耳机里面播放下一曲,这种常人不理解的场景,这个类别可以支持多个设备输入输出。
  • AVAudioSessionCategoryAudioProcessing: 主要用于音频格式处理,一般可以配合AudioUnit进行使用

 

还有的需求是需要像支付宝收款语音播报的效果,那种情况看别人的文章需要静默推送才能达到,因为要在程序已经被杀死的情况下也要能够播报,但是没有尝试过,如果将来需要会再来补充

 

你可能感兴趣的:(iOS)