Browse Source

//bug

private_deployment
xhxu 1 year ago
parent
commit
e1922bbc2c
6 changed files with 329 additions and 87 deletions
  1. +14
    -3
      suimangService/src/main/java/com/iformall/enums/EnumVideoType.java
  2. +82
    -13
      suimangService/src/main/java/com/iformall/service/sm/impl/UserMouldVideoServiceImpl.java
  3. +35
    -16
      suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java
  4. +59
    -0
      suimangService/src/main/java/com/iformall/sm/AiVideoParam.java
  5. +82
    -3
      suimangService/src/main/java/com/iformall/utils/Base64Util.java
  6. +57
    -52
      suimangService/src/main/java/com/iformall/utils/HttpUtil.java

+ 14
- 3
suimangService/src/main/java/com/iformall/enums/EnumVideoType.java View File

@@ -11,8 +11,8 @@ public enum EnumVideoType {
// 1:竖版
// 2:横版

VERTICAL_PLATE(1, "竖版"),
HORIZONTAL_PLATE(2, "横版"),
VERTICAL_PLATE(1, "竖版", "vertical"),
HORIZONTAL_PLATE(2, "横版", "horizontal"),
;

public static EnumVideoType getEnum(Integer code) {
@@ -34,10 +34,21 @@ public enum EnumVideoType {

private Integer code;
private String message;
private String type;

EnumVideoType(Integer code, String message) {

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

EnumVideoType(Integer code, String message, String type) {
this.code = code;
this.message = message;
this.type = type;
}

public Integer getCode() {


+ 82
- 13
suimangService/src/main/java/com/iformall/service/sm/impl/UserMouldVideoServiceImpl.java View File

@@ -11,17 +11,16 @@ import com.iformall.domain.po.sm.MaterialMould;
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.EnumMouldPatchType;
import com.iformall.enums.EnumVideoStatus;
import com.iformall.enums.EnumVideoType;
import com.iformall.enums.EnumVoiceType;
import com.iformall.enums.*;
import com.iformall.mapper.UserMouldVideoMapper;
import com.iformall.service.sm.MaterialMouldService;
import com.iformall.service.sm.PersonMouldService;
import com.iformall.service.sm.UserMouldVideoService;
import com.iformall.service.sm.VoiceMouldService;
import com.iformall.sm.AiVideoHelper;
import com.iformall.sm.AiVideoParam;
import com.iformall.sm.AiVideoResult;
import com.iformall.utils.Base64Util;
import com.iformall.video.VideoFactory;
import com.iformall.video.entity.VideUploadResult;
import org.apache.commons.lang3.StringUtils;
@@ -106,8 +105,19 @@ public class UserMouldVideoServiceImpl implements UserMouldVideoService {
JSONObject personObject = JSONObject.parseObject(record.getPersonJson());
if(personObject != null && !personObject.isEmpty()){
isPerson = true;
Long id = personObject.getLong("id");
Integer type = personObject.getInteger("type");
String material = personObject.getString("material");
int x = personObject.getIntValue("x");
int y = personObject.getIntValue("y");
int z = personObject.getIntValue("z");
float w = personObject.getFloatValue("w");
float h = personObject.getFloatValue("h");
}
}catch(Exception e){}
}catch(Exception e){
e.printStackTrace();
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"数字人层级数据错误");
}
//给数字人默认属性
if(!isPerson){
JSONObject personObject = new JSONObject();
@@ -126,8 +136,8 @@ public class UserMouldVideoServiceImpl implements UserMouldVideoService {
personObject.put("y",y);
}
personObject.put("z",0);
personObject.put("w","1");//比例系数(2位小数)
personObject.put("h","1");//比例系数(2位小数)
personObject.put("w",1.0f);//比例系数(2位小数)
personObject.put("h",1.0f);//比例系数(2位小数)
record.setPersonJson(personObject.toJSONString());
}
//默认背景
@@ -196,11 +206,11 @@ public class UserMouldVideoServiceImpl implements UserMouldVideoService {
materialIds.add(id);
}
String material = jsonObject.getString("material");
Integer x = jsonObject.getInteger("x");
Integer y = jsonObject.getInteger("y");
Integer z = jsonObject.getInteger("z");
String w = jsonObject.getString("w");
String h = jsonObject.getString("h");
int x = jsonObject.getIntValue("x");
int y = jsonObject.getIntValue("y");
int z = jsonObject.getIntValue("z");
float w = jsonObject.getFloatValue("w");
float h = jsonObject.getFloatValue("h");
}
}
record.setMaterialIds(JSONArray.toJSONString(materialIds));
@@ -258,12 +268,21 @@ public class UserMouldVideoServiceImpl implements UserMouldVideoService {
}

String voiceMouldSmId = null;
String voiceType = "default";//默认
if(mouldVideo.getVoiceMouldId() == null){
msg = "未选择声音模板";
}else{
try{
JSONObject personMouldObject = JSONObject.parseObject(mouldVideo.getVoiceMouldSm());
voiceMouldSmId = personMouldObject.getString("mouldSmId");
Integer speakType = personMouldObject.getInteger("speakType");
Integer personType = personMouldObject.getInteger("personType");
if(speakType != null && speakType > 0){
voiceType = EnumSpeakType.getEnum(speakType).getMessage();
}else if(personType != null && personType > 0){
voiceType = EnumPersonType.getEnum(personType).getMessage();
}

}catch(Exception e){}
if(StringUtils.isBlank(voiceMouldSmId)){
msg = "参数错误,未找到声音模板数据";
@@ -284,8 +303,58 @@ public class UserMouldVideoServiceImpl implements UserMouldVideoService {
return new AsyncResult<>(0);
}

Long backgroundId = mouldVideo.getBackgroundId();
if(backgroundId == null){
videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode());
videoUpd.setVideoMsg("未选择背景");
this.saveOrUpdate(videoUpd);
return new AsyncResult<>(0);
}

try{
AiVideoResult video = AiVideoHelper.createVideo(personMouldSmId, voiceMouldSmId, paperwork);
AiVideoParam videoParam = new AiVideoParam();
videoParam.setGen_txt(paperwork);
videoParam.setVideo_template_id(personMouldSmId);
videoParam.setVoice_id(voiceMouldSmId);
videoParam.setVoice_style(voiceType);
AiVideoParam.VideoFiles videoFiles = new AiVideoParam.VideoFiles();
AiVideoParam.BackGround backGround = new AiVideoParam.BackGround();
backGround.setType(EnumVideoType.getEnum(mouldVideo.getVideoType()).getType());
JSONObject backgroundObject = JSONObject.parseObject(mouldVideo.getBackgroundSm());
backGround.setImage(Base64Util.imageUrlToBase64(backgroundObject.getString("material")));
videoFiles.setBack_ground(backGround);
AiVideoParam.Material digitalHuman = new AiVideoParam.Material();
JSONObject personObject = JSONObject.parseObject(mouldVideo.getPersonJson());
int[] digitalHumanCoord = new int[]{personObject.getIntValue("x"),personObject.getIntValue("y")};
digitalHuman.setCoord(digitalHumanCoord);
digitalHuman.setLevel(personObject.getIntValue("z"));
digitalHuman.setRatio(personObject.getFloatValue("w"));
videoFiles.setDigital_human(digitalHuman);

if(StringUtils.isNotBlank(mouldVideo.getMaterialAllJson())){
JSONArray materialAllArray = JSONArray.parseArray(mouldVideo.getMaterialAllJson());
if(materialAllArray != null && !materialAllArray.isEmpty()){
List<AiVideoParam.Material> materialList = new ArrayList<>();
for(int i = 0;i < materialAllArray.size();i++) {
JSONObject materialObject = materialAllArray.getJSONObject(i);
if(EnumMouldPatchType.material_mould.getCode().equals(materialObject.getInteger("type"))){
AiVideoParam.Material material = new AiVideoParam.Material();
int[] materialCoord = new int[]{materialObject.getIntValue("x"),materialObject.getIntValue("y")};
material.setCoord(materialCoord);
material.setImage(Base64Util.imageUrlToBase64(materialObject.getString("material")));
material.setLevel(materialObject.getIntValue("z"));
material.setRatio(materialObject.getFloatValue("w"));
materialList.add(material);
}
}
if(materialList.size() > 0){
videoFiles.setMaterial(materialList);
}
}
}
videoParam.setVideo_files(videoFiles);

AiVideoResult video = AiVideoHelper.createVideo(videoParam);
if(video.isSuccess()){
videoUpd.setVideoPath(video.getUrl());
videoUpd.setVideoTime(video.getDuration()+"");


+ 35
- 16
suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java View File

@@ -1,6 +1,7 @@
package com.iformall.sm;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.douyin.pay.orderQuery.OrderQueryResult;
@@ -8,8 +9,11 @@ import com.iformall.douyin.pay.orderQuery.QueryMerchantResult;
import com.iformall.douyin.pay.orderQuery.QueryRefundResult;
import com.iformall.douyin.pay.orderQuery.QuerySettleResult;
import com.iformall.douyin.pay.preOrder.*;
import com.iformall.enums.EnumMouldPatchType;
import com.iformall.enums.EnumPayStatus;
import com.iformall.enums.EnumVideoType;
import com.iformall.exception.MallinkException;
import com.iformall.utils.Base64Util;
import com.iformall.utils.HttpUtil;
import com.iformall.utils.sign.SignUtils;
import lombok.extern.slf4j.Slf4j;
@@ -25,21 +29,15 @@ public class AiVideoHelper {

public static String uri = "http://222.128.9.132:22266";

public static String doPost(String url, Map<String, Object> params) {
return HttpUtil.doPost(url,params);
public static String doPost(String url, String params) {
return HttpUtil.doAiVideoPost(url,params);
}

public static AiVideoResult createVideo(String video_template_id,String voice_id,String gen_txt) {
Map<String,Object> params = new HashMap<>();
params.put("video_template_id",video_template_id);
if(StringUtils.isBlank(voice_id)){
voice_id = "default";
}
params.put("voice_id",voice_id);
params.put("gen_txt",gen_txt);
log.info("生成视频start request:" + JSONObject.toJSONString(params));
String response = doPost(uri+"/gen_dh_video", params);
public static AiVideoResult createVideo(AiVideoParam videoParam) {

log.info("生成视频start request:" + JSONObject.toJSONString(videoParam));
String response = doPost(uri+"/gen_dh_video", JSONObject.toJSONString(videoParam));
log.info("生成视频end response:"+response);

AiVideoResult result = new AiVideoResult();
@@ -50,12 +48,16 @@ public class AiVideoHelper {
return result;
}


JSONObject jsonObject = JSON.parseObject(response);
JSONObject status = jsonObject.getJSONObject("status");
Integer code = status.getInteger("code");
if(code == null){
result.setSuccess(false);
result.setMsg("请求生成视频异常,请稍后重试");
return result;
}

if(null != code && code.intValue() == 1000){
if(code.intValue() == 1000){
JSONObject data = jsonObject.getJSONObject("data");
JSONObject video = data.getJSONObject("video");
result.setSuccess(true);
@@ -93,8 +95,25 @@ public class AiVideoHelper {
}

public static void main(String[] args) {
createVideo("16739389169485046_nVi875Ej","default",
"恭喜发财");
AiVideoParam videoParam = new AiVideoParam();
videoParam.setGen_txt("我写了一篇小说,你帮我看看。");
videoParam.setVideo_template_id("16776650495633934_PgNAW8Sm");
videoParam.setVoice_id("zh-CN-XiaohanNeural");
videoParam.setVoice_style("default");
AiVideoParam.VideoFiles videoFiles = new AiVideoParam.VideoFiles();
AiVideoParam.BackGround backGround = new AiVideoParam.BackGround();
backGround.setType("vertical");
backGround.setImage(Base64Util.imageUrlToBase64("https://suimang.oss-accelerate.aliyuncs.com/builtin/background/grace/1080.jpg"));
videoFiles.setBack_ground(backGround);
AiVideoParam.Material digitalHuman = new AiVideoParam.Material();
int[] digitalHumanCoord = new int[]{0,0};
digitalHuman.setCoord(digitalHumanCoord);
digitalHuman.setLevel(0);
digitalHuman.setRatio(1.0f);
videoFiles.setDigital_human(digitalHuman);
videoParam.setVideo_files(videoFiles);

AiVideoResult video = AiVideoHelper.createVideo(videoParam);
}

}

+ 59
- 0
suimangService/src/main/java/com/iformall/sm/AiVideoParam.java View File

@@ -0,0 +1,59 @@
package com.iformall.sm;

import lombok.Data;

import java.util.List;

@Data
public class AiVideoParam {
/**
* | 参数 | 必选 | 类型 | 说明 |
* | ----------------- | ---- | ------- | ------------------------------------------------------------ |
* | gen_txt | 是 | string | 需要生成的文字内容 |
* | video_template_id | 是 | string | 使用的视频模板ID |
* | voice_id | 是 | string | 音色ID,如:"zh-CN-YunxiNeural"。如果使用“default”,表示不指定具体的,由后端服务自动匹配 |
* | voice_style | 是 | string | TTS语音风格,如:”angry“。如果使用“default”,表示默认风格 |
* | video_files | 否 | array[] | 字典类型,包含背景、数字人、素材信息。缺省,使用默认模板。 |
* | + back_ground | 否 | array[] | 字典类型,背景信息 |
* | ++ image | 是 | string | 背景图片,base64编辑后的字符串类型数据 |
* | ++ type | 是 | string | 背景图片类型,共两种。horizontal 表示横版,vertical 表示竖版 |
* | + digital_human | 否 | array[] | 字典类型,数字人信息 |
* | ++ coord | 是 | array[] | 集合类型,表示相对于左上角的位置,如[100, 200],表示相对于左边缘100像素,相对于上边缘200相素 |
* | ++ level | 是 | uint32 | 数字人图片的层级,值越大表示越高层,0表示最底层 |
* | ++ ratio | 是 | float32 | 相对于原数字人图片大小的缩放比例,如0.5表示宽高均变为原来的一半 |
* | + material | 否 | array[] | 字典类型,素材信息。具体的值是集合类型,内部由每个素材信息(素材信息是字典类型)组成,如"material":[{素材1的信息},{素材2的信息},{素材3的信息}] |
* | ++ | 否 | array[] | 集合类型,每个素材信息(素材信息是字典类型)组成 |
* | +++ coord | 是 | array[] | 集合类型,表示相对于左上角的位置,如[100, 200],表示相对于左边缘100像素,相对于上边缘200相素 |
* | +++ image | 是 | string | 素材图片,base64编辑后的字符串类型数据 |
* | +++ level | 是 | uint32 | 素材图片的层级,值越大表示越高层,0表示最底层 |
* | +++ ratio | 是 | float32 | 相对于原素材图片大小的缩放比例,如0.5表示宽高均变为原来的一半 |
*/

private String gen_txt;
private String video_template_id;
private String voice_id;
private String voice_style;
private VideoFiles video_files;

@Data
public static class VideoFiles {
private BackGround back_ground;
private Material digital_human;
private List<Material> material;
}

@Data
public static class BackGround {
private String image;
private String type;
}

@Data
public static class Material {
private int[] coord;
private String image;
private int level;
private float ratio;
}

}

+ 82
- 3
suimangService/src/main/java/com/iformall/utils/Base64Util.java View File

@@ -1,8 +1,12 @@
package com.iformall.utils;

import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Base64Util {
private static final char S_BASE64CHAR[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
@@ -309,4 +313,79 @@ public class Base64Util {
}
}

/**
* 图片URL转Base64编码
* @param imgUrl 图片URL
* @return Base64编码
*/
public static String imageUrlToBase64(String imgUrl) {
URL url = null;
InputStream is = null;
ByteArrayOutputStream outStream = null;
HttpURLConnection httpUrl = null;

try {
url = new URL(imgUrl);
httpUrl = (HttpURLConnection) url.openConnection();
httpUrl.connect();
httpUrl.getInputStream();

is = httpUrl.getInputStream();
outStream = new ByteArrayOutputStream();

//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用输入流从buffer里把数据读取出来
while( (len = is.read(buffer)) != -1 ){
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}

// 对字节数组Base64编码
return encode(outStream.toByteArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(is != null) {
is.close();
}
if(outStream != null) {
outStream.close();
}
if(httpUrl != null) {
httpUrl.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}

return null;
}

// /**
// * 图片转字符串
// * @param image 图片Buffer
// * @return Base64编码
// */
// public static String encode(byte[] image){
// BASE64Encoder decoder = new BASE64Encoder();
// return replaceEnter(decoder.encode(image));
// }
//
// /**
// * 字符替换
// * @param str 字符串
// * @return 替换后的字符串
// */
// public static String replaceEnter(String str){
// String reg ="[\n-\r]";
// Pattern p = Pattern.compile(reg);
// Matcher m = p.matcher(str);
// return m.replaceAll("");
// }

}

+ 57
- 52
suimangService/src/main/java/com/iformall/utils/HttpUtil.java View File

@@ -133,13 +133,8 @@ public class HttpUtil {

// 实例化HTTP方法
HttpPost request = new HttpPost();

request.setURI(new URI(url));
request.setConfig(RequestConfig.custom()
.setConnectionRequestTimeout(5000)
.setConnectTimeout(300000)
.setSocketTimeout(300000)
.build());

//设置参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
for (Iterator iter = params.keySet().iterator(); iter.hasNext();) {
@@ -382,52 +377,6 @@ public class HttpUtil {
return null;
}

// /**
// * post请求(用于请求json格式的参数)
// * @param url
// * @param params
// * @return
// */
// public static String doPost(String url, String params) throws Exception {
//
// CloseableHttpClient httpclient = HttpClients.createDefault();
// HttpPost httpPost = new HttpPost(url);// 创建httpPost
// httpPost.setHeader("Accept", "application/json");
// httpPost.setHeader("Content-Type", "application/json");
// String charSet = "UTF-8";
// StringEntity entity = new StringEntity(params, charSet);
// httpPost.setEntity(entity);
// CloseableHttpResponse response = null;
//
// try {
// response = httpclient.execute(httpPost);
// StatusLine status = response.getStatusLine();
// int state = status.getStatusCode();
// if (state == HttpStatus.SC_OK) {
// HttpEntity responseEntity = response.getEntity();
// String jsonString = EntityUtils.toString(responseEntity);
// return jsonString;
// }
// else{
// logger.info("请求返回:"+state+"("+url+")");
// }
// }
// finally {
// if (response != null) {
// try {
// response.close();
// } catch (IOException e) {
// logger.error(e.getMessage());
// }
// }
// try {
// httpclient.close();
// } catch (IOException e) {
// logger.error(e.getMessage());
// }
// }
// return null;
// }

/**
* post请求(用于请求json格式的参数)
@@ -646,5 +595,61 @@ public class HttpUtil {
//
// }

/**
* post请求(用于请求json格式的参数)
* @param url
* @param params
* @return
*/
public static String doAiVideoPost(String url, String params){

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);// 创建httpPost
httpPost.setConfig(RequestConfig.custom()
.setConnectionRequestTimeout(5000)
.setConnectTimeout(3000000)
.setSocketTimeout(3000000)
.build());
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-Type", "application/json");
String charSet = "UTF-8";
StringEntity entity = new StringEntity(params, charSet);
httpPost.setEntity(entity);
CloseableHttpResponse response = null;

try {
response = httpclient.execute(httpPost);
StatusLine status = response.getStatusLine();
int state = status.getStatusCode();
if (state == HttpStatus.SC_OK) {
HttpEntity responseEntity = response.getEntity();
String jsonString = EntityUtils.toString(responseEntity);
return jsonString;
}
else{
logger.info("请求返回:"+state+"("+url+")");
}
}
catch(Exception e){
logger.error(e.getMessage());
return null;
}
finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
logger.error(e.getMessage());
}
}
try {
httpclient.close();
} catch (IOException e) {
logger.error(e.getMessage());
}
}
return null;
}

}


Loading…
Cancel
Save