From febcb9163b6b78817e40ee33d31e0446b9ca5e0d Mon Sep 17 00:00:00 2001 From: xmzhao71 Date: Wed, 18 Oct 2023 18:34:02 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=B7=BB=E5=8A=A0=E7=AE=97?= =?UTF-8?q?=E5=8A=9B=E6=9C=8D=E5=8A=A1=E5=B9=B6=E6=96=B0=E5=A2=9E=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ai/AiVideoController.java | 38 +++++++++++ .../com/iformall/dto/GenerateVideoDTO.java | 12 ++++ .../com/iformall/dto/PreviewVideoDTO.java | 25 +++++++ .../com/iformall/service/AiVideoService.java | 22 ++++++ .../service/impl/AiVideoServiceImpl.java | 68 +++++++++++++++++++ .../iformall/controller/SDKController.java | 7 +- .../controller/VoiceMouldController.java | 6 +- .../iformall/service/sm/VoiceInfoService.java | 2 +- .../service/sm/impl/VoiceInfoServiceImpl.java | 17 +++-- 9 files changed, 178 insertions(+), 19 deletions(-) create mode 100644 open-api/src/main/java/com/iformall/controller/ai/AiVideoController.java create mode 100644 open-api/src/main/java/com/iformall/dto/GenerateVideoDTO.java create mode 100644 open-api/src/main/java/com/iformall/dto/PreviewVideoDTO.java create mode 100644 open-api/src/main/java/com/iformall/service/AiVideoService.java create mode 100644 open-api/src/main/java/com/iformall/service/impl/AiVideoServiceImpl.java diff --git a/open-api/src/main/java/com/iformall/controller/ai/AiVideoController.java b/open-api/src/main/java/com/iformall/controller/ai/AiVideoController.java new file mode 100644 index 0000000..6597f79 --- /dev/null +++ b/open-api/src/main/java/com/iformall/controller/ai/AiVideoController.java @@ -0,0 +1,38 @@ +package com.iformall.controller.ai; + +import com.iformall.common.ResultData; +import com.iformall.domain.po.sm.UserMouldVideo; +import com.iformall.dto.GenerateVideoDTO; +import com.iformall.dto.PreviewVideoDTO; +import com.iformall.service.AiVideoService; +import com.iformall.sm.AiPreviewParam; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +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; + +@Api(tags = "视频相关api") +@RestController +@RequestMapping("/ai/video") +public class AiVideoController { + + @Autowired + private AiVideoService aiVideoService; + + @ApiOperation("预览") + @PostMapping("/preview") + public ResultData previewVideo(@RequestBody PreviewVideoDTO dto) { + return new ResultData(aiVideoService.previewVideo(dto)); + } + + @ApiOperation("生成视频") + @PostMapping("generateVideo") + public ResultData generateVideo(@RequestBody GenerateVideoDTO dto) { + aiVideoService.generateVideo(dto); + return new ResultData(); + } +} diff --git a/open-api/src/main/java/com/iformall/dto/GenerateVideoDTO.java b/open-api/src/main/java/com/iformall/dto/GenerateVideoDTO.java new file mode 100644 index 0000000..6b02d7c --- /dev/null +++ b/open-api/src/main/java/com/iformall/dto/GenerateVideoDTO.java @@ -0,0 +1,12 @@ +package com.iformall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "生成视频请求参数") +@Data +public class GenerateVideoDTO { + @ApiModelProperty(value = "视频唯一标识") + private Long id; +} diff --git a/open-api/src/main/java/com/iformall/dto/PreviewVideoDTO.java b/open-api/src/main/java/com/iformall/dto/PreviewVideoDTO.java new file mode 100644 index 0000000..749e3b3 --- /dev/null +++ b/open-api/src/main/java/com/iformall/dto/PreviewVideoDTO.java @@ -0,0 +1,25 @@ +package com.iformall.dto; + +import com.iformall.sm.AiPreviewParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "预览视频请求参数") +@Data +public class PreviewVideoDTO { + @ApiModelProperty("文案") + private String paperwork; + @ApiModelProperty("声音id") + private String voiceId; + @ApiModelProperty("声音风格名称") + private String voiceStyle; + + public static AiPreviewParam mappingParam(PreviewVideoDTO dto) { + AiPreviewParam aiPreviewParam = new AiPreviewParam(); + aiPreviewParam.setGen_txt(dto.getPaperwork()); + aiPreviewParam.setVoice_id(dto.getVoiceId()); + aiPreviewParam.setVoice_style(dto.getVoiceStyle()); + return aiPreviewParam; + } +} diff --git a/open-api/src/main/java/com/iformall/service/AiVideoService.java b/open-api/src/main/java/com/iformall/service/AiVideoService.java new file mode 100644 index 0000000..4d0a4d4 --- /dev/null +++ b/open-api/src/main/java/com/iformall/service/AiVideoService.java @@ -0,0 +1,22 @@ +package com.iformall.service; + +import com.iformall.dto.GenerateVideoDTO; +import com.iformall.dto.PreviewVideoDTO; +import com.iformall.sm.AiPreviewParam; + +/** + * ai视频服务 + * + * @author xmzhao71 + * @date 2023-10-18 + */ +public interface AiVideoService { + + Double previewVideo(PreviewVideoDTO dto); + /** + * 生成视频 + * + * @param dto + */ + void generateVideo(GenerateVideoDTO dto); +} diff --git a/open-api/src/main/java/com/iformall/service/impl/AiVideoServiceImpl.java b/open-api/src/main/java/com/iformall/service/impl/AiVideoServiceImpl.java new file mode 100644 index 0000000..9085ad2 --- /dev/null +++ b/open-api/src/main/java/com/iformall/service/impl/AiVideoServiceImpl.java @@ -0,0 +1,68 @@ +package com.iformall.service.impl; + +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.sm.UserMouldVideo; +import com.iformall.dto.GenerateVideoDTO; +import com.iformall.dto.PreviewVideoDTO; +import com.iformall.enums.EnumVideoStatus; +import com.iformall.exception.BizException; +import com.iformall.service.AiVideoService; +import com.iformall.service.sm.UserMouldVideoService; +import com.iformall.service.sm.VoiceInfoService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.Optional; + +/** + * ai视频服务 + * + * @author xmzhao71 + * @date 2023-10-18 + */ +@Service +public class AiVideoServiceImpl implements AiVideoService { + + @Autowired + private VoiceInfoService voiceInfoService; + @Autowired + private UserMouldVideoService userMouldVideoService; + + @Override + public Double previewVideo(PreviewVideoDTO dto) { + return voiceInfoService.previewVoice(PreviewVideoDTO.mappingParam(dto)); + } + + @Override + public void generateVideo(GenerateVideoDTO dto) { + // 参数校验 + UserMouldVideo userMouldVideo = Optional.ofNullable(userMouldVideoService.getById(dto.getId())).orElseThrow(() -> new BizException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "未找到用户数据")); + if (StringUtils.isBlank(userMouldVideo.getPaperwork())) { + throw new BizException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "未填写视频文案"); + } + if (EnumVideoStatus.ing.getCode().equals(userMouldVideo.getVideoStatus()) + || EnumVideoStatus.success.getCode().equals(userMouldVideo.getVideoStatus()) + || EnumVideoStatus.upload_ing.getCode().equals(userMouldVideo.getVideoStatus()) + || EnumVideoStatus.upload_fail.getCode().equals(userMouldVideo.getVideoStatus())) { + throw new BizException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "视频生成中"); + } + if (EnumVideoStatus.upload_success.getCode().equals(userMouldVideo.getVideoStatus())) { + throw new BizException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "视频已生成完成"); + } + + // 更新视频信息 + updateUserMouldVideo(userMouldVideo); + userMouldVideoService.createVideo(userMouldVideo); + } + + private void updateUserMouldVideo(UserMouldVideo userMouldVideo) { + UserMouldVideo video = new UserMouldVideo(); + video.setId(userMouldVideo.getId()); + video.setVideoStatus(EnumVideoStatus.ing.getCode()); + video.setVideoMsg(""); + video.setCreateVideoDate(new Date()); + userMouldVideoService.updateById(video); + } +} diff --git a/suimangCApi/src/main/java/com/iformall/controller/SDKController.java b/suimangCApi/src/main/java/com/iformall/controller/SDKController.java index ffa7031..d53b70d 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/SDKController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/SDKController.java @@ -1,14 +1,9 @@ package com.iformall.controller; -import com.alibaba.fastjson.JSONArray; - import com.alibaba.fastjson.JSONObject; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.JsonObject; import com.iformall.annotation.AuthIgnore; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; -import com.iformall.domain.po.WxCVoiceTable; import com.iformall.domain.po.sm.PhotoSpeakVideo; import com.iformall.domain.po.sm.PreviewParam; import com.iformall.enums.EnumVideoStatus; @@ -82,7 +77,7 @@ public class SDKController extends BaseController { param.setVoice_style(previewParam.getVoiceStyle()); param.setGen_txt(previewParam.getGenTxt()); param.setGender(previewParam.getGender()); - return new ResultData(voiceInfoService.voicePreview(param)); + return new ResultData(voiceInfoService.previewVoice(param)); } @ApiOperation("生成视频") diff --git a/suimangCApi/src/main/java/com/iformall/controller/VoiceMouldController.java b/suimangCApi/src/main/java/com/iformall/controller/VoiceMouldController.java index 1183855..b61e965 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/VoiceMouldController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/VoiceMouldController.java @@ -5,13 +5,11 @@ 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.MouldPatch; import com.iformall.domain.po.sm.PersonMould; import com.iformall.domain.po.sm.UserMouldVideo; import com.iformall.domain.po.sm.VoiceMould; import com.iformall.enums.*; import com.iformall.language.LanguageDetect; -import com.iformall.mapper.VoiceLanguageMapper; import com.iformall.service.WxCVoiceService; import com.iformall.service.sm.*; import com.iformall.sm.AiPreviewParam; @@ -20,7 +18,6 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; -import org.checkerframework.checker.units.qual.A; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +25,6 @@ import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; -import java.util.Map; @RestController @@ -166,7 +162,7 @@ public class VoiceMouldController extends BaseController { @ApiImplicitParams({}) public ResultData voicePreview(@RequestBody AiPreviewParam aiPreviewParam) { logger.debug("[" + getIpAddr() + "] MouldPatchController::voicePreview"); - return new ResultData(voiceInfoService.voicePreview(aiPreviewParam)); + return new ResultData(voiceInfoService.previewVoice(aiPreviewParam)); } diff --git a/suimangService/src/main/java/com/iformall/service/sm/VoiceInfoService.java b/suimangService/src/main/java/com/iformall/service/sm/VoiceInfoService.java index 27d64e3..00ed921 100644 --- a/suimangService/src/main/java/com/iformall/service/sm/VoiceInfoService.java +++ b/suimangService/src/main/java/com/iformall/service/sm/VoiceInfoService.java @@ -15,5 +15,5 @@ public interface VoiceInfoService { VoiceInfo getById(Long voiceMouldId); - ResultData voicePreview(AiPreviewParam aiPreviewParam); + Double previewVoice(AiPreviewParam aiPreviewParam); } 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 402df0c..496ce20 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 @@ -11,6 +11,7 @@ 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.exception.BizException; import com.iformall.file.aliyun.bean.AliyunOSSConfig; import com.iformall.mapper.VoiceMapper; import com.iformall.service.sm.VoiceInfoService; @@ -23,6 +24,7 @@ import org.springframework.util.ObjectUtils; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service public class VoiceInfoServiceImpl implements VoiceInfoService { @@ -77,11 +79,12 @@ public class VoiceInfoServiceImpl implements VoiceInfoService { } @Override - public ResultData voicePreview(AiPreviewParam aiPreviewParam) { - VoiceInfo voiceInfo = voiceMapper.selectOne(new LambdaQueryWrapper().eq(VoiceInfo::getIsDel, 0).eq(VoiceInfo::getId, aiPreviewParam.getVoice_id())); - if (ObjectUtils.isEmpty(voiceInfo)){ - return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "声音信息不存在"); - } + public Double previewVoice(AiPreviewParam aiPreviewParam) { + VoiceInfo voiceInfo = voiceMapper.selectOne(new LambdaQueryWrapper() + .eq(VoiceInfo::getIsDel, 0) + .eq(VoiceInfo::getId, aiPreviewParam.getVoice_id())); + voiceInfo = Optional.ofNullable(voiceInfo).orElseThrow(() -> new BizException(ErrorCode.SYS_SERVER_ERROR.getCode(), "声音信息不存在")); + AiPreviewParam param = new AiPreviewParam(); param.setGen_txt(aiPreviewParam.getGen_txt().replaceAll(Constant.text_pause,"[*]")); param.setVoice_id(voiceInfo.getMouldSmId()); @@ -89,9 +92,9 @@ public class VoiceInfoServiceImpl implements VoiceInfoService { param.setGender(voiceInfo.getSex() == 1 ? "male" : "female"); AiPreviewResult result = AiVideoHelper.voicePreview(param); if (result.isSuccess()){ - return new ResultData(result.getTime()); + return result.getTime(); } - return new ResultData(result.getCode(), result.getMsgInfo(result.getCode(),result.getMsg())); + throw new BizException(result.getCode(), result.getMsgInfo(result.getCode(),result.getMsg())); } }