文档

Android SDK

更新时间:

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

前提条件

下载安装

  1. 下载SDK和示例代码

    说明

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

    类别

    兼容范围

    系统

    支持Android 4.0 以上版本,API LEVEL 14

    架构

    armeabi-v7a,arm64-v8a,x86,x86_64

    此SDK还包含如下功能,若未支持您想要的功能,请去对应文档获取SDK。

    功能

    是否支持

    一句话识别

    实时语音识别

    语音合成

    实时长文本语音合成

    流式文本语音合成

    离线语音合成

    录音文件识别极速版

    唤醒及命令词

    听悟实时推流

  2. 解压ZIP包,在app/libs目录下获取AAR格式的SDK包,将AAR包集成到您的工程项目中进行依赖。若需要Android CPP接入方式,则可在ZIP包的android_libs和android_include中获得动态库和头文件。

  3. 使用Android Studio打开此工程查看参考代码实现,其中语音合成示例代码为StreamInputTtsBasicActivity.java文件,替换appkeytoken后可直接运行。

关键接口

  • startStreamInputTts:开始运行流式TTS。

    /**
     * 开始运行流式TTS。请勿在UI线程调用,可能会引起阻塞。
     * @param callback:事件监听回调,参见下文具体回调。
     * @param ticket:json string形式的初始化参数,参见下方说明。
     * @param parameters:json string形式的初始化参数,参见下方说明。
     * @param session_id:当前会话的id,若客户端请求时传入则原样返回,否则由服务端自动生成32位唯一ID。
     * @param level:log打印级别,值越小打印越多。
     * @param save_log:是否保存log为文件,存储目录为ticket中的debug_path字段值。注意,log文件无上限,请注意持续存储导致磁盘存满。
     * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。
     */
    public synchronized int startStreamInputTts(INativeStreamInputTtsCallback callback,
                                                String ticket, String parameters,
                                                String session_id, int log_level,
                                                boolean save_log);
    

    其中,INativeStreamInputTtsCallback类型包含如下回调。

    • onStreamInputTtsEventCallback:SDK事件回调。

      /**
       * 事件回调
       * @param event:回调事件,参见如下事件列表。
       * @param task_id:整个实时语音合成会话的任务ID,整个请求中需要保持一致,32位唯一ID。
       * @param session_id:当前会话的id,若客户端请求时传入则原样返回,否则由服务端自动生成32位唯一ID。
       * @param ret_code:参见错误码,出现STREAM_INPUT_TTS_EVENT_TASK_FAILED事件时有效,可查阅https://help.aliyun.com/document_detail/459864.html。
       * @param error_msg:详细错误信息,出现STREAM_INPUT_TTS_EVENT_TASK_FAILED事件时有效。
       * @param timestamp:合成结果中时间戳相关信息。
       * @param all_response:完整的json string格式返回消息,可从中解析需要的信息。
       */
      void onStreamInputTtsEventCallback(StreamInputTtsEvent event,
                                         String task_id, String session_id,
                                         int ret_code, String error_msg,
                                         String timestamp, String all_response);

      事件列表:

      名称

      说明

      STREAM_INPUT_TTS_EVENT_SYNTHESIS_STARTED

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

      STREAM_INPUT_TTS_EVENT_SENTENCE_BEGIN

      服务端检测到了一句话的开始。

      STREAM_INPUT_TTS_EVENT_SENTENCE_SYNTHESIS

      增量返回语音合成的结果,包含最新的音频和时间戳,句内全量,句间增量。

      STREAM_INPUT_TTS_EVENT_SENTENCE_END

      服务端检测到了一句话的结束,返回该句的全量时间戳。

      STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE

      服务端检测到了一句话的结束,返回该句的全量时间戳。

      STREAM_INPUT_TTS_EVENT_TASK_FAILED

      语音合成发生错误,详见ret_code和error_msg。

    • onStreamInputTtsDataCallback:合成数据回调。

      /**
       * 合成数据回调。
       * @param data:合成的音频数据,写入播放器。
       */
      void onStreamInputTtsDataCallback(byte[] data);

      其中,ticket初始化相关参数说明,生成示例参见下方代码示例:

      参数

      类型

      是否必选

      说明

      url

      String

      服务地址,默认使用北京服务。

      app_key

      String

      管控台创建项目的appkey。

      token

      String

      请确保该Token可以使用并在有效期内。

      debug_path

      String

      当save_log为true时,将会把运行日志存储在此路径下。

      complete_waiting_ms

      Integer

      调用stop后等待STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE的超时时间,单位ms,默认10s。

      parameters任务相关参数说明,生成示例参见下方代码示例:

      参数

      类型

      是否必选

      说明

      voice

      String

      说话人音色。

      format

      String

      音频编码格式,如“pcm”“wav”“mp3”。

      sample_rate

      Integer

      音频采样率,24000,可选择8000、16000、24000、48000。

      volume

      Integer

      朗读音量,范围是0~100,默认50。

      speech_rate

      Integer

      朗读语速,范围是-500~500,默认是0。

      pitch_rate

      Integer

      朗读语调,范围是-500~500,默认是0。

      enable_subtitle

      Boolean

      开启字级别时间戳。更多使用方法,请参见时间戳功能介绍

  • stopStreamInputTts: 停止语音合成

    /**
     * 停止语音合成,等待接收完所有合成数据直到STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE。
     * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。
     */
    public synchronized int stopStreamInputTts();
  • sendStreamInputTts:发送待合成文本

    /**
     * 发送待合成文本
     * @param text:待合成文本,仅支持采用UTF-8编码的文本输入。单次合成推荐少于5000字,总计不超过10万字,其中1个汉字、1个英文字母、1个标点或1个句子中间空格均算作1个字符。
     * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。
     */
    public synchronized int sendStreamInputTts(String text);

调用步骤

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

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

  3. 调用startStreamInputTts开始进行流式文本语音合成。

  4. 调用sendStreamInputTts持续发送待合成文本。在合成数据回调中,将数据写入播放器进行播放,建议使用流式播放。

  5. 调用stopStreamInputTts表示文本发送完成,等待合成完毕。

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

代码示例

开始语音合成

//SDK初始化
NativeNui stream_input_tts_instance = new NativeNui(Constants.ModeType.MODE_STREAM_INPUT_TTS);
int ret = stream_input_tts_instance.startStreamInputTts(
        new INativeStreamInputTtsCallback() {},
        genTicket(), genParameters(), "",
        Constants.LogLevel.toInt(Constants.LogLevel.LOG_LEVEL_VERBOSE), false);

其中genTicket生成为String JSON串,包含用户信息。其中用户信息包含如下字段,获取方式请参考接口说明文档。

/**
 * ticket生成示例,详见Demo工程中代码示例
 */
private String genTicket() {
    String str = "";
    try {
        //郑重提示:
        //  语音交互服务需要先准备好账号,并开通相关服务。具体步骤请查看:
        //    https://help.aliyun.com/zh/isi/getting-started/start-here
        //
        //原始账号:
        //  账号(子账号)信息主要包括AccessKey ID(后续简称为ak_id)和AccessKey Secret(后续简称为ak_secret)。
        //  此账号信息一定不可存储在app代码中或移动端侧,以防账号信息泄露造成资费损失。
        //
        //STS临时凭证:
        //  由于账号信息下发给客户端存在泄露的可能,阿里云提供的一种临时访问权限管理服务STS(Security Token Service)。
        //  STS是由账号信息ak_id和ak_secret,通过请求生成临时的sts_ak_id/sts_ak_secret/sts_token
        //  (为了区别原始账号信息和STS临时凭证, 命名前缀sts_表示STS生成的临时凭证信息)
        //什么是STS:https://help.aliyun.com/zh/ram/product-overview/what-is-sts
        //STS SDK概览:https://help.aliyun.com/zh/ram/developer-reference/sts-sdk-overview
        //STS Python SDK调用示例:https://help.aliyun.com/zh/ram/developer-reference/use-the-sts-openapi-example
        //
        //账号需求说明:
        //  若使用离线功能(离线语音合成、唤醒), 则必须app_key、ak_id和ak_secret,或app_key、sts_ak_id、sts_ak_secret和sts_token
        //  若使用在线功能(语音合成、实时转写、一句话识别、录音文件转写等), 则只需app_key和token
        JSONObject object = Auth.getTicket(Auth.GetTicketMethod.GET_TOKEN_FROM_SERVER_FOR_ONLINE_FEATURES);
        if (!object.containsKey("token")) {
            Log.e(TAG, "Cannot get token!!!");
        }
        object.put("url", "wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1"); // 默认,必填
        str = object.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    Log.i(TAG, "UserContext:" + str);
    return str;
}

genParameters生成为String JSON串,包含参数信息,请参考接口说明文档。

/**
 * parameters生成示例,详见Demo工程中代码示例
 */
private String genParameters() {
    String str = "";
    try {
        JSONObject object = new JSONObject();
        object.put("enable_subtitle", true);
        object.put("voice", "zhixiaoxia");
        object.put("format", "pcm");
        object.put("sample_rate", 16000);
        object.put("volume", 50);
        object.put("speech_rate", 0);
        object.put("pitch_rate", 0);
        str = object.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    Log.i(TAG, "user parameters:" + str);
    return str;
}

流式发送合成文本

String sentence = "番茄炒蛋怎么做?";
stream_input_tts_instance.sendStreamInputTts(sentence);

结束语音合成

stream_input_tts_instance.stopStreamInputTts();

回调处理

  • onStreamInputTtsEventCallback:流式文本语音合成事件回调,根据语音合成状态控制播放器。

    public void onStreamInputTtsEventCallback(
                        INativeStreamInputTtsCallback.StreamInputTtsEvent event, String task_id,
                        String session_id, int ret_code, String error_msg,
                        String timestamp, String all_response) {
        Log.i(TAG, "stream input tts event:" + event + " session id " + session_id + " session id " + task_id + " ret " + ret_code);
        if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SYNTHESIS_STARTED) {
            Log.i(TAG, "STREAM_INPUT_TTS_EVENT_SYNTHESIS_STARTED");
            mAudioTrack.play();
            Log.i(TAG, "start play");
        } else if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SENTENCE_SYNTHESIS) {
            Log.i(TAG, "STREAM_INPUT_TTS_EVENT_SENTENCE_SYNTHESIS:" + timestamp);
        } else if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE || event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_TASK_FAILED) {
            /*
             * 提示: STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE事件表示TTS已经合成完并通过回调传回了所有音频数据, 而不是表示播放器已经播放完了所有音频数据。
             */
            Log.i(TAG, "play end");
    
            // 表示推送完数据, 当播放器播放结束则会有playOver回调
            mAudioTrack.isFinishSend(true);
    
            if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_TASK_FAILED) {
                Log.e(TAG, "STREAM_INPUT_TTS_EVENT_TASK_FAILED error_code:" + ret_code + " errmsg:" + error_msg);
            }
        } else if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SENTENCE_BEGIN) {
            Log.i(TAG, "STREAM_INPUT_TTS_EVENT_SENTENCE_BEGIN:" + all_response);
        } else if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SENTENCE_END) {
            Log.i(TAG, "STREAM_INPUT_TTS_EVENT_SENTENCE_END:" + all_response);
        }
    }
  • onStreamInputTtsDataCallback:语音合成数据回调,将回调中的合成数据写入播放器进行播放。

    public void onStreamInputTtsDataCallback(byte[] data) {
          if (data.length > 0) {
              if (mEncodeType.equals("pcm")) {
                  mAudioTrack.setAudioData(data);
              }
          }
      }