소스 검색

腾讯语音合成接口

LAPTOP-KB9HII50\70708 2 년 전
부모
커밋
45020a3b69

+ 23 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/constant/CommonConstant.java

@ -0,0 +1,23 @@
package com.yihu.jw.care.constant;
/**
 * Created by yeshijie on 2022/7/8.
 */
public class CommonConstant {
    /**
     * 网站域名
     */
    public static final String BASEURL = "https://zhyzh.gongshu.gov.cn/";
    /**
     * 腾讯语音合成域名
     */
    public static final String TXVOICEBASEURL = "tts.tencentcloudapi.com";
    /**
     * 腾讯语音合成文件路径
     */
    public static final String TXVOICEPATH = "/usr/local/nginx/hz/voice/";
}

+ 15 - 0
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/endpoint/admin/CommonEndpoint.java

@ -6,6 +6,7 @@ import com.yihu.jw.care.service.common.CommomService;
import com.yihu.jw.care.service.device.DevicePatientFaceService;
import com.yihu.jw.care.service.device.DevicePatientFaceService;
import com.yihu.jw.care.service.patient.CarePatientService;
import com.yihu.jw.care.service.patient.CarePatientService;
import com.yihu.jw.care.util.DingdingUtil;
import com.yihu.jw.care.util.DingdingUtil;
import com.yihu.jw.care.util.SpeechTtsUtil;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.entity.care.label.BaseCapacityLabelDO;
import com.yihu.jw.entity.care.label.BaseCapacityLabelDO;
import com.yihu.jw.patient.dao.BasePatientDao;
import com.yihu.jw.patient.dao.BasePatientDao;
@ -55,6 +56,20 @@ public class CommonEndpoint extends EnvelopRestEndpoint {
    private CarePatientService carePatientService;
    private CarePatientService carePatientService;
    @Autowired
    @Autowired
    private DevicePatientFaceService patientFaceService;
    private DevicePatientFaceService patientFaceService;
    @Autowired
    private SpeechTtsUtil speechTtsUtil;
    @GetMapping(value = "open/wordToVoice")
    @ApiOperation(value = "文字转语音")
    public Envelop wordToVoice(String text) {
        try {
            String res = speechTtsUtil.wordToVoice(text);
            return ObjEnvelop.getSuccess(res);
        } catch (Exception e) {
            return failedObjEnvelopException2(e);
        }
    }
    @GetMapping(value = "open/findFaceRecord")
    @GetMapping(value = "open/findFaceRecord")
    @ApiOperation(value = "获取人脸数据")
    @ApiOperation(value = "获取人脸数据")

+ 72 - 69
svr/svr-cloud-care/src/main/java/com/yihu/jw/care/util/SpeechTtsUtil.java

@ -1,89 +1,92 @@
package com.yihu.jw.care.util;
package com.yihu.jw.care.util;
import com.tencent.SpeechClient;
import com.tencent.tts.model.SpeechSynthesisRequest;
import com.tencent.tts.model.SpeechSynthesisResponse;
import com.tencent.tts.service.SpeechSynthesisListener;
import com.tencent.tts.service.SpeechSynthesizer;
import com.tencent.tts.utils.Ttsutils;
import com.tencent.tts.utils.Ttsutils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.tts.v20190823.TtsClient;
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceRequest;
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceResponse;
import com.yihu.jw.care.constant.CommonConstant;
import com.yihu.jw.care.dao.log.BaseWordToVoiceDao;
import com.yihu.jw.entity.care.log.BaseWordToVoiceDO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Decoder;
import java.util.Date;
import java.util.UUID;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;
/**
/**
 * Created by yeshijie on 2022/7/6.
 * Created by yeshijie on 2022/7/6.
 */
 */
@Component
public class SpeechTtsUtil {
public class SpeechTtsUtil {
    private static String codec = "pcm";
    private static int sampleRate = 16000;
    private static byte[] datas = new byte[0];
    private static final Logger logger = LoggerFactory.getLogger(SpeechTtsUtil.class);
    private static String codec = "mp3";
    private static final String appId = "appId";
    private static final String secretId = "secretId";
    private static final String secretKey = "secretKey";
    private static final String appId = "1305960513";
    private static final String secretId = "AKIDwhBPN5WgYAVaO2QXNwEF0UieJhpgGZbN";
    private static final String secretKey = "WliPpdBSXMuBBuNZU8VbQyFG0TfaEbhX";
    @Value("${spring.profiles.active}")
    private String profiles;
    @Autowired
    private BaseWordToVoiceDao wordToVoiceDao;
    /**
    /**
     * 语音合成
     * @param args
     * @throws IOException
     * 腾讯文字合成语音
     * @param text
     * @return
     */
     */
    public static void main(String[] args) throws IOException {
        //创建SpeechSynthesizerClient实例,目前是单例
        SpeechClient client = SpeechClient.newInstance(appId, secretId, secretKey);
        //初始化SpeechSynthesizerRequest,SpeechSynthesizerRequest包含请求参数
        SpeechSynthesisRequest request = SpeechSynthesisRequest.initialize();
        request.setCodec(codec);
        //request.setSampleRate(sampleRate);
        //request.setVolume(10);
        //request.setSpeed(2f);
        request.setVoiceType(101007);
        //使用客户端client创建语音合成实例
        SpeechSynthesizer speechSynthesizer = client.newSpeechSynthesizer(request, new MySpeechSynthesizerListener());
        //执行语音合成
        String ttsText = "腾讯云语音合成测试";
        speechSynthesizer.synthesis(ttsText);
    }
    public static class MySpeechSynthesizerListener extends SpeechSynthesisListener {
        private AtomicInteger sessionId = new AtomicInteger(0);
        @Override
        public void onComplete(SpeechSynthesisResponse response) {
            System.out.println("onComplete");
            if (response.getSuccess()) {
                //根据具体的业务选择逻辑处理
                //Ttsutils.saveResponseToFile(response.getAudio(),"./111.mp3");
                if ("pcm".equals(codec)) {
                    //pcm 转 wav
                    Ttsutils.responsePcm2Wav(sampleRate, response.getAudio(), response.getSessionId());
    public String wordToVoice(String text){
        synchronized (text.intern()){
            try{
                if("hzprod".equals(profiles)){
                    return CommonConstant.BASEURL + "voice/test.mp3";
                }
                }
                if ("opus".equals(codec)) {
                    //opus
                    System.out.println("OPUS:" + response.getSessionId() + " length:" + response.getAudio().length);
                BaseWordToVoiceDO voiceDO = wordToVoiceDao.findByWord(text);
                if(voiceDO!=null){
                    return voiceDO.getVoice();
                }
                }
                String sessionId = UUID.randomUUID().toString().replace("-","");
                Credential cred = new Credential(secretId, secretKey);
                // 实例化一个http选项,可选的,没有特殊需求可以跳过
                HttpProfile httpProfile = new HttpProfile();
                httpProfile.setEndpoint(CommonConstant.TXVOICEBASEURL);
                // 实例化一个client选项,可选的,没有特殊需求可以跳过
                ClientProfile clientProfile = new ClientProfile();
                clientProfile.setHttpProfile(httpProfile);
                // 实例化要请求产品的client对象,clientProfile是可选的
                TtsClient client = new TtsClient(cred, "ap-shanghai", clientProfile);
                // 实例化一个请求对象,每个接口都会对应一个request对象
                TextToVoiceRequest req = new TextToVoiceRequest();
                req.setText(text);
                req.setSessionId(sessionId);
                req.setVoiceType(10510000L);
                req.setVolume(10F);
                req.setCodec(codec);
                // 返回的resp是一个TextToVoiceResponse的实例,与请求对象对应
                TextToVoiceResponse resp = client.TextToVoice(req);
                // 输出json格式的字符串回包
                // logger.info(TextToVoiceResponse.toJsonString(resp));
                byte[] buffer = new BASE64Decoder().decodeBuffer(resp.getAudio());
                Ttsutils.saveResponseToFile(buffer,CommonConstant.TXVOICEPATH + sessionId+".mp3");
                voiceDO = new BaseWordToVoiceDO();
                voiceDO.setWord(text);
                voiceDO.setCreateTime(new Date());
                voiceDO.setVoice(CommonConstant.BASEURL + "voice/"+sessionId+".mp3");
                wordToVoiceDao.save(voiceDO);
                logger.info("ending.....");
            } catch (Exception e) {
                e.printStackTrace();
            }
            }
            System.out.println("结束:" + response.getSuccess() + " " + response.getCode()
                    + " " + response.getMessage() + " " + response.getEnd());
        }
        //语音合成的语音二进制数据
        @Override
        public void onMessage(byte[] data) {
            //System.out.println("onMessage:" + data.length);
            // Your own logic.
            System.out.println("onMessage length:" + data.length);
            sessionId.incrementAndGet();
        }
        @Override
        public void onFail(SpeechSynthesisResponse response) {
            System.out.println("onFail");
            return "";
        }
        }
    }
    }
}
}