全部产品

iOS SDK

更新时间:2021-04-23 17:39:30

本文介绍了如何使用阿里云离线语音合成服务提供的iOS NUI SDK,包括下载安装SDK和语音包、SDK关键接口及代码示例。

前提条件

下载安装

  1. 下载SDK

    说明

    下载后在样例初始化代码中替换您的阿里云账号信息、Appkey才可运行。为方便集成,2.5.14版本后iOS接口使用纯Object-C接口,不再使用C++混合接口。

  2. 下载语音包,详情请参见接口说明中的语音包列表。

    注意

    SDK和语音包是完全独立的,下载SDK后并不能直接使用,需要下载语音包,并设置语音包存放路径。

  3. 解压ZIP包,将zip包中的nuisdk.framework添加到您的工程中,并在工程Build Phases的Link Binary With Libraries中添加nuisdk.framework。请确保在编译配置的General > Frameworks, Libraries, and Embedded Content中配置nuisdk.framework为Embed & Sign。

  4. 使用Xcode打开此工程。工程中提供了参考代码以及一些直接可使用的工具类,例如音频播放录制和文件操作,您可以直接复制源码到您的实际工程进行使用。其中语音合成示例代码在LocalTTSViewController类中。

SDK关键接口

  • nui_tts_initialize:初始化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需要在回调中进行语音数据填充
           * @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:合成数据音量回调。

      /**
           * 当开始识别时,此回调被连续调用,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;

调用步骤

  1. 初始化SDK和播放组件。

  2. 根据业务需要设置参数。

  3. 调用nui_tts_play进行播放。

  4. 在合成数据回调中,将数据写入播放器进行播放,建议使用流式播放。

  5. 收到语音合成结束的回调。

代码示例

  1. 语音合成初始化。

    // 一次初始化成功,可以反复调用合成和参数设置接口,不需要频繁初始化和释放,减少耗时
    NSString * initParam = [self genInitParams];
    [_nui nui_tts_initialize:[initParam UTF8String] logLevel:LOG_LEVEL_VERBOSE saveLog:true];
    if (retcode != 0) {
     // 初始化失败,通过"error_msg"查看详细的错误信息,离线语音合成FAQ文档中已列出常见错误
      const char *errmsg = [_nui nui_tts_get_param: "error_msg"];
      TLog(@"init failed.retcode:%d.errmsg:%s", retcode, errmsg);
      // 初始化失败不需要再调用参数设置和合成接口
      return;
    }

    其中,genInitParams生成为String JSON字符串,包含资源目录和用户信息。其中用户信息包含如下字段。

        
        [dictM setObject:@"xx" forKey:@"ak_id"];
        [dictM setObject:@"xx" forKey:@"ak_secret"];
        [dictM setObject:@"xx" forKey:@"app_key"];
        [dictM setObject:@"software_nls_tts_offline" forKey:@"sdk_code"];
        
        // deviceid作为设备的唯一标识(可以是Mac地址,cpu序列号等参数),是进行鉴权认证的必要信息
        [dictM setObject:id_string forKey:@"device_id"];
        
        // 设置工作路径
        [dictM setObject:bundlePath forKey:@"workspace"];
        // 切换为离线合成模式
        [dictM setObject:@"0" forKey:@"mode_type"];
  2. 根据需求设置参数。

     // 加载语音包:已购买的语音包,可以放在任意位置,以aicheng为例,该语音包位于Documents/voices/下,设置命令为“aicheng:Documents/voices/aicheng”
     NSString *cmd = [NSString stringWithFormat:@"%@/aicheng", myvoicedir];
     [self.nui nui_tts_set_param:"extend_font_name" value:[cmd UTF8String]];
  3. 启动语音合成。

    [self.nui nui_tts_play:"1" taskId:"" text:[content UTF8String]];
  4. 回调处理。

    • onNuiTtsEventCallback:语音合成事件回调,根据语音合成状态控制播放器。

      - (void)onNuiTtsEventCallback:(nuisdk::NuiSdkTtsEvent)event taskId:(char*)taskid code:(int)code {
          TLog(@"onNuiTtsEventCallback event[%d]", event);
          if (event == TTS_EVENT_START) {
              // 表示合成开始
              // 通知播放器准备播放
              [self->_voicePlayer setstate:(PlayerState)playing];
              dispatch_async(dispatch_get_main_queue(), ^{
                  [self->_voicePlayer play];
              });
          } else if (event == TTS_EVENT_END || event == TTS_EVENT_CANCEL || event == TTS_EVENT_ERROR) {
              // 这三个事件都表示本条任务合成结束,对一条合成任务这三个事件只会触发其中一个:正常结束、正常取消或者发生错误
              if (event == TTS_EVENT_END) {
                  // 注意这里是指语音合成完成,而非播放完成,播放完成需要由voicePlayer对象来进行通知
                  [self->_voicePlayer drain];
              } else {
                  // 取消播报、或者发生异常时终止播放
                  [self->_voicePlayer setstate:(PlayerState)stopped];
                  dispatch_async(dispatch_get_main_queue(), ^{
                      [self.nui nui_tts_cancel:NULL];
                      [self->_voicePlayer stop];
                  });
              }
          }
      }
    • onNuiTtsUserdataCallback:语音合成数据回调,将回调中的合成数据写入播放器进行播放。

      - (void)onNuiTtsUserdataCallback:(char*)info wordIdx:(int)info_len buffer:(char*)buffer len:(int)len taskId:(char*)task_id {
          TLog(@"onnuiTtsUserdataCallback played info %s info_len %d", info, info_len);
          [_voicePlayer write:(char*)buffer Length:(unsigned int)len];
      }
  5. 取消语音合成。

    [self.nui nui_tts_cancel:NULL];