再过不久格志就将迎来一次比较大的版本更新,现在主要功能都开发的差不多了,剩下一些细节的完善。这两天也是正在制作格志的新手引导功能,前段时间 facebook 出的 Paper 中的新手引导效果非常棒,这次格志的新手引导也有借鉴了部分,其中一个功能是使用语音朗读出新手引导的文字内容。

由于格志是一个时髦的应用(Only iOS 7)…所以可以很开心的使用 iOS 7 中才有的 AVSpeechSynthesizer,做了一搜索后,可以说这货真的很简单、很好用!

如何使用

首先,使用 AVSpeechSynthesizer 时需要 #import <AVFoundation/AVFoundation.h>

然后我们可以用几行代码实现让程序阅读一段文字:

1
2
3
4
5
6
NSString *string = @"Hello, World!";
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:string];
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"];

AVSpeechSynthesizer *speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
[speechSynthesizer speakUtterance:utterance];

AVSpeechUtterance 对象用于封装要朗读的话语,可以指定这段话的语言、音量和语速等。

但是上面的代码有个问题,上面代码第三行中传入AVSpeechUtteranceAVSpeechSynthesisVoice 对象是在英文的语言环境下阅读文字,如果文字内容的语言声音的语言不同,程序就不会发出声音。而格志是个国际化 App,目前支持7种语言,所以要针对不同的语言内容设置正确的语音语言代码(如:en-US, zh-CH)。

可以通过[AVSpeechSynthesisVoice speechVoices]查询所有支持的语言,幸运的是可以通过[AVSpeechSynthesisVoice currentLanguageCode]获取用户当前系统设置中的语言所对应的语言代码。所以上面的代码可以改成这样以支持国际化

1
2
3
4
5
6
7
NSString *string = @"Hello, World!";
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:string];
NSString *code = [AVSpeechSynthesisVoice currentLanguageCode]; // 获取用户当前的语言代码
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:code];

AVSpeechSynthesizer *speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
[speechSynthesizer speakUtterance:utterance];

到这里好像我所需要的功能就大概实现了,当然在真实环境中还应该对语速、音量等参数做一些微调,让语音听上去更自然清晰。

然后…AVSpeechSynthesizer 不止只有这些,AVSpeechSynthesizer 的方法中还有有暂停、停止和继续的方法,注意到停止和暂停方法都可以传入一个(AVSpeechBoundary)boundary的参数,用于决定程序是在一个单词朗读完(AVSpeechBoundaryWord)再暂停还是立即(AVSpeechBoundaryImmediate)暂停。

 AVSpeechSynthesizerDelegate

AVSpeechSynthesizerDelegate中其实其它方法都没什么好说的,都是些开始阅读、结束阅读、取消等的状态回调。但是有一个方法不同,它带了将要阅读的文字的 NSRange,这个方法是:- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance;,如果获取到将要阅读的文字是哪些,我们就可以做一些有趣的事情,如:像歌词字幕一样高亮正在阅读的文字,或者可以像下面一样在屏幕中只显示将要阅读的文字。

总结

总之 AVSpeechSynthesizer  是一个简单又实用的语音合成类,分分钟上手有木有。使用语音朗读的场景感觉还是很多的,比如这次格志里用到的朗读用户引导的文字,语音导航,有声读物等等。

iOS UITextView 输入内容实时更新 cell 的高度

这篇文章介绍了在一个动态数据的 table view 中,cell 根据 text view 内容的输入实时改变 cell 和 table view 的高度。自动计算 cell 高度的功能使用 iOS 8 才支持的自适应 cell,如果你还不知道 iOS 8 自适应 cell, …… Continue reading

iOS 8 自适应 Cell

Published on November 13, 2014