[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為例:

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