You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
virtual-patient/virtual-patient-web/src/main/java/com/supervision/util/HumanUtil.java

104 lines
3.7 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.supervision.util;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.MD5;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.supervision.exception.BusinessException;
import com.supervision.exception.HumanException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;
@Slf4j
public class HumanUtil {
private static final Environment environment = SpringBeanUtil.getBean(Environment.class);
private static final String BASE_URL = environment.getProperty("human.base-url");
private static final String QUERY_ROOM_ID_URL = BASE_URL + environment.getProperty("human.room-id");
private static final String TEXT_DRIVEN_URL = BASE_URL + environment.getProperty("human.text-driven");
private static final String QUERY_TOKEN_STATUS = BASE_URL + environment.getProperty("human.talk-status");
public static String queryRoomId(String roomKey, String roomToken) {
Map<String, Object> param = new HashMap<>();
param.put("key", roomKey);
param.put("token", roomToken);
String res = HttpUtil.get(QUERY_ROOM_ID_URL, param);
HumanRes resDTO = JSONUtil.toBean(res, HumanRes.class);
if (!"200".equals(resDTO.code)) {
log.info("数字人失败-----------:{}",res);
throw new BusinessException("获取房间号失败");
}
// 去过为true,则data是房间号
return resDTO.data;
}
/**
* 这里是加锁的,注意,只能对应目前单机的情况,如果多节点,可能存在失效的问题
*
* @param text 需要发送的内容
* @param roomId 房间ID
*/
public static void textDriven(String text, String roomId) {
HashMap<String, Object> param = new HashMap<>();
long timeStamp = System.currentTimeMillis();
// 要播报的⽂本
param.put("text", text);
// 当前数字⼈房间id
param.put("roomId", roomId);
// 动作id默认-1
param.put("action", "-1");
// 请求唯⼀值使⽤uuid即可每次播报⽂本都要不同否则视为重复播报返回失败
param.put("nonce", UUID.randomUUID().toString());
// 毫秒
param.put("timeStamp", String.valueOf(timeStamp));
param.put("sign", getSign(String.valueOf(timeStamp),
(String) param.get("nonce"),
(String) param.get("text"),
(String) param.get("actionId"),
(String) param.get("roomId")));
String res = HttpUtil.get(TEXT_DRIVEN_URL, param);
HumanRes resDTO = JSONUtil.toBean(res, HumanRes.class);
if (!"200".equals(resDTO.code)) {
log.info("播放结果:{}",res);
throw HumanException.humanError("播放语音失败");
}
}
/**
* 获取验签
* 对timeStamp、nonce、text、rootId、actionId组成的对象的json字符串进⾏MD5计算结果是16位MD5值
*/
private static String getSign(String timeStamp, String nonce, String text, String actionId, String roomId) {
Map<String, Object> paramMap = new TreeMap<>();
paramMap.put("action", actionId);
paramMap.put("nonce", nonce);
paramMap.put("roomId", roomId);
paramMap.put("text", text);
paramMap.put("timeStamp", timeStamp);
String paramJsonString = JSONUtil.toJsonStr(paramMap);
return new MD5().digestHex16(paramJsonString);
}
@Data
public static class HumanRes {
private String code;
private String data;
private String state;
}
}