语音合成(webSocket版)
前提条件
- 确保已经按照配置好Android开发环境。
- 请参考SDK(websocket)获取最新版本SDK包。
初始化Client
初始化RttsClient,其中参数包含AuthInfo和SisHttpConfig和RttsResponseListener。其中AuthInfo和SisHttpConfig的参数如表1所示。
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
ak |
是 |
String |
用户的ak,可参考AK/SK认证。 |
sk |
是 |
String |
用户的sk,可参考AK/SK认证。 |
serviceRegion |
是 |
String |
区域,如cn-north-4,参考终端节点。 |
projectId |
是 |
String |
项目ID,同region一一对应,参考获取项目ID。 |
serviceEndPoint |
否 |
String |
终端节点,参考地区和终端节点。 |
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
connectionTimeout |
否 |
Integer |
连接超时,默认10000,单位ms。 |
readTimeout |
否 |
Integer |
读取超时,默认10000,单位ms。 |
websocketWaitTimeout |
否 |
Integer |
webSocket返回数据时等待时间,默认20000,单位毫秒。 |
ProxyHostInfo |
否 |
ProxyHostInfo |
代理类。 |
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
userName |
否 |
String |
代理用户名(例:test)。 |
passWord |
否 |
String |
代理密码(例:test)。 |
hostName |
否 |
String |
代理地址(例:“proxy.huaweicloud.com”)。 |
port |
否 |
int |
代理端口号(例:8080)。 |
其中RttsResponseListener使用户自定义的,建立webSocket之后,接受服务端返回消息的Listener。
函数名称 |
作用 |
---|---|
void onTranscriptionConnect(); |
webSocket建立连接后后调。 |
void onTranscriptionClose(); |
webSocket连接关闭后回调。 |
void onTranscriptionFail(RttsResponse response); |
长连接连接失败是回调。 |
void onTranscriptionBegin(RttsResponse response); |
开始合成音频数据时回调。 |
void onTranscriptionEnd(RttsResponse response); |
合成音频数据结束时回调。 |
void onTranscriptionError(RttsResponse response); |
合成音频数据过程中失败时回调。 |
void onTranscriptionResponse(byte[] bytes); |
返回合成的二进制数据。 |
请求参数
请求类为RttsRequest,其中参数包含text,command,Config,详见表5。
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
text |
是 |
String |
待合成的文本,文本长度限制小于500字符。 |
command |
是 |
String |
需设置为START,表示开始识别请求。 |
Config |
是 |
String |
配置信息。可参照表6。 |
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
audio_format |
否 |
String |
待合成的音频格式,可选mp3,wav等,默认wav。具体信息请参见《API参考》中语音合成章节。 |
pitch |
否 |
Integer |
音高,[-500,500] ,默认是0。 |
speed |
否 |
Integer |
语速,[-500,500] ,默认是0。 |
volume |
否 |
Integer |
音量,[0,100],默认是50。 |
sample_rate |
否 |
String |
采样率,支持“8000”、“16000”,默认“8000”。 |
property |
否 |
String |
特征字符串,{language}_{speaker}_{domain},默认chinese_xiaoqi_common。具体信息请参见《API参考》中语音合成章节。 |
建立连接,发送合成数据
rttsClient.connect(); rttsClient.sendData(rttsRequest);
发送关闭连接请求
rttsClient.close();
代码示例
如下示例仅供参考,最新代码请前往SDK(websocket)章节获取并运行。
/* * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. */ package com.huaweicloud.sis.android.demo.tts; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.cloud.sdk.util.StringUtils; import com.huaweicloud.sdk.core.utils.JsonUtils; import com.huaweicloud.sis.android.demo.R; import com.huaweicloud.sis.android.demo.service.AudioTrackService; import com.huaweicloud.sis.android.demo.Config; import com.huaweicloud.sis.android.demo.service.AudioTrackServiceCallback; import sis.android.sdk.RttsClient; import sis.android.sdk.bean.AuthInfo; import sis.android.sdk.bean.SisHttpConfig; import sis.android.sdk.bean.request.RttsRequest; import sis.android.sdk.bean.response.RttsResponse; import sis.android.sdk.exception.SisException; import sis.android.sdk.listeners.RttsResponseListener; /** * 功能描述 * 语音合成 websocket * * @since 2022-07-18 */ public class RttsActivity extends AppCompatActivity { private EditText textView; private Button startPlay; private RttsClient rttsClient; private SisHttpConfig sisHttpConfig; private AudioTrackService audioTrackService; private AudioTrackServiceCallback audioPlayerCallback; private AuthInfo authInfo; private static int dataAcceptanceTime = 1000 * 60 * 5; private RttsResponseListener rttsResponseListener = new RttsResponseListener() { @Override public void onTranscriptionConnect() { Log.i("info", "建立连接后回调"); } @Override public void onTranscriptionClose() { Log.i("info", "关闭连接后回调"); } @Override public void onTranscriptionFail(RttsResponse response) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "出现异常" + JsonUtils.toJSON(response), Toast.LENGTH_SHORT).show(); } }); updateButtonState(startPlay, true); Log.i("info", "长连接失败后回调" + JsonUtils.toJSON(response)); } @Override public void onTranscriptionBegin(RttsResponse response) { Log.i("info", "开始合成时的响应事件" + response.toString()); } @Override public void onTranscriptionEnd(RttsResponse response) { rttsClient.close(); audioTrackService.setPlayState(AudioTrackService.PlayState.playEnd); } @Override public void onTranscriptionError(RttsResponse response) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "出现异常" + JsonUtils.toJSON(response), Toast.LENGTH_SHORT).show(); } }); updateButtonState(startPlay, true); Log.i("info", "合成时发生错误的响应事件" + response.toString()); } @Override public void onTranscriptionResponse(byte[] bytes) { Log.i("info", "合成过程中返回的二进制流"); audioTrackService.setAudioData(bytes); } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rtts); } @Override protected void onStart() { super.onStart(); initView(); initResources(); } @Override protected void onDestroy() { super.onDestroy(); if (audioTrackService != null) { audioTrackService.stop(); audioTrackService.releaseTrack(); } } /** * 初始化UI */ private void initView() { textView = findViewById(R.id.itext); startPlay = findViewById(R.id.startplay); startPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { updateButtonState(startPlay, false); new Thread(new Runnable() { @Override public void run() { try { audioTrackService.play(); rttsClient = new RttsClient(authInfo, sisHttpConfig, rttsResponseListener); RttsRequest rttsRequest = rttsRequets(); rttsClient.connect(); rttsClient.sendData(rttsRequest); } catch (SisException e) { Log.e("error", e.getErrorCode() + e.getErrorMsg()); } } }).start(); } }); } // 用于设置按钮的状态 private void updateButtonState(final Button btn, final boolean state) { runOnUiThread(new Runnable() { @Override public void run() { btn.setEnabled(state); } }); } /** * 初始化资源 */ private void initResources() { authInfo = new AuthInfo(this.getString(R.string.HUAWEICLOUD_SDK_AK), this.getString(R.string.HUAWEICLOUD_SDK_SK), Config.REGION, Config.PROJECT_ID); sisHttpConfig = new SisHttpConfig(); // 设置等待事件为5分钟 sisHttpConfig.setWebsocketWaitTimeout(dataAcceptanceTime); audioPlayerCallback = new AudioTrackServiceCallback() { @Override public void playStart() { } @Override public void playOver() { updateButtonState(startPlay, true); } }; audioTrackService = new AudioTrackService(audioPlayerCallback); } /** * 功能描述 * 语音合成websocket 版 */ private RttsRequest rttsRequets() { RttsRequest rttsRequest = new RttsRequest(); RttsRequest.Config config = new RttsRequest.Config(); config.setAudioFormat("pcm"); config.setProperty("chinese_huaxiaomei_common"); config.setSampleRate("16000"); config.setPitch(0); config.setVolume(50); rttsRequest.setCommand("START"); rttsRequest.setConfig(config); String text = textView.getText().toString().trim(); if (!StringUtils.isNullOrEmpty(text)) { rttsRequest.setText(text); } else { rttsRequest.setText("请输入合成音频"); } return rttsRequest; } }