阿里云语音合成1.0版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37450089/article/details/84844694

官网文档https://helpcdn.aliyun.com/document_detail/84435.html

目前版本为2.0 ,但是发现限制:

  • 传入文本不能超过300个字符。   

于是找到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 <app-key> <Id> <Secret>");
//            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();
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37450089/article/details/84844694