diff --git a/suimangAdmin/src/main/resources/db/migration/V202306281655_photo_speak_video.sql b/suimangAdmin/src/main/resources/db/migration/V202306281655_photo_speak_video.sql new file mode 100644 index 0000000..4d60bed --- /dev/null +++ b/suimangAdmin/src/main/resources/db/migration/V202306281655_photo_speak_video.sql @@ -0,0 +1,2 @@ +ALTER TABLE `mallink_suimang_test`.`photo_speak_video` + ADD COLUMN `save_dir` varchar(255) NULL COMMENT '超分的视频路径' AFTER `music_id`; \ No newline at end of file diff --git a/suimangAdmin/src/main/resources/db/migration/V202306291619_voice_info.sql b/suimangAdmin/src/main/resources/db/migration/V202306291619_voice_info.sql new file mode 100644 index 0000000..fa16801 --- /dev/null +++ b/suimangAdmin/src/main/resources/db/migration/V202306291619_voice_info.sql @@ -0,0 +1,14 @@ +ALTER TABLE `mallink_suimang_test`.`photo_speak_video` + ADD COLUMN `video_hy_status` smallint DEFAULT 0 NULL COMMENT '视频超分状态' AFTER `video_status`; + +ALTER TABLE `mallink_suimang_test`.`voice_info` + ADD COLUMN `age_type` smallint NULL COMMENT '年纪类型 EnumAgeType' AFTER `sex`; + +ALTER TABLE `mallink_suimang_test`.`photo_speak_video` + ADD COLUMN `is_hy` smallint NULL DEFAULT 0 COMMENT '是否超分(1、是,2、否)' AFTER `video_hy_status`, + +ALTER TABLE `mallink_suimang_test`.`voice_material` + ADD COLUMN `time` double NULL COMMENT '视频时长' AFTER `type`; + +ALTER TABLE `mallink_suimang_test`.`photo_speak_video` + ADD COLUMN `audio_path` varchar(255) NULL DEFAULT NULL COMMENT 'audio_path' AFTER `save_dir`, \ No newline at end of file diff --git a/suimangCApi/src/main/java/com/iformall/controller/JsonImportController.java b/suimangCApi/src/main/java/com/iformall/controller/JsonImportController.java index d6cef7a..649b988 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/JsonImportController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/JsonImportController.java @@ -38,22 +38,29 @@ public class JsonImportController { @Transactional(rollbackFor = Exception.class) @PostMapping("/json") - public ResultData importMethod(@RequestBody List list) { + public ResultData importLanguage(@RequestBody List list) { String str = "https://suimang.oss-accelerate.aliyuncs.com/builtin/country/"; HashSet set = new HashSet<>(); for (JsonRootBean bean : list) { VoiceLanguage language = new VoiceLanguage(); String[] split = bean.getLocale().split("-"); - language.setCountry(split[0]); - language.setLanguage(split[1]); - language.setImg(str + split[0] + ".png"); + language.setCountry(split[1]); + language.setLanguage(split[0]); + language.setImg(str + split[1].toLowerCase() + ".png"); language.setLocal(bean.getLocale()); language.setName(bean.getLocaleName()); language.setIsDel(0); + HashMap map = initNameMap(); + language.setChineseName(map.get(bean.getLocale())); set.add(language); } voiceLanguageMapper.saveBatch(set); + return new ResultData("导入完成"); + } + @Transactional(rollbackFor = Exception.class) + @PostMapping("/language") + public ResultData importVoiceInfo(@RequestBody List list) { List list1 = new ArrayList<>(); for (JsonRootBean bean : list) { Date date = new Date(); @@ -64,9 +71,9 @@ public class JsonImportController { voiceInfo.setId(voiceMould.getId()); } VoiceLanguage voiceLanguage = voiceLanguageMapper.selectOne(new QueryWrapper().lambda().eq(VoiceLanguage::getLocal, bean.getLocale())); - if (!ObjectUtils.isEmpty(voiceLanguage)) { + if (voiceLanguage.getId() != null) { voiceInfo.setLanguageId(voiceLanguage.getId()); - }else { + } else { System.out.println(bean.getName()); } String gender = bean.getGender(); @@ -86,6 +93,13 @@ public class JsonImportController { if (!StringUtils.isEmpty(bean.getStyleList())) { voiceInfo.setStyleList(JSON.toJSONString(bean.getStyleList())); } + + HashMap map = initAgeMap(); + for (Map.Entry entry : map.entrySet()) { + if (bean.getShortName().equals(entry.getKey())){ + voiceInfo.setAgeType(entry.getValue()); + } + } voiceInfo.setCreateDate(date); voiceInfo.setUpdateDate(date); list1.add(voiceInfo); @@ -93,4 +107,220 @@ public class JsonImportController { voiceMapper.saveBatch(list1); return new ResultData("导入完成"); } -} + + + public HashMap initAgeMap() { + HashMap map = new HashMap<>(); + map.put("zh-CN-XiaochenNeural", 3); + map.put("zh-CN-XiaohanNeural", 3); + map.put("zh-CN-XiaomengNeural", 3); + map.put("zh-CN-XiaomoNeural", 3); + map.put("zh-CN-XiaoqiuNeural", 4); + map.put("zh-CN-XiaoruiNeural", 5); + map.put("zh-CN-XiaoshuangNeural", 1); + map.put("zh-CN-XiaoxiaoNeural", 3); + map.put("zh-CN-XiaoxuanNeural", 3); + map.put("zh-CN-XiaoyanNeural", 3); + map.put("zh-CN-XiaoyiNeural", 3); + map.put("zh-CN-XiaoyouNeural", 1); + map.put("zh-CN-XiaozhenNeural", 3); + map.put("zh-CN-YunfengNeural", 4); + map.put("zh-CN-YunhaoNeural", 3); + map.put("zh-CN-YunjianNeural", 4); + map.put("zh-CN-YunxiaNeural", 2); + map.put("zh-CN-YunxiNeural", 3); + map.put("zh-CN-YunyangNeural", 3); + map.put("zh-CN-YunyeNeural", 4); + map.put("zh-CN-YunzeNeural", 4); + map.put("wuu-CN-XiaotongNeural", 3); + map.put("wuu-CN-YunzheNeural", 3); + map.put("yue-CN-XiaoMinNeural", 3); + map.put("yue-CN-YunSongNeural", 3); + map.put("zh-CN-henan-YundengNeural", 3); + map.put("zh-CN-liaoning-XiaobeiNeural", 3); + map.put("zh-CN-shaanxi-XiaoniNeural", 3); + map.put("zh-CN-shandong-YunxiangNeural", 3); + map.put("zh-CN-sichuan-YunxiNeural", 3); + map.put("zh-HK-HiuGaaiNeural", 3); + map.put("zh-HK-HiuMaanNeural", 3); + map.put("zh-HK-WanLungNeural", 3); + map.put("zh-TW-HsiaoChenNeural", 3); + map.put("zh-TW-HsiaoYuNeural", 3); + map.put("zh-TW-YunJheNeural", 3); + map.put("en-US-AmberNeural", 3); + map.put("en-US-AnaNeural", 1); + map.put("en-US-AriaNeural", 3); + map.put("en-US-AshleyNeural", 3); + map.put("en-US-CoraNeural", 3); + map.put("en-US-ElizabethNeural", 3); + map.put("en-US-JaneNeural", 3); + map.put("en-US-JennyNeural", 3); + map.put("en-US-MichelleNeural", 3); + map.put("en-US-MonicaNeural", 3); + map.put("en-US-NancyNeural", 3); + map.put("en-US-SaraNeural", 3); + map.put("en-US-BrandonNeural", 3); + map.put("en-US-ChristopherNeural", 3); + map.put("en-US-DavisNeural", 3); + map.put("en-US-EricNeural", 3); + map.put("en-US-GuyNeural", 3); + map.put("en-US-JacobNeural", 3); + map.put("en-US-JasonNeural", 3); + map.put("en-US-RogerNeural", 3); + map.put("en-US-SteffanNeural", 3); + map.put("en-US-TonyNeural", 3); + return map; + } + + public HashMap initNameMap() { + HashMap map = new HashMap<>(); + map.put("af-ZA", "南非荷兰语(南非)"); + map.put("am-ET", "阿姆哈拉语(埃塞俄比亚)"); + map.put("ar-AE", "阿拉伯语(阿拉伯联合酋长国)"); + map.put("ar-BH", "阿拉伯语(巴林)"); + map.put("ar-DZ", "阿拉伯语(阿尔及利亚)"); + map.put("ar-EG", "阿拉伯语(埃及)"); + map.put("ar-IQ", "阿拉伯语(伊拉克)"); + map.put("ar-JO", "阿拉伯语(约旦)"); + map.put("ar-KW", "阿拉伯语(科威特)"); + map.put("ar-LB", "阿拉伯语(黎巴嫩)"); + map.put("ar-LY", "阿拉伯语(利比亚)"); + map.put("ar-MA", "阿拉伯语(摩洛哥)"); + map.put("ar-OM", "阿拉伯语(阿曼)"); + map.put("ar-QA", "阿拉伯语(卡塔尔)"); + map.put("ar-SA", "阿拉伯语(沙特阿拉伯)"); + map.put("ar-SY", "阿拉伯语(叙利亚)"); + map.put("ar-TN", "阿拉伯语(突尼斯)"); + map.put("ar-YE", "阿拉伯语(也门)"); + map.put("az-AZ", "阿塞拜疆语(拉丁语,阿塞拜疆)"); + map.put("bg-BG", "保加利亚语(保加利亚)"); + map.put("bn-BD", "孟加拉语(孟加拉国)"); + map.put("bn-IN", "孟加拉语(印度)"); + map.put("bs-BA", "波斯尼亚语(波斯尼亚和黑塞哥维那)"); + map.put("ca-ES", "加泰罗尼亚语(西班牙)"); + map.put("cs-CZ", "捷克语(捷克)"); + map.put("cy-GB", "威尔士语(英国)"); + map.put("da-DK", "丹麦语(丹麦)"); + map.put("de-AT", "德语(奥地利)"); + map.put("de-CH", "德语(瑞士)"); + map.put("de-DE", "德语(德国)"); + map.put("el-GR", "希腊语(希腊)"); + map.put("en-AU", "英语(澳大利亚)"); + map.put("en-CA", "英语(加拿大)"); + map.put("en-GB", "英语(英国)"); + map.put("en-HK", "英语(香港特別行政区)"); + map.put("en-IE", "英语(爱尔兰)"); + map.put("en-IN", "英语(印度)"); + map.put("en-KE", "英语(肯尼亚)"); + map.put("en-NG", "英语(尼日利亚)"); + map.put("en-NZ", "英语(新西兰)"); + map.put("en-PH", "英语(菲律宾)"); + map.put("en-SG", "英语(新加坡)"); + map.put("en-TZ", "英语(坦桑尼亚)"); + map.put("en-US", "英语(美国)"); + map.put("en-ZA", "英语(南非)"); + map.put("es-AR", "西班牙语(阿根廷)"); + map.put("es-BO", "西班牙语(玻利维亚)"); + map.put("es-CL", "西班牙语(智利)"); + map.put("es-CO", "西班牙语(哥伦比亚)"); + map.put("es-CR", "西班牙语(哥斯达黎加)"); + map.put("es-CU", "西班牙语(古巴)"); + map.put("es-DO", "西班牙语(多米尼加共和国)"); + map.put("es-EC", "西班牙语(厄瓜多尔)"); + map.put("es-ES", "西班牙语(西班牙)"); + map.put("es-GQ", "西班牙语(赤道几内亚)"); + map.put("es-GT", "西班牙语(危地马拉)"); + map.put("es-HN", "西班牙语(洪都拉斯)"); + map.put("es-MX", "西班牙语(墨西哥)"); + map.put("es-NI", "西班牙(尼加拉瓜)"); + map.put("es-PA", "西班牙语(巴拿马)"); + map.put("es-PE", "西班牙语(秘鲁)"); + map.put("es-PR", "西班牙语(波多黎各)"); + map.put("es-PY", "西班牙语(巴拉圭)"); + map.put("es-SV", "西班牙语(萨尔瓦多)"); + map.put("es-US", "西班牙语(美国)"); + map.put("es-UY", "西班牙语(乌拉圭)"); + map.put("es-VE", "西班牙语(委内瑞拉)"); + map.put("et-EE", "爱沙尼亚语(爱沙尼亚)"); + map.put("eu-ES", "巴斯克语"); + map.put("fa-IR", "波斯语(伊朗)"); + map.put("fi-FI", "芬兰语(芬兰)"); + map.put("fil-PH", "菲律宾语(菲律宾)"); + map.put("fr-BE", "法语(比利时)"); + map.put("fr-CA", "法语(加拿大)"); + map.put("fr-CH", "法语(瑞士)"); + map.put("fr-FR", "法语(法国)"); + map.put("ga-IE", "爱尔兰语(爱尔兰)"); + map.put("gl-ES", "加利西亚语"); + map.put("gu-IN", "古吉拉特语(印度)"); + map.put("he-IL", "希伯来语(以色列)"); + map.put("hi-IN", "印地语(印度)"); + map.put("hr-HR", "克罗地亚语(克罗地亚)"); + map.put("hu-HU", "匈牙利语(匈牙利)"); + map.put("hy-AM", "亚美尼亚语(亚美尼亚)"); + map.put("id-ID", "印度尼西亚语(印度尼西亚)"); + map.put("is-IS", "冰岛语(冰岛)"); + map.put("it-IT", "意大利语(意大利)"); + map.put("ja-JP", "日语(日本)"); + map.put("jv-ID", "爪哇语(拉丁语、印度尼西亚)"); + map.put("ka-GE", "格鲁吉亚语(格鲁吉亚)"); + map.put("kk-KZ", "哈萨克语(哈萨克斯坦)"); + map.put("km-KH", "高棉语(柬埔寨)"); + map.put("kn-IN", "卡纳达语(印度)"); + map.put("ko-KR", "韩语(韩国)"); + map.put("lo-LA", "老挝语(老挝)"); + map.put("lt-LT", "立陶宛语(立陶宛)"); + map.put("lv-LV", "拉脱维亚语(拉脱维亚)"); + map.put("mk-MK", "马其顿语(北马其顿)"); + map.put("ml-IN", "马拉雅拉姆语(印度)"); + map.put("mn-MN", "蒙古语(蒙古)"); + map.put("mr-IN", "马拉地语(印度)"); + map.put("ms-MY", "马来语(马来西亚)"); + map.put("mt-MT", "马耳他语(马耳他)"); + map.put("my-MM", "缅甸语(缅甸)"); + map.put("nb-NO", "书面挪威语(挪威)"); + map.put("ne-NP", "尼泊尔语(尼泊尔)"); + map.put("nl-BE", "荷兰语(比利时)"); + map.put("nl-NL", "荷兰语(荷兰)"); + map.put("pl-PL", "波兰语(波兰)"); + map.put("ps-AF", "普什图语(阿富汗)"); + map.put("pt-BR", "葡萄牙语(巴西)"); + map.put("pt-PT", "葡萄牙语(葡萄牙)"); + map.put("ro-RO", "罗马尼亚语(罗马尼亚)"); + map.put("ru-RU", "俄语(俄罗斯)"); + map.put("si-LK", "僧伽罗语(斯里兰卡)"); + map.put("sk-SK", "斯洛伐克语(斯洛伐克)"); + map.put("sl-SI", "斯洛文尼亚语(斯洛文尼亚)"); + map.put("so-SO", "索马里语(索马里)"); + map.put("sq-AL", "阿尔巴尼亚语(阿尔巴尼亚)"); + map.put("sr-RS", "塞尔维亚语(西里尔文,塞尔维亚)"); + map.put("su-ID", "巽他语(印度尼西亚)"); + map.put("sv-SE", "瑞典语(瑞典)"); + map.put("sw-KE", "斯瓦希里语(肯尼亚)"); + map.put("sw-TZ", "斯瓦希里语(坦桑尼亚)"); + map.put("ta-IN", "泰米尔语(印度)"); + map.put("ta-LK", "泰米尔语(斯里兰卡)"); + map.put("ta-MY", "泰米尔语(马来西亚)"); + map.put("ta-SG", "泰米尔语(新加坡)"); + map.put("te-IN", "泰卢固语(印度)"); + map.put("th-TH", "泰语(泰国)"); + map.put("tr-TR", "土耳其语(土耳其)"); + map.put("uk-UA", "乌克兰语(乌克兰)"); + map.put("ur-IN", "乌尔都语(印度)"); + map.put("ur-PK", "乌尔都语(巴基斯坦)"); + map.put("uz-UZ", "乌兹别克语(拉丁语,乌兹别克斯坦)"); + map.put("vi-VN", "越南语(越南)"); + map.put("wuu-CN", "中文(吴语,简体)"); + map.put("yue-CN", "中文(粤语,简体)"); + map.put("zh-CN", "中文(普通话,简体)"); + map.put("zh-CN-henan", "中文(中原官话河南,简体)"); + map.put("zh-CN-liaoning", "中文(东北官话,简体)"); + map.put("zh-CN-shaanxi", "中文(中原官话陕西,简体)"); + map.put("zh-CN-shandong", "中文(冀鲁官话,简体)"); + map.put("zh-CN-sichuan", "中文(西南普通话,简体)"); + map.put("zh-HK", "中文(粤语,繁体)"); + map.put("zh-TW", "中文(台湾普通话,繁体)"); + map.put("zu-ZA", "祖鲁语(南非)"); + return map; + } +} \ No newline at end of file diff --git a/suimangCApi/src/main/java/com/iformall/controller/PersonPhotoController.java b/suimangCApi/src/main/java/com/iformall/controller/PersonPhotoController.java index 7258331..3ed4fe7 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/PersonPhotoController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/PersonPhotoController.java @@ -5,14 +5,13 @@ import com.iformall.annotation.AuthIgnore; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.domain.po.base.BaseEntity; -import com.iformall.domain.po.sm.MaterialMould; import com.iformall.domain.po.sm.PersonPhoto; -import com.iformall.enums.EnumMouldPatchType; import com.iformall.enums.EnumMouldSendType; import com.iformall.enums.EnumaMouldPatchStatus; -import com.iformall.service.sm.MaterialMouldService; import com.iformall.service.sm.MouldPatchSignService; import com.iformall.service.sm.PersonPhotoService; +import com.iformall.sm.AiBaiduCheckResult; +import com.iformall.utils.BaiduImageCheckUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -23,6 +22,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; @RestController @@ -86,18 +86,30 @@ public class PersonPhotoController extends BaseController { } @ApiOperation("图片质量审核接口") - @PostMapping("checkPhoto") - @ApiImplicitParam(name = "material", value = "material", dataType = "String", paramType = "query", required = true) - public ResultData checkPhoto(String material) { + @PostMapping(value = "checkPhoto", consumes = "multipart/*", headers = "content-type=multipart/form-data") + @ApiImplicitParam(name = "file", value = "file", dataType = "MultipartFile", paramType = "query", required = true) + public ResultData checkPhoto(@RequestPart("file") MultipartFile file) { logger.debug("[" + getIpAddr() + "] PersonPhotoController::checkPhoto"); - if (StringUtils.isBlank(material)) { + if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "素材为空"); } - ResultData data = personPhotoService.checkPhoto(material); - if (data.code == 2000) { - return new ResultData(); + return personPhotoService.checkPhoto(file); + } + + @ApiOperation("百度图片审核接口") + @PostMapping(value = "baiduPhoto", consumes = "multipart/*", headers = "content-type=multipart/form-data") + @ApiImplicitParam(name = "file", value = "file", dataType = "MultipartFile", paramType = "query", required = true) + public ResultData baiduCheckPhoto(@RequestPart("file") MultipartFile file) { + logger.debug("[" + getIpAddr() + "] PersonPhotoController::baiduCheckPhoto"); + if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "素材为空"); + } + long size = file.getSize(); + final long length = 4 * 1024 * 1024; + if (size > length) { + return new ResultData(ErrorCode.PICTURE_FOUR_SIZE_EXCEED); } - return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), data.message); + return BaiduImageCheckUtil.photoCheck(file); } diff --git a/suimangCApi/src/main/java/com/iformall/controller/PhotoSpeakVideoController.java b/suimangCApi/src/main/java/com/iformall/controller/PhotoSpeakVideoController.java index 6796529..c84bcd2 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/PhotoSpeakVideoController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/PhotoSpeakVideoController.java @@ -7,9 +7,7 @@ import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.domain.po.base.BaseEntity; import com.iformall.domain.po.sm.*; -import com.iformall.enums.EnumMouldSendType; -import com.iformall.enums.EnumVideoStatus; -import com.iformall.enums.EnumaMouldPatchStatus; +import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.service.sm.*; import com.iformall.video.VideoFactory; @@ -24,6 +22,8 @@ import org.checkerframework.checker.units.qual.A; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.AsyncResult; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -178,6 +178,67 @@ public class PhotoSpeakVideoController extends BaseController { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成"); } + PhotoSpeakVideo videoUpd = new PhotoSpeakVideo(); + videoUpd.setId(record.getId()); + if (mouldVideo.getPersonPhotoId() == null) { + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到人物照片"); + } + if(StringUtils.isBlank(mouldVideo.getPersonPhotoUrl())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到人物照片地址"); + } + videoUpd.setPersonPhotoId(mouldVideo.getPersonPhotoId()); + videoUpd.setPersonPhotoUrl(mouldVideo.getPersonPhotoUrl()); + + Integer voiceFrom = mouldVideo.getVoiceFrom(); + videoUpd.setVoiceFrom(voiceFrom); + if(EnumVoiceFrom.FROM_MOULD.getCode().equals(voiceFrom)){ + String voiceMouldSmId = null; + try{ + JSONObject personMouldObject = JSONObject.parseObject(mouldVideo.getVoiceMouldSm()); + voiceMouldSmId = personMouldObject.getString("mouldSmId"); + videoUpd.setVoiceMouldSm(voiceMouldSmId); + videoUpd.setPaperwork(mouldVideo.getPaperwork()); + videoUpd.setVoiceMouldSm(mouldVideo.getVoiceMouldSm()); + }catch(Exception e){ + logger.info(e.getMessage()); + } + if(StringUtils.isBlank(voiceMouldSmId)){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"参数错误,未找到声音模板数据"); + } + if(StringUtils.isBlank(mouldVideo.getPaperwork())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未填写视频文案数据"); + } + //TODO 设置预估时长 +// videoUpd.setVideoTime(); + }else if(EnumVoiceFrom.FROM_UPD.getCode().equals(voiceFrom)){ + String voiceMaterialUrl = mouldVideo.getVoiceMaterialUrl(); + VoiceMaterial voiceMaterial = voiceMaterialService.getById(mouldVideo.getVoiceMaterialId()); + if(StringUtils.isBlank(voiceMaterialUrl)){ + voiceMaterialService.handVideoUrl(voiceMaterial); + voiceMaterialUrl = voiceMaterial.getMaterial(); + } + if(StringUtils.isBlank(voiceMaterialUrl)){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未找到上传声音文件"); + } + videoUpd.setVoiceMaterialUrl(voiceMaterialUrl); +// videoUpd.setVideoTime(String.valueOf(voiceMaterial.getTime())); + } else if (EnumVoiceFrom.MUSIC.getCode().equals(voiceFrom)) { + Long musicId = mouldVideo.getMusicId(); + MusicInfo musicInfo = musicInfoService.getById(musicId); + if (ObjectUtils.isEmpty(musicInfo)) { + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未找到音乐文件"); + } + if (StringUtils.isBlank(musicInfo.getUrl())) { + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"音乐文件错误"); + } + if(musicInfo.getTime() == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"音乐时长为空"); + } + videoUpd.setVoiceMaterialUrl(musicInfo.getUrl()); +// videoUpd.setVideoTime(String.valueOf(musicInfo.getTime())); + } else { + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"声音数据异常"); + } PhotoSpeakVideo mouldVideoUpd = new PhotoSpeakVideo(); mouldVideoUpd.setId(record.getId()); mouldVideoUpd.setVideoStatus(EnumVideoStatus.ing.getCode()); @@ -185,7 +246,7 @@ public class PhotoSpeakVideoController extends BaseController { mouldVideoUpd.setCreateVideoDate(new Date()); photoSpeakVideoService.saveOrUpdate(mouldVideoUpd); - photoSpeakVideoService.createVideo(mouldVideo,true); + photoSpeakVideoService.createVideo(videoUpd); return new ResultData(); } @@ -363,4 +424,54 @@ public class PhotoSpeakVideoController extends BaseController { return new ResultData(); } + @ApiOperation("视频超分") + @GetMapping("/videoHy") + @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) + public ResultData videoHy(Long id) { + logger.debug("[" + getIpAddr() + "] PersonPhotoController::videoHy"); + if(id == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空"); + } + PhotoSpeakVideo speakVideo = photoSpeakVideoService.getById(id); + if(speakVideo == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到数据"); + } + if (StringUtils.isEmpty(speakVideo.getSaveDir())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"save_dir为空"); + } + if(!speakVideo.getUserId().equals(getMemberId())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未找到用户数据"); + } + + if(!EnumVideoStatus.upload_success.getCode().equals(speakVideo.getVideoStatus())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"原始视频生成未完成"); + } + + if(EnumVideoStatus.ing.getCode().equals(speakVideo.getVideoHyStatus()) + || EnumVideoStatus.success.getCode().equals(speakVideo.getVideoHyStatus()) + || EnumVideoStatus.upload_ing.getCode().equals(speakVideo.getVideoHyStatus()) + || EnumVideoStatus.upload_fail.getCode().equals(speakVideo.getVideoHyStatus())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"高清晰度视频生成中"); + } + if(EnumVideoStatus.upload_success.getCode().equals(speakVideo.getVideoHyStatus())){ + //上传阿里云状态 生成成功 + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"高清晰度视频已生成完成"); + } + + speakVideo.setVideoHyStatus(EnumVideoStatus.ing.getCode()); + speakVideo.setVideoMsg(""); + speakVideo.setIsHy(EnumYesOrNo.YES.getCode()); + speakVideo.setUpdateDate(new Date()); + photoSpeakVideoService.updateById(speakVideo); + + photoSpeakVideoService.videoHy(speakVideo); + return new ResultData(); + } + + @ApiOperation("获取视频是否生成成功") + @GetMapping("/checkVideoStatus") + @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) + public ResultData checkVideoStatus(@RequestParam("list") List list,@RequestParam("type") Integer type) { + return photoSpeakVideoService.checkVideoStatus(getMemberId(),list,type); + } } diff --git a/suimangCApi/src/main/java/com/iformall/controller/SDKController.java b/suimangCApi/src/main/java/com/iformall/controller/SDKController.java index 1a8aee2..0d63a8d 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/SDKController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/SDKController.java @@ -17,10 +17,9 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.Date; @@ -43,12 +42,12 @@ public class SDKController extends BaseController { @ApiOperation("图片质量审核接口") @PostMapping("checkPhoto") @ApiImplicitParam(name = "material", value = "material", dataType = "String", paramType = "query", required = true) - public ResultData checkPhoto(String material) { + public ResultData checkPhoto(@RequestPart("file") MultipartFile file) { logger.debug("[" + getIpAddr() + "] SDKController::checkPhoto"); - if (StringUtils.isBlank(material)) { + if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "素材为空"); } - ResultData data = personPhotoService.checkPhoto(material); + ResultData data = personPhotoService.checkPhoto(file); if (data.code == 2000) { return new ResultData(); } @@ -101,7 +100,7 @@ public class SDKController extends BaseController { mouldVideoUpd.setVideoMsg(""); mouldVideoUpd.setCreateVideoDate(new Date()); photoSpeakVideoService.saveOrUpdate(mouldVideoUpd); - photoSpeakVideoService.createVideo(mouldVideo, true); + photoSpeakVideoService.createVideo(mouldVideo); return new ResultData(); } } diff --git a/suimangCApi/src/main/java/com/iformall/controller/UploadController.java b/suimangCApi/src/main/java/com/iformall/controller/UploadController.java index 8687965..12e1f49 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/UploadController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/UploadController.java @@ -75,9 +75,9 @@ public class UploadController extends BaseController { TenantEntity tenantEntity = getTenantInfo(); long size = multiReq.getSize(); - final long length = 2097152; + final long length = 2097152 * 2; if (size > length) { - return new ResultData(ErrorCode.PICTURE_SIZE_EXCEED); + return new ResultData(ErrorCode.PICTURE_FOUR_SIZE_EXCEED); } String fileFormat = ""; diff --git a/suimangCApi/src/main/java/com/iformall/controller/VideoCallbackController.java b/suimangCApi/src/main/java/com/iformall/controller/VideoCallbackController.java new file mode 100644 index 0000000..e2962e6 --- /dev/null +++ b/suimangCApi/src/main/java/com/iformall/controller/VideoCallbackController.java @@ -0,0 +1,126 @@ +package com.iformall.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.api.R; +import com.github.pagehelper.PageInfo; +import com.iformall.annotation.AuthIgnore; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.base.BaseEntity; +import com.iformall.domain.po.sm.MusicInfo; +import com.iformall.domain.po.sm.PhotoSpeakVideo; +import com.iformall.domain.po.sm.VoiceInfo; +import com.iformall.enums.EnumVideoStatus; +import com.iformall.exception.MallinkException; +import com.iformall.service.sm.MouldPatchService; +import com.iformall.service.sm.MusicInfoService; +import com.iformall.service.sm.PhotoSpeakVideoService; +import com.iformall.service.sm.VoiceInfoService; +import com.iformall.video.VideoFactory; +import com.iformall.video.aliyun.sdk.server.UploadCacheHelper; +import com.iformall.video.entity.VideUploadResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.SneakyThrows; +import org.apache.commons.lang3.StringUtils; +import org.flowable.idm.engine.impl.persistence.entity.UserEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.*; + + +@RestController +@RequestMapping("/callback") +@Api(description = "视频回调") +public class VideoCallbackController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private PhotoSpeakVideoService photoSpeakVideoService; + + @AuthIgnore + @ApiOperation("视频回调") + @PostMapping(value = "/photo/speak") + public ResultData photoSpeak(@RequestBody Map paranMap) { + logger.debug("[" + getIpAddr() + "] VideoCallbackController::photoSpeak"); + logger.info("照片生成视频结果通知{}"+JSONObject.toJSONString(paranMap)); + Long task_id = (Long) paranMap.get("task_id");//任务ID + String code = (String) paranMap.get("code");//code + String msg = (String) paranMap.get("msg"); + Object data = paranMap.get("data"); + + String jsonString = JSONObject.toJSONString(data); + Map dataMap = JSONObject.parseObject(jsonString,Map.class); + Boolean sr = (Boolean) dataMap.get("sr");//判断 sr=True 就是超分的, False 是没超分的 + String url = (String) dataMap.get("url"); + String save_dir = null; + if (!sr){ + save_dir = (String) dataMap.get("save_dir"); + } + + if (task_id == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"任务ID不能为空"); + } + + PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.getById(Long.valueOf(task_id)); + if (photoSpeakVideo == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到任务数据"); + } + + if (Integer.parseInt(code) != 4000){ + String returnMsg; + if (sr){ + photoSpeakVideo.setVideoHyStatus(EnumVideoStatus.fail.getCode()); + returnMsg = "超分视频生成失败"; + }else { + photoSpeakVideo.setVideoStatus(EnumVideoStatus.fail.getCode()); + returnMsg = "视频生成失败"; + } + photoSpeakVideo.setVideoMsg("(MetaService)"+msg); + photoSpeakVideo.setUpdateDate(new Date()); + photoSpeakVideoService.updateById(photoSpeakVideo); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),returnMsg); + } + + if (StringUtils.isEmpty(url)){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"视频URL不能为空"); + } + + if (save_dir != null && !save_dir.equals(photoSpeakVideo.getSaveDir())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"save_dir参数不一致"); + } + + if (sr){ + photoSpeakVideo.setVideoHyStatus(EnumVideoStatus.success.getCode()); + }else { + photoSpeakVideo.setVideoStatus(EnumVideoStatus.success.getCode()); + } + photoSpeakVideo.setVideoMsg("success"); + photoSpeakVideo.setUpdateDate(new Date()); + photoSpeakVideoService.updateById(photoSpeakVideo); + //TODO 用户相关操作 + if (sr){ + photoSpeakVideoService.uploadHyVideo(photoSpeakVideo); + }else { + photoSpeakVideoService.uploadVideo(photoSpeakVideo); + } + + return new ResultData(); + } + +} diff --git a/suimangCApi/src/main/java/com/iformall/utils/BaiDuHttpUtil.java b/suimangCApi/src/main/java/com/iformall/utils/BaiDuHttpUtil.java new file mode 100644 index 0000000..edf9281 --- /dev/null +++ b/suimangCApi/src/main/java/com/iformall/utils/BaiDuHttpUtil.java @@ -0,0 +1,77 @@ +package com.iformall.utils; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; +import java.util.Map; + +/** + * http 工具类 + */ +public class BaiDuHttpUtil { + + public static String post(String requestUrl, String accessToken, String params) + throws Exception { + String contentType = "application/x-www-form-urlencoded"; + return BaiDuHttpUtil.post(requestUrl, accessToken, contentType, params); + } + + public static String post(String requestUrl, String accessToken, String contentType, String params) + throws Exception { + String encoding = "UTF-8"; + if (requestUrl.contains("nlp")) { + encoding = "GBK"; + } + return BaiDuHttpUtil.post(requestUrl, accessToken, contentType, params, encoding); + } + + public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding) + throws Exception { + String url = requestUrl + "?access_token=" + accessToken; + return BaiDuHttpUtil.postGeneralUrl(url, contentType, params, encoding); + } + + public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding) + throws Exception { + URL url = new URL(generalUrl); + // 打开和URL之间的连接 + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + // 设置通用的请求属性 + connection.setRequestProperty("Content-Type", contentType); + connection.setRequestProperty("Connection", "Keep-Alive"); + connection.setUseCaches(false); + connection.setDoOutput(true); + connection.setDoInput(true); + + // 得到请求的输出流对象 + DataOutputStream out = new DataOutputStream(connection.getOutputStream()); + out.write(params.getBytes(encoding)); + out.flush(); + out.close(); + + // 建立实际的连接 + connection.connect(); + // 获取所有响应头字段 + Map> headers = connection.getHeaderFields(); + // 遍历所有的响应头字段 + for (String key : headers.keySet()) { + System.err.println(key + "--->" + headers.get(key)); + } + // 定义 BufferedReader输入流来读取URL的响应 + BufferedReader in = null; + in = new BufferedReader( + new InputStreamReader(connection.getInputStream(), encoding)); + String result = ""; + String getLine; + while ((getLine = in.readLine()) != null) { + result += getLine; + } + in.close(); + System.err.println("result:" + result); + return result; + } +} diff --git a/suimangCApi/src/main/java/com/iformall/utils/BaiduImageCheckUtil.java b/suimangCApi/src/main/java/com/iformall/utils/BaiduImageCheckUtil.java new file mode 100644 index 0000000..e6a22ae --- /dev/null +++ b/suimangCApi/src/main/java/com/iformall/utils/BaiduImageCheckUtil.java @@ -0,0 +1,114 @@ +package com.iformall.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.sm.AiBaiduCheckResult; +import okhttp3.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.net.URLEncoder; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; + +/** + * 图片质量检查方法 + */ +public class BaiduImageCheckUtil { + // 百度图片审核接口地址 + private final static String photo_check_url = "https://aip.baidubce.com/rest/2.0/solution/v1/img_censor/v2/user_defined"; + // 获取token + private final static String auth_url = "https://aip.baidubce.com/oauth/2.0/token?"; + // 百度API Key + private final static String apiKey = "Your API Key"; + // 百度Secret Key + private final static String secretKey = "Your Secret Key"; + //写死的 access_token + private final static String access_token = "24.c1c7992795301773c60c8cf01abfe759.2592000.1689236723.282335-33618414"; + + public static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build(); + + public static ResultData photoCheck(MultipartFile file) { + try { + byte[] fileBytes = file.getBytes(); + String imgStr = Base64Util.encode(fileBytes); + String imageUrl = URLEncoder.encode(imgStr, "UTF-8"); + String param = "image=" + imageUrl; + // 注意这里access_token有过期时间, 客户端可自行缓存,过期后重新获取。 + // Access Token的有效期(秒为单位,有效期30天) +// String accessToken = getAuth(); + //这里暂时写死 + String result = BaiDuHttpUtil.post(photo_check_url, access_token, param); + System.out.println(result); + JSONObject jsonObject = JSON.parseObject(result); + //1:合规,2:不合规,3:疑似,4:审核失败 + Integer type = jsonObject.getInteger("conclusionType"); + if (type == 1) { + return new ResultData(); + } else if (type == 2 || type == 3) { + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"图片不合规"); + } else if (type == 4) { + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"图片审核失败"); + } else { + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"图片不合规"); + } + } catch (Exception e) { + e.printStackTrace(); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"图片审核失败"); + } + } + + /** + * 将阿里云图片地址转为字节码 + */ + public static String aliyunImageToByteArray(String imageUrl) throws IOException { + InputStream inputStream = null; + try { + // 创建URL对象 + URL url = new URL(imageUrl); + // 打开连接 + URLConnection conn = url.openConnection(); + // 获取输入流 + inputStream = conn.getInputStream(); + // 将输入流转换为字节数组 + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + byteStream.write(buffer, 0, bytesRead); + } + inputStream.close(); + byte[] byteArray = byteStream.toByteArray(); + String imgStr = Base64Util.encode(byteArray); + return URLEncoder.encode(imgStr, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + if (inputStream != null) { + inputStream.close(); + } + } + return null; + } + + /** + * 获取API访问权限token,该token有一定的有效期,需要自行管理,当失效时需重新获取。 + * Access Token的有效期(秒为单位,有效期30天) + */ + public static String getAuth() throws IOException { + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(mediaType, ""); + Request request = new Request.Builder() + .url(auth_url + "client_id=" + apiKey + "&client_secret= " + secretKey + "&grant_type=client_credentials") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + Response response = HTTP_CLIENT.newCall(request).execute(); + System.out.println(response.body().string()); + return response.body().string(); + } +} \ No newline at end of file diff --git a/suimangCApi/src/main/java/com/iformall/utils/UrlCheck.java b/suimangCApi/src/main/java/com/iformall/utils/UrlCheck.java index bdfb789..e6530fd 100644 --- a/suimangCApi/src/main/java/com/iformall/utils/UrlCheck.java +++ b/suimangCApi/src/main/java/com/iformall/utils/UrlCheck.java @@ -10,7 +10,9 @@ public class UrlCheck { || url.contains("awsFilesUpload") || url.contains("awsImgUpload") || url.contains("getCarStopFee") - || url.contains("/video/upload"); + || url.contains("/video/upload") + || url.contains("/personPhoto/baiduPhoto") + || url.contains("/personPhoto/checkPhoto"); } } diff --git a/suimangCApi/src/main/resources/application-dev.yml b/suimangCApi/src/main/resources/application-dev.yml index 04196a0..355efad 100644 --- a/suimangCApi/src/main/resources/application-dev.yml +++ b/suimangCApi/src/main/resources/application-dev.yml @@ -186,4 +186,10 @@ fm: logging: level: com.iformall: debug - path: ./logs/c \ No newline at end of file + path: ./logs/c + +photo: + url: http://nas.pucao.cn:2002 + hy_url: http://nas.pucao.cn:2002 + talk: + callbackUrl: https://phototest.metavatar.cc/C diff --git a/suimangCApi/src/main/resources/application-prod.yml b/suimangCApi/src/main/resources/application-prod.yml index d4744f4..a0a368b 100644 --- a/suimangCApi/src/main/resources/application-prod.yml +++ b/suimangCApi/src/main/resources/application-prod.yml @@ -141,4 +141,10 @@ fm: logging: level: com.iformall: debug - path: ./logs/c \ No newline at end of file + path: ./logs/c + +photo: + url: http://111.198.0.15:22299 + hy_url: http://111.198.0.15:22288 + talk: + callbackUrl: https://photo.metavatar.cc/C diff --git a/suimangSchedule/src/main/java/com/iformall/schedule/PhotoSpeakSchedule.java b/suimangSchedule/src/main/java/com/iformall/schedule/PhotoSpeakSchedule.java index 319ae96..1651eb0 100644 --- a/suimangSchedule/src/main/java/com/iformall/schedule/PhotoSpeakSchedule.java +++ b/suimangSchedule/src/main/java/com/iformall/schedule/PhotoSpeakSchedule.java @@ -57,8 +57,7 @@ public class PhotoSpeakSchedule { if (list != null && list.size() > 0) { for (PhotoSpeakVideo video : list) { try { - Future future = photoSpeakVideoService.createVideo(video,false); - future.get(); + photoSpeakVideoService.createVideo(video); } catch (Exception e) { logger.error("TtCouponVideoSchedule error.couponVideoSchedule:"+video.getId(),e); } @@ -109,4 +108,68 @@ public class PhotoSpeakSchedule { } } } + + /** + * 超分上传阿里云 + */ + @Scheduled(cron = "0 */30 * * * *?") // 每半小时检查一次 + public void userVideoHyUploadSchedule() { + List videos = photoSpeakVideoService.getNotHyUploadList(); + if (videos != null && videos.size() > 0) { + for (PhotoSpeakVideo video : videos) { + try { + photoSpeakVideoService.uploadHyVideo(video); + } catch (Exception e) { + logger.error("TtCouponVideoSchedule error.couponVideoSchedule:"+video.getId(),e); + } + } + } + } + + /** + * 获取超分时长和大小 + */ + @Scheduled(cron = "0 1/5 * * * *?") // 每五分钟检查一次 + public void userVideoHyDetailSchedule() { + List videos = photoSpeakVideoService.getUpLoadHyIngList(); + if (videos != null && videos.size() > 0) { + for (PhotoSpeakVideo video : videos) { + try { + VideUploadResult videoDetail = videoFactory.getExcutor(videoType).getVideoDetailWithCache(video.getVideoId()); + if (videoDetail.isSuccess() + && StringUtils.isNotBlank(videoDetail.getDuration()) + && !"0.0".equals(videoDetail.getDuration())) { + video.setCoverImg(videoDetail.getCoverURL()); + video.setVideoPlayUrl(videoDetail.getVideoUrl()); + video.setVideoTime(videoDetail.getDuration()); + video.setVideoSize(videoDetail.getSize()); + video.setVideoHyStatus(EnumVideoStatus.upload_success.getCode()); + photoSpeakVideoService.updateById(video); + } + } catch (Exception e) { + logger.error("TtCouponVideoSchedule error.couponVideoSchedule:"+video.getId(),e); + } + } + } + } + + /** + * 超分生成视频 + */ + @Scheduled(cron = "0 20/30 * * * *?") // 每半小时检查一次 + public void photoSpeakCreateHySchedule() { + PhotoSpeakVideo videoUpd = new PhotoSpeakVideo(); + videoUpd.setVideoStartDate(DateUtils.getHourDateBefore(2,new Date())); + videoUpd.setVideoHyStatus(EnumVideoStatus.fail.getCode()); + List list = photoSpeakVideoService.findList(videoUpd); + if (list != null && list.size() > 0) { + for (PhotoSpeakVideo video : list) { + try { + photoSpeakVideoService.videoHy(video); + } catch (Exception e) { + logger.error("TtCouponVideoSchedule error.couponVideoSchedule:"+video.getId(),e); + } + } + } + } } \ No newline at end of file diff --git a/suimangSchedule/src/main/resources/application-dev.yml b/suimangSchedule/src/main/resources/application-dev.yml index fb8d2fe..d3baf87 100644 --- a/suimangSchedule/src/main/resources/application-dev.yml +++ b/suimangSchedule/src/main/resources/application-dev.yml @@ -190,3 +190,9 @@ logging: #tk.mybatis: debug com.iformall.mapper: debug path: ./logs/s + +photo: + url: http://nas.pucao.cn:2002 + hy_url: http://nas.pucao.cn:2002 + talk: + callbackUrl: https://phototest.metavatar.cc/C \ No newline at end of file diff --git a/suimangSchedule/src/main/resources/application-prod.yml b/suimangSchedule/src/main/resources/application-prod.yml index 444ca3d..efcdab7 100644 --- a/suimangSchedule/src/main/resources/application-prod.yml +++ b/suimangSchedule/src/main/resources/application-prod.yml @@ -144,4 +144,11 @@ logging: level: #tk.mybatis: debug com.iformall: debug - path: ./logs/s \ No newline at end of file + path: ./logs/s + + +photo: + url: http://111.198.0.15:22299 + hy_url: http://111.198.0.15:22288 + talk: + callbackUrl: https://photo.metavatar.cc/C \ No newline at end of file diff --git a/suimangService/src/main/java/com/iformall/common/ErrorCode.java b/suimangService/src/main/java/com/iformall/common/ErrorCode.java index c979198..83a9005 100644 --- a/suimangService/src/main/java/com/iformall/common/ErrorCode.java +++ b/suimangService/src/main/java/com/iformall/common/ErrorCode.java @@ -103,6 +103,7 @@ public enum ErrorCode{ MEMBER_IS_NOT_ACTIVE(2112, "当前会员未激活"), MEMBER_IS_ACTIVE(2113, "当前会员已激活"), MEMBER_IS_FOUND(2114, "当前会员已存在"), + VIDEO_CREATING(2115, "视频生成中"), /** * 商场/商户 @@ -609,6 +610,7 @@ public enum ErrorCode{ PICTURE_SIZE_CUSTOMIZE(40003, "图片超过大小限制"), PICTURE_W_H_CUSTOMIZE(40004, "图片不符合宽高限制"), PICTURE_ENDWIDTH_ERROR(40005, "格式只支持.mp3,.mp4"), + PICTURE_FOUR_SIZE_EXCEED(40006, "图片超过4M限制"), /** * 电费生成配置 diff --git a/suimangService/src/main/java/com/iformall/domain/po/json/JsonRootBean.java b/suimangService/src/main/java/com/iformall/domain/po/json/JsonRootBean.java index bfac32f..69e32d1 100644 --- a/suimangService/src/main/java/com/iformall/domain/po/json/JsonRootBean.java +++ b/suimangService/src/main/java/com/iformall/domain/po/json/JsonRootBean.java @@ -1,114 +1,35 @@ package com.iformall.domain.po.json; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + import java.util.List; +@Data public class JsonRootBean { - private String name; - private String displayName; - private String localName; - private String shortName; - private String gender; - private String locale; - private String localeName; - private String sampleRateHertz; - private String voiceType; - private String status; - private String wordsPerMinute; - private List styleList; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getLocalName() { - return localName; - } - - public void setLocalName(String localName) { - this.localName = localName; - } - - public String getShortName() { - return shortName; - } - - public void setShortName(String shortName) { - this.shortName = shortName; - } - - public String getGender() { - return gender; - } - - public void setGender(String gender) { - this.gender = gender; - } - - public String getLocale() { - return locale; - } - - public void setLocale(String locale) { - this.locale = locale; - } - - public String getLocaleName() { - return localeName; - } - - public void setLocaleName(String localeName) { - this.localeName = localeName; - } - - public String getSampleRateHertz() { - return sampleRateHertz; - } - - public void setSampleRateHertz(String sampleRateHertz) { - this.sampleRateHertz = sampleRateHertz; - } - - public String getVoiceType() { - return voiceType; - } - - public void setVoiceType(String voiceType) { - this.voiceType = voiceType; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getWordsPerMinute() { - return wordsPerMinute; - } - - public void setWordsPerMinute(String wordsPerMinute) { - this.wordsPerMinute = wordsPerMinute; - } - - public List getStyleList() { - return styleList; - } + @JsonProperty("Name") + private String Name; + @JsonProperty("DisplayName") + private String DisplayName; + @JsonProperty("LocalName") + private String LocalName; + @JsonProperty("ShortName") + private String ShortName; + @JsonProperty("Gender") + private String Gender; + @JsonProperty("Locale") + private String Locale; + @JsonProperty("LocaleName") + private String LocaleName; + @JsonProperty("SampleRateHertz") + private String SampleRateHertz; + @JsonProperty("VoiceType") + private String VoiceType; + @JsonProperty("Status") + private String Status; + @JsonProperty("WordsPerMinute") + private String WordsPerMinute; + @JsonProperty("StyleList") + private List StyleList; - public void setStyleList(List styleList) { - this.styleList = styleList; - } } \ No newline at end of file diff --git a/suimangService/src/main/java/com/iformall/domain/po/sm/PhotoSpeakVideo.java b/suimangService/src/main/java/com/iformall/domain/po/sm/PhotoSpeakVideo.java index 7863b71..cd09480 100644 --- a/suimangService/src/main/java/com/iformall/domain/po/sm/PhotoSpeakVideo.java +++ b/suimangService/src/main/java/com/iformall/domain/po/sm/PhotoSpeakVideo.java @@ -122,12 +122,12 @@ public class PhotoSpeakVideo extends TenantEntity { } return videoPathUri; } - public String getPhotoSpeakPathUri(){ - if(StringUtils.isNotBlank(this.videoPath)){ - videoPathUri = AiVideoHelper.url; - } - return videoPathUri; - } +// public String getPhotoSpeakPathUri(){ +// if(StringUtils.isNotBlank(this.videoPath)){ +// videoPathUri = AiVideoHelper.url; +// } +// return videoPathUri; +// } @io.swagger.annotations.ApiModelProperty(value="",name="videoPath") private String videoPath; @io.swagger.annotations.ApiModelProperty(value="播放地址",name="videoPlayUrl") @@ -151,6 +151,14 @@ public class PhotoSpeakVideo extends TenantEntity { @TableField(exist = false) private List videoStatuss; + private String audioPath; + private Long musicId; + + private String saveDir; + + private Integer videoHyStatus; + + private Integer isHy;//是否超分(1、是,0、否) } diff --git a/suimangService/src/main/java/com/iformall/domain/po/sm/VoiceInfo.java b/suimangService/src/main/java/com/iformall/domain/po/sm/VoiceInfo.java index a1438a5..5120873 100644 --- a/suimangService/src/main/java/com/iformall/domain/po/sm/VoiceInfo.java +++ b/suimangService/src/main/java/com/iformall/domain/po/sm/VoiceInfo.java @@ -4,6 +4,7 @@ package com.iformall.domain.po.sm; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.iformall.domain.po.base.TenantEntity; +import com.iformall.domain.vo.VoiceInfoVo; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -60,7 +61,7 @@ public class VoiceInfo extends TenantEntity { */ private String styleList; @TableField(exist = false) - private List style; + private List style; /** * 创建时间 */ @@ -73,4 +74,10 @@ public class VoiceInfo extends TenantEntity { * 是否删除1是0否 */ private Integer isDel; + /** + * 年纪类型 EnumAgeType + */ + private Integer ageType; + @TableField(exist = false) + private String voiceUrl; } diff --git a/suimangService/src/main/java/com/iformall/domain/po/sm/VoiceMaterial.java b/suimangService/src/main/java/com/iformall/domain/po/sm/VoiceMaterial.java index 06bb829..5adda40 100644 --- a/suimangService/src/main/java/com/iformall/domain/po/sm/VoiceMaterial.java +++ b/suimangService/src/main/java/com/iformall/domain/po/sm/VoiceMaterial.java @@ -121,4 +121,6 @@ public class VoiceMaterial extends TenantEntity { private Integer type; + private Double time; + } diff --git a/suimangService/src/main/java/com/iformall/domain/vo/VoiceInfoVo.java b/suimangService/src/main/java/com/iformall/domain/vo/VoiceInfoVo.java new file mode 100644 index 0000000..15dd52c --- /dev/null +++ b/suimangService/src/main/java/com/iformall/domain/vo/VoiceInfoVo.java @@ -0,0 +1,10 @@ +package com.iformall.domain.vo; + +import lombok.Data; + + +@Data +public class VoiceInfoVo { + private String url; + private String name; +} diff --git a/suimangService/src/main/java/com/iformall/enums/EnumVideoStatus.java b/suimangService/src/main/java/com/iformall/enums/EnumVideoStatus.java index 868a5a8..1a603dd 100644 --- a/suimangService/src/main/java/com/iformall/enums/EnumVideoStatus.java +++ b/suimangService/src/main/java/com/iformall/enums/EnumVideoStatus.java @@ -16,7 +16,6 @@ public enum EnumVideoStatus { upload_ing(4,"上传视频中"), upload_success(5,"上传视频成功"), upload_fail(6,"上传视频失败") - ; public static EnumVideoStatus getEnum(Integer code) { diff --git a/suimangService/src/main/java/com/iformall/mapper/PhotoSpeakVideoMapper.java b/suimangService/src/main/java/com/iformall/mapper/PhotoSpeakVideoMapper.java index 193adfa..ccae9a7 100644 --- a/suimangService/src/main/java/com/iformall/mapper/PhotoSpeakVideoMapper.java +++ b/suimangService/src/main/java/com/iformall/mapper/PhotoSpeakVideoMapper.java @@ -23,4 +23,5 @@ public interface PhotoSpeakVideoMapper extends CommonMapper getSortList(PhotoSpeakVideo record); + Integer checkVideoStatus(@Param("userId") Long userId, @Param("list") List list,@Param("type") Integer type); } diff --git a/suimangService/src/main/java/com/iformall/service/sm/PersonPhotoService.java b/suimangService/src/main/java/com/iformall/service/sm/PersonPhotoService.java index 61e3049..d2fd1a0 100644 --- a/suimangService/src/main/java/com/iformall/service/sm/PersonPhotoService.java +++ b/suimangService/src/main/java/com/iformall/service/sm/PersonPhotoService.java @@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo; import com.iformall.common.ResultData; import com.iformall.domain.po.sm.MaterialMould; import com.iformall.domain.po.sm.PersonPhoto; +import org.springframework.web.multipart.MultipartFile; public interface PersonPhotoService { @@ -43,5 +44,5 @@ public interface PersonPhotoService { void updateOnline(PersonPhoto record); - ResultData checkPhoto(String material); + ResultData checkPhoto(MultipartFile file); } diff --git a/suimangService/src/main/java/com/iformall/service/sm/PhotoSpeakVideoService.java b/suimangService/src/main/java/com/iformall/service/sm/PhotoSpeakVideoService.java index 5cde9e4..742b04a 100644 --- a/suimangService/src/main/java/com/iformall/service/sm/PhotoSpeakVideoService.java +++ b/suimangService/src/main/java/com/iformall/service/sm/PhotoSpeakVideoService.java @@ -3,10 +3,8 @@ package com.iformall.service.sm; import com.github.pagehelper.PageInfo; import com.iformall.common.ResultData; import com.iformall.domain.po.sm.PhotoSpeakVideo; -import com.iformall.domain.po.sm.UserMouldVideo; import java.util.List; -import java.util.concurrent.Future; public interface PhotoSpeakVideoService { @@ -45,7 +43,7 @@ public interface PhotoSpeakVideoService { */ void deleteById(Long id); - Future createVideo(PhotoSpeakVideo mouldVideo,Boolean flag); + ResultData createVideo(PhotoSpeakVideo mouldVideo); void uploadVideo(PhotoSpeakVideo mouldVideo); @@ -59,4 +57,13 @@ public interface PhotoSpeakVideoService { int updateById(PhotoSpeakVideo video); + ResultData videoHy(PhotoSpeakVideo speakVideo); + + void uploadHyVideo(PhotoSpeakVideo mouldVideo); + + List getUpLoadHyIngList(); + + List getNotHyUploadList(); + + ResultData checkVideoStatus(Long userId, List time, Integer type); } diff --git a/suimangService/src/main/java/com/iformall/service/sm/impl/PersonPhotoServiceImpl.java b/suimangService/src/main/java/com/iformall/service/sm/impl/PersonPhotoServiceImpl.java index 9756d65..2e4639b 100644 --- a/suimangService/src/main/java/com/iformall/service/sm/impl/PersonPhotoServiceImpl.java +++ b/suimangService/src/main/java/com/iformall/service/sm/impl/PersonPhotoServiceImpl.java @@ -29,8 +29,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.math.BigDecimal; +import java.net.URLEncoder; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -135,13 +138,20 @@ public class PersonPhotoServiceImpl implements PersonPhotoService { } @Override - public ResultData checkPhoto(String material) { - AiCheckPhotoParam param = new AiCheckPhotoParam(); - param.setImg(Base64Util.imageUrlToBase64(material)); - AiCheckPhotoResult result = AiVideoHelper.checkPhoto(param); - if (result.isSuccess()){ - return new ResultData(); + public ResultData checkPhoto(MultipartFile file) { + try { + byte[] fileBytes = file.getBytes(); + String imgStr = Base64Util.encode(fileBytes); + AiCheckPhotoParam param = new AiCheckPhotoParam(); + param.setImg(imgStr); + AiCheckPhotoResult result = AiVideoHelper.checkPhoto(param); + if (result.isSuccess()) { + return new ResultData(); + } + return new ResultData(result.getCode(), result.getMsgInfo(result.getCode(),result.getMsg())); + } catch (IOException e) { + e.printStackTrace(); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "接口请求异常"); } - return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), result.getMsg()); } } diff --git a/suimangService/src/main/java/com/iformall/service/sm/impl/PhotoSpeakVideoServiceImpl.java b/suimangService/src/main/java/com/iformall/service/sm/impl/PhotoSpeakVideoServiceImpl.java index 1055a23..75ef959 100644 --- a/suimangService/src/main/java/com/iformall/service/sm/impl/PhotoSpeakVideoServiceImpl.java +++ b/suimangService/src/main/java/com/iformall/service/sm/impl/PhotoSpeakVideoServiceImpl.java @@ -75,8 +75,22 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { @Autowired private UserCreditLogService userCreditLogService; + @Autowired + @Qualifier("objectCommonRedisTemplate") + RedisTemplate redisTemplate; + + @Value("${photo.url}") + private String url; + @Value("${photo.hy_url}") + private String hy_url; + @Value("${photo.talk}") + private String talk_url; + private final static String str = "\uD83D\uDD57"; + @Value("${photo.callbackUrl}") + private String callbackUrl; + @Override public PageInfo listAsPage(PhotoSpeakVideo record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> photoSpeakVideoMapper.findList(record)); @@ -177,7 +191,6 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { photoSpeakVideoMapper.deleteById(id); } - @Async @Override public Future createVideo(PhotoSpeakVideo photoSpeakVideo,Boolean flag) { boolean isCreate = false; @@ -361,21 +374,30 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { userCreateVideoNumService.addOrSubtractNumberOfTimes(1, videoNum, useCredit, videoTime); } + @Async + public ResultData createVideo(PhotoSpeakVideo photoSpeakVideo) { try { AiPhotoSpeakParam param = new AiPhotoSpeakParam(); + param.setTask_id(photoSpeakVideo.getId()); + param.setCallback_url(callbackUrl + "/callback/photo/speak"); param.setImg(Base64Util.imageUrlToBase64(photoSpeakVideo.getPersonPhotoUrl())); - param.setVoice_id(voiceMouldSmId == null ? "default" : voiceMouldSmId); - String voiceMouldSm = photoSpeakVideo.getVoiceMouldSm(); + Integer sex = 1; Integer speakType = 0; + String mouldSmId = null; if (!StringUtils.isBlank(voiceMouldSm)) { JSONObject jsonObject = JSON.parseObject(voiceMouldSm); speakType = jsonObject.getInteger("speakType"); + sex = jsonObject.getInteger("sex"); + mouldSmId = jsonObject.getString("mouldSmId"); } - param.setVoice_style(EnumSpeakType.getEnum(speakType).getType()); + param.setVoice_style(speakType == null ? "default" : EnumSpeakType.getEnum(speakType).getType()); + param.setVoice_id(mouldSmId == null ? "default" : mouldSmId); + Integer voiceFrom = photoSpeakVideo.getVoiceFrom(); + String voiceMaterialUrl = photoSpeakVideo.getVoiceMaterialUrl(); if (EnumVoiceFrom.FROM_MOULD.getCode().equals(voiceFrom)) { - param.setGen_txt(paperwork.replaceAll(str, "[*]")); + param.setGen_txt(photoSpeakVideo.getPaperwork().replaceAll(str, "[*]")); if (sex == 1){ param.setGender("male"); }else if (sex == 2){ @@ -394,64 +416,82 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { param.setUrl(voiceMaterialUrl); } - AiPhotoSpeakResult video = AiVideoHelper.createPhotoSpeakVideo(param); - if (video.isSuccess()) { - videoUpd.setVideoPath(video.getUrl()); - videoUpd.setVideoStatus(EnumVideoStatus.success.getCode()); - videoUpd.setVideoMsg("success"); - videoUpd.setCreateVideoDate(new Date()); - this.saveOrUpdate(videoUpd); - - videoUpd.setTitle(photoSpeakVideo.getTitle()); - -// UserCreditLog log = new UserCreditLog(); -// log.setId(IdWorker.get().nextId()); -// log.setUserId(photoSpeakVideo.getUserId()); -// log.setCredits(-(float)useCredit); -// log.setType(EnumLogType.PHOTO_SPEAK.getCode()); -// log.setRemark(EnumLogType.PHOTO_SPEAK.getMessage()); -// log.setVideoOrPhotoOrTalkId(videoUpd.getId()); -// userCreditLogService.insertLog(log); - - this.uploadVideo(videoUpd); - - return new AsyncResult<>(1); - } - videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); - videoUpd.setVideoMsg(video.getMsg()); - this.saveOrUpdate(videoUpd); - - if (flag) { - //如果生成视频失败了,就把创建视频积分加回去 - userCreateVideoNumService.addOrSubtractNumberOfTimes(2, videoNum, useCredit, videoTime); + try { + AiPhotoSpeakResult video = AiVideoHelper.createPhotoSpeakVideo(param); + if (video.isSuccess()) { + photoSpeakVideo.setSaveDir(video.getSaveDir()); + photoSpeakVideo.setAudioPath(video.getAudioPath()); + photoSpeakVideo.setVideoPath(video.getUrl()); + this.updateById(photoSpeakVideo); + return new ResultData(); + } + photoSpeakVideo.setVideoStatus(EnumVideoStatus.fail.getCode()); + photoSpeakVideo.setVideoMsg(video.getMsg()); + this.updateById(photoSpeakVideo); + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), video.getMsg()); + }catch (Exception e){ + photoSpeakVideo.setVideoStatus(EnumVideoStatus.fail.getCode()); + photoSpeakVideo.setVideoMsg("Meta接口请求异常"); + this.updateById(photoSpeakVideo); + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"Meta接口请求异常"); } - return new AsyncResult<>(0); - } catch (Exception e) { - if (flag) { - //如果生成视频失败了,就把创建视频积分加回去 - userCreateVideoNumService.addOrSubtractNumberOfTimes(2, videoNum, useCredit, videoTime); - } e.printStackTrace(); - videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); - videoUpd.setVideoMsg("请求异常"); - this.saveOrUpdate(videoUpd); - return new AsyncResult<>(0); + photoSpeakVideo.setVideoStatus(EnumVideoStatus.fail.getCode()); + photoSpeakVideo.setVideoMsg("接口请求异常"); + this.updateById(photoSpeakVideo); + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"生成视频失败"); } } + + @Async @Override public void uploadVideo(PhotoSpeakVideo mouldVideo){ if(EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoStatus()) || EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoStatus())){ - String url = mouldVideo.getPhotoSpeakPathUri() + mouldVideo.getVideoPath(); - VideUploadResult result = videoFactory.getExcutor(videoType).uploadVideoPath(mouldVideo.getTitle(), url); + String url1 = url + mouldVideo.getVideoPath(); + VideUploadResult result = videoFactory.getExcutor(videoType).uploadVideoPath(mouldVideo.getTitle(), url1); if(result.isSuccess()){ PhotoSpeakVideo videoUpd = new PhotoSpeakVideo(); videoUpd.setId(mouldVideo.getId()); videoUpd.setVideoId(result.getVideoId()); videoUpd.setVideoStatus(EnumVideoStatus.upload_ing.getCode()); this.saveOrUpdate(videoUpd); + + AtomicInteger integer = new AtomicInteger(30); + while (true){ + try { + String progress = videoFactory.getExcutor(videoType).getVedioUploadProgress(result.getVideoId()); + Thread.sleep(1000); + if (StringUtils.isNotEmpty(progress) && progress.equals("complete")) { + VideUploadResult videoDetail = videoFactory.getExcutor(videoType).getVideoDetailWithCache(result.getVideoId()); + if (videoDetail.isSuccess() + && StringUtils.isNotBlank(videoDetail.getDuration()) + && !"0.0".equals(videoDetail.getDuration())) { + mouldVideo.setCoverImg(videoDetail.getCoverURL()); + mouldVideo.setVideoPlayUrl(videoDetail.getVideoUrl()); + mouldVideo.setVideoTime(videoDetail.getDuration()); + mouldVideo.setVideoSize(videoDetail.getSize()); + mouldVideo.setVideoStatus(EnumVideoStatus.upload_success.getCode()); + this.updateById(mouldVideo); + break; + } + } + + if (integer.getAndDecrement() <= 0){ + mouldVideo.setVideoStatus(EnumVideoStatus.fail.getCode()); + mouldVideo.setVideoMsg("视频上传失败,点击“编辑”重试"); + this.updateById(mouldVideo); + break; + } + } catch (InterruptedException e) { + e.printStackTrace(); + mouldVideo.setVideoStatus(EnumVideoStatus.fail.getCode()); + mouldVideo.setVideoMsg("视频上传失败,点击“编辑”重试"); + this.updateById(mouldVideo); + } + } } } } @@ -490,4 +530,126 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { return photoSpeakVideoMapper.updateById(video); } + @Override + @Async + public ResultData videoHy(PhotoSpeakVideo speakVideo) { + try { + AiVideoHqParam param = new AiVideoHqParam(); + param.setSave_dir(speakVideo.getSaveDir()); + param.setAudio_path(speakVideo.getAudioPath()); + param.setTask_id(speakVideo.getId()); + param.setCallback_url(callbackUrl + "/callback/photo/speak"); + try { + AiVideoHqResult result = AiVideoHelper.videoHq(param); + if (result.isSuccess()) { + speakVideo.setVideoHyStatus(EnumVideoStatus.success.getCode()); + speakVideo.setVideoMsg("超分视频生成成功"); + speakVideo.setVideoPath(result.getUrl()); + this.updateById(speakVideo); + return new ResultData(); + } + speakVideo.setVideoHyStatus(EnumVideoStatus.draft.getCode()); + speakVideo.setVideoMsg("Mata视频超分失败"); + this.updateById(speakVideo); + return new ResultData(result.getCode(), result.getMsgInfo(result.getCode(),result.getMsg())); + }catch (Exception e){ + e.printStackTrace(); + speakVideo.setVideoHyStatus(EnumVideoStatus.draft.getCode()); + speakVideo.setVideoMsg("Mata视频超分失败"); + this.updateById(speakVideo); + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"Meta接口请求异常"); + } + } catch (Exception e) { + e.printStackTrace(); + speakVideo.setVideoHyStatus(EnumVideoStatus.draft.getCode()); + speakVideo.setVideoMsg("接口请求异常"); + this.updateById(speakVideo); + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "接口请求异常"); + } + } + + @Async + @Override + public void uploadHyVideo(PhotoSpeakVideo mouldVideo){ + if(EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoHyStatus()) + || EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoHyStatus())){ + String url = hy_url + mouldVideo.getVideoPath(); + VideUploadResult result = videoFactory.getExcutor(videoType).uploadVideoPath(mouldVideo.getTitle(), url); + if(result.isSuccess()){ + PhotoSpeakVideo videoUpd = new PhotoSpeakVideo(); + videoUpd.setId(mouldVideo.getId()); + videoUpd.setVideoId(result.getVideoId()); + videoUpd.setVideoHyStatus(EnumVideoStatus.upload_ing.getCode()); + this.saveOrUpdate(videoUpd); + + AtomicInteger integer = new AtomicInteger(30); + while (true){ + try { + String progress = videoFactory.getExcutor(videoType).getVedioUploadProgress(result.getVideoId()); + Thread.sleep(1000); + if (progress.equals("complete")) { + VideUploadResult videoDetail = videoFactory.getExcutor(videoType).getVideoDetailWithCache(result.getVideoId()); + if (videoDetail.isSuccess() + && StringUtils.isNotBlank(videoDetail.getDuration()) + && !"0.0".equals(videoDetail.getDuration())) { + mouldVideo.setCoverImg(videoDetail.getCoverURL()); + mouldVideo.setVideoPlayUrl(videoDetail.getVideoUrl()); + mouldVideo.setVideoTime(videoDetail.getDuration()); + mouldVideo.setVideoSize(videoDetail.getSize()); + mouldVideo.setIsHy(2);//超分视频生成成功了状态为2 + mouldVideo.setVideoHyStatus(EnumVideoStatus.upload_success.getCode()); + this.updateById(mouldVideo); + break; + } + } + + if (integer.getAndDecrement() <= 0){ + mouldVideo.setVideoHyStatus(EnumVideoStatus.fail.getCode()); + mouldVideo.setVideoMsg("视频上传失败,点击“编辑”重试"); + this.updateById(mouldVideo); + break; + } + } catch (InterruptedException e) { + e.printStackTrace(); + mouldVideo.setVideoHyStatus(EnumVideoStatus.fail.getCode()); + mouldVideo.setVideoMsg("视频上传失败,点击“编辑”重试"); + this.updateById(mouldVideo); + } + } + } + } + } + + @Override + public List getUpLoadHyIngList() { + PhotoSpeakVideo umVideoQ = new PhotoSpeakVideo(); + umVideoQ.setVideoHyStatus(EnumVideoStatus.upload_ing.getCode()); + return photoSpeakVideoMapper.getSortList(umVideoQ); + } + + @Override + public List getNotHyUploadList() { + PhotoSpeakVideo umVideoQ = new PhotoSpeakVideo(); + List videoStatuss = new ArrayList<>(); + videoStatuss.add(EnumVideoStatus.success.getCode()); + videoStatuss.add(EnumVideoStatus.upload_fail.getCode()); + umVideoQ.setVideoStatuss(videoStatuss); + return photoSpeakVideoMapper.getSortList(umVideoQ); + } + + @Override + public ResultData checkVideoStatus(Long userId, List list, Integer type) { + if (CollectionUtils.isEmpty(list)){ + return new ResultData(ErrorCode.VIDEO_CREATING.getCode(),""); + } + + if (type == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"类型不能为空"); + } + Integer integer = photoSpeakVideoMapper.checkVideoStatus(userId,list,type); + if (integer > 0){ + return new ResultData("生成视频成功"); + } + return new ResultData(ErrorCode.VIDEO_CREATING.getCode(),"视频生成中"); + } } diff --git a/suimangService/src/main/java/com/iformall/service/sm/impl/VoiceInfoServiceImpl.java b/suimangService/src/main/java/com/iformall/service/sm/impl/VoiceInfoServiceImpl.java index 7fc31e9..46b2bc8 100644 --- a/suimangService/src/main/java/com/iformall/service/sm/impl/VoiceInfoServiceImpl.java +++ b/suimangService/src/main/java/com/iformall/service/sm/impl/VoiceInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.google.common.collect.Lists; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.domain.po.sm.VoiceInfo; +import com.iformall.domain.vo.VoiceInfoVo; import com.iformall.enums.EnumSex; import com.iformall.enums.EnumSpeakType; import com.iformall.mapper.VoiceMapper; @@ -28,20 +29,35 @@ public class VoiceInfoServiceImpl implements VoiceInfoService { private VoiceMapper voiceMapper; private final static String str = "\uD83D\uDD57"; + private final static String url = "https://suimang.oss-accelerate.aliyuncs.com/builtin/tts_all_sample/"; + private final static String end = ".wav"; @Override public List chooseType(Long id) { - List voiceInfos = voiceMapper.selectList(new LambdaQueryWrapper().eq(VoiceInfo::getLanguageId, id).orderByAsc(VoiceInfo::getDisplayName).select(VoiceInfo::getId, VoiceInfo::getDisplayName, VoiceInfo::getStyleList,VoiceInfo::getSex)); + List voiceInfos = voiceMapper.selectList(new LambdaQueryWrapper().eq(VoiceInfo::getLanguageId, id).orderByAsc(VoiceInfo::getDisplayName)); voiceInfos.forEach(x -> { if (StringUtils.isNotEmpty(x.getStyleList())) { List strings = JSON.parseArray(x.getStyleList(), String.class); - List list = new ArrayList<>(); + List list = new ArrayList<>(); strings.forEach(y->{ - list.add(EnumSpeakType.getEnum(y).getMessage()); + VoiceInfoVo infoVo = new VoiceInfoVo(); + infoVo.setName(EnumSpeakType.getEnum(y).getMessage()); + infoVo.setUrl(url + x.getMouldSmId() + "_" + y + end); + list.add(infoVo); }); + + VoiceInfoVo infoVo = new VoiceInfoVo(); + infoVo.setName(EnumSpeakType.getEnum(0).getMessage()); + infoVo.setUrl(url + x.getMouldSmId() + "_" + "default" + end); + list.add(infoVo); x.setStyle(list); } else { - x.setStyle(Lists.newArrayList()); + List list = Lists.newArrayList(); + VoiceInfoVo infoVo = new VoiceInfoVo(); + infoVo.setName(EnumSpeakType.getEnum(0).getMessage()); + infoVo.setUrl(url + x.getMouldSmId() + "_" + "default" + end); + list.add(infoVo); + x.setStyle(list); } }); return voiceInfos; @@ -65,8 +81,8 @@ public class VoiceInfoServiceImpl implements VoiceInfoService { param.setGender(voiceInfo.getSex() == 1 ? "male" : "female"); AiPreviewResult result = AiVideoHelper.voicePreview(param); if (result.isSuccess()){ - return new ResultData(result.getUrl()); + return new ResultData(result.getTime()); } - return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), result.getMsg()); + return new ResultData(result.getCode(), result.getMsgInfo(result.getCode(),result.getMsg())); } } diff --git a/suimangService/src/main/java/com/iformall/service/sm/impl/VoiceLanguageServiceImpl.java b/suimangService/src/main/java/com/iformall/service/sm/impl/VoiceLanguageServiceImpl.java index d19a36d..e52501e 100644 --- a/suimangService/src/main/java/com/iformall/service/sm/impl/VoiceLanguageServiceImpl.java +++ b/suimangService/src/main/java/com/iformall/service/sm/impl/VoiceLanguageServiceImpl.java @@ -20,7 +20,7 @@ public class VoiceLanguageServiceImpl implements VoiceLanguageService { @Override public List voiceTotal() { - List languages = voiceLanguageMapper.selectList(new LambdaQueryWrapper().eq(VoiceLanguage::getIsDel, 0).orderByAsc(VoiceLanguage::getName)); + List languages = voiceLanguageMapper.selectList(new LambdaQueryWrapper().eq(VoiceLanguage::getIsDel, 0).orderByAsc(VoiceLanguage::getLocal)); return CollectionUtils.isEmpty(languages) ? Lists.newArrayList() : languages; } } diff --git a/suimangService/src/main/java/com/iformall/sm/AiBaiduCheckResult.java b/suimangService/src/main/java/com/iformall/sm/AiBaiduCheckResult.java new file mode 100644 index 0000000..a742080 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/sm/AiBaiduCheckResult.java @@ -0,0 +1,11 @@ +package com.iformall.sm; + +import lombok.Data; + +@Data +public class AiBaiduCheckResult { + + private boolean success; + private String msg; + private Integer code; +} diff --git a/suimangService/src/main/java/com/iformall/sm/AiCheckPhotoResult.java b/suimangService/src/main/java/com/iformall/sm/AiCheckPhotoResult.java index 709ccbb..f634512 100644 --- a/suimangService/src/main/java/com/iformall/sm/AiCheckPhotoResult.java +++ b/suimangService/src/main/java/com/iformall/sm/AiCheckPhotoResult.java @@ -6,27 +6,25 @@ import lombok.Data; @Data public class AiCheckPhotoResult { - private boolean success; - private String msg; - private Integer code; + private boolean success; + private String msg; + private Integer code; - public String getMsgInfo(Integer code,String msg){ - if (code == 10 && msg.equals("unknown error")) { - return "系统服务异常"; - }else if (code == 2000 && msg.equals("success")){ - return "成功"; - }else if (code == 2001 && msg.equals("no face")){ - return "图片中没有人脸"; - }else if (code == 2002 && msg.equals("more face")){ - return "图片中人脸大于1个"; - }else if (code == 2003 && msg.equals("big angle")){ - return "图片中人脸转动角度太大"; - }else if (code == 2004 && msg.equals("big mouth angle")){ - return "图片中嘴张开太大"; - }else if (code == 2005 && msg.equals("Sensitive people")){ - return "图片中人物可能是敏感人物,比如是政要或者明星"; - }else { - return msg; - } - } + public String getMsgInfo(Integer code, String msg) { + if (code == 2000) { + return "成功"; + } else if (code == 2001 && msg.equals("no face")) { + return "(MetaService)图片中没有人脸"; + } else if (code == 2002 && msg.equals("more face")) { + return "(MetaService)图片中人脸大于1个"; + } else if (code == 2003 && msg.equals("big angle")) { + return "(MetaService)图片中人脸转动角度太大"; + } else if (code == 2004 && msg.equals("big mouth angle")) { + return "图片中嘴张开太大(SM)"; + } else if (code == 2005 && msg.equals("Sensitive people")) { + return "(MetaService)图片中人物可能是敏感人物,比如是政要或者明星"; + } else { + return "(MetaService)图片不合规,请重新上传"; + } + } } diff --git a/suimangService/src/main/java/com/iformall/sm/AiPhotoSpeakParam.java b/suimangService/src/main/java/com/iformall/sm/AiPhotoSpeakParam.java index d9943c9..eb64056 100644 --- a/suimangService/src/main/java/com/iformall/sm/AiPhotoSpeakParam.java +++ b/suimangService/src/main/java/com/iformall/sm/AiPhotoSpeakParam.java @@ -23,6 +23,8 @@ public class AiPhotoSpeakParam { private String gender; private String url; private String img; + private Long task_id; + private String callback_url; public String neglectImgString() { StringBuffer str = new StringBuffer(); @@ -32,7 +34,9 @@ public class AiPhotoSpeakParam { str.append("\"voice_style\":").append("\"").append(voice_style).append("\","); str.append("\"gender\":").append("\"").append(gender).append("\","); str.append("\"url\":").append("\"").append(url).append("\","); - str.append("\"img\":").append("\"").append(img).append("\"}"); + str.append("\"img\":").append("\"").append(img); + str.append("\"task_id\":").append("\"").append(task_id); + str.append("\"callback_url\":").append("\"").append(callback_url).append("\"}"); return str.toString(); } } diff --git a/suimangService/src/main/java/com/iformall/sm/AiPhotoSpeakResult.java b/suimangService/src/main/java/com/iformall/sm/AiPhotoSpeakResult.java index 3fe72ff..8612048 100644 --- a/suimangService/src/main/java/com/iformall/sm/AiPhotoSpeakResult.java +++ b/suimangService/src/main/java/com/iformall/sm/AiPhotoSpeakResult.java @@ -8,18 +8,21 @@ public class AiPhotoSpeakResult { private boolean success; private String msg; private String url; + private Integer code; + private String saveDir; + private String audioPath; public String getMsgInfo(Integer code, String msg) { - if (code == 4000 && msg.equals("success")) { + if (code == 4000) { return "成功"; } else if (code == 3006 && msg.equals("miss parameter")) { - return "却少参数"; + return "(MetaService)却少参数"; } else if (code == 3007 && msg.equals("miss gen_txt")) { - return "没有检测到文本"; + return "(MetaService)没有检测到文本"; } else if (code == 3008 && msg.equals("check languages")) { - return "文字和语种不对应"; + return "(MetaService)文字和语种不对应"; } else { - return msg; + return "(MetaService:" + msg + ")服务被Avatar攻击..."; } } } diff --git a/suimangService/src/main/java/com/iformall/sm/AiPreviewResult.java b/suimangService/src/main/java/com/iformall/sm/AiPreviewResult.java index 2d8735f..1f80c6a 100644 --- a/suimangService/src/main/java/com/iformall/sm/AiPreviewResult.java +++ b/suimangService/src/main/java/com/iformall/sm/AiPreviewResult.java @@ -6,23 +6,23 @@ import lombok.Data; @Data public class AiPreviewResult { - private boolean success; - private Integer code; - private String msg; - private String url; - private Double time; + private boolean success; + private Integer code; + private String msg; + private String url; + private Double time; - public String getMsgInfo(Integer code, String msg) { - if (code == 3000 && msg.equals("success")) { - return "成功"; - } else if (code == 3006 && msg.equals("miss parameter")) { - return "缺少参数"; - } else if (code == 3007 && msg.equals("miss gen_txt")) { - return "没有检测到文本"; - } else if (code == 3008 && msg.equals("check languages")) { - return "文字和语种不对应"; - } else { - return msg; - } - } + public String getMsgInfo(Integer code, String msg) { + if (code == 3000) { + return "成功"; + } else if (code == 3006 && msg.equals("miss parameter")) { + return "(MetaService)缺少参数"; + } else if (code == 3007 && msg.equals("miss gen_txt")) { + return "(MetaService)没有检测到文本"; + } else if (code == 3008 && msg.equals("check languages")) { + return "(MetaService)文字和语种不对应"; + } else { + return "(MetaService)预览失败,请重试"; + } + } } diff --git a/suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java b/suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java index 3f95582..c67ebd2 100644 --- a/suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java +++ b/suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java @@ -18,6 +18,8 @@ import com.iformall.utils.HttpUtil; import com.iformall.utils.sign.SignUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -25,6 +27,7 @@ import java.security.NoSuchAlgorithmException; import java.util.*; @Slf4j +@Component public class AiVideoHelper { // public static String uri = "http://222.128.9.132:22266"; @@ -33,10 +36,33 @@ public class AiVideoHelper { public static String uri = "http://111.198.0.15:22266"; // public static String url = "http://nas.pucao.cn:2002"; - public static String url = "http://111.198.0.15:22299"; +// public static String hy_url = "http://nas.pucao.cn:2002"; +// +// public static String url = "http://111.198.0.15:22299"; +// public static String hy_url = "http://111.198.0.15:22288"; + + + private static String url; + @Value("${photo.url}") + public void setUrl(String url){ + this.url = url; + } + private static String hy_url; + @Value("${photo.hy_url}") + + public void setHyUrl(String url){ + this.hy_url = url; + } + private static String talk_url; + @Value("${photo.talk}") + + public void setTalkUrl(String url){ + this.talk_url = url; + } public static String photo_speak_suffix = "/img_talking"; public static String image_quality_suffix = "/image_qualit"; public static String voice_preview = "/tts_wav"; + public static String video_hq = "/video_hq"; public static String doPost(String url, String params) { return HttpUtil.doAiVideoPost(url,params); @@ -105,10 +131,11 @@ public class AiVideoHelper { public static AiPhotoSpeakResult createPhotoSpeakVideo(AiPhotoSpeakParam videoParam) { String response = doPost(url + photo_speak_suffix, JSONObject.toJSONString(videoParam)); log.info("生成视频end response:" + response); + log.info("生成视频的 IP:" + url + photo_speak_suffix); AiPhotoSpeakResult result = new AiPhotoSpeakResult(); if (StringUtils.isBlank(response)) { result.setSuccess(false); - result.setMsg("请求生成视频异常,请稍后重试"); + result.setMsg("(MetaService empty)服务被Avatar攻击..."); return result; } @@ -118,19 +145,25 @@ public class AiVideoHelper { String msg = status.getString("msg"); if (code == null) { result.setSuccess(false); - result.setMsg("请求生成视频异常,请稍后重试"); + result.setMsg("(MetaService code empty)服务被Avatar攻击..."); return result; } if (code.intValue() == 4000) { JSONObject data = jsonObject.getJSONObject("data"); String videoUrl = data.getString("url"); + String saveDir = data.getString("save_dir"); + String audioPath = data.getString("audio_path"); result.setSuccess(true); result.setUrl(videoUrl); + result.setSaveDir(saveDir); + result.setCode(code); + result.setAudioPath(audioPath); String resultMsg = result.getMsgInfo(code, msg); result.setMsg(resultMsg); } else { result.setSuccess(false); + result.setCode(code); String resultMsg = result.getMsgInfo(code, msg); result.setMsg(resultMsg); } @@ -140,11 +173,12 @@ public class AiVideoHelper { public static AiCheckPhotoResult checkPhoto(AiCheckPhotoParam param) { String response = doPost(url + image_quality_suffix, JSONObject.toJSONString(param)); log.info("图片质量审核 end response:" + response); + log.info("图片质量审核 IP:" + url + image_quality_suffix); AiCheckPhotoResult result = new AiCheckPhotoResult(); if (StringUtils.isBlank(response)) { result.setSuccess(false); - result.setMsg("图片质量审核失败,请稍后重试"); + result.setMsg("(MetaService)图片质量审核失败,请稍后重试"); return result; } JSONObject jsonObject = JSON.parseObject(response); @@ -153,7 +187,7 @@ public class AiVideoHelper { String msg = status.getString("msg"); if (code == null) { result.setSuccess(false); - result.setMsg("请求异常,请稍后重试"); + result.setMsg("(MetaService)请求图片质量检查失败,请稍后重试"); return result; } if (code.intValue() == 2000) { @@ -173,11 +207,12 @@ public class AiVideoHelper { public static AiPreviewResult voicePreview(AiPreviewParam param) { String response = doPost(url + voice_preview, JSONObject.toJSONString(param)); log.info("TTS音色预览 end response:" + response); + log.info("TTS音色预览 IP:" + url + voice_preview); AiPreviewResult result = new AiPreviewResult(); if (StringUtils.isBlank(response)) { result.setSuccess(false); - result.setMsg("TTS音色预览失败,请稍后重试"); + result.setMsg("(MetaService)TTS音色预览失败,请稍后重试"); return result; } JSONObject jsonObject = JSON.parseObject(response); @@ -194,7 +229,7 @@ public class AiVideoHelper { String msg = status.getString("msg"); if (code == null) { result.setSuccess(false); - result.setMsg("TTS音色预览异常,请稍后重试"); + result.setMsg("(MetaService)TTS音色预览异常,请稍后重试"); return result; } if (code.intValue() == 3000) { @@ -213,6 +248,47 @@ public class AiVideoHelper { return result; } + public static AiVideoHqResult videoHq(AiVideoHqParam param) { + String response = doPost(hy_url + video_hq, JSONObject.toJSONString(param)); + log.info("视频超分 end response:" + response); + log.info("视频超分 IP:" + hy_url + video_hq); + AiVideoHqResult result = new AiVideoHqResult(); + + if (StringUtils.isBlank(response)) { + result.setSuccess(false); + result.setMsg("(MetaService)视频超分失败,请稍后重试"); + return result; + } + JSONObject jsonObject = JSON.parseObject(response); + JSONObject status = jsonObject.getJSONObject("status"); + JSONObject data = jsonObject.getJSONObject("data"); + String strURL = null; + if (data != null){ + strURL = data.getString("url"); + } + + Integer code = status.getInteger("code"); + String msg = status.getString("msg"); + if (code == null) { + result.setSuccess(false); + result.setMsg("(MetaService)视频超分异常,请稍后重试"); + return result; + } + if (code.intValue() == 3000) { + result.setCode(200); + result.setSuccess(true); + result.setUrl(url + strURL); + String resultMsg = result.getMsgInfo(code, msg); + result.setMsg(resultMsg); + } else { + result.setCode(code); + result.setSuccess(false); + String resultMsg = result.getMsgInfo(code, msg); + result.setMsg(resultMsg); + } + return result; + } + public static void main(String[] args) { // AiVideoParam videoParam = new AiVideoParam(); // videoParam.setGen_txt("我写了一篇小说,你帮我看看。"); @@ -237,26 +313,43 @@ public class AiVideoHelper { // AiPhotoSpeakParam param = new AiPhotoSpeakParam(); // param.setGen_txt("人多泰达股份冲冠怒发代发"); -// param.setImg(Base64Util.imageUrlToBase64("https://suimang.oss-accelerate.aliyuncs.com/builtin/digitalperson/16760216806604820_cSHoijDX_matting.png")); +// param.setImg(Base64Util.imageUrlToBase64("https://suimang.oss-accelerate.aliyuncs.com/builtin/personphoto/16564099737021232.png")); // param.setGender("male"); -// param.setVoice_id("zh-CN-YunxiNeural"); -// param.setVoice_style("sad"); +// param.setVoice_id("yue-CN-YunSongNeural"); +// param.setVoice_style("default"); // param.setUrl("None"); // AiPhotoSpeakResult video = AiVideoHelper.createPhotoSpeakVideo(param); + AiPhotoSpeakParam param = new AiPhotoSpeakParam(); + param.setCallback_url("https://phototest.metavatar.cc/C/callback/photo/speak"); + param.setTask_id(836805079248850944L); + param.setGen_txt("None"); + param.setImg(Base64Util.imageUrlToBase64("https://suimang.oss-accelerate.aliyuncs.com/capi/2023-06-07/6da595fe12ef405bb6434f31e6bad4ec.png")); + param.setGender("None"); + param.setVoice_id("default"); + param.setVoice_style("default"); + param.setUrl("https://video.metavatar.cc/sv/262b03bd-18929af12fd/262b03bd-18929af12fd.mp3"); + AiPhotoSpeakResult video = AiVideoHelper.createPhotoSpeakVideo(param); + // AiCheckPhotoParam param = new AiCheckPhotoParam(); // String img = Base64Util.imageUrlToBase64("https://suimang.oss-accelerate.aliyuncs.com/builtin/personmould/16760216806604820_cSHoijDX_grace_1080.jpg"); // param.setImg(img); // AiCheckPhotoResult result = AiVideoHelper.checkPhoto(param); // System.out.println(result); // - AiPreviewParam param = new AiPreviewParam(); - param.setGen_txt("今天是个好日子"); - param.setVoice_id("ar-DZ-AminaNeural"); - param.setVoice_style("default"); - param.setGender("female"); - AiPreviewResult result = AiVideoHelper.voicePreview(param); - System.out.println(result); +// AiPreviewParam param = new AiPreviewParam(); +// param.setGen_txt("今天是个好日子"); +// param.setVoice_id("ar-DZ-AminaNeural"); +// param.setVoice_style("default"); +// param.setGender("female"); +// AiPreviewResult result = AiVideoHelper.voicePreview(param); +// System.out.println(result); + +// AiVideoHqParam param = new AiVideoHqParam(); +// param.setSave_dir("static/video/2023-07-06/16886220017209544_wav.mp4"); +// param.setAudio_path("static/mp3/2023-07-06/291ab7dc-18929b6e89e_convert.wav"); +// AiVideoHqResult result = AiVideoHelper.videoHq(param); +// System.out.println(result); } diff --git a/suimangService/src/main/java/com/iformall/sm/AiVideoHqParam.java b/suimangService/src/main/java/com/iformall/sm/AiVideoHqParam.java new file mode 100644 index 0000000..9a1bb2c --- /dev/null +++ b/suimangService/src/main/java/com/iformall/sm/AiVideoHqParam.java @@ -0,0 +1,12 @@ +package com.iformall.sm; + +import lombok.Data; + +@Data +public class AiVideoHqParam { + private String save_dir; + private String audio_path; + private Long task_id; + private String callback_url; + +} diff --git a/suimangService/src/main/java/com/iformall/sm/AiVideoHqResult.java b/suimangService/src/main/java/com/iformall/sm/AiVideoHqResult.java new file mode 100644 index 0000000..1af0b9b --- /dev/null +++ b/suimangService/src/main/java/com/iformall/sm/AiVideoHqResult.java @@ -0,0 +1,19 @@ +package com.iformall.sm; + +import lombok.Data; + +@Data +public class AiVideoHqResult { + private boolean success; + private Integer code; + private String msg; + private String url; + + public String getMsgInfo(Integer code, String msg) { + if (code == 5000) { + return "成功"; + } else { + return "(MetaService)视频超分失败,点击“编辑”重试"; + } + } +} diff --git a/suimangService/src/main/resources/mapper/PhotoSpeakVideoMapper.xml b/suimangService/src/main/resources/mapper/PhotoSpeakVideoMapper.xml index 661a8ae..a553528 100644 --- a/suimangService/src/main/resources/mapper/PhotoSpeakVideoMapper.xml +++ b/suimangService/src/main/resources/mapper/PhotoSpeakVideoMapper.xml @@ -27,6 +27,11 @@ + + + + + @@ -35,7 +40,8 @@ `id`, `tenant_id`, `parent_tenant_id`, `user_id`, `person_photo_id`, `person_photo_url`, `voice_from`, `voice_mould_id`, `voice_mould_sm`, `paperwork`, `voice_material_id`, `voice_material_url`, - `title`, `cover_img`, `remark`, `video_id`, `video_path`, `video_play_url`, `video_time`, `video_size`, `video_status`, `video_msg`, `create_video_date`, `create_date`, `update_date` + `title`, `cover_img`, `remark`, `video_id`, `video_path`, `video_play_url`, `video_time`, `video_size`, `video_status`, `video_msg`, `create_video_date`, `create_date`, `update_date`, + `is_hy`,`video_hy_status`,`music_id`,`save_dir` @@ -59,6 +65,15 @@ and `voice_from` = #{voiceFrom} + + and `is_hy` = #{isHy} + + + and `music_id` = #{musicId} + + + and `save_dir` = #{saveDir} + and `voice_mould_id` = #{voiceMouldId} @@ -71,6 +86,9 @@ and `video_status` = #{videoStatus} + + and `video_hy_status` = #{videoHyStatus} + and create_date >= #{startDate} @@ -119,7 +137,7 @@ `id`, `paperwork`, `title`, `cover_img`, `remark`, `video_id`, `video_path`, `video_play_url`, `video_time`, `video_size`, `video_status`,`video_msg`, - `create_video_date`, `create_date`, `update_date` + `create_video_date`, `create_date`, `update_date`,`is_hy`,`video_hy_status` from photo_speak_video @@ -138,5 +156,22 @@ + diff --git a/suimangService/src/main/resources/mapper/VoiceLanguageMapper.xml b/suimangService/src/main/resources/mapper/VoiceLanguageMapper.xml index e9dfaf0..039a587 100644 --- a/suimangService/src/main/resources/mapper/VoiceLanguageMapper.xml +++ b/suimangService/src/main/resources/mapper/VoiceLanguageMapper.xml @@ -3,7 +3,7 @@ INSERT INTO voice_language (`id`, `country`, - `language`, `local`, `name`, `img`, `is_del`) + `language`, `local`, `name`, `img`, `is_del`,`chinese_name`) VALUES ( @@ -13,7 +13,8 @@ #{item.local}, #{item.name}, #{item.img}, - #{item.isDel} + #{item.isDel}, + #{item.chineseName} ) diff --git a/suimangService/src/main/resources/mapper/VoiceMapper.xml b/suimangService/src/main/resources/mapper/VoiceMapper.xml index 1fb1703..382f9b0 100644 --- a/suimangService/src/main/resources/mapper/VoiceMapper.xml +++ b/suimangService/src/main/resources/mapper/VoiceMapper.xml @@ -5,7 +5,7 @@ INSERT INTO voice_info (`id`, `language_id`, `sex`, `display_name`, `local_name`, `mould_sm_id`, `sample_rate_hertz`, `words_per_minute`, `voice_type`, - `style_list`, `create_date`, `update_date`, `is_del`) + `style_list`, `create_date`, `update_date`, `is_del`,`age_type`) VALUES ( @@ -21,7 +21,8 @@ #{item.styleList}, #{item.createDate}, #{item.updateDate}, - #{item.isDel} + #{item.isDel}, + #{item.ageType} ) diff --git a/suimangVideo/src/main/java/com/iformall/video/VideoExcutor.java b/suimangVideo/src/main/java/com/iformall/video/VideoExcutor.java index e62a9fc..153dab1 100644 --- a/suimangVideo/src/main/java/com/iformall/video/VideoExcutor.java +++ b/suimangVideo/src/main/java/com/iformall/video/VideoExcutor.java @@ -1,11 +1,9 @@ package com.iformall.video; -import java.io.File; import java.io.InputStream; import com.iformall.video.entity.VideTransResult; import com.iformall.video.entity.VideUploadResult; -import org.apache.commons.lang3.StringUtils; public interface VideoExcutor {