全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网

Android SDK

更新时间:2017-09-29 14:33:29

功能介绍

语音Android SDK提供提供将文本转为普通话语音的语音合成功能。

阿里云语音服务SDK(NLSClinet),是运行于android平台的基础语音识别、自然语言理解和语音合成的基础服务,本服务通过Jar包和.so库的形式导入,用户通过本指南可以方便的接入。

SDK下载地址

语音合成AndroidSDK

获取appkey

获取appkey

开发包目录

文件夹 内容
libs/
libs/NlsClientSdk.jar NLSClinet的服务包
libs/armeabi
libs/armeabi/libztcodec2.so
libs/armeabi-v7a
libs/armeabi-v7a/libztcodec2.so
libs/x86
libs/x86/libztcodec2.so
  • 本服务使用了解析json的gson.jar,需要用户自行导入。

集成指南

导入服务包

将下载的服务包解压后,将NlsClientSdk.jar,以及对应架构的.so包导入你的项目中的libs/目录下。

Android权限管理

在AndroidManifest.xml文件中添加以下权限申请:

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  4. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  7. <uses-permission android:name="android.permission.WRITE_SETTINGS" />

Proguard配置

如果代码使用了混淆,请在proguard-rules.pro中配置:

  1. -keep class com.alibaba.idst.nls.** {*;}
  2. -keep class com.google.**{*;}

重要接口说明

com.alibaba.idst.nls.NlsClient


语音服务的核心服务类,客户端程序通过调用该类的cancel()、start()、stop()等方法来打开、关闭或发送语音数据。

全局配置

public static void configure(Context appContext)

  • 说明 全局配置,在初始化NlsClient前需要被调用,建议放在Application的onCreate()里
  • 参数
    • appContext 传入ApplicationContext参数,用于识别引擎内部访问和Android上下文相关的资源
  • 返回值 null

实例化NlsClient对象

public static NlsClient newInstance(Context context,NlsListener nlsListener,StageListener stageListener, NlsRequest nlsRequest)

  • 说明 获得一个NlsClient, 通过该方法实例化NlsClient。
  • 参数
    • context 传入Context参数,用于识别引擎内部访问和Android上下文相关的资源
    • nlsListener 识别相关的回调接口,用于通知客户端识别结果
    • stageListener 引擎状态回调接口,用于通知客户端当前的引擎状态以及录音音量等
  • 返回值 NlsClient

TTS请求接口

ppublic boolean PostTtsRequest(String InputText,String SampleRate)

  • 说明 TTS 服务调用接口,传入文本,返回语音结果
  • 参数
    • InputText 用户输入的文本请求
    • SampleRate 用户传入码率 如16000
  • 返回值 true:请求成功发送 false:发送失败

其它接口

Log开关

public static void openLog(boolean isOpen)

  • 说明 log开关,标识是否需要通过logcat打印识别引擎的相关log
  • 参数
    • isOpen true:打印log false:关闭log
  • 返回值 null

com.alibaba.idst.nls.internal.protocol.NlsRequest


语音服务的请求封装对象。调用程序需要至少在请求对象里设定好调用者的appKey和语音数据的格式以便后台服务能正确识别并翻译语音。

初始化Nls 请求:NlsRequest mNlsRequest = new NlsRequest()

public void setApp_key(String app_key)

  • 说明 设置应用的appkey,appkey需要先申请再使用。
  • 参数
    • app_key
  • 返回值 null

public void authorize(String id, String secret)

  • 说明 数加认证模块,所有的请求都必须通过authorize方法认证通过,才可以使用。 id和secret需要申请获取。
  • 参数
    • id id。
    • secret 对应密钥。
  • 返回值 null

public void setTtsEncodeType(String encodeType)

  • 说明 设置tts返回语音的格式类型,目前支持pcm、wav、alaw。
  • 参数
    • encodeType 类型
  • 返回值 null

public void setTtsSpeechRate(String speechRate)

  • 说明 语速,默认输入为0,阈值-500~500。
  • 参数
    • speechRate 语速
  • 返回值 null

public void setTtsVolume(String volume)

  • 说明 音量大小默认50,阈值0-100。
  • 参数
    • volume 音量
  • 返回值 null

com.alibaba.idst.nls.internal.protocol.NlsRequestProto


NlsRequest对象初始化时需要注入的参数。

public void setApp_id(String app_id)

  • 设置application_id.

public void setApp_user_id(String app_user_id)

  • 设置app_user_id.

public void setQuery_type(String query_type)

  • 设置query_type.

com.alibaba.idst.nls.StageListener


语音服务引擎状态变更回调接口,服务状态的改变、音量大小的回调、语音文件的生成通过本接口获取。

录音开始的回调

public void onStartRecording(NlsClient recognizer)

  • 说明 录音开始
  • 参数

  • 返回值 NlsClient

录音结束的回调

public void onStopRecording(NlsClient recognizer)

  • 说明 录音结束
  • 参数

  • 返回值 NlsClient

识别开始的回调

public void onStartRecognizing(NlsClient recognizer)

  • 说明 识别开始
  • 参数

  • 返回值 NlsClient

识别结束的回调

public void onStopRecognizing(NlsClient recognizer)

  • 说明 识别结束
  • 参数

  • 返回值 NlsClient

音量大小回调

public void onVoiceVolume(int volume)

  • 说明 获取音量

  • 参数

    • volume 录音音量,范围0-100
  • 返回值 null

com.alibaba.idst.nls.NlsListener


语音服务结果的回调类,语音服务是一个相对较长过程,为了不影响客户端的正常工作,语音sdk被设计成异步模式,调用程序将语音客户端建立好并将语音数据交给sdk后就可以离开。在收到语音数据之后的处理需要通过实现该接口来完成。每一个识别过程创建的时候都需要注入侦听者以响应语音服务的结果。

tts文本转语音,语音流回调接口

public void onTtsResult(int status, byte[] ttsResult)

  • 说明 tts识别结束时回调接口,识别结束时回调。
  • 参数
    • status 标识识别结果的状态,详情见下方。
    • result 返回识别结果,结果byte[]类型。
  • 返回值 null

  • status 状态:

  • 客户端错误码
字段名 含义
TTS_BEGIN 6 tts 语音流开始
TTS_TRANSFERRING 7 tts 中间结果
TTS_OVER 8 tts 语音流结束
CONNECT_ERROR 530 socket请求失败
  • 服务端返回结果错误码
状态 status_code CloseFrame状态码 HTTP语义
成功 200 1000 成功处理
请求格式有误 400 4400 错误请求
需要鉴权信息 401 4401 请求要求身份验证
鉴权失败 403 4403 服务器拒绝请求
超出最大并发量 429 4429 太多请求
请求超时 408 4408 处理请求超时
处理出错 500 4500 服务器内部错误
服务不可用 503 4503 服务不可用

错误码

  • 客户端错误码
字段名 错误码 含义
SUCCESS 0 成功
RECOGNIZE_ERROR 1 识别失败
USER_CANCEL 520 用户取消
CONNECT_ERROR 530 网络及通讯异常
NOTHING 540 语音服务异常
RECORDING_ERROR 550 录音及语音识别异常
ERROR_CLICK_TOOMUCH 570 用户点击过快
  • 服务端返回结果错误码
状态 status_code CloseFrame状态码 HTTP语义
成功 200 1000 成功处理
请求格式有误 400 4400 错误请求
需要鉴权信息 401 4401 请求要求身份验证
鉴权失败 403 4403 服务器拒绝请求
超出最大并发量 429 4429 太多请求
请求超时 408 4408 处理请求超时
处理出错 500 4500 服务器内部错误
服务不可用 503 4503 服务不可用

完整示例

  1. package com.alibaba.idst.nlsdemo;
  2. import android.app.Activity;
  3. import android.media.AudioFormat;
  4. import android.media.AudioManager;
  5. import android.media.AudioTrack;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.TextView;
  11. import android.widget.Toast;
  12. import com.alibaba.idst.R;
  13. import com.alibaba.idst.nls.NlsClient;
  14. import com.alibaba.idst.nls.NlsListener;
  15. import com.alibaba.idst.nls.internal.protocol.NlsRequest;
  16. import com.alibaba.idst.nls.internal.protocol.NlsRequestProto;
  17. public class PublicTtsActivity extends Activity {
  18. private static final String TAG = "PublicTtsActivity";
  19. private TextView UserContent;
  20. private Button Send_User_Content;
  21. private NlsClient mNlsClient;
  22. private NlsRequest mNlsRequest;
  23. private Context context;
  24. int iMinBufSize = AudioTrack.getMinBufferSize(8000,
  25. AudioFormat.CHANNEL_CONFIGURATION_STEREO,
  26. AudioFormat.ENCODING_PCM_16BIT);
  27. AudioTrack audioTrack=new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
  28. AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT,
  29. iMinBufSize, AudioTrack.MODE_STREAM) ; //使用audioTrack播放返回的pcm数据
  30. @Override
  31. protected void onCreate(Bundle savedInstanceState) {
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.activity_public_tts);
  34. UserContent = (TextView) findViewById(R.id.UserContent_tts);
  35. Send_User_Content = (Button) findViewById(R.id.send_tts);
  36. context = getApplicationContext();
  37. mNlsRequest = initNlsRequest();
  38. String appkey = "nls-service"; //请设置简介页面的Appkey
  39. mNlsRequest.setApp_key(appkey); //appkey请从 简介页面的appkey列表中获取
  40. mNlsRequest.initTts(); //初始化tts请求
  41. NlsClient.openLog(true);
  42. NlsClient.configure(getApplicationContext()); //全局配置
  43. mNlsClient = NlsClient.newInstance(this, mRecognizeListener, null ,mNlsRequest); //实例化NlsClient
  44. initTtsContentButton();
  45. }
  46. private NlsRequest initNlsRequest(){
  47. NlsRequestProto proto = new NlsRequestProto(context);
  48. proto.setApp_user_id("xxx"); //设置用户名
  49. return new NlsRequest(proto);
  50. }
  51. private void initTtsContentButton(){
  52. Send_User_Content.setOnClickListener(new View.OnClickListener() {
  53. @Override
  54. public void onClick(View view) {
  55. String user_input = UserContent.getText().toString();
  56. if (user_input.equals("")){
  57. Toast.makeText(PublicTtsActivity.this, "输入不能为空!", Toast.LENGTH_LONG).show();
  58. }else {
  59. mNlsRequest.setTtsEncodeType("pcm"); //返回语音数据格式,支持pcm,wav.alaw
  60. mNlsRequest.setTtsVolume(50); //音量大小默认50,阈值0-100
  61. mNlsRequest.setTtsSpeechRate(0);//语速,阈值-500~500
  62. mNlsClient.PostTtsRequest(user_input); //用户输入文本
  63. mNlsRequest.authorize("", ""); //请替换为用户申请到的数加认证key和密钥
  64. audioTrack.play();
  65. }
  66. }
  67. });
  68. }
  69. private NlsListener mRecognizeListener = new NlsListener() {
  70. @Override
  71. public void onTtsResult(int status, byte[] ttsResult){
  72. switch (status) {
  73. case NlsClient.ErrorCode.TTS_BEGIN :
  74. audioTrack.play();
  75. Log.e(TAG, "tts begin");
  76. audioTrack.write(ttsResult, 0, ttsResult.length);
  77. break;
  78. case NlsClient.ErrorCode.TTS_TRANSFERRING :
  79. Log.e(TAG,"tts transferring"+ttsResult.length);
  80. audioTrack.write(ttsResult, 0, ttsResult.length);
  81. break;
  82. case NlsClient.ErrorCode.TTS_OVER :
  83. audioTrack.stop();
  84. Log.e(TAG,"tts over");
  85. break;
  86. case NlsClient.ErrorCode.CONNECT_ERROR :
  87. Toast.makeText(PublicTtsActivity.this, "CONNECT ERROR", Toast.LENGTH_LONG).show();
  88. break;
  89. }
  90. }
  91. } ;
  92. @Override
  93. protected void onDestroy() {
  94. audioTrack.release();
  95. super.onDestroy();
  96. }
  97. }
本文导读目录