全部产品

Android SDK

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

前提条件

下载安装

  1. 下载SDK。

    说明

    下载后在样例初始化代码中替换您的阿里云账号信息、Appkey才可运行。

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

    注意

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

  3. 解压zip包,在app/libs目录下获取AAR格式的SDK包。

  4. 使用Android Studio打开此工程。其中语音合成示例代码为TtsLocalActivity.java文件。

SDK关键接口

  • tts_initialize:初始化SDK。

    /**
         * 初始化SDK,离线合成暂不支持多实例,请先释放后再次进行初始化。请勿在UI线程调用,可能会引起阻塞。
         * 初始化是耗时操作,不需要合成一个任务就进行该操作;在启动和退出时进行一次即可
         * @param callback:事件监听回调,参见下文具体回调。
         * @param ticket:初始化参数,参数说明参见接口说明。ticket生成方式参getTicket
         * @param level:log打印级别,值越小打印越多。
         * @param save_log:是否保存log为文件,存储目录为parameter中的debug_path字段值。
         * @return:参见错误码。
         */
        public synchronized int tts_initialize(INativeTtsCallback callback,
                                                   String ticket,
                                                   final Constants.LogLevel level,
                                                   boolean save_log)

    INativeTtsCallback类型包含如下回调:

    • onTtsEventCallback:SDK事件回调。

      /**
           * 事件回调
           * @param event:回调事件,参见如下事件列表。
           * @param task_id:请求的任务ID。
           * @param ret_code:参见错误码,出现TTS_EVENT_ERROR事件时有效。
           */
          void onTtsEventCallback(TtsEvent event, String task_id, int ret_code);

      事件列表:

      名称

      说明

      TTS_EVENT_START

      语音合成开始,准备播放。

      TTS_EVENT_END

      语音合成播放结束。

      TTS_EVENT_CANCEL

      取消语音合成。

      TTS_EVENT_PAUSE

      语音合成暂停。

      TTS_EVENT_RESUME

      语音合成恢复。

      TTS_EVENT_ERROR

      语音合成发生错误。

    • onTtsDataCallback:合成数据回调。

      /**
           * 合成数据回调
           * @param info:使用时间戳功能时,返回JSON格式的时间戳结果。
           * @param info_len:info字段的数据长度,暂不使用。
           * @param data:合成的音频数据,写入播放器。
           */
          void onTtsDataCallback(String info, int info_len, byte[] data);
  • setparamTts:设置参数。

    /**
         * 以键值对形式设置参数
         * @param param:参数名,参见接口说明。
         * @param value:参数值,参见接口说明。
         * @return:参见错误码。
         */
        public synchronized int setparamTts(String param, String value);
  • getparamTts:获取参数。

    /**
         * 获取参数值
         * @param param:参数名,参考接口说明。
         * @return:参数值。
         */
        public String getparamTts(String param);
  • startTts:开始合成。

    /**
         * 开始合成任务,该接口异步执行
         * @param priority:任务优先级,请使用"1"。
         * @param taskid:任务ID,可传入32个字节的uuid,或传入空内容由SDK自动生成。
         * @param text:播放的文本内容。
         * @return:参见错误码。
         */
        public synchronized int startTts(String priority, String taskid, String text)
  • cancelTts:取消合成。

    /**
         * 取消合成任务
         * @param taskid:传入想要停止的任务ID,如果为空则取消所有任务。
         * @return:参见错误码。
         */
        public synchronized int cancelTts(String taskid)
  • pauseTts:暂停合成。

    /**
         * 暂停合成任务
         * @return:参见错误码。
         */
        public synchronized int pauseTts()
  • resumeTts:恢复合成。

    /**
         * 恢复暂停的任务
         * @return:参见错误码。
         */
        public synchronized int resumeTts()
  • tts_release:释放SDK资源。

    /**
         * 释放SDK
         * @return:参见错误码。
         */
        public synchronized int tts_release()

调用步骤

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

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

  3. 调用startTts进行播放。

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

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

代码示例

  1. 语音合成初始化。

    // 拷贝资源
    CommonUtils.copyAssetsData(this);
    // SDK初始化
    // 注意:离线合成暂不支持多实例
    int ret = nui_tts_instance.tts_initialize(new INativeTtsCallback() {}, genInitParams(path), Constants.LogLevel.LOG_LEVEL_VERBOSE, true);
    if (Constants.NuiResultCode.SUCCESS == ret) {
     // 初始化成功
    } else {
     // 初始化失败,通过“error_msg”查看详细错误信息,离线语音合成FAQ文档中已列出常见错误
      String errmsg =  nui_tts_instance.getparamTts("error_msg");
      Log.e(TAG, "init failed.errmsg:" + errmsg);
      // 初始化失败时直接返回,不用再调用合成或者参数设置接口
      return ret;
    }

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

    public static JSONObject getTicket() {
            JSONObject object = new JSONObject();
            object.put("ak_id", "xx");                          // 设置阿里云账号信息
            object.put("ak_secret", "xx");           // 设置阿里云账号信息
            object.put("app_key","xx");             // 设置阿里云账号信息
            object.put("device_id", "xx");                      // 设置设备唯一码
            object.put("sdk_code","software_nls_tts_offline");  // 设为离线合成
            object.put("workspace","xx");            // 设置资源目录
            object.put("mode_type", "0");                       // 设为离线模式
            return object;
        }
        String ticket = Auth.getTicket();
  2. 根据需求设置参数。

    // 设置本地发音人,如下载的aicheng语音包放在目录/sdcard/idst/目录下,那么命令为”/sdcard/idst/aicheng“
    // 注:通常"/sdcard/”和”/storage/emulated/0/“对应手机的同一位置
    // 路径避免包含中文字段
    String fullName = mFontPath + mFontName;
    nui_tts_instance.setparamTts("extend_font_name", fullName);
  3. 启动语音合成。

    nui_tts_instance.startTts("1", "", ttsText);
  4. 回调处理。

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

      public void onTtsEventCallback(INativeTtsCallback.TtsEvent event) {
                      Log.i(TAG, "tts event:" + event);
                      if (event == INativeTtsCallback.TtsEvent.TTS_EVENT_START) {
                        // 该事件表示开始合成
                          // 播放器准备播放
                          mAudioTrack.play();
                      } else if (event == INativeTtsCallback.TtsEvent.TTS_EVENT_END || event == TtsEvent.TTS_EVENT_CANCEL || event == TtsEvent.TTS_EVENT_ERROR) {
                          // 这三个事件都表示本次合成已经结束,对一条合成任务这三个事件只会触发其中一个:正常结束、正常取消或者发生错误
                          // 通知播放器数据发送完毕
                          mAudioTrack.isFinishSend(true);
                      } else if (event == TtsEvent.TTS_EVENT_PAUSE) {
                        // 该事件表示暂停合成
                          // 通知播放器暂停播放
                          mAudioTrack.pause();
                      } else if (event == TtsEvent.TTS_EVENT_RESUME) {
                        // 该事件表示重启合成
                          // 通知播放器重启播放
                          mAudioTrack.play();
                      }
                  }
    • onTtsDataCallback:语音合成数据回调,将回调中的合成数据写入播放器进行播放。

      public void onTtsDataCallback(String info, int info_len, byte[] data) {
                      if (data.length > 0) {
                          mAudioTrack.setAudioData(data);
                      }
                  }
  5. 取消语音合成。

    nui_tts_instance.cancelTts("");
  6. 退出语音合成。

    nui_tts_instance.tts_release();