iOS 语音合成支持后台和锁屏情况
最近有一個需求,就是要加入語音合成,并能夠在進入后臺或者鎖屏之后能夠播報,現在最流行的應該就是科大訊飛了,功能強大,用起來簡單,但是如果只要簡單的TTS功能就沒有必要集成其他的SDK了,iOS中提供好的API就可以了。
AVSpeechSynthesizer
這個類可以用來播放一個或者多個語音內容,播放的語音內容都是通過實例化AVSpeechUtterance而得到,對于一個或者多個AVSpeechUtterance實例,AVSpeechSynthesizer對象起到隊列的作用,提供了API可以控制和監視正在進行的語音播放,首先引入頭文件:
#import <AVFoundation/AVFoundation.h>創建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.0futterance.rate = 0.5f;// 聲音的音調 0.5f~2.0futterance.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);通過設置上面的屬性還有就是勾選后臺模式就可以實現上面要達到的效果
| 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 语音合成支持后台和锁屏情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2014微软open day 51CTO
- 下一篇: 注册了看雪论坛