功能介绍
语音Android SDK提供提供将文本转为普通话语音的语音合成功能。
阿里云语音服务SDK(NLSClinet),是运行于android平台的基础语音识别、自然语言理解和语音合成的基础服务,本服务通过Jar包和.so库的形式导入,用户通过本指南可以方便的接入。
SDK下载地址
语音合成AndroidSDK
获取appkey
获取appkey
开发包目录
- 本服务使用了解析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="">
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <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="">
- -keep class com.alibaba.idst.nls.** {*;}
- -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)
public void setApp_user_id(String app_user_id)
public void setQuery_type(String query_type)
com.alibaba.idst.nls.StageListener
语音服务引擎状态变更回调接口,服务状态的改变、音量大小的回调、语音文件的生成通过本接口获取。
录音开始的回调
public void onStartRecording(NlsClient recognizer)
录音结束的回调
public void onStopRecording(NlsClient recognizer)
识别开始的回调
public void onStartRecognizing(NlsClient recognizer)
识别结束的回调
public void onStopRecognizing(NlsClient recognizer)
音量大小回调
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 状态:
错误码
完整示例
<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="">
- package com.alibaba.idst.nlsdemo;
- import android.app.Activity;
- import android.media.AudioFormat;
- import android.media.AudioManager;
- import android.media.AudioTrack;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- import com.alibaba.idst.R;
- import com.alibaba.idst.nls.NlsClient;
- import com.alibaba.idst.nls.NlsListener;
- import com.alibaba.idst.nls.internal.protocol.NlsRequest;
- import com.alibaba.idst.nls.internal.protocol.NlsRequestProto;
- public class PublicTtsActivity extends Activity {
- private static final String TAG = "PublicTtsActivity";
- private TextView UserContent;
- private Button Send_User_Content;
- private NlsClient mNlsClient;
- private NlsRequest mNlsRequest;
- private Context context;
- int iMinBufSize = AudioTrack.getMinBufferSize(8000,
- AudioFormat.CHANNEL_CONFIGURATION_STEREO,
- AudioFormat.ENCODING_PCM_16BIT);
- AudioTrack audioTrack=new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
- AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT,
- iMinBufSize, AudioTrack.MODE_STREAM) ; //使用audioTrack播放返回的pcm数据
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_public_tts);
- UserContent = (TextView) findViewById(R.id.UserContent_tts);
- Send_User_Content = (Button) findViewById(R.id.send_tts);
- context = getApplicationContext();
- mNlsRequest = initNlsRequest();
- String appkey = "nls-service"; //请设置简介页面的Appkey
- mNlsRequest.setApp_key(appkey); //appkey请从 简介页面的appkey列表中获取
- mNlsRequest.initTts(); //初始化tts请求
- NlsClient.openLog(true);
- NlsClient.configure(getApplicationContext()); //全局配置
- mNlsClient = NlsClient.newInstance(this, mRecognizeListener, null ,mNlsRequest); //实例化NlsClient
- initTtsContentButton();
- }
- private NlsRequest initNlsRequest(){
- NlsRequestProto proto = new NlsRequestProto(context);
- proto.setApp_user_id("xxx"); //设置用户名
- return new NlsRequest(proto);
- }
- private void initTtsContentButton(){
- Send_User_Content.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- String user_input = UserContent.getText().toString();
- if (user_input.equals("")){
- Toast.makeText(PublicTtsActivity.this, "输入不能为空!", Toast.LENGTH_LONG).show();
- }else {
- mNlsRequest.setTtsEncodeType("pcm"); //返回语音数据格式,支持pcm,wav.alaw
- mNlsRequest.setTtsVolume(50); //音量大小默认50,阈值0-100
- mNlsRequest.setTtsSpeechRate(0);//语速,阈值-500~500
- mNlsClient.PostTtsRequest(user_input); //用户输入文本
- mNlsRequest.authorize("", ""); //请替换为用户申请到的数加认证key和密钥
- audioTrack.play();
- }
- }
- });
- }
- private NlsListener mRecognizeListener = new NlsListener() {
- @Override
- public void onTtsResult(int status, byte[] ttsResult){
- switch (status) {
- case NlsClient.ErrorCode.TTS_BEGIN :
- audioTrack.play();
- Log.e(TAG, "tts begin");
- audioTrack.write(ttsResult, 0, ttsResult.length);
- break;
- case NlsClient.ErrorCode.TTS_TRANSFERRING :
- Log.e(TAG,"tts transferring"+ttsResult.length);
- audioTrack.write(ttsResult, 0, ttsResult.length);
- break;
- case NlsClient.ErrorCode.TTS_OVER :
- audioTrack.stop();
- Log.e(TAG,"tts over");
- break;
- case NlsClient.ErrorCode.CONNECT_ERROR :
- Toast.makeText(PublicTtsActivity.this, "CONNECT ERROR", Toast.LENGTH_LONG).show();
- break;
- }
- }
- } ;
- @Override
- protected void onDestroy() {
- audioTrack.release();
- super.onDestroy();
- }
- }