Skip to content
This repository was archived by the owner on May 28, 2019. It is now read-only.

DOC iOS TTS

lixi edited this page Sep 14, 2017 · 4 revisions

百度语音开放平台-iOS SDK文档

[TOC]

1. 概述

本文档是百度语音开放平台iOS SDK的用户指南,描述了语音合成相关接口的使用说明。

1.1 兼容性

类别 兼容范围
系统 支持iOS 6.0及以上系统
架构 armv7、arm64、i386、x86_64(模拟器架构暂不支持离线功能)
网络 支持移动网络、WIFI等网络环境
开发环境 工程内使用了LTO等优化选项,建议使用最新版本Xcode进行开发

1.2 资源占用描述

静态库占用:

SDK类型 静态库大小 二进制增量 __TEXT增量
合成 104.6M 9.3M 4.0M~4.6M

资源占用:

资源名称 资源描述 资源大小
Chinese_And_English_Speech_Female.dat 离线合成中英文女声资源文件 305K
Chinese_And_English_Speech_Male.dat 离线合成中英文男声资源文件 305K
Chinese_And_English_Text.dat 离线合成中英文文本模型文件 7.6M
由于 BITCODE 开启会导致二进制文件体积增大,这部分会在 APPStore 发布时进行进一步编译优化,并不会引起最终文件的体积变化,故此处计算的是关闭 BITCODE 下的二进制增量。

2. 集成

2.1 语音合成

2.1.1 添加Framework

Framework 描述
libc++.tbd 提供对C/C++特性支持
libstdc++.6.0.9.tbd 提供C++标准库的支持
libz.1.2.5.tbd 提供gzip支持
libiconv.2.4.0.tbd 提供编码转换支持
AudioToolbox 提供录音和播放支持
AVFoundation 提供录音和播放支持
CoreTelephony 提供对移动网络类型判断的支持
SystemConfiguration 提供对网络状态检测的支持

2.1.2 添加头文件

将SDK提供的头文件添加到工程后,只需引入如下头文件:

#import "BDSSpeechSynthesizer.h"

2.1.3 添加静态库

SDK提供的是静态库,开发者只需要将库文件拖入工程目录即可。对静态库有以下几点说明:

1. 静态库采用lipo命令将armv7,arm64及模拟器Debug版的静态库合并成的一个通用的库文件,避免开发者在编译不同target时频繁替换的问题;
2. 模拟器版本只支持在线合成,不支持离线功能;

2.1.4 添加所需资源

将开发包中OfflineTTSDatFiles目录,以"create groups"方式添加到工程目录下即可,资源文件说明如下:

文件名 说明
offline_engine_tmp_license.dat 离线临时授权文件
Chinese_And_English_Speech_Female.dat 离线合成中英文女声资源文件
Chinese_And_English_Speech_Male.dat 离线合成中英文男声资源文件
Chinese_And_English_Text.dat 离线合成中英文文本模型文件

3. 语音合成接口

3.1 合成器初始化

静态接口,用于获取、释放合成器唯一实例

+ (BDSSpeechSynthesizer*)sharedInstance;
+ (void)releaseInstance;

3.2 参数配置接口

3.2.1 设置合成器代理

/**
 * @brief 设置合成器代理
 * @param delegate 代理对象,负责处理合成器各类事件
 */
- (void)setSynthesizerDelegate: (id<BDSSpeechSynthesizerDelegate>)delegate;

3.2.2 合成器参数设置

/**
 * @brief 合成器参数设置接口
 * @param param 参数对应的值
 * @param key 合成器预定义的参数名称,参见附录及头文件BDSSpeechSynthesizerParams.h.
 */
-(NSError*)setSynthParam:(id)param forKey:(BDSSynthesizerParamKey)key;

3.2.3 获取合成器参数

/**
 * @brief 获取合成器参数
 * @param key 合成器预定义的参数名称
 * @param err 如果不为nil,返回错误信息
 * @return 当前使用的参数值
 */
-(id)getSynthParamforKey:(BDSSynthesizerParamKey)key withError:(NSError**)err;

3.2.4 设置认证信息

/**
 * @brief 为在线合成设置认证信息
 * @param apiKey 在百度开发者中心注册应用获得
 * @param secretKey 在百度开发者中心注册应用获得
 */
- (void)setApiKey:(NSString *)apiKey withSecretKey:(NSString *)secretKey;

3.2.5 设置SDK工作队列

/**
 * @brief 指定SDK工作队列,默认值为main queue (dispatch_get_main_queue())
 * @param callbackQueue 串行队列
 * @return 错误信息,成功返回nil
 */
-(NSError*)setSDKCallbackQueue:(dispatch_queue_t)callbackQueue;

3.2.6 获取SDK当前运行队列

-(dispatch_queue_t)getCurrentCallbackQueue;

3.3 离线合成相关

3.3.1 加载合成引擎

/**
 * @brief 加载合成引擎
 * @param textDatFilePath 文本分析数据文件路径
 * @param speechDataPath 声学模型数据文件路径
 * @param licenseFilePath 授权文件路径,如果没有本地授权可传入nil
 * @param appCode 用户持有的授权app code, 即APPID
 * @return 错误码, 成功返回nil
 */
- (NSError*)loadOfflineEngine: (NSString*)textDatFilePath
               speechDataPath: (NSString*)speechDatFilePath
              licenseFilePath: (NSString*)licenseFilePath
                  withAppCode: (NSString*)appCode;

如果需要英文合成,在加载引擎后,需要调用一下接口加载英文合成相关资源:

/**
 * @brief 加载合成引擎 注意:用上面的方法加载中英文混合模型不用调用此方法
 * @param textDatFilePath 文本分析数据文件路径
 * @param speechDataPath 声学模型数据文件路径
 * @return 错误码, 成功返回nil
 */
-(NSError*)loadEnglishDataForOfflineEngine: (NSString*)textDataPath
                                speechData: (NSString*)speechDataPath;

3.3.2 重新加载文本分析数据文件或者声学模型数据文件

/**
 * @brief 重新加载文本分析数据文件或者声学模型数据文件
 * @param datFilePath: 数据文件路径
 * @return 错误码, 成功返回nil
 */
- (NSError*)reinitOfflineEngineData: (NSString*)datFilePath;

3.3.3 加载定制库

/**
 * @brief 加载定制库,加载离线引擎后方可调用该接口
 * @param datFilePath 定制库路径
 * @return 错误码, 成功返回nil
 */
- (NSError*)loadDomainDataForOfflineEngine:(NSString*)datFilePath;

3.3.4 卸载定制库

/**
 * @brief 卸载定制库
 * @return 错误码, 成功返回nil
 */
- (NSError*)unloadDomainDataFromOfflineEngine;

3.3.5 验证音库文件的有效性

/**
 * @brief 验证音库文件的有效性
 * @param datFilePath data文件路径
 * @param err 如果验证失败, 返回错误信息
 * @return 验证成功YES,失败NO
 */
- (BOOL)verifyDataFile: (NSString*) datFilePath error:(NSError**)err;

3.3.6 获取音库文件相关参数

/**
 * @brief 获取音库文件相关参数
 * @param datFilePath data文件路径
 * @param paramType 参数类型
 * @param paramValue 传出对应参数的值
 * @param err 如果失败, 返回错误信息
 * @return 成功YES,失败NO
 */
- (BOOL)getDataFileParam: (NSString*)datFilePath
                    type: (TTSDataParam)paramType
                   value: (NSString**)paramValue
                   error: (NSError**)err;

3.4 语音合成接口

3.4.1 合成并朗读文本

/**
 * @brief 合成并朗读文本
 * @param sentence 待合成文本
 * @param err 如果出错,返回错误信息
 * @return 语句ID或-1,如果返回-1,可以从err中获取错误详细信息 
 */
-(NSInteger) speakSentence:(NSString*)sentence withError:(NSError**)err;

3.4.2 合成不朗读文本

/**
 * @brief 合成不朗读文本
 * @param sentence 待合成文本
 * @param err 如果出错,返回错误信息
 * @return 语句ID或-1,如果返回-1,可以从err中获取错误详细信息
 */
-(NSInteger) synthesizeSentence:(NSString*)sentence withError:(NSError**)err;

3.4.3 取消本次合成并停止朗读

- (void)cancel;

3.4.4 暂停文本合成与朗读

- (BDSSynthesizerStatus)pause;

3.4.5 恢复文本合成与朗读

- (BDSSynthesizerStatus)resume;

3.4.6 获取合成器状态

- (BDSSynthesizerStatus)synthesizerStatus;

3.4.7 获取待播放语句数量

/**
 * @brief 获取待播放语句数量,包括未合成语句
 */
-(NSInteger)RemainingPlaybackSentenceCount;

3.4.8 获取待合成语句数量

-(NSInteger)RemainingSynthesizeSentenceCount;

3.5 播放控制

3.5.1 设置播放器音量

/**
 * @brief 设置播放器音量
 * @param volume 音量值,[0, 1]
 */
- (void)setPlayerVolume:(float)volume;

3.5.2 设置AudioSessionCategory类型

/**
 * @brief 设置AudioSessionCategory类型
 * @param category AudioSessionCategory类型,取值参见AVAudioSession Class Reference
 * Default: AVAudioSessionCategoryPlayback
 */
- (void)setAudioSessionCategory:(NSString *)category;

3.6 调试接口

3.6.1 设置、获取日志级别

+ (void)setLogLevel:(BDSLogLevel)logLevel;
+ (BDSLogLevel)logLevel;

3.6.2 获取SDK版本信息

/**
 * @brief SDK版本信息,包含离线引擎版本信息
 */
+ (NSString *)version;

3.7 代理对象说明

3.7.1 开始合成

/**
 * @brief 开始合成新的语句
 * @param SynthesizeSentence 语句对应的ID,该值为合成接口的返回值
 */
- (void)synthesizerStartWorkingSentence:(NSInteger)SynthesizeSentence;

3.7.2 结束合成

/**
 * @brief 结束合成某个语句
 * @param SynthesizeSentence 语句对应的ID,该值为合成接口的返回值
 */
- (void)synthesizerFinishWorkingSentence:(NSInteger)SynthesizeSentence;

3.7.3 朗读开始

/**
 * @brief 开始朗读某个语句,如果调用纯合成接口,不会触发该回调
 * @param SpeakSentence 语句对应的ID,该值为合成接口的返回值
 */
- (void)synthesizerSpeechStartSentence:(NSInteger)SpeakSentence;

3.7.4 朗读完成

/**
 * @brief 朗读完成,如果调用纯合成接口,不会触发该回调
 * @param SpeakSentence 语句对应的ID,该值为合成接口的返回值
 */
- (void)synthesizerSpeechEndSentence:(NSInteger)SpeakSentence;

3.7.5 返回合成语音数据

/**
 * @brief 新的语音数据已经合成
 * @param newData 语音数据
 * @param fmt 缓存中的音频格式
 * @param newLength 当前语句已合成字符数
 * @param SynthesizeSentence 语句对应的ID,该值为合成接口的返回值
 */
- (void)synthesizerNewDataArrived:(NSData *)newData
                       DataFormat:(BDSAudioFormat)fmt
                   characterCount:(int)newLength
                   sentenceNumber:(NSInteger)SynthesizeSentence;

3.7.6 播放进度变更

/**
 * @brief 播放进度变更,返回当前语句已播放字符数,如果调用纯合成接口,不会触发该回调
 * @param newLength 当前语句已播放字符数,非精确值
 * @param SpeakSentence 语句对应的ID,该值为合成接口的返回值
 */
- (void)synthesizerTextSpeakLengthChanged:(int)newLength
                           sentenceNumber:(NSInteger)SpeakSentence;

3.7.7 合成器发生错误

/**
 * @brief 合成器发生错误
 * @param error 错误对象,包含错误信息
 * @param SpeakSentence 正在播放的语句对应的ID,该值为合成接口的返回值
 * @param SynthesizeSentence 正在合成的语句对应的ID
 */
- (void)synthesizerErrorOccurred:(NSError *)error
                        speaking:(NSInteger)SpeakSentence
                    synthesizing:(NSInteger)SynthesizeSentence;

4. 功能说明

4.1 语音合成中的AudioSession

合成SDK默认会将AudioSession的Category设置为AVAudioSessionCategoryPlayback,并在必要的时候调用setActive接口对外部音频进行打断及恢复,如果开发者不希望SDK对AudioSession进行操作,可以通过参数配置接口,把BDS_SYNTHESIZER_PARAM_ENABLE_AVSESSION_MGMT对应的value设置为NO,即可屏蔽SDK内部的操作,按照需求,自行配置AudioSession。

4.1.1 离线语音合成资源加载顺序

使用离线合成时,需要加载离线资源,加载过程需注意加载顺序:

  1. 加载离线引擎时传入中文合成资源;
  2. 如需支持英文离线合成,需额外加载英文合成资源;
  3. 如果需要加载定制库文件,加载离线引擎后,调用相关接口进行加载;

5. 附录

5.1 语音合成

5.1.1 参数说明

参数名称 说明
BDS_SYNTHESIZER_PARAM_SPEED 语速,NSNumber([0...9])
BDS_SYNTHESIZER_PARAM_PITCH 音调,NSNumber([0...9])
BDS_SYNTHESIZER_PARAM_VOLUME 合成器音量,NSNumber([0...9])
BDS_SYNTHESIZER_PARAM_ENABLE_AVSESSION_MGMT 是否启用SDK对AudioSession的操作,默认打开
BDS_SYNTHESIZER_PARAM_AUDIO_SESSION_CATEGORY_OPTIONS SDK设置AudioSession类别是的选项
BDS_SYNTHESIZER_PARAM_PID 产品线ID
BDS_SYNTHESIZER_PARAM_AUDIO_ENCODING 音频编码类型
BDS_SYNTHESIZER_PARAM_SPEAKER 发音人
BDS_SYNTHESIZER_PARAM_USER_AGENT UA
BDS_SYNTHESIZER_PARAM_ONLINE_REQUEST_TIMEOUT 合成请求超时时间,开启播放后失效
BDS_SYNTHESIZER_PARAM_ETTS_OPEN_XML 开启XML标记,NSNumber([0,1])
BDS_SYNTHESIZER_PARAM_ETTS_DOMAIN_SYNTH 定制库开关
BDS_SYNTHESIZER_PARAM_ETTS_AUDIO_FORMAT 音频格式
BDS_SYNTHESIZER_PARAM_ETTS_VOCODER_OPTIM_LEVEL 合成引擎速度优化等级
BDS_SYNTHESIZER_PARAM_ONLINE_TTS_THRESHOLD 在线切离线的网络阈值
BDS_SYNTHESIZER_PARAM_ENABLE_TIMEOUT_OPTIMIZATION 超时优化开关

5.2.1 错误码说明

5.2.1.1 license验证错误状态:
错误码 说明
-2 包名不匹配
-3 开发者签名或AppCode的不匹配
-4 cuid不匹配
-7 平台错误(ASR/TTS/andriod/iOS/PC)
-5 license过期
-6 license还有一个月过期
-8 license文件不存在或文件长度为0
-10 临时授权文件过期
5.2.1.2 下载license错误状态:
错误码 说明
-8 网络超时
-101 验证不通过
-102 返回结果出错
-103 激活超量
-104 已过有效期
-105 服务器生产license失败
-106 读取license失败
-107 插入device信息失败
-108 更新开发者信息失败
Clone this wiki locally