iOS SDK
本文介绍了如何使用阿里云智能语音服务提供的iOS NUI SDK,包括SDK下载安装、关键接口及代码示例。
前提条件
下载安装
- 说明
下载后请在样例初始化代码中替换您的阿里云账号信息、Appkey和Token才可运行。为方便集成,2.5.14版本后iOS接口使用纯Object-C接口,不再使用C++混合接口。
解压ZIP包,将ZIP包中的nuisdk.framework添加到您的工程中,并在工程Build Phases的Link Binary With Libraries中添加nuisdk.framework。请确保在编译配置的General > Frameworks, Libraries, and Embedded Content中配置nuisdk.framework为Embed & Sign。
使用Xcode打开此工程,工程中提供了参考代码以及一些直接可使用的工具类,例如音频播放录制和文件操作,您可以直接复制源码到您的实际工程进行使用。其中语音合成示例代码在TTSViewController类中。
SDK关键接口
tts_initialize:初始化SDK
/**
* 初始化SDK,SDK为单例,请先释放后再次进行初始化。请勿在UI线程调用,意外下可能引起阻塞。
* @param parameters: 初始化参数,参考接口说明
* @param level: log打印级别,值越小打印越多
* @param save_log: 是否保存log为文件,存储目录为parameter中的debug_path字段值
* @return 参考错误码
*/
-(int) nui_tts_initialize:(const char *)parameters
logLevel:(NuiSdkLogLevel)level
saveLog:(BOOL)save_log;
nui_tts_play: 开始播放
/**
* 开始播放
* @param priority: 任务优先级,请使用"1"
* @param taskid: 任务id,可传入32个字节的uuid或者传入空内容由SDK自动生成
* @param text: 要播放的文本内容
* @return 参考错误码
*/
-(int) nui_tts_play:(const char *)priority
taskId:(const char *)taskid
text:(const char *)text;
nui_tts_cancel:取消播放
/**
* 取消合成任务
* @param taskid: 传入想要停止的任务id,如果为空则取消所有任务
* @return 参考错误码
*/
-(int) nui_tts_cancel:(const char *)taskid;
nui_tts_pause:暂停播放
/**
* 暂停
* @return 参考错误码
*/
-(int) nui_tts_pause;
nui_tts_resume:恢复播放
/**
* 恢复暂停的任务
* @return 参考错误码
*/
-(int) nui_tts_resume;
nui_tts_set_param:设置语音合成参数
/**
* 以键值对形式设置参数
* @param param: 参数名,参考接口说明
* @param value: 参数值,参考接口说明
* @return 参考错误码
*/
-(int) nui_tts_set_param:(const char *)param
value:(const char *)value;
nui_tts_get_param:获取参数
/**
* 获取参数值
* @param param: 参数名,参考接口说明
* @return 参数值
*/
-(const char *) nui_tts_get_param:(const char *)param;
nui_tts_release: 释放SDK资源
/**
* 释放SDK
* @return 参考错误码
*/
-(int) nui_tts_release;
NeoNuiTtsDelegate 事件代理
onNuiTtsUserdataCallback:在回调中提供音频数据。
/**
* 当开始识别时,此回调被连续调用,App需要在回调中进行语音数据填充,语音数据来自App的录音
* @param info: 在使用时间戳功能时返回时间戳结果,json格式
* @param info_len: info字段的数据长度
* @param buffer: 合成的语音数据
* @param len: 合成的语音长度
* @param taskid: 本次合成的任务id
*/
- (void)onNuiTtsUserdataCallback:(char*)info infoLen:(int)info_len buffer:(char*)buffer len:(int)len taskId:(char*)task_id;
onNuiTtsEventCallback: 事件回调。
/**
* SDK主要事件回调
* @param event: 回调事件,参考接口说明
* @param taskid: 本次合成的任务id
* @param code: 参考错误码,TTS_EVENT_ERROR时有效
*/
- (void)onNuiTtsEventCallback:(NuiSdkTtsEvent)event taskId:(char*)taskid code:(int)code;
NuiSdkTtsEvent事件列表:
名称 | 说明 |
TTS_EVENT_START | 语音合成开始,准备播放。 |
TTS_EVENT_END | 语音合成结束,合成数据已全部抛出,但并不表示播放结束。 |
TTS_EVENT_CANCEL | 取消语音合成。 |
TTS_EVENT_PAUSE | 语音合成暂停。 |
TTS_EVENT_RESUME | 语音合成恢复。 |
TTS_EVENT_ERROR | 语音合成发生错误。 |
onNuiTtsVolumeCallback:合成数据音量回调。
/**
* SDK主要事件回调
* @param volume: 合成的语音的能量,可用于动画显示等
* @param taskid: 本次合成的任务id
*/
-(void)onNuiTtsVolumeCallback:(int)volume taskId:(char*)task_id;
调用步骤
初始化SDK和播放组件。
根据业务需要设置参数。
调用nui_tts_play进行播放。
在合成数据回调中,将数据写入播放器进行播放,建议使用流式播放。
收到语音合成结束的回调。
代码示例
接口默认采用get_instance方式获得单例,您如果有多例需求,也可以直接alloc对象进行使用。
语音合成初始化
NSString * initParam = [self genInitParams]; [_nui nui_tts_initialize:[initParam UTF8String] logLevel:LOG_LEVEL_VERBOSE saveLog:true];
其中,genInitParams生成为String JSON字符串,包含资源目录和用户信息。其中用户信息包含如下字段。
[dictM setObject:id_string forKey:@"device_id"]; [dictM setObject:@"" forKey:@"url"]; [dictM setObject:@"" forKey:@"app_key"]; [dictM setObject:@"" forKey:@"token"];
根据需求设置参数
//可以设置发音人、语调和语速等参数,参数列表参见接口说明。 [self.nui nui_tts_set_param:"font_name" value:"xiaoyun"];
启动语音合成
[self.nui nui_tts_play:"1" taskId:"" text:[content UTF8String]];
回调处理
onNuiTtsEventCallback:语音合成事件回调,根据语音合成状态控制播放器。
- (void)onNuiTtsEventCallback:(NuiSdkTtsEvent)event taskId:(char*)taskid code:(int)code { TLog(@"onNuiTtsEventCallback event[%d]", event); if (event == TTS_EVENT_START) { loop_in = TTS_EVENT_START; dispatch_async(dispatch_get_main_queue(), ^{ [self->_voicePlayer play]; }); } else if (event == TTS_EVENT_END) { loop_in = TTS_EVENT_END; dispatch_async(dispatch_get_main_queue(), ^{ [self->_voicePlayer drain]; }); } }
onNuiTtsUserdataCallback:语音合成数据回调,将回调中的合成数据写入播放器进行播放。
- (void)onNuiTtsUserdataCallback:(char*)info wordIdx:(int)info_len buffer:(char*)buffer len:(int)len taskId:(char*)task_id { TLog(@"onnuiTtsUserdataCallback played text %s index %d", text, word_idx); [_voicePlayer write:(char*)buffer Length:(unsigned int)len]; }
结束语音合成
[self.nui nui_tts_cancel:NULL];
常见问题
使用在线合成语音iOS SDK,写入文件播放声音是杂音,是什情况?
使用语音合成iOS SDK,连续点击播放按钮,高频率触发播放出现页面终止情况,该如何解决?
使用语音合成iOS SDK,如何保存为文件,保存格式是什么?
使用语音合成iOS SDK,onNuiTtsUserdataCallback不返回时间戳信息,如何解决?
是否有Android和iOS的SDK,能否用在专有云下?
是否支持后台处理?
下载语音交互iOS SDK至本地库,测试代码时,在模拟器可以正常运行,真机却无法运行,报错提示“Reason: no suitable image found. Did find:xxx”。
使用智能语音服务集成iOS SDK,接入NuiSdk运行报错MIC。
使用智能语音服务集成iOS SDK,接入nuisdk.framework后,导入头文件项目失败。
使用iOS SDK接入nuisdk.framework后,报错提示“/Users/admin/FlashTranscription_iOS/Fc_ASR.xcodeproj Building for iOS, but the linked and embedded framework 'nuisdk.framework' was built for iOS + iOS Simulator”。
使用集成语音服务iOS SDK,flutter_plugin集成时,报错提示“Undefined symbols for architecture arm64: "std::__1::mutex::~mutex()", referenced from: ___cxx_global_var_init in libflutter_tts.a(ringBuf.o)”。
TRTC实时音视频和语音识别结合,当同时调用麦克风时可能会发生冲突,导致有一方没有声音,如何解决?
使用集成语音服务iOS SDK,在接入nuisdk.framework后报错,需要修改Legacy Build system,才可以运行,是什么原因?
使用App集成iOS SDK,提交到App store失败,提示“Unsupported Architectures. The executable for AliYunSmart.app/Frameworks/nuisdk.framework contains unsupported architectures '[x86_ _64, i386]'. With error code”。