| @@ -85,23 +85,20 @@ public class PersonPhotoController extends BaseController { | |||||
| } | } | ||||
| @ApiOperation("图片质量审核接口") | @ApiOperation("图片质量审核接口") | ||||
| @GetMapping("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"); | 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(), "素材为空"); | return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "素材为空"); | ||||
| } | } | ||||
| ResultData data = personPhotoService.checkPhoto(material); | |||||
| if (data.code == 2000) { | |||||
| return new ResultData(); | |||||
| } | |||||
| return new ResultData(data.message); | |||||
| personPhotoService.checkPhoto(file); | |||||
| return new ResultData(); | |||||
| } | } | ||||
| @ApiOperation("百度图片审核接口") | @ApiOperation("百度图片审核接口") | ||||
| @PostMapping(value = "baiduPhoto", consumes = "multipart/*", headers = "content-type=multipart/form-data") | @PostMapping(value = "baiduPhoto", consumes = "multipart/*", headers = "content-type=multipart/form-data") | ||||
| @ApiImplicitParam(name = "material", value = "material", dataType = "String", paramType = "query", required = true) | |||||
| @ApiImplicitParam(name = "file", value = "file", dataType = "MultipartFile", paramType = "query", required = true) | |||||
| public ResultData baiduCheckPhoto(@RequestPart("file") MultipartFile file) { | public ResultData baiduCheckPhoto(@RequestPart("file") MultipartFile file) { | ||||
| logger.debug("[" + getIpAddr() + "] PersonPhotoController::baiduCheckPhoto"); | logger.debug("[" + getIpAddr() + "] PersonPhotoController::baiduCheckPhoto"); | ||||
| if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) { | if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) { | ||||
| @@ -466,7 +466,7 @@ public class PhotoSpeakVideoController extends BaseController { | |||||
| speakVideo.setUpdateDate(new Date()); | speakVideo.setUpdateDate(new Date()); | ||||
| photoSpeakVideoService.updateById(speakVideo); | photoSpeakVideoService.updateById(speakVideo); | ||||
| photoSpeakVideoService.videoHy(speakVideo,true); | |||||
| photoSpeakVideoService.videoHy(speakVideo); | |||||
| return new ResultData(); | return new ResultData(); | ||||
| } | } | ||||
| @@ -17,10 +17,9 @@ import org.apache.commons.lang3.StringUtils; | |||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | 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; | import java.util.Date; | ||||
| @@ -43,12 +42,12 @@ public class SDKController extends BaseController { | |||||
| @ApiOperation("图片质量审核接口") | @ApiOperation("图片质量审核接口") | ||||
| @PostMapping("checkPhoto") | @PostMapping("checkPhoto") | ||||
| @ApiImplicitParam(name = "material", value = "material", dataType = "String", paramType = "query", required = true) | @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"); | 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(), "素材为空"); | return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "素材为空"); | ||||
| } | } | ||||
| ResultData data = personPhotoService.checkPhoto(material); | |||||
| ResultData data = personPhotoService.checkPhoto(file); | |||||
| if (data.code == 2000) { | if (data.code == 2000) { | ||||
| return new ResultData(); | return new ResultData(); | ||||
| } | } | ||||
| @@ -110,7 +110,12 @@ public class VideoCallbackController extends BaseController { | |||||
| photoSpeakVideo.setUpdateDate(new Date()); | photoSpeakVideo.setUpdateDate(new Date()); | ||||
| photoSpeakVideoService.updateById(photoSpeakVideo); | photoSpeakVideoService.updateById(photoSpeakVideo); | ||||
| //TODO 用户相关操作 | //TODO 用户相关操作 | ||||
| photoSpeakVideoService.uploadVideo(photoSpeakVideo); | |||||
| if (sr){ | |||||
| photoSpeakVideoService.uploadHyVideo(photoSpeakVideo); | |||||
| }else { | |||||
| photoSpeakVideoService.uploadVideo(photoSpeakVideo); | |||||
| } | |||||
| return new ResultData(); | return new ResultData(); | ||||
| } | } | ||||
| @@ -11,12 +11,12 @@ import java.util.Map; | |||||
| /** | /** | ||||
| * http 工具类 | * http 工具类 | ||||
| */ | */ | ||||
| public class HttpUtil { | |||||
| public class BaiDuHttpUtil { | |||||
| public static String post(String requestUrl, String accessToken, String params) | public static String post(String requestUrl, String accessToken, String params) | ||||
| throws Exception { | throws Exception { | ||||
| String contentType = "application/x-www-form-urlencoded"; | String contentType = "application/x-www-form-urlencoded"; | ||||
| return HttpUtil.post(requestUrl, accessToken, contentType, params); | |||||
| return BaiDuHttpUtil.post(requestUrl, accessToken, contentType, params); | |||||
| } | } | ||||
| public static String post(String requestUrl, String accessToken, String contentType, String params) | public static String post(String requestUrl, String accessToken, String contentType, String params) | ||||
| @@ -25,13 +25,13 @@ public class HttpUtil { | |||||
| if (requestUrl.contains("nlp")) { | if (requestUrl.contains("nlp")) { | ||||
| encoding = "GBK"; | encoding = "GBK"; | ||||
| } | } | ||||
| return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding); | |||||
| return BaiDuHttpUtil.post(requestUrl, accessToken, contentType, params, encoding); | |||||
| } | } | ||||
| public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding) | public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding) | ||||
| throws Exception { | throws Exception { | ||||
| String url = requestUrl + "?access_token=" + accessToken; | String url = requestUrl + "?access_token=" + accessToken; | ||||
| return HttpUtil.postGeneralUrl(url, contentType, params, encoding); | |||||
| return BaiDuHttpUtil.postGeneralUrl(url, contentType, params, encoding); | |||||
| } | } | ||||
| public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding) | public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding) | ||||
| @@ -3,7 +3,6 @@ package com.iformall.utils; | |||||
| import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
| import com.alibaba.fastjson.JSONObject; | import com.alibaba.fastjson.JSONObject; | ||||
| import okhttp3.*; | import okhttp3.*; | ||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.springframework.web.multipart.MultipartFile; | import org.springframework.web.multipart.MultipartFile; | ||||
| import java.io.*; | import java.io.*; | ||||
| @@ -12,7 +11,6 @@ import java.io.IOException; | |||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.net.URL; | import java.net.URL; | ||||
| import java.net.URLConnection; | import java.net.URLConnection; | ||||
| import java.util.Base64; | |||||
| /** | /** | ||||
| * 图片质量检查方法 | * 图片质量检查方法 | ||||
| @@ -41,7 +39,7 @@ public class BaiduImageCheckUtil { | |||||
| // Access Token的有效期(秒为单位,有效期30天) | // Access Token的有效期(秒为单位,有效期30天) | ||||
| // String accessToken = getAuth(); | // String accessToken = getAuth(); | ||||
| //这里暂时写死 | //这里暂时写死 | ||||
| String result = HttpUtil.post(photo_check_url, access_token, param); | |||||
| String result = BaiDuHttpUtil.post(photo_check_url, access_token, param); | |||||
| System.out.println(result); | System.out.println(result); | ||||
| JSONObject jsonObject = JSON.parseObject(result); | JSONObject jsonObject = JSON.parseObject(result); | ||||
| //1:合规,2:不合规,3:疑似,4:审核失败 | //1:合规,2:不合规,3:疑似,4:审核失败 | ||||
| @@ -11,7 +11,8 @@ public class UrlCheck { | |||||
| || url.contains("awsImgUpload") | || url.contains("awsImgUpload") | ||||
| || url.contains("getCarStopFee") | || url.contains("getCarStopFee") | ||||
| || url.contains("/video/upload") | || url.contains("/video/upload") | ||||
| || url.contains("/personPhoto/baiduPhoto"); | |||||
| || url.contains("/personPhoto/baiduPhoto") | |||||
| || url.contains("/personPhoto/checkPhoto"); | |||||
| } | } | ||||
| } | } | ||||
| @@ -109,6 +109,22 @@ public class PhotoSpeakSchedule { | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * 超分上传阿里云 | |||||
| */ | |||||
| @Scheduled(cron = "0 */30 * * * *?") // 每半小时检查一次 | |||||
| public void userVideoHyUploadSchedule() { | |||||
| List<PhotoSpeakVideo> 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); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * 获取超分时长和大小 | * 获取超分时长和大小 | ||||
| @@ -149,7 +165,7 @@ public class PhotoSpeakSchedule { | |||||
| if (list != null && list.size() > 0) { | if (list != null && list.size() > 0) { | ||||
| for (PhotoSpeakVideo video : list) { | for (PhotoSpeakVideo video : list) { | ||||
| try { | try { | ||||
| photoSpeakVideoService.videoHy(video,false); | |||||
| photoSpeakVideoService.videoHy(video); | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| logger.error("TtCouponVideoSchedule error.couponVideoSchedule:"+video.getId(),e); | logger.error("TtCouponVideoSchedule error.couponVideoSchedule:"+video.getId(),e); | ||||
| } | } | ||||
| @@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo; | |||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.domain.po.sm.MaterialMould; | import com.iformall.domain.po.sm.MaterialMould; | ||||
| import com.iformall.domain.po.sm.PersonPhoto; | import com.iformall.domain.po.sm.PersonPhoto; | ||||
| import org.springframework.web.multipart.MultipartFile; | |||||
| public interface PersonPhotoService { | public interface PersonPhotoService { | ||||
| @@ -43,5 +44,5 @@ public interface PersonPhotoService { | |||||
| void updateOnline(PersonPhoto record); | void updateOnline(PersonPhoto record); | ||||
| ResultData checkPhoto(String material); | |||||
| ResultData checkPhoto(MultipartFile file); | |||||
| } | } | ||||
| @@ -59,10 +59,12 @@ public interface PhotoSpeakVideoService { | |||||
| int updateById(PhotoSpeakVideo video); | int updateById(PhotoSpeakVideo video); | ||||
| void videoHy(PhotoSpeakVideo speakVideo,Boolean flag); | |||||
| ResultData videoHy(PhotoSpeakVideo speakVideo); | |||||
| void uploadHyVideo(PhotoSpeakVideo mouldVideo); | void uploadHyVideo(PhotoSpeakVideo mouldVideo); | ||||
| List<PhotoSpeakVideo> getUpLoadHyIngList(); | List<PhotoSpeakVideo> getUpLoadHyIngList(); | ||||
| List<PhotoSpeakVideo> getNotHyUploadList(); | |||||
| } | } | ||||
| @@ -29,8 +29,11 @@ import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
| import org.springframework.web.multipart.MultipartFile; | |||||
| import java.io.IOException; | |||||
| import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
| import java.net.URLEncoder; | |||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | import java.util.List; | ||||
| @@ -135,13 +138,20 @@ public class PersonPhotoServiceImpl implements PersonPhotoService { | |||||
| } | } | ||||
| @Override | @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(ErrorCode.SYS_SERVER_ERROR.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()); | |||||
| } | } | ||||
| } | } | ||||
| @@ -231,17 +231,20 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { | |||||
| AiPhotoSpeakResult video = AiVideoHelper.createPhotoSpeakVideo(param); | AiPhotoSpeakResult video = AiVideoHelper.createPhotoSpeakVideo(param); | ||||
| if (video.isSuccess()) { | if (video.isSuccess()) { | ||||
| photoSpeakVideo.setSaveDir(video.getSaveDir()); | |||||
| photoSpeakVideo.setVideoPath(video.getUrl()); | |||||
| this.updateById(photoSpeakVideo); | |||||
| return new ResultData(); | return new ResultData(); | ||||
| } | } | ||||
| photoSpeakVideo.setVideoStatus(EnumVideoStatus.draft.getCode()); | photoSpeakVideo.setVideoStatus(EnumVideoStatus.draft.getCode()); | ||||
| photoSpeakVideo.setVideoMsg(video.getMsg()); | photoSpeakVideo.setVideoMsg(video.getMsg()); | ||||
| this.saveOrUpdate(photoSpeakVideo); | |||||
| this.updateById(photoSpeakVideo); | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"接口请求异常"); | return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"接口请求异常"); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| e.printStackTrace(); | e.printStackTrace(); | ||||
| photoSpeakVideo.setVideoStatus(EnumVideoStatus.draft.getCode()); | photoSpeakVideo.setVideoStatus(EnumVideoStatus.draft.getCode()); | ||||
| photoSpeakVideo.setVideoMsg("口请求异常"); | |||||
| this.saveOrUpdate(photoSpeakVideo); | |||||
| photoSpeakVideo.setVideoMsg("接口请求异常"); | |||||
| this.updateById(photoSpeakVideo); | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"接口请求异常"); | return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"接口请求异常"); | ||||
| } | } | ||||
| } | } | ||||
| @@ -312,24 +315,33 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void videoHy(PhotoSpeakVideo speakVideo,Boolean flag) { | |||||
| AiVideoHqParam param = new AiVideoHqParam(); | |||||
| param.setSave_dir(speakVideo.getSaveDir()); | |||||
| AiVideoHqResult result = AiVideoHelper.videoHq(param); | |||||
| if(result.isSuccess()){ | |||||
| speakVideo.setVideoHyStatus(EnumVideoStatus.success.getCode()); | |||||
| speakVideo.setVideoMsg("超分视频生成成功"); | |||||
| speakVideo.setIsHy(EnumYesOrNo.YES.getCode()); | |||||
| public ResultData videoHy(PhotoSpeakVideo speakVideo) { | |||||
| try { | |||||
| AiVideoHqParam param = new AiVideoHqParam(); | |||||
| param.setSave_dir(speakVideo.getSaveDir()); | |||||
| AiVideoHqResult result = AiVideoHelper.videoHq(param); | |||||
| if (result.isSuccess()) { | |||||
| speakVideo.setVideoHyStatus(EnumVideoStatus.success.getCode()); | |||||
| speakVideo.setVideoMsg("超分视频生成成功"); | |||||
| speakVideo.setVideoPath(result.getUrl()); | |||||
| speakVideo.setIsHy(EnumYesOrNo.YES.getCode()); | |||||
| this.updateById(speakVideo); | |||||
| return new ResultData(); | |||||
| } | |||||
| speakVideo.setVideoHyStatus(EnumVideoStatus.draft.getCode()); | |||||
| speakVideo.setVideoMsg("视频超分失败"); | |||||
| this.updateById(speakVideo); | this.updateById(speakVideo); | ||||
| this.uploadHyVideo(speakVideo); | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "接口请求异常"); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| speakVideo.setVideoHyStatus(EnumVideoStatus.draft.getCode()); | |||||
| speakVideo.setVideoMsg("接口请求异常"); | |||||
| this.updateById(speakVideo); | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "接口请求异常"); | |||||
| } | } | ||||
| speakVideo.setVideoHyStatus(EnumVideoStatus.fail.getCode()); | |||||
| speakVideo.setVideoMsg("视频超分失败"); | |||||
| this.updateById(speakVideo); | |||||
| } | } | ||||
| @Async | |||||
| @Override | @Override | ||||
| public void uploadHyVideo(PhotoSpeakVideo mouldVideo){ | public void uploadHyVideo(PhotoSpeakVideo mouldVideo){ | ||||
| if(EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoHyStatus()) | if(EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoHyStatus()) | ||||
| @@ -342,6 +354,19 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { | |||||
| videoUpd.setVideoId(result.getVideoId()); | videoUpd.setVideoId(result.getVideoId()); | ||||
| videoUpd.setVideoHyStatus(EnumVideoStatus.upload_ing.getCode()); | videoUpd.setVideoHyStatus(EnumVideoStatus.upload_ing.getCode()); | ||||
| this.saveOrUpdate(videoUpd); | this.saveOrUpdate(videoUpd); | ||||
| AtomicInteger integer = new AtomicInteger(30); | |||||
| while (true){ | |||||
| String progress = videoFactory.getExcutor(videoType).getVedioUploadProgress(result.getVideoId()); | |||||
| if (progress.equals("complete")) { | |||||
| mouldVideo.setVideoHyStatus(EnumVideoStatus.upload_success.getCode()); | |||||
| this.updateById(mouldVideo); | |||||
| break; | |||||
| } | |||||
| if (integer.getAndDecrement() <= 0){ | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -352,4 +377,14 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { | |||||
| umVideoQ.setVideoHyStatus(EnumVideoStatus.upload_ing.getCode()); | umVideoQ.setVideoHyStatus(EnumVideoStatus.upload_ing.getCode()); | ||||
| return photoSpeakVideoMapper.getSortList(umVideoQ); | return photoSpeakVideoMapper.getSortList(umVideoQ); | ||||
| } | } | ||||
| @Override | |||||
| public List<PhotoSpeakVideo> getNotHyUploadList() { | |||||
| PhotoSpeakVideo umVideoQ = new PhotoSpeakVideo(); | |||||
| List<Integer> videoStatuss = new ArrayList<>(); | |||||
| videoStatuss.add(EnumVideoStatus.success.getCode()); | |||||
| videoStatuss.add(EnumVideoStatus.upload_fail.getCode()); | |||||
| umVideoQ.setVideoStatuss(videoStatuss); | |||||
| return photoSpeakVideoMapper.getSortList(umVideoQ); | |||||
| } | |||||
| } | } | ||||
| @@ -278,9 +278,9 @@ public class AiVideoHelper { | |||||
| AiPhotoSpeakParam param = new AiPhotoSpeakParam(); | AiPhotoSpeakParam param = new AiPhotoSpeakParam(); | ||||
| param.setGen_txt("人多泰达股份冲冠怒发代发"); | 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.setGender("male"); | ||||
| param.setVoice_id("zh-CN-YunyangNeural"); | |||||
| param.setVoice_id("yue-CN-YunSongNeural"); | |||||
| param.setVoice_style("default"); | param.setVoice_style("default"); | ||||
| param.setUrl("None"); | param.setUrl("None"); | ||||
| AiPhotoSpeakResult video = AiVideoHelper.createPhotoSpeakVideo(param); | AiPhotoSpeakResult video = AiVideoHelper.createPhotoSpeakVideo(param); | ||||