[TOC]
合成支持在线和离线两种工作方式,默认使用在线方式。如果使用离线服务,有2种方式,一种是使用语记SDK(原语音+ SDK)提供的免费服务,一种是付费购买后在应用内部集成。相关细节请关注讯飞开放平台(http://www.xfyun.cn/)。
## 在线合成
本示例对应Demo的TTSUIController文件,为在线合成的代码示例。
~~~
//包含头文件
#import "iflyMSC/IFlyMSC.h"
//需要实现IFlySpeechSynthesizerDelegate合成会话的服务代理
@interface TTSUIController : UIViewController<IFlySpeechSynthesizerDelegate>
@property (nonatomic, strong) IFlySpeechSynthesizer *iFlySpeechSynthesizer;
@end
//获取语音合成单例
_iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
//设置协议委托对象
_iFlySpeechSynthesizer.delegate = self;
//设置合成参数
//设置在线工作方式
[_iFlySpeechSynthesizer setParameter:[IFlySpeechConstant TYPE_CLOUD]
forKey:[IFlySpeechConstant ENGINE_TYPE]];
//设置音量,取值范围 0~100
[_iFlySpeechSynthesizer setParameter:@"50"
forKey: [IFlySpeechConstant VOLUME]];
//发音人,默认为”xiaoyan”,可以设置的参数列表可参考“合成发音人列表”
[_iFlySpeechSynthesizer setParameter:@" xiaoyan "
forKey: [IFlySpeechConstant VOICE_NAME]];
//保存合成文件名,如不再需要,设置为nil或者为空表示取消,默认目录位于library/cache下
[_iFlySpeechSynthesizer setParameter:@" tts.pcm"
forKey: [IFlySpeechConstant TTS_AUDIO_PATH]];
//启动合成会话
[_iFlySpeechSynthesizer startSpeaking: @"你好,我是科大讯飞的小燕"];
//IFlySpeechSynthesizerDelegate协议实现
//合成结束
- (void) onCompleted:(IFlySpeechError *) error {}
//合成开始
- (void) onSpeakBegin {}
//合成缓冲进度
- (void) onBufferProgress:(int) progress message:(NSString *)msg {}
//合成播放进度
- (void) onSpeakProgress:(int) progress beginPos:(int)beginPos endPos:(int)endPos {}
~~~
## 离线合成
离线合成指的是语音引擎和资源放置在应用内部,不需要连接到语音云时也可以使用的语音合成服务。因此使用时,需要在应用中添加离线引擎和发音人资源。离线引擎在提供离线服务的SDK中已内置。在使用时只需要根据选择的发音人来设置对应的离线发音人资源即可。
以Demo为例:
![](https://box.kancloud.cn/540436f07551f855a63251a0da32cf4d_208x238.png)
ttsres是离线合成的引擎资源集合,common.jet是基础资源,其他文件是发音人各自对应的资源。在实际使用时,common.jet和发音人资源需要同时设置。发音人可以根据需要自行选择。
**引擎大小**:
|状态 |大小 |
| :---: | :---: |
|编译前静态库 | 18.2MB |
| 编译后(ipa) | 4.3MB |
**资源大小**:
| 类型 |大小 |
| :---: | :---: |
| 基础资源 |4.3 MB |
|小燕 |4.1 MB |
| 小峰 |1.3 MB |
|小梅 |1.7 MB |
|凯瑟琳 | 3.0 MB |
**空间大小**:(不同的编译器编译后大小会有不同,请以实际为准)
ipa文件大小 = 引擎编译后(4.3MB) + 基础资源(4.3MB) + 所选择的发音人资源(如:小燕4.1MB)。
下面代码是集成本地资源时需要添加的部分,其他代码与在线一致。
~~~
//设置语音合成的启动参数
[[IFlySpeechUtility getUtility] setParameter:@"tts" forKey:[IFlyResourceUtil ENGINE_START]];
//获得语音合成的单例
_iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
//设置协议委托对象
_iFlySpeechSynthesizer.delegate = self;
//设置本地引擎类型
[_iFlySpeechSynthesizer setParameter:[IFlySpeechConstant TYPE_LOCAL] forKey:[IFlySpeechConstant ENGINE_TYPE]];
//设置发音人为小燕
[_iFlySpeechSynthesizer setParameter:@"xiaoyan" forKey:[IFlySpeechConstant VOICE_NAME]];
//获取离线语音合成发音人资源文件路径。以发音人小燕为例,请确保资源文件的存在。
NSString *resPath = [[NSBundle mainBundle] resourcePath];
NSString *vcnResPath = [[NSString alloc] initWithFormat:@"%@/ttsres/common.jet;%@/tts64res/xiaoyan.jet",resPath,resPath];
//设置离线语音合成发音人资源文件路径
[_iFlySpeechSynthesizer setParameter:vcnResPath forKey:@"tts_res_path"];
~~~