最近项目刚刚交付,偶然间用到了语音播报和语音搜索的功能。语音搜索我用的是讯飞的 demo, 感觉效果还不错,感兴趣的话可以去官网上面下载 demo, 里面讲的特别的详细,不过稍显麻烦一些。语音播报讯飞也有 demo, 不过做开发当然要寻求最简洁的处理方式,ios7.0 之后新添加了一些新的功能,里面就有系统自带的语音播报库 AVFoundation。关于语音播报的文章其实挺多的。文本转语音技术, 也叫 TTS, 是 Text To Speech 的缩写. iOS 如果想做有声书等功能的时候, 会用到这门技术.
一,使用 iOS 自带 TTS 需要注意的几点:
二,代码示例, 播放语音
- //语音播报
- AVSpeechUtterance * utterance = [AVSpeechUtterance speechUtteranceWithString: @"床前明月光,疑是地上霜。"];
- utterance.pitchMultiplier = 0.8;
- //中式发音
- AVSpeechSynthesisVoice * voice = [AVSpeechSynthesisVoice voiceWithLanguage: @"zh-CN"];
- //英式发音
- // AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-GB"];
- utterance.voice = voice;
- NSLog(@"%@", [AVSpeechSynthesisVoice speechVoices]);
- AVSpeechSynthesizer * synth = [[AVSpeechSynthesizer alloc] init];
- [synth speakUtterance: utterance];
三,AVSpeechSynthesizer 介绍
这个类就像一个会说话的人, 可以 "说话", 可以 "暂停" 说话, 可以 "继续" 说话, 可以判断他当前是否正在说话. 有以下的方法或者属性:
四,AVSpeechBoundary 介绍
这是一个枚举. 在暂停, 或者停止说话的时候, 停下的方式用这个枚举标示. 包括两种:
五,AVSpeechSynthesizerDelegate 介绍
合成器的委托, 对于一些事件, 提供了响应的接口.
六,AVSpeechSynthesisVoice 介绍
AVSpeechSynthesisVoice 定义了一系列的声音, 主要是不同的语言和地区.
七,AVSpeechUtterance 介绍
这个类就是一段要说的话. 主要的属性和方法有:
上面这些是关于语音播报的基本用法和一些属性、方法,但是如何结合程序推送,在程序后台运行的时候实现语音播报的效果呢?当然还有很多需要注意的地方。
和上面的后台获取类似,更改 Info.plist,在 UIBackgroundModes 下加入 remote-notification 即可开启,当然同样的更简单直接的办法是使用 Capabilities,勾选下面的三个 modes。
在 iOS7 中,如果想要使用推送来唤醒应用运行代码的话,需要在 payload 中加入 content-available,并设置为 1。
{"aps":{"content-available":1,"alert":"今天是个好天气"}}
"content-available":1 推送唤醒
"alert":"" 推送内容
"badge":1 app 右上角数字
"sound":"default" 默认声音
aps
{
content-available: 1
alert: {...}
}
最后在 appDelegate 中实现 - application:didReceiveRemoteNotification:fetchCompletionHandle:。这部分内容和上面的后台获取部分完全一样,在此不再重复。
// 接收到推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"remote: %@", userInfo);
// 回调
completionHandler(UIBackgroundFetchResultNewData);
// 语音播报
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:userInfo[@"aps"][@"alert"]];
AVSpeechSynthesizer *synth = [[AVSpeechSynthesizer alloc] init];
[synth speakUtterance:utterance];
}
完成以上步骤就可在后台进行语音播报了。
参考文章链接:
一、
二、
三、
五、
六、
来源: http://www.cnblogs.com/bigant9527/p/6144292.html