AVFoundation實現(xiàn)語音讀報

demo下載地址

屏幕快照 2017-01-11 上午12.22.24.png

思路:

這里主要使用系統(tǒng)自帶的AVFoundation框架,利用語音合成器AVSpeechSynthesizer 的實例對象相關方法實現(xiàn)相關操作:

一:導入框架AVFoundation

在項目的TARGETS下的linked Frameworks and Libraries 點擊+

屏幕快照 2017-01-10 下午11.54.16.png

在系統(tǒng)頂部導入頭文件

#import <AVFoundation/AVFoundation.h>

二:利用懶加載生成語音合成器和語音數(shù)組

// 懶加載
-(NSArray<AVSpeechSynthesisVoice *> *)laungeVoices{
    
    if (_laungeVoices == nil) {
        _laungeVoices = @[
                          // 美式英語
                          [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"],
                          // 英式英語
                          [AVSpeechSynthesisVoice voiceWithLanguage:@"en-GB"],
                          // 中文
                          [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"]
                          ];
        
    }
 return _laungeVoices;
    
}

-(AVSpeechSynthesizer *)synthesizer{
    if (_synthesizer == nil) {
        _synthesizer = [[AVSpeechSynthesizer alloc]init];
        _synthesizer.delegate = self;
        
    }
    return _synthesizer;
}

三:實現(xiàn)語音的開始和停止的操作

這里一定注意,選擇語音發(fā)音的類別,如果有中文,一定選擇中文,如果在有中文的情況下沒有選擇中文,那么中文一定不會被讀出,英文是在什么情況下都可以被讀出的,只是美式和英式的差別,因此這里最好設置為中文
utterance.voice = self.laungeVoices[2];

#pragma mark 語音處理
- (IBAction)voiceBtnClick:(UIButton *)sender {
    
  // 創(chuàng)建一個對話
    AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:self.textView.text];
 // 選擇語音發(fā)音的類別,如果有中文,一定選擇中文
    utterance.voice = self.laungeVoices[2];
  // 播放語音的速錄,值越大,速度越快
    utterance.rate = 0.4f;
    //音調  --  為語句指定pitchMultiplier 耕渴,可以在播放特定語句時改變聲音的音調颁股、pitchMultiplier的允許值一般介于0.5(低音調)和2.0(高音調)之間
    utterance.pitchMultiplier = 0.8f;
    
    //讓語音合成器在播放下一句之前有短暫時間的暫停派昧,也可以類似的設置preUtteranceDelay
    utterance.postUtteranceDelay = 0.1f;
    
    if (self.synthesizer.isSpeaking) { //正在語音播放
        
        //立即停止播放語音
        [self.synthesizer stopSpeakingAtBoundary:AVSpeechBoundaryImmediate];
    }
    else{
        //播放語言
        [self.synthesizer speakUtterance:utterance];
    } 
}

四:實現(xiàn)暫停和繼續(xù)的語音播放

/** 暫停語音播放/回復語音播放 */
- (IBAction)playAndPauseBtnClick:(UIButton *)sender {
    
    if (self.synthesizer.isPaused == YES) { //暫停狀態(tài)
        //繼續(xù)播放
        [self.synthesizer continueSpeaking];
        
    }
    
    else { //現(xiàn)在在播放
        
        //立即暫停播放
        [self.synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryImmediate];
        
    }
 
}

五:注意一下幾個代理方法的使用場景


- (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(@"繼續(xù)播放語音的時候調用");
}


- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance {
    NSLog(@"取消語音播放的時候調用");
}


- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance {
    
    /** 將要播放的語音文字 */
    NSString *willSpeakRangeOfSpeechString = [utterance.speechString substringWithRange:characterRange];
    
    NSLog(@"即將播放的語音文字:%@",willSpeakRangeOfSpeechString);
}

注意:

https://github.com/chenfanfang/CollectionsOfExample
里面有正則表達式的使用方法以及一下效果的實現(xiàn)源碼

不同寬度的標簽.png
下拉菜單的基本使用.png
雪花飄落效果.png
自定義菜單樣式1.png
自定義菜單cell(非xib).png
自定義下拉菜單cell(xib).png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市粗悯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌同欠,老刑警劉巖样傍,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異铺遂,居然都是意外死亡铭乾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門娃循,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炕檩,“玉大人,你說我怎么就攤上這事捌斧〉阎剩” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵捞蚂,是天一觀的道長妇押。 經常有香客問我,道長姓迅,這世上最難降的妖魔是什么敲霍? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮丁存,結果婚禮上肩杈,老公的妹妹穿的比我還像新娘。我一直安慰自己解寝,他們只是感情好扩然,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聋伦,像睡著了一般夫偶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上觉增,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天兵拢,我揣著相機與錄音,去河邊找鬼逾礁。 笑死说铃,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播截汪,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼疾牲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衙解?” 一聲冷哼從身側響起阳柔,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚓峦,沒想到半個月后舌剂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡暑椰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年霍转,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片一汽。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡避消,死狀恐怖,靈堂內的尸體忽然破棺而出召夹,到底是詐尸還是另有隱情岩喷,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布监憎,位于F島的核電站纱意,受9級特大地震影響,放射性物質發(fā)生泄漏鲸阔。R本人自食惡果不足惜偷霉,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褐筛。 院中可真熱鬧类少,春花似錦、人聲如沸死讹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞警。三九已至,卻和暖如春虏两,著一層夾襖步出監(jiān)牢的瞬間愧旦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工定罢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笤虫,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像琼蚯,于是被迫代替她去往敵國和親酬凳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議遭庶。它實...
    香橙柚子閱讀 23,911評論 8 183
  • 常常心底里會產生空虛與不安宁仔,在擁有太多空閑時間時。這種境況纏繞著我峦睡,至一度不知所措翎苫。 這種情況下,音樂便成了我的指...
    大米飯的遇似非遇閱讀 277評論 0 0
  • 不得不說榨了,自己是一個批判性很強的人煎谍,發(fā)生在自己身上的,別人身上的龙屉,總會看不過去呐粘,還會經常自己想想自己氣,尤其是自...
    妍心12388閱讀 390評論 0 0
  • 轉移轉移转捕,重新開始事哭,正式開始,拼命開始瓜富。包容鳍咱,無為,給予与柑,從最簡單的事情做起谤辜。
    M_152閱讀 153評論 0 0
  • 別一個昨日, 念一種舊情价捧, 思一位知己丑念, 看一處遠方, 追一次夢想结蟋。 我來了脯倚, 你一定要等。 你等了嵌屎, 我不會辜負你……
    小劇在成長閱讀 402評論 0 9