开发者社区 问答 正文

语音AI生成后一直被占用怎么解决?用没有办法不关闭服务结束这个占用

语音AI生成后一直被占用怎么解决?用没有办法不关闭服务结束这个占用

展开
收起
鸡蛋灌饼儿 2023-01-30 15:46:31 425 分享 版权
1 条回答
写回答
取消 提交回答
  • "用这个试试```package com.alibaba.nls.client;

    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调用 * 流式合成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 token, String url) {
        this.appKey = appKey;
        //TODO 重要提示 创建NlsClient实例,应用全局创建一个即可,生命周期可和整个应用保持一致,默认服务地址为阿里云线上服务地址
        if(url.isEmpty()) {
            client = new NlsClient(token);
        }else {
            client = new NlsClient(url, token);
        }
    }
    
    private static SpeechSynthesizerListener getSynthesizerListener() {
        SpeechSynthesizerListener listener = null;
        try {
            listener = new SpeechSynthesizerListener() {
                File f=new File(""test.wav"");
                FileOutputStream fout = new FileOutputStream(f);
                private boolean firstRecvBinary = true;
    
                //语音合成结束
                @Override
                public void onComplete(SpeechSynthesizerResponse response) {
                    // TODO 当onComplete时表示所有TTS数据已经接收完成,因此这个是整个合成延迟,该延迟可能较大,未必满足实时场景
                    System.out.println(""name: "" + response.getName() + "", status: "" + response.getStatus()+"", output file :""+f.getAbsolutePath());
                }
    
                //语音合成的语音二进制数据
                @Override
                public void onMessage(ByteBuffer message) {
                    try {
                        if(firstRecvBinary) {
                            // TODO 此处是计算首包语音流的延迟,收到第一包语音流时,即可以进行语音播放,以提升响应速度(特别是实时交互场景下)
                            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);
                        //System.out.println(""write array:"" + bytesArray.length);
                        fout.write(bytesArray);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
                @Override
                public void onFail(SpeechSynthesizerResponse response){
                    // TODO 重要提示: task_id很重要,是调用方和服务端通信的唯一ID标识,当遇到问题时,需要提供此task_id以便排查
                    System.out.println(
                        ""task_id: "" + response.getTaskId() +
                            //状态码 20000000 表示识别成功
                            "", status: "" + response.getStatus() +
                            //错误信息
                            "", status_text: "" + response.getStatusText());
                }
    
                @Override
                public void onMetaInfo(SpeechSynthesizerResponse response) {
                    System.out.println(""MetaInfo event:{}"" +  response.getTaskId());
                }
            };
        } 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_8K);
            //发音人
      synthesizer.setVoice(""siyue"");
            //语调,范围是-500~500,可选,默认是0
    //        synthesizer.setPitchRate(100);
           //语速,范围是-500~500,默认是0
      //      synthesizer.setSpeechRate(10);
            // volume 音量,范围是0~100,可选,默认50
    //        synthesizer.setVolume(60);
            // 是否开启字幕功能(返回对应文本的相应时间戳),默认不开启。
            synthesizer.addCustomedParam(""enable_subtitle"", true);
            //设置用于语音合成的文本
        //  synthesizer.setText(""<speak bgm=\""https://toolsdownload.17van.com/voice/beijingyinyue/1.wav\"" backgroundMusicVolume='50' > 想吃不一样的美味吗?想感受不一样的味觉冲击吗?来吃羊蝎子火锅吧!好吃的美味,优惠的价格,绝对物超所值。来自老北京的美味在这里落脚了,风味独特的羊蝎子火锅绝对能勾起您久违的食欲。国庆1号至7号活动期间:每桌送1升王老吉1瓶,指定啤酒买一送一,菜金满一百送20元代金卷。 地址:广电局右侧渔夫人家订餐\n"" +
          //        ""电话5029666</speak>"");
     //       synthesizer.setText(""<speak voice=\""zhitian_emo\"">\n"" +
           //         ""    <emotion category=\""happy\"" intensity=\""1.0\"">今天天气真不错!</emotion></speak>"");
     //   synthesizer.setText(""<speak  voice=\""zhimi_emo\""><emotion category=\""angry\"" intensity=\""1.0\"">欢迎乘坐天猫国际快线!</emotion> </speak>"");
     //  synthesizer.setText(""<speak>请闭上眼睛休息一下<break time=\""500ms\""/>好了,请睁开眼睛。</speak>"");
    

    // synthesizer.setText(""连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都没用了连借口都没有连转身都不回头对不起你只会言不由衷连挽留都""); // synthesizer.setText(""主播看到有家人询问一些服务方面的细节问题。这个要具体问题具体分析<break time=""2000ms""/><break time=""2000ms""/><break time=""2000ms""/><break time=""2000ms""/>您可以点击下方的小风车,点【在线咨询】,跟我们的同事说一下您想咨询什么,我们会跟您详细说明。也可以点预约按步骤操作,我们稍后会主动联系您,告诉您情况。""); synthesizer.setText(""这曲儿是不是不够嗨呀?"");

      //      synthesizer.addCustomedParam(""enable_subtitle"", true);
    //        synthesizer.setText(""<speak voice=\""zaikan\""><emotion category=\""{category}\"" intensity=\""{intensity}\"">今天天气真不错</emotion></speak>"");
            //此方法将以上参数设置序列化为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 = """";
    
      String token = """";
        String url = ""wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1""; // 默认即可,默认值:wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1
    
    
        SpeechSynthesizerDemo demo = new SpeechSynthesizerDemo(appKey, token, url);
        demo.process();
        demo.shutdown();
    }
    

    }

    ——该回答整理自钉群“阿里语音AI【5群】”
    2023-01-30 16:41:19
    赞同 展开评论