談談iOS自帶文字轉語音

前言

? ? 之前自己的項目中曾經使用過訊飛的文字轉語音技術,但是通過實際測試,發現它的免費在線轉語音不是很好,受網絡的影響聲音經常斷斷續續的;而它的離線轉語音價格有太貴,最便宜的要8000RMB/2000裝機量,令許多開發者望而止步。那么既然支付不了訊飛那昂貴的費用,iOS自帶的文字轉語音也是我們不錯的選擇,只是他的發音效果不夠理想,不過還可以接受。今天我就帶大家學習iOS自帶的文字轉語音!

第一步:導入系統框架

使用iOS系統的文字轉語音需要用到AVFoundation框架,這個不需要詳談了吧:


導入框架

隨后,導入

#import<AVFoundation/AVSpeechSynthesis.h>

需要代理的話導入代理

@interfaceViewController()<AVSpeechSynthesizerDelegate>

第二步:創建對象

在這里對象最好創建為全局的,便于我們控制;當然如果你不需要暫停、繼續播放等操作的話可以創建一個局部的。

{

AVSpeechSynthesizer*av;

}

隨后我們創建一個簡單的按鈕來操控他:

UIButton*button=[UIButtonbuttonWithType:UIButtonTypeCustom];

button.frame=CGRectMake(100,100,100,50);

[buttonsetTitle:@"講"forState:UIControlStateNormal];

[buttonsetTitle:@"停"forState:UIControlStateSelected];

[buttonsetTitleColor:[UIColorblueColor]forState:UIControlStateNormal];

button.backgroundColor=[UIColorgrayColor];

button.showsTouchWhenHighlighted=YES;

[buttonaddTarget:selfaction:@selector(start:)forControlEvents:UIControlEventTouchUpInside];

[self.viewaddSubview:button];

第三步:具體代碼部分

-(void)start:(UIButton*)sender{

if(sender.selected==NO) {

if([avisPaused]) {

//如果暫停則恢復,會從暫停的地方繼續

[avcontinueSpeaking];

sender.selected=!sender.selected;

}else{

//初始化對象

av= [[AVSpeechSynthesizeralloc]init];

av.delegate=self;//掛上代理

AVSpeechUtterance*utterance = [[AVSpeechUtterancealloc]initWithString:@"錦瑟無端五十弦,一弦一柱思華年。莊生曉夢迷蝴蝶,望帝春心托杜鵑。滄海月明珠有淚,藍田日暖玉生煙。此情可待成追憶,只是當時已惘然。"];//需要轉換的文字

utterance.rate=0.5;// 設置語速,范圍0-1,注意0最慢,1最快;AVSpeechUtteranceMinimumSpeechRate最慢,AVSpeechUtteranceMaximumSpeechRate最快

AVSpeechSynthesisVoice*voice = [AVSpeechSynthesisVoicevoiceWithLanguage:@"zh-CN"];//設置發音,這是中文普通話

utterance.voice= voice;

[avspeakUtterance:utterance];//開始

sender.selected=!sender.selected;

}

}else{

//[av stopSpeakingAtBoundary:AVSpeechBoundaryWord];//感覺效果一樣,對應代理>>>取消

[avpauseSpeakingAtBoundary:AVSpeechBoundaryWord];//暫停

sender.selected=!sender.selected;

}

//[utterance release];//需要關閉ARC

//[av release];

}

下面是代理:

- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didStartSpeechUtterance:(AVSpeechUtterance*)utterance{

NSLog(@"---開始播放");

}

- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance*)utterance{

NSLog(@"---完成播放");

}

- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance*)utterance{

NSLog(@"---播放中止");

}

- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance*)utterance{

NSLog(@"---恢復播放");

}

- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance*)utterance{

NSLog(@"---播放取消");

}

詳解:

@property(nonatomic,readonly,getter=isSpeaking)BOOL speaking;//是否正在播放

@property(nonatomic,readonly,getter=isPaused)BOOL paused;//是否暫停

- (BOOL)stopSpeakingAtBoundary:(AVSpeechBoundary)boundary;//取消播放,將會完全停止

- (BOOL)pauseSpeakingAtBoundary:(AVSpeechBoundary)boundary;//暫停播放,將會保存進度

- (BOOL)continueSpeaking;//恢復播放

取消與暫停的兩個效果我感覺都一樣:

typedefNS_ENUM(NSInteger, AVSpeechBoundary) {

AVSpeechBoundaryImmediate,

AVSpeechBoundaryWord

}NS_ENUM_AVAILABLE_IOS(7_0);

@property(nonatomic)floatrate;// 設置語速,范圍0-1,注意0最慢,1最快;AVSpeechUtteranceMinimumSpeechRate最慢,AVSpeechUtteranceMaximumSpeechRate最快

@property(nonatomic)floatpitchMultiplier;// [0.5 - 2] Default = 1,聲調,不怕逗死你就設成2

@property(nonatomic)floatvolume;// [0-1] Default = 1,音量

代理:

- (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;

//取消

設置聲音效果的方法,注意選英語則讀不了漢語,但是漢語可以和英語混用,這個我已經試過了:

+ (nullableAVSpeechSynthesisVoice*)voiceWithLanguage:(nullableNSString*)languageCode;

下面給出詳細的發音列表,中英文的已標出,其他語言請大家自己試吧:

avspeech支持的語言種類包括:

"[AVSpeechSynthesisVoice 0x978a0b0] Language: th-TH",

"[AVSpeechSynthesisVoice 0x977a450] Language: pt-BR",

"[AVSpeechSynthesisVoice 0x977a480] Language: sk-SK",

"[AVSpeechSynthesisVoice 0x978ad50] Language: fr-CA",

"[AVSpeechSynthesisVoice 0x978ada0] Language: ro-RO",

"[AVSpeechSynthesisVoice 0x97823f0] Language: no-NO",

"[AVSpeechSynthesisVoice 0x978e7b0] Language: fi-FI",

"[AVSpeechSynthesisVoice 0x978af50] Language: pl-PL",

"[AVSpeechSynthesisVoice 0x978afa0] Language: de-DE",

"[AVSpeechSynthesisVoice 0x978e390] Language: nl-NL",

"[AVSpeechSynthesisVoice 0x978b030] Language: id-ID",

"[AVSpeechSynthesisVoice 0x978b080] Language: tr-TR",

"[AVSpeechSynthesisVoice 0x978b0d0] Language: it-IT",

"[AVSpeechSynthesisVoice 0x978b120] Language: pt-PT",

"[AVSpeechSynthesisVoice 0x978b170] Language: fr-FR",

"[AVSpeechSynthesisVoice 0x978b1c0] Language: ru-RU",

"[AVSpeechSynthesisVoice 0x978b210] Language: es-MX",

"[AVSpeechSynthesisVoice 0x978b2d0] Language: zh-HK",中文(香港)粵語

"[AVSpeechSynthesisVoice 0x978b320] Language: sv-SE",

"[AVSpeechSynthesisVoice 0x978b010] Language: hu-HU",

"[AVSpeechSynthesisVoice 0x978b440] Language: zh-TW",中文(臺灣)

"[AVSpeechSynthesisVoice 0x978b490] Language: es-ES",

"[AVSpeechSynthesisVoice 0x978b4e0] Language: zh-CN",中文(普通話)

"[AVSpeechSynthesisVoice 0x978b530] Language: nl-BE",

"[AVSpeechSynthesisVoice 0x978b580] Language: en-GB",英語(英國)

"[AVSpeechSynthesisVoice 0x978b5d0] Language: ar-SA",

"[AVSpeechSynthesisVoice 0x978b620] Language: ko-KR",

"[AVSpeechSynthesisVoice 0x978b670] Language: cs-CZ",

"[AVSpeechSynthesisVoice 0x978b6c0] Language: en-ZA",

"[AVSpeechSynthesisVoice 0x978aed0] Language: en-AU",

"[AVSpeechSynthesisVoice 0x978af20] Language: da-DK",

"[AVSpeechSynthesisVoice 0x978b810] Language: en-US",英語(美國)

"[AVSpeechSynthesisVoice 0x978b860] Language: en-IE",

"[AVSpeechSynthesisVoice 0x978b8b0] Language: hi-IN",

"[AVSpeechSynthesisVoice 0x978b900] Language: el-GR",

"[AVSpeechSynthesisVoice 0x978b950] Language: ja-JP"

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評論 6 545
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,795評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,943評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,057評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,773評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,106評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,282評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,793評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,507評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,741評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,929評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,325評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,661評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,482評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,702評論 2 380

推薦閱讀更多精彩內容

  • iOS文本轉語音技術 文本轉語音技術, 也叫TTS, 是Text To Speech的縮寫. iOS如果想做有聲書...
    windgo閱讀 4,426評論 7 10
  • 因新項目需求,需要接入類似支付寶收款提示聲----“支付寶到賬xxxx元”,就查看了一些文章,蘋果還是想的很周全,...
    Hyperion_J閱讀 12,546評論 8 4
  • 最近項目剛剛交付,偶然間用到了語音播報和語音搜索的功能。語音搜索我用的是訊飛的demo,感覺效果還不錯,感興趣的話...
    奔跑的小螞蟻_8b28閱讀 8,504評論 13 6
  • 前言 最近忙完項目比較閑,想寫一篇博客來分享一些自學iOS的心得體會,希望對迷茫的你有所幫助。博主非科班出身,一些...
    GitHubPorter閱讀 1,451評論 9 5
  • 一些小的功能點,雖然很小,但是里面有些彎,值得注意。(同系列文章會持續更新.......) 1.tableHead...
    進無盡閱讀 475評論 0 3