BaiduAIインターフェースポートレートグラデーションサンプルコードのデモンストレーション

顔のグラデーションインターフェース機能の紹介

  • 1. GIF画像の生成では、1-Nの写真をアップロードすることで、GIF画像(絵文字パッケージ)を生成したり、非ポートレート表示効果のある段階的な遷移画像を作成したりできます。
  • 2.アップロードされた1-N写真を使用して、非ポートレート表示効果または段階的な遷移に基づいてビデオを生成する短いビデオ生成。ユーザーが特別セッションの速度、滞在時間、音楽リズムをカスタマイズできるようにします。
      利点
      1、勾配は自然であり、注釈の大量のデータを通じて、ビデオ内の顔の動的追跡は優れた効果をもたらします。
      2.効果は多様で、音楽のリズムが大きいため、ポートレート以外の写真の表示効果も多様化しており、静かでエレガント、そして生き生きとしています。  
      3.便利なアクセス、カスタマイズ可能な音楽リズム、フレームレート、フレームレート、さまざまなアプリケーションシナリオとの互換性、優れた適応性、短いシーンのビデオ生成、ユーザーがアップロードした1-nの写真、段階的な変更で生成されたビデオさまざまなショートビデオ製品で使用されるエフェクトは、ユーザーのゲームプレイを向上させるだけでなく、ユーザーエクスペリエンスをより面白くします。

パラメータリスト

注:公式パラメーターリストのappidパラメーターの説明が正しくありません

パラメータ 必須 の種類 説明
appid はい ストリング アプリロゴの公式サイトから取得したAppIDが登録済みのAppIDに更新されます
image_list はい アレイ 写真リスト
+画像 はい ストリング 画像のBASE64でエンコードされた文字列を特定します
music_id はい int 音楽ID、0を入力してください。このサービスはサウンドトラックをサポートしていません
fps はい int デフォルトのビデオフレームレートは10です
時間 はい ストリング スペースで区切られた各画像の表示時間、要件の数は、要求された画像の数と一致しています。GIFのデフォルトは画像あたり0.7秒、ビデオのデフォルトは画像あたり2秒です。
morph_time 番号 int / float ポートレートフェードの最長時間、GIFのデフォルトは0.5秒、ビデオのデフォルトは1秒
output_width 番号 int 出力ファイルの画像幅はデフォルトで800です
output_height 番号 int 出力ファイルの画像の高さはデフォルトで1280です
output_type はい ストリング 出力ファイルタイプはオプションの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>

BaiduAIインターフェースの公式ドキュメント

BaiduAPIの公式ドキュメント

おすすめ

転載: blog.csdn.net/weixin_49822811/article/details/109200811