怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)
原文: http://www.raywenderlich.com/64623/make-narrated-book-using-avspeechsynthesizer-ios-7
随着 PageViewController 的引入,苹果让开发人员们制作图书类app 更加轻松。
不幸的是,对于生活在朝九晚五繁忙节奏中的人们来说,阅读也是一件奢侈的事情。为什么你不能在读一本小说的同一时候做其它事情呢?
在 Siri 刚開始出现的时候,苹果以前用复杂的动态文本阅读将开发人员拒之门外,但当iOS7 公布的时候,苹果最终放开了这扇大门。
在本教程中,你将制作一本故事书。这本书的每一页都会在显示文字的同一时候朗读文字中的内容。
有声的阅读将让你的 app 在 iTunes 中显得与众不同,同一时候还保护了视力。
有声书尤其受广播听众的喜爱。由于它同意人们在锻炼、烹饪或工作的同一时候进行“阅读”。
当你制作自己的有声书时, 你将学习到:
- 怎样使用 AVSpeechSynthesizer 和 AVSpeechUtterance 让 iOS 设备朗读文本
- How to make this synthesized speech sound more natural by modifying AVSpeechUtterance properties like pitch and rate.
- 怎样改动 AVSpeechUtterance 属性比如 pitch 和 rate,使合成的语音更自然
AVSpeechSynthesizer当然比不上真人语音。但它对于你将要开发的 app 来说,相对easy一些。
注意:关于怎样用 Sprite Kit 开发iPad儿童书籍,请參考Tammy Coron 的教程: ;
||
self.currentPageIndex ;
;
[self setupForCurrentPage];
}
@end
以上代码说明例如以下:
- book 属性保存了当前的 RWTBook 对象,currentPageIndex属性保存了 RWTBook 对象的当前页索引。
- 当视图载入完毕,设置要显示的 page,并增加滑动手势的识别器以便用户能通过手势进行翻页。
- 返回当前页的 RWTPage 对象。
- 设置 book 属性并将当前页置为第一页。
- 设置当前页的显示内容。
- 查找下一页。假设该页存在。则将下一页设置为当前页。
该方法由 swipeNext 手势识别器调用。
- 查找上一页。假设该页存在。则将上一页设置为当前页。该方法由 swipePrevious 手势识别器调用。
播放和停止!
这是一个非常要命的问题。
打开RWTPageViewController.m,在#import "RWTPage.h" 以下增加:
|
@import AVFoundation; |
iOS 语音功能由 AVFoundation 框架提供,你必须导入这个框架。
提示: @import会导入并连接 AVFoundation 框架。关于 iOS7 中 @import 及相关的 O-C 语言新特性,请參考这篇文章What’sNew in Objective-C and Foundation in iOS 7。
在 currentPageIndex 属性声明之下增加:
|
@property (nonatomic, strong) AVSpeechSynthesizer *synthesizer; |
synthesizer 对象将用于朗读每一页中的文字。
能够将 ViewController 中定义的AVSpeechSynthesizer 对象想象成一个会说话的人。而 AVSpeechUtterance 则能够想象成一张小纸条。把纸条递给这个人,则他就会念出纸条上的字。
注意:一个 AVSpeechUtterance 可能是一个单词,比方“Whisky”,或者是一个完整的语句,比方“Whisky,frisky,hippidityhop”。
在 RWTPageViewController.m 的最后增加以下方法:
|
#pragma mark - Speech Management - (void)speakNextUtterance { AVSpeechUtterance *nextUtterance = [[AVSpeechUtterance alloc] initWithString:[self currentPage].displayText]; [self.synthesizer speakUtterance:nextUtterance]; } |
创建了一个 utterance 对象,然后告诉 synthesizer 去念出它。
然后实现这种方法:
|
- (void)startSpeaking { if (!self.synthesizer) { self.synthesizer = [[AVSpeechSynthesizer alloc] init]; } [self speakNextUtterance]; } |
这种方法负责初始化 synthesizer 属性(假设它未初始化的话)。
然后调用speakNextUtterance 方法,開始朗读。
在 viewDidLoad 、gotoNextPage 和 gotoPreviousPage 方法的最后加上这行:
|
[self startSpeaking]; |
这样。当书一打开,或者用户前后翻页的时候。朗读就会開始。
Build & run。你会听到AVSpeechSynthesizer 发出的天籁之音。
注意:假设你什么也没听到,请检查 Mac 或者 iOS 设备的音量设置(看你是在什么地方执行这个 app 的)。你能够尝试着进行翻页看是不是能播放语音。
提示:假设你是在模拟器上执行程序。 可能控制台会输出一堆莫名其妙的错误信息。
这仅仅会在模拟器上出现。使用设备时则不会打印这些错误。
假设你听到了语音播放,请再次 Build & Run。这次,在第一页内容播放完之前,尝试向左滑动(向后翻页)。发现了什么?
synthesizer 仅仅会在第一页念完之后才開始念下一页。这不是用户想要的结果。他们会想让第一页停止播放而第二页马上開始。这点小瑕疵对于一页内容比較短的童谣来说不成问题。但试想一下,假设每页的内容都非常长的话会是什么效果……
怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)的更多相关文章
- 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(3)
plist 中的每一页 utteranceSting 我们都创建了一个RWTPage.displayText.因此,每页的文本会一次性地显示出来. 由于 You've constructedeach ...
- 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(2)
切分语句 软件project的一条定律是数据和代码分离.这样做会使代码更易于測试,即使输入的数据发生改变,你的代码也能够同意.甚至于,程序能在执行中实时下载新的数据.假设程序能在执行中下载新书岂不是更 ...
- 如何使用 iOS 7 的 AVSpeechSynthesizer 国家有声读物(4)
控制:我们一定要学会控制 尤达大师(电影<星球大战>)有话:的关键在于控制.这本故事书是一个字一个字读出来,我愿意为它添加两个button,音调和语速,以便我们能够调整语音合成实时的时候. ...
- iOS静态库的制作与引用
[iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ...
- iOS企业应用Profile制作流程
第一步:企业版iDP申请完成以后,访问iOS Dev Center:https://developer.apple.com/devcenter/ios/index.action 第二步:点击Log I ...
- iOS自定义控件教程:制作一个可重用的旋钮
当你的APP需要一些新功能时,自定义UI控件会十分有用,尤其是这些自定义控件可以在其他APP里面很好的重用.Colin Eberhart写过一篇很棒的介绍自定义UI控件的教程.这个教程涉及的是一个继承 ...
- iOS 静态库的制作
按照公司的想法 要开发一款SDK,于是就抽空学习一下静态枯的制作过程. 在IOS中有静态库和动态库的区分,下面我们就来详细介绍一下. 一.静态库和动态库的详细介绍. 我们平时的工程中或多或少都要引入第 ...
- iOS企业分发证书制作
自签名证书制作流程 打开终端,输入 openssl genrsa - ,生成名称为ca的秘钥 注:openssl生成的文件皆放在用户文档下(finder菜单栏'前往' - 电脑 -Macintosh ...
- c#上iOS apns p12文件制作记录 iOS推送证书制件
前期一些准备工作可参考:http://jingyan.baidu.com/article/7082dc1c6bb86de40a89bd1a.html 1.在桌面上建一个"apns_p12&q ...
随机推荐
- 【linux】UBUNTU 12.04下傻瓜式简单安装arm-linux-gcc等gnu arm toolchain交叉编译工具
欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...
- TCP与UDP在socket编程中的区别 (网络收集转载)
http://blog.chinaunix.net/uid-26421509-id-3814684.html 一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) ...
- Delphi中拖动无边框窗口的5种方法
1.MouseMove事件中加入: // ReleaseCapture;// Perform(WM_SYSCOMMAND, $F017 , 0); 2.MouseDown事件中加入: // POSTM ...
- QModelIndex有internalPointer()函数,可以存任何数据,另有QAbstractItemModel::createIndex来创造节点
整个model的节点数据,都靠它来记录了. 另有一个创造节点的函数(自带函数): QModelIndex QAbstractItemModel::createIndex(int arow, int a ...
- EF连接MySQL数据Web.Config配置
EF连接MySQL数据Web.Config配置 <?xml version="1.0" encoding="utf-8"?> <configu ...
- jQuery EasyUI API 中文文档 - 分隔按钮(splitbutton)
<html> <head> <script src="jquery-easyui/jquery.min.js"></script> ...
- C++学习笔记3
函数小结 : 函数是有名字的计算单元,对程序(就算是小程序)的结构化至关重要. 函数的定义由返回类型.函数名.形參表(可能为空)以及函数体组成.函数体是调用函数时运行的语句块. 在调用函数时,传递给函 ...
- Eclipse + PyDev 无法导入模块
下载后的包,在python IDLE 都可以导入这些模块,但是在Eclipse里面需要我们自己添加路径 需要导入的模块,在那个路径下,就在这里添加路径即可,其他的同理.
- java内存模型与线程(转) good
java内存模型与线程 参考 http://baike.baidu.com/view/8657411.htm http://developer.51cto.com/art/201309/410971_ ...
- 【HTML】让<pre>标签文本自动换行
利用<pre></pre>这个标签可以将其包起来的文字排版.格式,原封不动的呈现出来. 也就是说你输入的东西被原封不动的输出,包括你输入的空格之类的,不用 和<BR> ...