百度AI接口人像渐变示例代码演示

it2024-07-31  37

百度AI接口人像渐变示例代码

人脸渐变接口功能介绍参数列表 Java示例代码所需用到的第三方JAR所需用到的工具类Java示例代码 Access_token获取示例代码请求示例返回示例效果演示百度AI接口官方文档

人脸渐变接口功能介绍

1,GIF图生成可通过上传1-N张照片,生成基非人像展示效果的GIF图(表情包)或人脸渐变过渡图像。2,短视频生成,用上传的1-N张照片,生成基于非人像的展示效果或人脸渐变过渡的视频,支持用户对专场速度、停留时间和音乐节奏进行自定义设置。   优势   1,渐变自然 ,通过标注的海量数据,动态追踪视频里的人脸具有优异的效果。   2,效果多元,配合海量的音乐节奏,让非人像的图片具有多元化的展示效果,即可恬 静高雅又生 动活泼。     3,接入便捷,可自定义音乐节奏、帧率、帧速,并兼容多种应用场景,具有超强的适应性,场景 短视频生成,把用户上传的1-n张图片,生成具有渐变和展示效果的视频,用在各类短视频产品中不仅增加了用户玩法,还让用户体验更有趣味性。

参数列表

注:官方提供的参数列表appid参数说明有误

参数必选类型说明appid是stringapp标识 官网获取的 AppID 更新为你注册的AppIDimage_list是array图片列表+image是string识别图片的BASE64编码字符串music_id是int音乐 ID, 请传入0,本服务暂不支持配乐fps是int视频帧率 默认 10tempo是string每张图片的展示时长, 以空格分隔 数量要求和请求的图片张数一致 GIF默认每张图片0.7s 视频默认每张图片2smorph_time否int / float人像渐变的最长时间 GIF默认0.5s 视频默认1soutput_width否int输出文件的图像宽度 默认800output_height否int输出文件的图像高度 默认 1280output_type是string输出文件类型 可选GIF,MOV,MP4

Java示例代码

说明

所需用到的第三方JAR

hutool fastjson lombok 需要开发工具安装插件 java.util.Base64; 需要JDK1.8 或者使用hutool 里面封装的BASE64处理方法

所需用到的工具类

/** * 重要提示代码中所需工具类 * FileUtil,Base64Util * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * 下载 * lombok 需要jar和开发工具安装插件 * hutool 直接引入jar即可 * JDK 最好1.8以上 */

Java示例代码

package gradient; import cn.hutool.http.HttpUtil; import cn.sample.Base64Util; import cn.sample.FileUtil; import com.alibaba.fastjson.JSON; import lombok.Data; import lombok.NoArgsConstructor; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Base64; /** * @author Hai * @className GradientSample * @Description 人像渐变(邀测) * @Date 2020/10/21 **/ public class GradientSample { public static void main(String[] args) throws Exception { //获取access_token的方式可直接访问百度ai文档 //也可参考页面最下方获取access_token示例代码 String token = "【access_token】"; String url = "https://aip.baidubce.com/rest/2.0/face/v1/gradient"; //图片转BASE64 String base641 = Base64Util.encode(FileUtil.readFileByBytes("【本地图片地址1】")); String base642 = Base64Util.encode(FileUtil.readFileByBytes("【本地图片地址2】")); String base643 = Base64Util.encode(FileUtil.readFileByBytes("【本地图片地址3】")); String base644 = Base64Util.encode(FileUtil.readFileByBytes("【本地图片地址4】")); GradientBean bean = new GradientBean(); //app标识 bean.setAppid("【appid】"); //音乐 ID 我想输出文件类型为GIF应该是没啥用的吧 bean.setMusic_id(0); //视频帧率 默认 10 bean.setFps(20); //输出文件类型 可选GIF,MOV,MP4 bean.setOutput_type("MP4"); bean.setOutput_width(800); bean.setOutput_height(1280); //只支持4张图片 5张就报错 不知道是不是接口的限制 List<GradientBean.ImageListBean> image_list = new ArrayList<>(); GradientBean.ImageListBean imgA = new GradientBean.ImageListBean(); imgA.setImage(base641); GradientBean.ImageListBean imgB = new GradientBean.ImageListBean(); imgB.setImage(base642); GradientBean.ImageListBean imgC = new GradientBean.ImageListBean(); imgC.setImage(base643); GradientBean.ImageListBean imgD = new GradientBean.ImageListBean(); imgD.setImage(base644); image_list.add(imgA); image_list.add(imgB); image_list.add(imgC); image_list.add(imgD); bean.setImage_list(image_list); //每张图片的展示时长, 以空格分隔 数量要求和请求的图片张数一致 GIF默认每张图片0.7s 视频默认每张图片2s //这个参数必须给 且和 图片个数一致 用空格 隔开 bean.setTempo("2 2 2 2"); String param = JSON.toJSONString(bean); System.out.println(bean.getTempo()); System.out.println(param); System.out.println(url + "?access_token=" + token); long startTime = System.currentTimeMillis(); System.out.println("开始时间 = " + startTime); String result = HttpUtil.post(url + "?access_token=" + token, param); long endTime = System.currentTimeMillis(); System.out.println("结束时间 = " + endTime); System.out.println("耗时 = " + (endTime - startTime)); GradientResponseBean responseBean = JSON.parseObject(result, GradientResponseBean.class); System.out.println("结果 = " +responseBean.toString()); //直接拿base64保存为文件 GenerateBase64ToFile(responseBean.getResult().getOutput(),bean.getOutput_type()); //把base64存到文本 不是必须操作 cn.hutool.core.io.FileUtil.writeString(responseBean.getResult().getOutput(), "F://testimg//gradient.txt", "UTF-8"); } @NoArgsConstructor @Data public static class GradientBean{ private String appid; private int music_id; private int fps = 10; private String output_type; private int output_width = 800; private int output_height = 1280; private String tempo; private int morph_time = 1; private List<ImageListBean> image_list; @NoArgsConstructor @Data public static class ImageListBean { private String image; } } @NoArgsConstructor @Data public static class GradientResponseBean{ private int error_code; private String error_msg; private long log_id; private int timestamp; private int cached; private ResultBean result; @Override public String toString() { return "GradientResponseBean{" + "error_code=" + error_code + ", error_msg='" + error_msg + '\'' + ", log_id=" + log_id + ", timestamp=" + timestamp + ", cached=" + cached + '}'; } } @NoArgsConstructor @Data public static class ResultBean { private String output; } /** * @Author Hai * @Description base64保存为文件 * @Date 2020/10/21 * @param imgStr 文件的base64字符串 * @param prefix 保存的后缀 * @return boolean **/ public static boolean GenerateBase64ToFile(String imgStr,String prefix) { //对字节数组字符串进行Base64解码并生成图片 Base64.Decoder decoder = Base64.getDecoder(); try { if(imgStr == null) { //图像数据为空 return false; }else{ //Base64解码 byte[] b = decoder.decode(imgStr); for (int i = 0; i < b.length; ++i) { 调整异常数据 if (b[i] < 0) { b[i] += 256; } } //生成jpeg图片 新生成的图片 String imgFilePath = "F://testimg//"+System.currentTimeMillis()+"."+prefix.toLowerCase(); OutputStream out = new FileOutputStream(imgFilePath); out.write(b); out.flush(); out.close(); return true; } } catch (Exception e) { return false; } } }

Access_token获取示例代码

package com.baidu.ai.aip.auth; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * 获取token类 */ public class AuthService { /** * 获取权限token * @return 返回示例: * { * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", * "expires_in": 2592000 * } */ public static String getAuth() { // 官网获取的 API Key 更新为你注册的 String clientId = "百度云应用的AK"; // 官网获取的 Secret Key 更新为你注册的 String clientSecret = "百度云应用的SK"; return getAuth(clientId, clientSecret); } /** * 获取API访问token * 该token有一定的有效期,需要自行管理,当失效时需重新获取. * @param ak - 百度云官网获取的 API Key * @param sk - 百度云官网获取的 Securet Key * @return assess_token 示例: * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" */ public static String getAuth(String ak, String sk) { // 获取token地址 String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; String getAccessTokenUrl = authHost // 1. grant_type为固定参数 + "grant_type=client_credentials" // 2. 官网获取的 API Key + "&client_id=" + ak // 3. 官网获取的 Secret Key + "&client_secret=" + sk; try { URL realUrl = new URL(getAccessTokenUrl); // 打开和URL之间的连接 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("GET"); connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { System.err.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String result = ""; String line; while ((line = in.readLine()) != null) { result += line; } /** * 返回结果示例 */ System.err.println("result:" + result); JSONObject jsonObject = new JSONObject(result); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("获取token失败!"); e.printStackTrace(System.err); } return null; } }

请求示例

注:只要是按照这个格式提交过去就行,示例只是参考具体如何实现可自行研究与优化

{ "image_list": [{ "image": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD..." }, { "image": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD..." }, { "image": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD..." }, { "image": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD..." } ], "music_id": 0, "fps": 10, "output_type": "MP4", "output_width": 600, "output_height": 600, "tempo": "1.0 1.0 1.0 1.0", "morph_time": 1 }

返回示例

{ "error_code": 0, "error_msg": "SUCCESS", "log_id": 1234567890123, "timestamp": 1533094576, "cached": 0, "result": { "output": "AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQATHf9tZGF0..." } }

效果演示

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!--返回的base64参数是不带前缀的需要自行拼接固定格式 data:video/MP4;base64, --> <video src="data:video/MP4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQALWK1tZGF0AAACoQY..." controls alt=""> </body> </html>

百度AI接口官方文档

百度API官方文档

最新回复(0)