增加算法语音合成

This commit is contained in:
wulin 2023-10-18 16:14:08 +08:00
parent 15e654c897
commit ef5cbad1ef
7 changed files with 556 additions and 56 deletions

View File

@ -1,6 +1,8 @@
package com.qiuguo.iot.base.date;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
public enum DateEnum implements IDate{
//现在今天明天后天昨天前天*天后*
@ -11,6 +13,106 @@ public enum DateEnum implements IDate{
//*小时
//*
/**
* 早上
*/
MONRING("早上"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withHour(6);
}
},
/**
* 早晨
*/
MONRING_M("早晨"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return MONRING.getDateTime(localDateTime);
}
},
/**
* 拂晓
*/
DAWN("拂晓"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return MONRING.getDateTime(localDateTime);
}
},
/**
* 上午
*/
AM("上午"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withHour(9);
}
},
/**
* 中午
*/
NOON("中午"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withHour(12);
}
},
/**
* 下午
*/
PM("下午"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withMonth(15);
}
},
/**
* 傍晚
*/
EVENING("傍晚"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withMonth(18);
}
},
/**
* 晚上
*/
NIGHT("晚上"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withHour(21);
}
},
/**
* 深夜
*/
DEEP_NIGHT("深夜"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withHour(23);
}
},
/**
* 凌晨
*/
BEFORE_DAWN("凌晨"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withHour(1);
}
},
/**
* 今天
*/
@ -53,7 +155,7 @@ public enum DateEnum implements IDate{
},
/**
*
*
*/
BEFOR_YESTERDAY("前天"){
@Override
@ -71,6 +173,147 @@ public enum DateEnum implements IDate{
return localDateTime.minusDays(-2);
}
},
/**
* 今年
*/
THIS_YEAR("今年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withMonth(3);
}
},
/**
* 下半年
*/
NEXT_HALF_YEAR("下半年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.withMonth(10);
}
},
/**
* 上半年
*/
LAST_HALF_YEAR("上半年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime;
}
},
/**
* 明年
*/
NEXT_YEAR("明年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusYears(-1);
}
},
/**
* 去年
*/
LAST_YEAR("去年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusYears(1);
}
},
/**
* 下个年
*/
NEXT_Y_YEAR("下个年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return NEXT_YEAR.getDateTime(localDateTime);
}
},
/**
* 下年
*/
NEXT__YEAR("下年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return NEXT_YEAR.getDateTime(localDateTime);
}
},
/**
* 上个年
*/
LAST_Y_YEAR("上个年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return LAST_YEAR.getDateTime(localDateTime);
}
},
/**
* 前年
*/
BEFOR_YEAR("前年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusYears(2);
}
},
/**
* 后年
*/
AFTER_YEAR("后年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusYears(-2);
}
},
/**
* 下月
*/
NEXT_MONTH("下月"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusMonths(-1);
}
},
/**
* 上月
*/
LAST_MONTH("上月"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return LAST_MONTH.getDateTime(localDateTime);
}
},
/**
* 下个月
*/
NEXT_M_MONTH("下个月"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return NEXT_MONTH.getDateTime(localDateTime);
}
},
/**
* 上个年
*/
LAST_M_MONTH("去年"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusYears(1);
}
},
/**
* n天后
@ -83,112 +326,82 @@ public enum DateEnum implements IDate{
},
/**
* n天
* 国庆节
*/
N_DAY(""){
GUO_QING_JIE("国庆节"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
return localDateTime.withMonth(10).withDayOfMonth(1);
}
},
/**
* N月后
* 国庆
*/
N_AFTER_MONTH("月后"){
GUO_QIN("国庆"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
return GUO_QING_JIE.getDateTime(localDateTime);
}
},
/**
* N月
* 元旦节
*/
N_MONTH(""){
NEW_YEAR("元旦节"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
return localDateTime.withMonth(1).withDayOfMonth(1);
}
},
/**
* N年后
* 元旦
*/
N_AFTER_YEAR("年后"){
NEW_Y_YEAR("元旦"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
return NEW_Y_YEAR.getDateTime(localDateTime);
}
},
/**
* N年
* 五一
*/
N_YEAR(""){
WU_YI("五一"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
return localDateTime.withMonth(5).withDayOfMonth(1);
}
},
/**
* N小时后
* 五一劳动节
*/
N_AFTER_HOUR("小时后"){
WU_Y_YI("五一劳动节"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
return WU_YI.getDateTime(localDateTime);
}
},
/**
* N小时
* 六一
*/
N_HOUR("小时"){
LIU_YI("六一"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
return localDateTime.withMonth(6).withDayOfMonth(1);
}
},
/**
* N分钟后
* 六一儿童节
*/
N_AFTER_MINUTE("分钟后"){
LIU_Y_YI("六一儿童节"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
}
},
/**
* N分钟
*/
N_MINUTE("分钟"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
}
},
/**
* N秒后
*/
N_AFTER_SECOND("秒后"){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
}
},
/**
* N秒
*/
N_SECOND(""){
@Override
public LocalDateTime getDateTime(LocalDateTime localDateTime){
return localDateTime.minusDays(-2);
return LIU_YI.getDateTime(localDateTime);
}
},
@ -203,6 +416,8 @@ public enum DateEnum implements IDate{
;
Date date;
String code;
String time;
DateEnum(String c) {
code = c;
}
@ -214,6 +429,102 @@ public enum DateEnum implements IDate{
return dateEnum;
}
}
if(c.contains("天后")){
c = c.replace("天后", "");
}else if(c.contains("天前")){
c = c.replace("天前", "");
}else if(c.contains("")){
c = c.replace("", "");
}else if(c.contains("个月后")){
c = c.replace("个月后", "");
}else if(c.contains("个月前")){
c = c.replace("个月前", "");
}else if(c.contains("个月")){
c = c.replace("个月", "");
}else if(c.contains("月后")){
c = c.replace("月后", "");
}else if(c.contains("月前")){
c = c.replace("月前", "");
}else if(c.contains("月份")){
c = c.replace("月份", "");
}else if(c.contains("")){
c = c.replace("", "");
}else if(c.contains("年后")){
c = c.replace("年后", "");
}else if(c.contains("年前")){
c = c.replace("年前", "");
}else if(c.contains("")){
c = c.replace("", "");
}else if(c.contains("小时后")){
c = c.replace("小时后", "");
}else if(c.contains("小时前")){
c = c.replace("小时前", "");
}else if(c.contains("小时")){
c = c.replace("小时", "");
}else if(c.contains("点钟后")){
c = c.replace("点钟后", "");
}else if(c.contains("点钟前")){
c = c.replace("点钟前", "");
}else if(c.contains("点钟")){
c = c.replace("点钟", "");
}else if(c.contains("点前")){
c = c.replace("点前", "");
}else if(c.contains("点后")){
c = c.replace("点后", "");
}else if(c.contains("")){
c = c.replace("", "");
}else if(c.contains("时后")){
c = c.replace("时后", "");
}else if(c.contains("时前")){
c = c.replace("时前", "");
}else if(c.contains("")){
c = c.replace("", "");
}else if(c.contains("分钟后")){
c = c.replace("分钟后", "");
}else if(c.contains("分钟前")){
c = c.replace("分钟前", "");
}else if(c.contains("分钟")){
c = c.replace("分钟", "");
}else if(c.contains("秒后")){
c = c.replace("秒后", "");
}else if(c.contains("秒前")){
c = c.replace("秒前", "");
}else if(c.contains("")){
c = c.replace("", "");
}else if(c.contains("")){//一周周一
c = c.replace("", "");
}else if(c.contains("星期")){//一星期 星期一
c = c.replace("星期", "");
}else{
//24节气调用网络接口
}
Integer n = 1;
try{
n = Integer.parseInt(c);
}catch(Exception e){
//含有中文
Map<String, Integer> chineseToArib = new HashMap<>();
chineseToArib.put("", 1);
chineseToArib.put("", 10);
chineseToArib.put("", 100);
chineseToArib.put("", 1000);
chineseToArib.put("", 10000);
chineseToArib.put("亿", 100000000);
chineseToArib.put("", 1);
chineseToArib.put("", 2);
chineseToArib.put("", 3);
chineseToArib.put("", 4);
chineseToArib.put("", 5);
chineseToArib.put("", 6);
chineseToArib.put("", 7);
chineseToArib.put("", 8);
chineseToArib.put("", 9);
char[] ch = new char[c.length()];
c.getChars(0, c.length(), ch, 0);
}
//中英文数字
return DEFAULT;
}
}

View File

@ -1,11 +1,16 @@
package com.qiuguo.iot.third.nlp.action;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.qiuguo.iot.base.date.DateEnum;
import com.qiuguo.iot.base.utils.StringUtils;
import lombok.Data;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
@Data
public class ActionTime {
@ -52,7 +57,101 @@ public class ActionTime {
detailTime = localDateTime;
dateTime = localDateTime.format(df);
dateDetailTime = localDateTime.format(df1);
}
public static void main(String[] args) {
JSONObject json = JSON.parseObject("{\"data\":[\"Success\",{\"name\":\"/data/wzg/vits_results/089135a743d4d438ecda93263174ab0cfe5dff0a/audio.wav\",\"data\":null,\"is_file\":true}],\"is_generating\":false,\"duration\":0.3392457962036133,\"average_duration\":0.5043019453684489}");
JSONArray array = json.getJSONArray("data");
json = array.getJSONObject(1);
String m = json.getString("name");
DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now();
localDateTime = DateEnum.getWithCode("国庆").getDateTime(DateEnum.getWithCode("拂晓").getDateTime(localDateTime));
System.out.println(localDateTime.format(df1));
int n = 1;
Map<String, Integer> chineseToArib1 = new HashMap<>();
chineseToArib1.put("", 1);
chineseToArib1.put("", 10);
chineseToArib1.put("", 100);
chineseToArib1.put("", 1000);
chineseToArib1.put("", 10000);
chineseToArib1.put("亿", 100000000);
Map<String, Integer> chineseToArib = new HashMap<>();
chineseToArib.put("", 1);
chineseToArib.put("", 2);
chineseToArib.put("", 3);
chineseToArib.put("", 4);
chineseToArib.put("", 5);
chineseToArib.put("", 6);
chineseToArib.put("", 7);
chineseToArib.put("", 8);
chineseToArib.put("", 9);
chineseToArib.put("", 0);
chineseToArib.put("1", 1);
chineseToArib.put("2", 2);
chineseToArib.put("3", 3);
chineseToArib.put("4", 4);
chineseToArib.put("5", 5);
chineseToArib.put("6", 6);
chineseToArib.put("7", 7);
chineseToArib.put("8", 8);
chineseToArib.put("9", 9);
chineseToArib.put("0", 0);
String c = "";
char[] ch = new char[c.length()];
c.getChars(0, c.length(), ch, 0);
Integer p = 1;
String v = String.valueOf(n);
String key;
for(char h : ch){
key = String.valueOf(h);
if(chineseToArib1.containsKey(key)){
p = chineseToArib.get(key);
}else if(chineseToArib.containsKey(key)){
n *= p;
}
}
c = "一十二";
ch = new char[c.length()];
c.getChars(0, c.length(), ch, 0);
p = 1;
n = 1;
v = String.valueOf(n);
for(char h : ch){
if(chineseToArib1.containsKey(String.valueOf(h))){
p = chineseToArib.get(String.valueOf(h));
}else if(chineseToArib.containsKey(String.valueOf(h))){
n *= p;
}
}
c = "十一";
ch = new char[c.length()];
c.getChars(0, c.length(), ch, 0);
p = 1;
n = 1;
v = String.valueOf(n);
for(char h : ch){
if(chineseToArib1.containsKey(h)){
p = chineseToArib.get(h);
}else if(chineseToArib.containsKey(h)){
n *= p;
}
}
c = "一百零三";
ch = new char[c.length()];
c.getChars(0, c.length(), ch, 0);
p = 1;
n = 1;
v = String.valueOf(n);
for(char h : ch){
if(chineseToArib1.containsKey(h)){
p = chineseToArib.get(h);
}else if(chineseToArib.containsKey(h)){
n *= p;
}
}
System.out.println(v);
}
}

View File

@ -0,0 +1,12 @@
package com.qiuguo.iot.third.request;
import lombok.Data;
import java.util.List;
@Data
public class AudioRequest {
List<Object> data;
Integer fn_index = 0;
}

View File

@ -0,0 +1,55 @@
package com.qiuguo.iot.third.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.qiuguo.iot.base.enums.DeviceTypeEnum;
import com.qiuguo.iot.base.enums.KeyTypeEnum;
import com.qiuguo.iot.base.utils.StringUtils;
import com.qiuguo.iot.base.utils.WebClientUtils;
import com.qiuguo.iot.data.entity.device.DeviceUserBindEntity;
import com.qiuguo.iot.data.entity.system.SystemTalkAnswerConfigEntity;
import com.qiuguo.iot.data.request.device.DeviceUserBindRequest;
import com.qiuguo.iot.data.service.device.DeviceUserBindService;
import com.qiuguo.iot.data.service.system.SystemTalkAnswerConfigService;
import com.qiuguo.iot.third.enums.ChinesePartSpeechEnum;
import com.qiuguo.iot.third.nlp.NlpKey;
import com.qiuguo.iot.third.nlp.action.Action;
import com.qiuguo.iot.third.nlp.action.Actions;
import com.qiuguo.iot.third.nlp.entity.SystemTalkKeyAndDeviceName;
import com.qiuguo.iot.third.request.AudioRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* 算法提供的语音合成
*/
@Service
@Slf4j
public class AudioService {
public Mono<String> getAudioUrl(String v){
AudioRequest request = new AudioRequest();
request.setData(new ArrayList<>(4));
request.getData().add(v);
request.getData().add("zxo");
request.getData().add("简体中文");
request.getData().add(1);
/*String[] data = new String[3];
data[0] = v;
data[1] = "zxo";
data[2] = "简体中文";
request.setData(data);*/
return WebClientUtils.post("http://192.168.8.211:18000/run/predict", (JSONObject)JSONObject.toJSON(request)).flatMap(jsonObject -> {
JSONArray array = jsonObject.getJSONArray("data");
jsonObject = array.getJSONObject(1);
String m = jsonObject.getString("name").replaceAll("/data/wzg/vits_results", "http://192.168.8.211:8880");
return Mono.just(m);
});
}
}

View File

@ -123,6 +123,10 @@ public class NlpService {
for (NlpKey key : nlp.getKeys()
) {
if(key.getKey().equals(" ")){
//空格跳过
continue;
}
action = ChinesePartSpeechEnum.getEnumWithCode(key.getType()).getAction(systemTalkAnswerConfigService.getSystemTalkWithKeyGroup(),
key.getKey(),
actions,

View File

@ -24,4 +24,9 @@ public class BoxMessageResp extends BaseMessageResp {
* 时间
*/
DateTimeResp time;
/**
* 音频播放地址
*/
String audio;
}

View File

@ -85,6 +85,9 @@ public class BaseWebSocketProcess {
@Autowired
protected MqService mqService;
@Autowired
AudioService audioService;
@Autowired
protected SystemTalkBindU3dService systemTalkBindU3dService;
@ -708,7 +711,18 @@ public class BaseWebSocketProcess {
private void sendMsg(BaseSession baseSession, String msg) {
log.info("推到终端:{},SN:{},userId:{},消息内容:{}", baseSession.getSessionType(), baseSession.getSn(), baseSession.getUserId(), msg);
baseSession.getSink().next(baseSession.getSession().textMessage(msg));
if(this instanceof BoxWebSocketHandler){
BoxMessageResp boxMessageResp = JSONObject.parseObject(msg, BoxMessageResp.class);
audioService.getAudioUrl(boxMessageResp.getText()).map(s ->{
log.info("音频地址:{}", s);
boxMessageResp.setAudio(s);
baseSession.getSink().next(baseSession.getSession().textMessage(JSONObject.toJSONString(boxMessageResp)));
return s;
}).subscribe();
}else{
baseSession.getSink().next(baseSession.getSession().textMessage(msg));
}
}