|
|
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;
|
|
|
}
|
|
|
}
|