您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> 安卓开发 >> 正文

使用 iOS 7 的 AVSpeechSynthesizer 制作有声书的方法

作者:佚名    责任编辑:admin    更新时间:    2015-10-21 14:40:44

这是一篇关于iOS 7 的 AVSpeechSynthesizer 制作有声书的文章,看看小编为大家整理的吧。

开始: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

pages 属性存放了 Page 对象的数组,每个 Page对象代表图书中的每一页。

bookWithPages: 方法是一个初始化 Book 的方法,它用指定的 page 对象数组为参数,返回一个 book 对象。

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

常量用于从字典中检索页。RWTPageAttributesKeyUtterances常量可以检索出page 对象中的文本,RWTPageAttributesKeyBackgroundImage则用于检索 page 对象所用的背景图片。

displayText 属性用于存储 page 的文本,backgroundImage 属性用于存储 page 的背景图片。

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

以上代码说明如下:

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];

这样,当书一打开,或者用户前后翻页的时候,朗读就会开始。