官网文档https://helpcdn.aliyun.com/document_detail/84435.html
目前版本为2.0 ,但是发现限制:
于是找到1.0的版本发现可以传入几千字,所以使用的1.0的版本,但是好像最近更新后1.0已经不存在了,好久之前就想就想整理的,真是可惜了。
@SuppressWarnings("unused")
public String getYp(ContentTxt txt,HttpServletRequest request) throws Exception {
//语音合成
if (txt != null && txt.getTxt()!= null) {
NlsClient client = new NlsClient();
client.init();
String tts_text = txt.getTxt();
tts_text = tts_text.replaceAll("?[^>]+>", "");
String fileName = UUID.randomUUID().toString();
int ttsTextLength = tts_text.length();
String[] longTexts;
int i = 0;
boolean isHead = false; //标识是否是第一个头文件
String tts_part_text;
//文件夹的路径
String path = request.getSession().getServletContext().getRealPath("/");
path = path+"yyjs";
//文件夹不存在则新建
File fileDir = new File(path);
if(!fileDir.exists()){
fileDir.setWritable(true);
fileDir.mkdirs();
}
//新建文件
File file = new File(path,fileName+".pcm");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
FileOutputStream outputStream = new FileOutputStream(file, true);
longTexts = processLongText(tts_text);
//处理文本,文本长度以50为限,截取为多个文件.
while (ttsTextLength > 0) {
tts_part_text = "";
if (ttsTextLength > 50) {
if (i == 0) {
isHead = true;
} else {
isHead = false;
}
for (; i < longTexts.length; i++) {
tts_part_text = tts_part_text + longTexts[i];
if (i < longTexts.length - 1 && tts_part_text.length() + longTexts[i + 1].length() >= 50) {
i = i + 1;
break;
}
}
} else {
if (i == 0) {
isHead = true;
}
for (; i < longTexts.length; i++) {
tts_part_text = tts_part_text + longTexts[i];
}
}
NlsRequest req = new NlsRequest();
req.setApp_key("nls-service");
req.setTts_req(tts_part_text, "16000");
req.setTtsEncodeType("wav");
req.setTtsVoice("xiaoyun");//男声:xiaogang
req.setTtsVolume(50);
req.setTtsSpeechRate(-100);
req.setTtsBackgroundMusic(1, 0);
req.authorize("", "");//此处填写开通服务时的appKey, token
NlsListener nlsListener = new LongTtsDemo();
NlsFuture future = client.createNlsFuture(req, nlsListener);
int total_len = 0;
byte[] data;
while ((data = future.read()) != null) {
if (data.length == 8044 ) {
// 去掉wav头,同时将多条wav转成一条pcm
outputStream.write(data, 44, data.length - 44);
} else {
outputStream.write(data, 0, data.length);
}
total_len += data.length;
}
future.await(10000);
ttsTextLength = ttsTextLength - tts_part_text.length();
}
outputStream.close();
//将pcm转为wav,可以直接播放. 格式为:16kHz采样率,16bit,单声道
PcmToWav.copyWaveFile(path+"\\"+fileName+".pcm",path+"\\"+fileName+".wav");
client.close();
return path+"\\"+fileName+".wav";
}
return null;
}
这是官方提供的demo
package com.alibaba.idst.nls.demo;
import com.alibaba.idst.nls.NlsClient;
import com.alibaba.idst.nls.NlsFuture;
import com.alibaba.idst.nls.event.NlsEvent;
import com.alibaba.idst.nls.event.NlsListener;
import com.alibaba.idst.nls.protocol.NlsRequest;
import com.alibaba.idst.nls.protocol.NlsRequestASR;
import com.alibaba.idst.nls.protocol.NlsRequestProto;
import com.alibaba.idst.nls.protocol.NlsResponse;
import com.alibaba.idst.nls.utils.PcmToWav;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Arrays;
import java.util.UUID;
/**
* Created by songsong.sss on 16/12/12.
*/
public class LongTtsDemo implements NlsListener {
static Logger logger = LoggerFactory.getLogger(LongTtsDemo.class);
private NlsClient client = new NlsClient();
public String appKey = null;
public String auth_Id = null;
public String auth_Secret = null;
public LongTtsDemo() {
}
public void shutDown() {
logger.info("close NLS client");
client.close();
logger.info("demo done");
}
public void start() {
logger.info("init Nls client...");
client.init();
}
public void sayIt(String tts_text,String fileName) throws Exception {
int ttsTextLength = tts_text.length();
String[] longTexts;
int i = 0;
boolean isHead = false; //标识是否是第一个头文件
String tts_part_text;
File file = new File(fileName+".pcm");
if (!file.exists()) {
try {
file.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
}
FileOutputStream outputStream = new FileOutputStream(file, true);
longTexts = processLongText(tts_text);
//处理文本,文本长度以50为限,截取为多个文件.
while (ttsTextLength > 0) {
tts_part_text = "";
if (ttsTextLength > 50) {
if (i == 0) {
isHead = true;
} else {
isHead = false;
}
for (; i < longTexts.length; i++) {
tts_part_text = tts_part_text + longTexts[i];
if (i < longTexts.length - 1 && tts_part_text.length() + longTexts[i + 1].length() >= 50) {
i = i + 1;
break;
}
}
} else {
if (i == 0) {
isHead = true;
}
for (; i < longTexts.length; i++) {
tts_part_text = tts_part_text + longTexts[i];
}
}
NlsRequest req = new NlsRequest();
req.setApp_key("nls-service");
req.setTts_req(tts_part_text, "16000");
req.setTtsEncodeType("wav");
req.setTtsVoice("xiaoyun");//男声:xiaogang
req.setTtsVolume(50);
req.setTtsBackgroundMusic(1, 0);
req.authorize(auth_Id, auth_Secret);
NlsFuture future = client.createNlsFuture(req, this);
int total_len = 0;
byte[] data;
while ((data = future.read()) != null) {
if (data.length == 8044 ) {
// 去掉wav头,同时将多条wav转成一条pcm
logger.debug("data length:{} , and head is:{}", (data.length - 44), isHead ? "true" : "false");
outputStream.write(data, 44, data.length - 44);
} else {
outputStream.write(data, 0, data.length);
}
total_len += data.length;
}
logger.info("tts audio file size is :" + total_len);
future.await(10000);
ttsTextLength = ttsTextLength - tts_part_text.length();
}
outputStream.close();
//将pcm转为wav,可以直接播放. 格式为:16kHz采样率,16bit,单声道
PcmToWav.copyWaveFile(fileName+".pcm",fileName+".wav");
logger.debug("close the wav file!");
}
@Override
public void onMessageReceived(NlsEvent e) {
NlsResponse response = e.getResponse();
String result = "";
if (response.getDs_ret() != null) {
result = "get ds result: " + response.getDs_ret();
}
if (response.getAsr_ret() != null) {
result += "\nget asr result: " + response.getAsr_ret();
}
if (response.getTts_ret() != null) {
result += "\nget tts result: " + response.getTts_ret();
}
if (response.getGds_ret() != null) {
result += "\nget gds result: " + response.getGds_ret();
}
if (!result.isEmpty()) {
logger.info(result);
} else if (response.jsonResults != null) {
logger.info(response.jsonResults.toString());
} else {
logger.info("get an acknowledge package from server.");
}
}
@Override
public void onOperationFailed(NlsEvent e) {
logger.error("Error message is: {}, Error code is: {}", e.getErrorMessage(), Integer.valueOf(e.getResponse().getStatus_code()));
}
//切分长文本
public static String[] processLongText(String text) {
text = text.replaceAll("、", "、|");
text = text.replaceAll(",", ",|");
text = text.replaceAll("。", "。|");
text = text.replaceAll(";", ";|");
text = text.replaceAll("?", "?|");
text = text.replaceAll("!", "!|");
text = text.replaceAll(",", ",|");
text = text.replaceAll(";", ";|");
text = text.replaceAll("\\?", "?|");
text = text.replaceAll("!", "!|");
String[] texts = text.split("\\|");
return texts;
}
@Override
public void onChannelClosed(NlsEvent e) {
logger.info("on websocket closed.");
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
LongTtsDemo lun = new LongTtsDemo();
// if (args.length < 4) {
// logger.info("NlsDemo ");
// System.exit(-1);
// }
String fileName = UUID.randomUUID().toString();
String tts_text = "杨鲁安先生捐赠大批个人藏品的义举洞记游图卷 等,还有清代名家汪昉、王素、汤雨生、董婉贞、任熏、张熊、姜筠、吴昌硕、吴榖祥、王闿运及近代颜伯龙等人书画扇面精品。民国时期书画名家张謇、刘春霖、梁启超、丁佛言、赵云壑;当代王襄、吴玉如、潘主兰、白铭、陶博吾的上乘之作。陶器、青铜器——这里展示了仰韶涡纹双耳彩陶罐;战国到汉魏的一批瓦当;其中,西汉初期的“惟汉三年大并天下”瓦当为国内罕见。还有从商周到民国初年的一批铜器;春秋蟠螭纹六蛇圈足青铜簋,是晋国早期礼器。展出的还有汉族和少数民族各式带钩,战国晚期各式匈奴带钩;铸造精致,花纹奇特。那柄马首匈奴人带钩,露出匈奴人脸部真容,这为研究匈奴族和汉匈和亲提供了重要材料。钱币——先秦的贝币、布币、刀币、环钱以及秦、汉、唐、宋各朝方孔圆钱。其中半两与五铢钱都是成系列的,小直刀,战国 楚)“郢爰”金版,西汉武帝四铢半两金钱,新莽“六泉十布”及其钱范,北宋大观通宝 行书 铁母钱,均属珍品。还陈列了辽、西夏、金、元各朝铸钱。令人目不暇接,反映了中华钱币文化的概貌。 印章——从古代玺印到近代篆刻家的作品百余钮,展示了我国传统文化的一枝奇葩。西周“吴”字亚形印,为国内仅有;战国官印“北路官”制造精美,文字奇逸;“晋率叟迁长”银官印,西汉“姚禹”玉印,均属珍品。 鲁安作品——这里展出的是杨老的书画作品,书体有甲骨、金文、楷等,书风雄强,久为书法界所称道。其画作凝练、老辣,酣畅、灵动。 为了弘扬杨老留下的这批精神文化遗产,杨鲁安藏珍馆将长期陈列,并适时轮换陈列藏品,期望广大观众热情关注。地址:呼和浩特市回民区公园东路108号。电话 0471-6537871; 0471-6297893 ; 0471-6924915";
// String tts_text = "百草堂与三味书屋 鲁迅 \n" +
// "我家的后面有一个很大的园,相传叫作百草园。现在是早已并屋子一起卖给朱文公的子孙了,连那最末次的相见也已经隔了七八年,其中似乎确凿只有一些野草;但那时却是我的乐园。\n" +
// "不必说碧绿的菜畦,光滑的石井栏,高大的皂荚树,紫红的桑葚;也不必说鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上,轻捷的叫天子(云雀)忽然从草间直窜向云霄里去了。\n"+
// "单是周围的短短的泥墙根一带,就有无限趣味。油蛉在这里低唱,蟋蟀们在这里弹琴。翻开断砖来,有时会遇见蜈蚣;还有斑蝥,倘若用手指按住它的脊梁,便会啪的一声,\n"+
// "从后窍喷出一阵烟雾。何首乌藤和木莲藤缠络着,木莲有莲房一般的果实,何首乌有臃肿的根。有人说,何首乌根是有像人形的,吃了便可以成仙,我于是常常拔它起来,牵连不断地拔起来,\n" +
// "也曾因此弄坏了泥墙,却从来没有见过有一块根像人样。如果不怕刺,还可以摘到覆盆子,像小珊瑚珠攒成的小球,又酸又甜,色味都比桑葚要好得远。" ;
lun.appKey = "nls-service";
lun.auth_Id = "";
lun.auth_Secret = "";
lun.start();
lun.sayIt(tts_text,fileName);
lun.shutDown();
}
}