开发者社区> 问答> 正文

语音合成Android SDK



功能介绍


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

SDK下载地址


语音合成AndroidSDK

获取appkey


获取appkey

开发包目录

文件夹内容
libs/
libs/NlsClientSdk.jarNLSClinet的服务包
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文件中添加以下权限申请:<divre style='background: rgb(246, 246, 246); font: 12px/1.6 "YaHei Consolas Hybrid", Consolas, "Meiryo UI", "Malgun Gothic", "Segoe UI", "Trebuchet MS", Helvetica, monospace, monospace; margin: 0px 0px 16px; padding: 10px; outline: 0px; border-radius: 3px; border: 1px solid rgb(221, 221, 221); color: rgb(51, 51, 51); text-transform: none; text-indent: 0px; letter-spacing: normal; overflow: auto; word-spacing: 0px; white-space: pre-wrap; word-wrap: break-word; box-sizing: border-box; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;' prettyprinted?="" linenums="">
  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中配置:<divre style='background: rgb(246, 246, 246); font: 12px/1.6 "YaHei Consolas Hybrid", Consolas, "Meiryo UI", "Malgun Gothic", "Segoe UI", "Trebuchet MS", Helvetica, monospace, monospace; margin: 0px 0px 16px; padding: 10px; outline: 0px; border-radius: 3px; border: 1px solid rgb(221, 221, 221); color: rgb(51, 51, 51); text-transform: none; text-indent: 0px; letter-spacing: normal; overflow: auto; word-spacing: 0px; white-space: pre-wrap; word-wrap: break-word; box-sizing: border-box; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;' prettyprinted?="" linenums="">
  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:发送失败

<a name="其它接口:">其它接口:



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_BEGIN6tts 语音流开始
TTS_TRANSFERRING7tts 中间结果
TTS_OVER8tts 语音流结束
CONNECT_ERROR530socket请求失败
  • 服务端返回结果错误码
状态status_codeCloseFrame状态码HTTP语义
成功2001000成功处理
请求格式有误4004400错误请求
需要鉴权信息4014401请求要求身份验证
鉴权失败4034403服务器拒绝请求
超出最大并发量4294429太多请求
请求超时4084408处理请求超时
处理出错5004500服务器内部错误
服务不可用5034503服务不可用


错误码

  • 客户端错误码
字段名错误码含义
SUCCESS0成功
RECOGNIZE_ERROR1识别失败
USER_CANCEL520用户取消
CONNECT_ERROR530网络及通讯异常
NOTHING540语音服务异常
RECORDING_ERROR550录音及语音识别异常
ERROR_CLICK_TOOMUCH570用户点击过快
  • 服务端返回结果错误码
状态status_codeCloseFrame状态码HTTP语义
成功2001000成功处理
请求格式有误4004400错误请求
需要鉴权信息4014401请求要求身份验证
鉴权失败4034403服务器拒绝请求
超出最大并发量4294429太多请求
请求超时4084408处理请求超时
处理出错5004500服务器内部错误
服务不可用5034503服务不可用


完整示例

<pre style='background: rgb(246, 246, 246); font: 12px/1.6 "YaHei Consolas Hybrid", Consolas, "Meiryo UI", "Malgun Gothic", "Segoe UI", "Trebuchet MS", Helvetica, monospace, monospace; padding: 10px; outline: 0px; border-radius: 3px; border: 1px solid rgb(221, 221, 221); color: rgb(51, 51, 51); text-transform: none; text-indent: 0px; letter-spacing: normal; overflow: auto; margin-top: 0px; margin-right: 0px; margin-bottom: 0px !important; margin-left: 0px; word-spacing: 0px; white-space: pre-wrap; word-wrap: break-word; box-sizing: border-box; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;' prettyprinted?="" linenums="">
  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. }

展开
收起
nicenelly 2017-10-25 15:22:15 2728 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载