怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(3)
plist 中的每一页 utteranceSting 我们都创建了一个RWTPage.displayText。因此,每页的文本会一次性地显示出来。
由于
You’ve constructedeach RWTPage.displayTextfrom the combined utteranceStringsfor the page in the plist. So, your page view displays the entire page’s text.
However, remember that RWTPageViewController.speakNextUtterancecreates a single AVSpeechUtterancefor the entire RWTPage.displayText.The result is that it overlooks your carefully parsed utterance properties.
In order to modifyhow each utterance is spoken, you need to synthesize each page’s text asindividual utterances. If only there were some way to observe and control howand when AVSpeechSynthesizerspeaks. Hmmm…
实现托付
AVSpeechSynthesizer 有一个托付AVSpeechSynthesizerDelegate ,在合成器生命周期中它负责通知各种重要的事件和动作。通过实现这些托付方法,我们可以让声音更自然。
打开 RWTPage.h。增加下列代码:
|
; ; // 3 [self.synthesizer speakUtterance:utterance]; } } |
- 在凝视为 1 的地方,我们先确保 nextSpeechUtterance 不会出现下标越界。
- 在凝视为 2 的地方,我们获得当前要读到的 utterance。然后 nextSpeechUtterance 加1。
- 终于,凝视为 3 的地方。朗读 utterance。
编译执行,听到了吗?在念第一页的时候。你仅仅听见一个词“Whisky”。由于我们还没有实现其它的托付方法,因此当一个utterance 念完后,并不会接着念下一个 utterance。
改动 startSpeaking方法:
|
- (void)startSpeaking { if (!self.synthesizer) { self.synthesizer = [[AVSpeechSynthesizer alloc] init]; // 1 self.synthesizer.delegate = self; } [self speakNextUtterance]; } |
凝视“1”的地方,我们将 ViewController 作为合成器的托付。
在 RWTPageViewController.m 最后增加一个方法:
|
#pragma mark - AVSpeechSynthesizerDelegate Protocol - (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance*)utterance { NSUInteger indexOfUtterance = [[self currentPage].utterances indexOfObject:utterance]; if (indexOfUtterance == NSNotFound) { return; } [self speakNextUtterance]; } |
这段代码在当前 utterance (文本)念完后,開始念下一段。
编译执行。如今的效果是:
- 一旦当前文本念完,自己主动跳到下一文本。直至这一页都念完。
- 不管向前还是向后翻页时。这一页的内容都不再继续念了。
- 发声更自然。这归功于 WhirlySquirrelly.plist文件里的 utteranceProperties 字段。为此,作者不得不手工调整每个词句。
怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(3)的更多相关文章
- 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)
原文: http://www.raywenderlich.com/64623/make-narrated-book-using-avspeechsynthesizer-ios-7 随着 PageVie ...
- 怎样使用 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 ...
随机推荐
- 第三篇:python基础_3
本篇内容 文件处理补充 函数基本语法及特性 参数 返回值 嵌套函数 一.文件处理补充 1.文件操作的内置方法 #!/usr/bin/env pyhon #encoding: utf-8 #auth: ...
- 通过Url网络编程实现下载
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputS ...
- uvalive 6323 状态压缩DP
思路:dp[i][j][x]表示状态 i 以 j 为结束 得分为 x 的方案数. #include<iostream> #include<cstdio> #include< ...
- BZOJ2806 [Ctsc2012]Cheat 【后缀自动机 + 二分 + 单调队列优化DP】
题目 输入格式 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库 的行数 接下来M行的01串,表示标准作文库 接下来N行的01串,表示N篇作文 输出格式 N行,每行一个整数,表示这篇作文的 ...
- bzoj3694最短路
bzoj3694最短路 Description 给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1.定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1 ...
- 【BZOJ 5047 空间传送装置】
Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 282 Solved: 121[Submit][Status][Discuss] Descriptio ...
- 【VBA】标准Sub/Function定义,带ScreenUpdating、On Error GoTo
[说明] 标准Sub/Function定义,带ScreenUpdating.On Error GoTo Sub AutoFillRole() '--------------- ERROR MSG--- ...
- [Linux]方便openmp等程序的类似编译
因为总是打参数例如-fopenmp或者-lGL等等有些麻烦,所以特地写一个可以使用的bash文件用来执行简单的操作 首先在.profile中添加 if [ -d "$HOME/bin&quo ...
- MFC 对话框阴影效果
在 OnInitDialog(Cdialog)里面添加 SetClassLong(this->m_hWnd, GCL_STYLE, GetClassLong(this->m_hWnd, G ...
- [LeetCode] 4Sum hash表
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...