原文: 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

以上代码说明例如以下:

  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. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(3)

    plist 中的每一页 utteranceSting 我们都创建了一个RWTPage.displayText.因此,每页的文本会一次性地显示出来. 由于 You've constructedeach ...

  2. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(2)

    切分语句 软件project的一条定律是数据和代码分离.这样做会使代码更易于測试,即使输入的数据发生改变,你的代码也能够同意.甚至于,程序能在执行中实时下载新的数据.假设程序能在执行中下载新书岂不是更 ...

  3. 如何使用 iOS 7 的 AVSpeechSynthesizer 国家有声读物(4)

    控制:我们一定要学会控制 尤达大师(电影<星球大战>)有话:的关键在于控制.这本故事书是一个字一个字读出来,我愿意为它添加两个button,音调和语速,以便我们能够调整语音合成实时的时候. ...

  4. iOS静态库的制作与引用

    [iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ...

  5. iOS企业应用Profile制作流程

    第一步:企业版iDP申请完成以后,访问iOS Dev Center:https://developer.apple.com/devcenter/ios/index.action 第二步:点击Log I ...

  6. iOS自定义控件教程:制作一个可重用的旋钮

    当你的APP需要一些新功能时,自定义UI控件会十分有用,尤其是这些自定义控件可以在其他APP里面很好的重用.Colin Eberhart写过一篇很棒的介绍自定义UI控件的教程.这个教程涉及的是一个继承 ...

  7. iOS 静态库的制作

    按照公司的想法 要开发一款SDK,于是就抽空学习一下静态枯的制作过程. 在IOS中有静态库和动态库的区分,下面我们就来详细介绍一下. 一.静态库和动态库的详细介绍. 我们平时的工程中或多或少都要引入第 ...

  8. iOS企业分发证书制作

    自签名证书制作流程 打开终端,输入 openssl genrsa - ,生成名称为ca的秘钥 注:openssl生成的文件皆放在用户文档下(finder菜单栏'前往' - 电脑 -Macintosh ...

  9. c#上iOS apns p12文件制作记录 iOS推送证书制件

    前期一些准备工作可参考:http://jingyan.baidu.com/article/7082dc1c6bb86de40a89bd1a.html 1.在桌面上建一个"apns_p12&q ...

随机推荐

  1. Qt录音程序

    源地址:http://www.oschina.net/code/snippet_1243295_48623 [代码] [C/C++]代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  2. twemproxy 简介

    twemproxy,也叫nutcraker.是twtter开源的一个redis和memcache代理服务器. redis作为一个高效的缓存服务器,非常具有应用价值.但是当使用比较多的时候,就希望可以通 ...

  3. css盒模型和块级、行内元素深入理解

    盒模型是CSS的核心知识点之一,它指定元素如何显示以及如何相互交互.页面上的每个元素都被看成一个矩形框,这个框由元素的内容.内边距.边框和外边距组成,需要了解的朋友可以深入参考下 一.CSS盒模型 盒 ...

  4. 一些Windows API导致的Crash以及使用问题总结

    RegQueryValueEx gethostbyname/getaddrinfo _localtime64 FindFirstFile/FindNextFile VerQueryValue Crea ...

  5. Maven 实现Struts2注解配置步骤详解

    1,pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  6. Opencv2系列学习笔记8(图像滤波)

    一:概念: 滤波是信号处理机图像处理中的一个基本操作.滤波去除图像中的噪声,提取感兴趣的特征,允许图像重采样. 图像中的频域和空域:空间域指用图像的灰度值来描述一幅图像:而频域指用图像灰度值的变化来描 ...

  7. Sublime Text3 + Golang搭建开发环境

    Sublime Text3 + Golang搭建开发环境 http://blog.csdn.net/aqiang912/article/details/46775409 1.安装git 因为golan ...

  8. Hadoop--序列化

    序列化: 对象的序列化用于将一个对象编码成字节流,以及从字节流中重新构建对象. 将一个对象编码成一个字节流称为序列化该对象. 序列化三种主要的用途: 1.作为一种持久化格式. 2.作为一种通信的数据格 ...

  9. Ajax技术--考试计时并自动提交试卷

    1.概述 在开发网络考试系统时,考试计时并自动提交试卷是必不可少的功能.由于在答卷过程中,试卷不能刷新,所以需要使用Ajax实现无刷新操作.运行本实例,访问准备考试页面index.jsp,在该页面中, ...

  10. Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单

    {================================================================= 功 能: 创建 桌面.发送到....快速启动栏.开始菜单.程序菜单 ...