| @@ -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(); | |||
| } | |||
| } | |||
| @@ -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; | |||
| } | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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); | |||
| } | |||
| @@ -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); | |||
| } | |||
| } | |||
| @@ -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("生成视频") | |||
| @@ -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)); | |||
| } | |||
| @@ -15,5 +15,5 @@ public interface VoiceInfoService { | |||
| VoiceInfo getById(Long voiceMouldId); | |||
| ResultData voicePreview(AiPreviewParam aiPreviewParam); | |||
| Double previewVoice(AiPreviewParam aiPreviewParam); | |||
| } | |||
| @@ -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<VoiceInfo>().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<VoiceInfo>() | |||
| .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())); | |||
| } | |||
| } | |||