Java SDK 您所在的位置:网站首页 阿里云智能语音交互收费多少 Java SDK

Java SDK

2024-05-27 16:18| 来源: 网络整理| 查看: 265

前提条件

在使用SDK之前,请先阅读接口说明,详情请参见接口说明。

下载安装

从Maven服务器下载最新版本SDK,下载nls-sdk-java-demo。

com.alibaba.nls nls-sdk-tts 2.1.6

解压ZIP文件,在pom目录运行mvn package,会在target目录生成可执行JAR:nls-example-tts-2.0.0-jar-with-dependencies.jar,将JAR包拷贝到目标服务器,用于快速验证及压测服务。

服务验证:

运行如下代码,并按提示提供相应参数。

运行后在命令执行目录生成logs/nls.log。

java -cp nls-example-tts-2.0.0-jar-with-dependencies.jar com.alibaba.nls.client.SpeechSynthesizerDemo

服务压测:

运行如下代码,并按提示提供相应参数。

其中阿里云服务URL参数为:wss://nls-gateway-ap-southeast-1.aliyuncs.com/ws/v1,并发数根据您的购买情况进行选择。

java -jar nls-example-tts-2.0.0-jar-with-dependencies.jar说明

自行压测超过2并发将产生费用。

关键接口

NlsClient:语音处理客户端,利用该客户端可以进行一句话识别、实时语音识别和语音合成的语音处理任务。该客户端为线程安全,建议全局仅创建一个实例。

SpeechSynthesizer:语音合成处理类,通过该接口设置请求参数,发送请求。非线程安全。

SpeechSynthesizerListener:语音合成监听类,监听返回结果。非线程安全。需要实现如下两个抽象方法:

/** * 接收语音合成二进制数据 */ abstract public void onMessage(ByteBuffer message); /** * 语音合成结束事件通知 * * @param response */ abstract public void onComplete(SpeechSynthesizerResponse response);

更多介绍,请参见Java API接口说明。

重要

SDK调用注意事项:

NlsClient使用Netty框架,NlsClient对象的创建会消耗一定时间和资源,一经创建可以重复使用。建议调用程序将NlsClient的创建和关闭与程序本身的生命周期相结合。

SpeechSynthesizer对象不可重复使用,一个语音合成任务对应一个SpeechSynthesizer对象。例如,N个文本要进行N次语音合成任务,创建N个SpeechSynthesizer对象。

SpeechSynthesizerListener对象和SpeechSynthesizer对象是一一对应的,不能将一个SpeechSynthesizerListener对象设置到多个SpeechSynthesizer对象中,否则不能将各语音合成任务区分开。

Java SDK依赖Netty网络库,如果您的应用依赖Netty,其版本需更新至4.1.17.Final及以上。

代码示例说明

示例中使用SDK内置的默认语音合成服务的外网访问服务URL,如果您使用阿里云上海ECS,且需要通过内网访问服务URL,则在创建NlsClient对象时,设置内网访问的URL:

client = new NlsClient("ws://nls-gateway.ap-southeast-1-internal.aliyuncs.com/ws/v1", accessToken);

示例中将合成的音频保存在文件中,如果您需要播放音频且对实时性要求较高,建议使用流式播放,即边接收语音数据边播放,减少延时。

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import com.alibaba.nls.client.protocol.NlsClient; import com.alibaba.nls.client.protocol.OutputFormatEnum; import com.alibaba.nls.client.protocol.SampleRateEnum; import com.alibaba.nls.client.protocol.tts.SpeechSynthesizer; import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerListener; import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 此示例演示了: * 语音合成API调用。 * 动态获取token。 * 流式合成TTS。 * 首包延迟计算。 */ public class SpeechSynthesizerDemo { private static final Logger logger = LoggerFactory.getLogger(SpeechSynthesizerDemo.class); private static long startTime; private String appKey; NlsClient client; public SpeechSynthesizerDemo(String appKey, String accessKeyId, String accessKeySecret) { this.appKey = appKey; //应用全局创建一个NlsClient实例,默认服务地址为阿里云线上服务地址。 //获取token,使用时注意在accessToken.getExpireTime()过期前再次获取。 AccessToken accessToken = new AccessToken(accessKeyId, accessKeySecret); try { accessToken.apply(); System.out.println("get token: " + accessToken.getToken() + ", expire time: " + accessToken.getExpireTime()); client = new NlsClient(accessToken.getToken()); } catch (IOException e) { e.printStackTrace(); } } public SpeechSynthesizerDemo(String appKey, String accessKeyId, String accessKeySecret, String url) { this.appKey = appKey; AccessToken accessToken = new AccessToken(accessKeyId, accessKeySecret); try { accessToken.apply(); System.out.println("get token: " + accessToken.getToken() + ", expire time: " + accessToken.getExpireTime()); if(url.isEmpty()) { client = new NlsClient(accessToken.getToken()); }else { client = new NlsClient(url, accessToken.getToken()); } } catch (IOException e) { e.printStackTrace(); } } private static SpeechSynthesizerListener getSynthesizerListener() { SpeechSynthesizerListener listener = null; try { listener = new SpeechSynthesizerListener() { File f=new File("tts_test.wav"); FileOutputStream fout = new FileOutputStream(f); private boolean firstRecvBinary = true; //语音合成结束 @Override public void onComplete(SpeechSynthesizerResponse response) { //调用onComplete时表示所有TTS数据已接收完成,因此为整个合成数据的延迟。该延迟可能较大,不一定满足实时场景。 System.out.println("name: " + response.getName() + ", status: " + response.getStatus()+ ", output file :"+f.getAbsolutePath() ); } //语音合成的语音二进制数据 @Override public void onMessage(ByteBuffer message) { try { if(firstRecvBinary) { //计算首包语音流的延迟,收到第一包语音流时,即可以进行语音播放,以提升响应速度(特别是实时交互场景下)。 firstRecvBinary = false; long now = System.currentTimeMillis(); logger.info("tts first latency : " + (now - SpeechSynthesizerDemo.startTime) + " ms"); } byte[] bytesArray = new byte[message.remaining()]; message.get(bytesArray, 0, bytesArray.length); fout.write(bytesArray); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFail(SpeechSynthesizerResponse response){ //task_id是调用方和服务端通信的唯一标识,当遇到问题时需要提供task_id以便排查。 System.out.println( "task_id: " + response.getTaskId() + //状态码 20000000 表示识别成功 ", status: " + response.getStatus() + //错误信息 ", status_text: " + response.getStatusText()); } }; } catch (Exception e) { e.printStackTrace(); } return listener; } public void process() { SpeechSynthesizer synthesizer = null; try { //创建实例,建立连接。 synthesizer = new SpeechSynthesizer(client, getSynthesizerListener()); synthesizer.setAppKey(appKey); //设置返回音频的编码格式 synthesizer.setFormat(OutputFormatEnum.WAV); //设置返回音频的采样率 synthesizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K); //发音人 synthesizer.setVoice("siyue"); //语调,范围是-500~500,可选,默认是0。 synthesizer.setPitchRate(100); //语速,范围是-500~500,默认是0。 synthesizer.setSpeechRate(100); //设置用于语音合成的文本 synthesizer.setText("欢迎使用阿里巴巴智能语音合成服务,您可以说北京明天天气怎么样啊"); // 是否开启字幕功能(返回相应文本的时间戳),默认不开启,需要注意并非所有发音人都支持该参数。 synthesizer.addCustomedParam("enable_subtitle", false); //此方法将以上参数设置序列化为JSON格式发送给服务端,并等待服务端确认。 long start = System.currentTimeMillis(); synthesizer.start(); logger.info("tts start latency " + (System.currentTimeMillis() - start) + " ms"); SpeechSynthesizerDemo.startTime = System.currentTimeMillis(); //等待语音合成结束 synthesizer.waitForComplete(); logger.info("tts stop latency " + (System.currentTimeMillis() - start) + " ms"); } catch (Exception e) { e.printStackTrace(); } finally { //关闭连接 if (null != synthesizer) { synthesizer.close(); } } } public void shutdown() { client.shutdown(); } public static void main(String[] args) throws Exception { String appKey = "您的appkey"; String id = "您的AccessKey Id"; String secret = "您的AccessKey Secret"; String url = ""; //默认值:wss://nls-gateway-ap-southeast-1.aliyuncs.com/ws/v1 if (args.length == 3) { appKey = args[0]; id = args[1]; secret = args[2]; } else if (args.length == 4) { appKey = args[0]; id = args[1]; secret = args[2]; url = args[3]; } else { System.err.println("run error, need params(url is optional): " + " [url]"); System.exit(-1); } SpeechSynthesizerDemo demo = new SpeechSynthesizerDemo(appKey, id, secret, url); demo.process(); demo.shutdown(); } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有