iOS 语音合成支持后台和锁屏情况
最近有一個(gè)需求,就是要加入語音合成,并能夠在進(jìn)入后臺或者鎖屏之后能夠播報(bào),現(xiàn)在最流行的應(yīng)該就是科大訊飛了,功能強(qiáng)大,用起來簡單,但是如果只要簡單的TTS功能就沒有必要集成其他的SDK了,iOS中提供好的API就可以了。
AVSpeechSynthesizer
這個(gè)類可以用來播放一個(gè)或者多個(gè)語音內(nèi)容,播放的語音內(nèi)容都是通過實(shí)例化AVSpeechUtterance而得到,對于一個(gè)或者多個(gè)AVSpeechUtterance實(shí)例,AVSpeechSynthesizer對象起到隊(duì)列的作用,提供了API可以控制和監(jiān)視正在進(jìn)行的語音播放,首先引入頭文件:
#import <AVFoundation/AVFoundation.h>創(chuàng)建AVSpeechSynthesizer:
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];播放合成語音的相關(guān)方法:
- (void)speakUtterance:(AVSpeechUtterance *)utterance;AVSpeechSynthesizerDelegate協(xié)議的監(jiān)聽方法:
@optional // 播放開始狀態(tài) - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didStartSpeechUtterance:(AVSpeechUtterance *)utterance; // 播放結(jié)束狀態(tài) - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance; // 播放暫停狀態(tài) - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance *)utterance; // 跳出播放狀態(tài) - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance *)utterance; // 退出播放狀態(tài) - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance; // 播放狀態(tài)時(shí),當(dāng)前所播放的字符串范圍,及AVSpeechUtterance實(shí)例(可通過此方法監(jiān)聽當(dāng)前播放的字或者詞) - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance;AVSpeechSynthesisUtterance
這個(gè)類的一個(gè)實(shí)例可以理解為合成的一段語音所需要的內(nèi)容和設(shè)置,其中包含了文本內(nèi)容,語速,音調(diào)等信息。播放合成一段最簡單的“Hello!”語音如下:
// 創(chuàng)建 AVSpeechSynthesizer AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init]; // 創(chuàng)建 AVSpeechUtterance AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:@"Hello!"]; // 播放合成語音 [synthesizer speakUtterance:utterance];上面是最基本的用法
// 設(shè)置合成語音的語言utterance.voice = voiceLanguage;// 語速 0.0f~1.0futterance.rate = 0.5f;// 聲音的音調(diào) 0.5f~2.0futterance.pitchMultiplier = 0.8f;// 使播放下一句的時(shí)候有0.1秒的延遲utterance.postUtteranceDelay = 0.1f;還可以設(shè)置這些屬性,如果同時(shí)實(shí)例兩個(gè)語音合成,那么會第一個(gè)實(shí)例播報(bào)完成之后再進(jìn)行第二個(gè)實(shí)例的播報(bào),程序不會阻塞
?
設(shè)置播報(bào)不同的語言:
AVSpeechSynthesisVoice *voiceType = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"];這里在設(shè)置語言的時(shí)候發(fā)現(xiàn)一個(gè)問題,就是只能設(shè)置中文女聲找不到中文男聲,但是一次錯(cuò)誤讓我找到了中文男聲的設(shè)置方法,@"zh-CN"是中文女生的設(shè)置方式,而@"zh-CH"就是中文男聲的設(shè)置方式
蘋果支持的語言類型:
-
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)
如果完成上面的操作就可以正常的播報(bào)了,但是退到后臺或者鎖屏之后播報(bào)就會停止了,但是需求要這樣的情況也要能播報(bào)啊
不要擔(dān)心還有一個(gè)屬性需要設(shè)置就可以了
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);通過設(shè)置上面的屬性還有就是勾選后臺模式就可以實(shí)現(xiàn)上面要達(dá)到的效果
| AVAudioSessionCategoryAmbient | 是 | 否 | 只支持播放 |
| AVAudioSessionCategoryAudioProcessing | - | 都不支持 | |
| AVAudioSessionCategoryMultiRoute | 否 | 是 | 既可以錄音也可以播放 |
| AVAudioSessionCategoryPlayAndRecord | 否 | 默認(rèn)不引起 | 既可以錄音也可以播放 |
| AVAudioSessionCategoryPlayback | 否 | 默認(rèn)引起 | 只用于播放 |
| AVAudioSessionCategoryRecord | 否 | 是 | 只用于錄音 |
| AVAudioSessionCategorySoloAmbient | 是 | 是 | 只用于播放 |
可以看到,其實(shí)默認(rèn)的就是“AVAudioSessionCategorySoloAmbient”類別。從表中我們可以總結(jié)如下:
- AVAudioSessionCategoryAmbient : 只用于播放音樂時(shí),并且可以和QQ音樂同時(shí)播放,比如玩游戲的時(shí)候還想聽QQ音樂的歌,那么把游戲播放背景音就設(shè)置成這種類別。同時(shí),當(dāng)用戶鎖屏或者靜音時(shí)也會隨著靜音,這種類別基本使用所有App的背景場景。
- AVAudioSessionCategorySoloAmbient: 也是只用于播放,但是和"AVAudioSessionCategoryAmbient"不同的是,用了它就別想聽QQ音樂了,比如不希望QQ音樂干擾的App,類似節(jié)奏大師。同樣當(dāng)用戶鎖屏或者靜音時(shí)也會隨著靜音,鎖屏了就玩不了節(jié)奏大師了。
- AVAudioSessionCategoryPlayback: 如果鎖屏了還想聽聲音怎么辦?用這個(gè)類別,比如App本身就是播放器,同時(shí)當(dāng)App播放時(shí),其他類似QQ音樂就不能播放了。所以這種類別一般用于播放器類App
- AVAudioSessionCategoryRecord: 有了播放器,肯定要錄音機(jī),比如微信語音的錄制,就要用到這個(gè)類別,既然要安靜的錄音,肯定不希望有QQ音樂了,所以其他播放聲音會中斷。想想微信語音的場景,就知道什么時(shí)候用他了。
- AVAudioSessionCategoryPlayAndRecord: 如果既想播放又想錄制該用什么模式呢?比如VoIP,打電話這種場景,PlayAndRecord就是專門為這樣的場景設(shè)計(jì)的 。
- AVAudioSessionCategoryMultiRoute: 想象一個(gè)DJ用的App,手機(jī)連著HDMI到揚(yáng)聲器播放當(dāng)前的音樂,然后耳機(jī)里面播放下一曲,這種常人不理解的場景,這個(gè)類別可以支持多個(gè)設(shè)備輸入輸出。
- AVAudioSessionCategoryAudioProcessing: 主要用于音頻格式處理,一般可以配合AudioUnit進(jìn)行使用
?
還有的需求是需要像支付寶收款語音播報(bào)的效果,那種情況看別人的文章需要靜默推送才能達(dá)到,因?yàn)橐诔绦蛞呀?jīng)被殺死的情況下也要能夠播報(bào),但是沒有嘗試過,如果將來需要會再來補(bǔ)充
?
總結(jié)
以上是生活随笔為你收集整理的iOS 语音合成支持后台和锁屏情况的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2014微软open day 51CTO
- 下一篇: 注册了看雪论坛