原文: 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 的教程: How to Create an Interactive Children’s Book for the iPad

開始:AVSpeechSynthesizer

首先,请下载 初始项目。进入NarratedBookUsingAVSpeechStarter 文件夹。双击 NarratedBookUsingAVSpeech.xcodeproj 以打开初始项目。

Build & run 。

你将在模拟器中看到:

书的内容是关于松鼠的童谣。尽管不是亚马逊买得最火的读物,但对于本教程来说足够了。

向左滑动进行向后翻页,向右滑动则返回前一页。

噢。它已经拥有了主要的“书”的功能,真是不错的開始。

理解机制

注意:教程的最后,会留给你几个习题。

接下来一节将包含演示样例项目的一些内容,以便你能独立完毕这些习题。假设你对这部分内容不感兴趣。请跳到下一节。

初始项目包含两个类:

1. Models: 用于存放书籍的内容,它是page 的集合。

2. Presentation: 将 models 展现到屏幕并响应用户动作(比如滑动手势)。

在你制作自己的图书时,理解这两个类的工作机制是非常有必要的。

打开RWTBook.h:

@interface RWTBook : NSObject

//1

@property (nonatomic, copy, readonly) NSArray *pages;

//2

+ (instancetype)bookWithPages:(NSArray*)pages;

//3

+ (instancetype)testBook;

@end

  1. pages 属性存放了 Page 对象的数组,每一个 Page对象代表图书中的每一页。
  2. bookWithPages: 方法是一个初始化 Book 的方法,它用指定的 page 对象数组为參数。返回一个 book 对象。
  3. testBook 创建 Book 对象,用于測试。

    在開始增加和读取你自己的图书内容之前,就先使用 testBook 创建一个简单的 Book 吧。

RWTPage.h声明例如以下:

//1

extern NSString* const RWTPageAttributesKeyUtterances;

extern NSString* const RWTPageAttributesKeyBackgroundImage;

@interface RWTPage : NSObject

//2

@property (nonatomic, strong, readonly) NSString *displayText;

@property (nonatomic, strong, readonly) UIImage *backgroundImage;

//3 + (instancetype)pageWithAttributes:(NSDictionary*)attributes;

@end

  1. 常量用于从字典中检索页。RWTPageAttributesKeyUtterances常量能够检索出page 对象中的文本,RWTPageAttributesKeyBackgroundImage则用于检索 page 对象所用的背景图片。
  2. displayText 属性用于存储 page 的文本,backgroundImage 属性用于存储 page 的背景图片。
  3. pageWithAttributes:用指定的 NSDictionary 创建一个 page 实例。

RWTPageViewController.m声明例如以下:

#pragma mark - Class Extension

// 1

@interface RWTPageViewController ()

@property (nonatomic, strong) RWTBook *book;

@property (nonatomic, assign) NSUInteger currentPageIndex;

@end

@implementation RWTPageViewController

#pragma mark - Lifecycle

// 2

- (void)viewDidLoad {

[super viewDidLoad];

[self setupBook:[RWTBook testBook]];

UISwipeGestureRecognizer *swipeNext = [[UISwipeGestureRecognizer alloc]                                           initWithTarget:self                                                   action:@selector(gotoNextPage)];

swipeNext.direction = UISwipeGestureRecognizerDirectionLeft;   [self.view addGestureRecognizer:swipeNext];

UISwipeGestureRecognizer *swipePrevious = [[UISwipeGestureRecognizer alloc]                                               initWithTarget:self                                                       action:@selector(gotoPreviousPage)];

swipePrevious.direction = UISwipeGestureRecognizerDirectionRight;

[self.view addGestureRecognizer:swipePrevious];

}

#pragma mark - Private

// 3

- (RWTPage*)currentPage {

return [self.book.pages objectAtIndex:self.currentPageIndex];

}

// 4

- (void)setupBook:(RWTBook*)newBook {

self.book = newBook;

self.currentPageIndex = 0;

[self setupForCurrentPage];

}

// 5

- (void)setupForCurrentPage {

self.pageTextLabel.text = [self currentPage].displayText;

self.pageImageView.image = [self currentPage].backgroundImage;

}

// 6

- (void)gotoNextPage {

if ([self.book.pages count] == 0 ||

self.currentPageIndex == [self.book.pages count] - 1) {

return;

}

self.currentPageIndex += 1;

[self setupForCurrentPage];

}

// 7

- (void)gotoPreviousPage {

if (self.currentPageIndex == 0) {

return;

}

self.currentPageIndex -= 1;

[self setupForCurrentPage];

}

@end

以上代码说明例如以下:

  1. book 属性保存了当前的 RWTBook 对象,currentPageIndex属性保存了 RWTBook 对象的当前页索引。
  2. 当视图载入完毕,设置要显示的 page,并增加滑动手势的识别器以便用户能通过手势进行翻页。
  3. 返回当前页的 RWTPage 对象。
  4. 设置 book 属性并将当前页置为第一页。
  5. 设置当前页的显示内容。
  6. 查找下一页。假设该页存在。则将下一页设置为当前页。

    该方法由 swipeNext 手势识别器调用。

  7. 查找上一页。假设该页存在。则将上一页设置为当前页。该方法由 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)相关推荐

  1. 智能有声书_有声小说全套资料_SSM_PPT_演示视频

    软件需求规约 1. 简介 1.1 目的 本文档目的在于提供关于智能有声书系统的功能需求的详述以及系统性能参数的说明. 1.2 开发语言及工具 组号 06 项目名称 智能有声书 编程语言 JavaScr ...

  2. 有声书制作是什么?有声书和电子书的区别是什么?

    有声书制作是什么? 有声书制作是一种个人或多人依据文稿并借着不同的声音表情和录音格式所录制的作品,常见的有声书制作格式有录音带.CD.数位档(例如MP3). 有声书制作一词约在1980年代出现,意味着 ...

  3. 大众都在用FLBOOK平台制作有声朗读电子书

    先看一段视频: QQ录屏20230719102543 怎么样?效果是不是很nice,不仅缓解疲劳,节约用眼.节省时间,还能增添很多乐趣! 想知道怎么制作吗? 我有一个方法可以供大家见解,FLBOOK大 ...

  4. 墙裂安利!用腾讯云AI语音合成打造自己的第一本有声书

    现代生活中,我们不可避免会遇到很多碎片时间,等公交.倒地铁.排核酸.买早点等等.这些时间累积起来,无疑是一笔很大的个人资源,而想利用这部分时间,听显然是最好的方式. 国内云计算语音合成服务已经非常成熟 ...

  5. [Android] 我的听书 一款安卓听书小说软件 清新无广告 离线缓存 最好的有声书播放器

    发一个无广告的听书app,有离线缓存功能,书源还可以自行手动勾选,软件自带的书源就有几十种可供选择,另外其他一些播放高级功能也都能在设置中找到,具体大家自行测试吧, 独特功能说明(最好的有声书播放器) ...

  6. audible 有声书_如何在iPhone或iPad上购买Kindle或Audible书

    audible 有声书 If you've ever tried to buy a book from the Kindle or Audible app on your iPhone or iPad ...

  7. 为什么人们爱听有声书?

    今日导读 都说"一千个人心中就有一千个哈姆雷特",那么试问,在音频对白中听到的哈姆雷特,相比在舞台上.荧幕上看到的哈姆雷特,哪一种给你留下的印象会更深刻呢?单纯的听觉享受和多维的视 ...

  8. 百度路书 信息显示_学会用地图制作路书,分分钟从小白变成自驾游达人

    原创文章,欢迎点评! 很多想要开车自驾游的朋友,由于自己不会做行程规划和安排,或总是感觉自己做的行程规划.安排不是很精准,不能很清晰的规划出自己每天该走多远的路?途中在景点游玩的时间应该是多少?什么时 ...

  9. 不可描述⁄( ⁄•⁄ω⁄•⁄ )⁄!亚马逊用机器学习找有声书中情色片段

    安妮 编译整理 量子位 出品 | 公众号 QbitAI 醉翁之意不在酒("∇") 你得承认,有的时候看言情小说不是因为里面的情节有多赞,也不是因为它的文学价值很高,而是因为里面有一 ...

  10. 爬虫结合批量下载评书、有声书、戏曲等的使用教程

    为了教妈妈如何给姥爷下载唱戏机评书歌曲 出了一份图解教程如下 1.打开ht网.(此爬虫专用网站) 2.在网站上选择喜欢的内容记住他的id号码(下图举例)图片中id号为9774 3.以家里电脑为例,进入 ...

最新文章

  1. 2022-2028年中国食品电商行业投资分析及前景预测报告
  2. c语言程序设计入门导论,程序设计入门——C语言
  3. mysql 逻辑处理_mysql 逻辑查询处理流程
  4. Linux文件atime ctime mtime
  5. MySql日期处理系列-常用的日期推算处理
  6. html中iframe根据子页面内容动态修改高度
  7. Linux下利用脚本全自动搭建论坛
  8. 计算机网络对我们思维的影响,计算机网络教学中学生计算思维的培养
  9. 深入理解Spring系列之四:BeanDefinition装载前奏曲
  10. 创建虚拟交换机(New-VMSwitch)
  11. 【渝粤教育】国家开放大学2018年春季 0653-21T机电控制与可编程控制技术 参考试题
  12. Linux下删除mysql安装包相关内容信息
  13. Excel数据导入___你hold住么(二)
  14. 刀具磨损类论文观后总结
  15. Taylor’s Formula - 泰勒公式
  16. Simon 5有哪些新功能? Simon 5 Mac版新功能介绍
  17. Arcgis js featureLayer加载完成之后,对其加载的要素重新定义样式
  18. LCS算法:最长公共子序列
  19. 监管总局严打虚假检测报告
  20. 软电话 开源的和免费的大全

热门文章

  1. 什么是SVC?AVC和SVC有什么区别
  2. c语言程序设计精髓第六章编程题
  3. 微型计算机内存一般为多少,微型计算机内存容量的基本计量单位
  4. MIPS汇编语言实现Fibonacci数列(斐波那契数列)
  5. pdf文件转换成word转换器
  6. 双绞线 计算机考试,计算机基础知识:有线传输介质之双绞线
  7. 笔记本的无线网共享给台式机上网
  8. 倒计时器 (WPF)
  9. windows能装linux系统盘,用U盘安装linux系统(Windows环境下制作启动盘)
  10. 10大名场面!Python处理办公自动化的10招!