すべてのプロダクト
Search
ドキュメントセンター

Intelligent Media Services:チュートリアル:顔合成動画の作成

最終更新日:Apr 26, 2026

このチュートリアルでは、Intelligent Media Services (IMS) の顔検索およびビデオ編集機能を使用して、効率的に顔合成動画を作成・編集する方法を説明します。インテリジェントメディアアセット検索の基本操作、顔検索の API ワークフロー、タイムライン構成、高度なテンプレートの使用方法について解説し、高品質な顔合成動画を迅速に制作できるように支援します。

背景情報

動画コンテンツが増加する中で、特定の人物が登場する動画クリップを迅速に検索・整理することが重要なタスクとなっています。顔合成は、さまざまなシーンに登場する個人の活動を効果的に紹介する手法であり、映画制作、ニュース報道、ソーシャルエンターテインメントなどで広く利用されています。本チュートリアルでは、IMS の強力な機能を活用してこの目的を達成する方法を紹介します。

ユースケース

ユースケース 1:アスリートのハイライト動画

マラソンなどのスポーツイベントでは、主催者やメディアアウトレットがアスリートのハイライト動画を作成することがよくあります。これらの動画は、競技中のスプリントやライバルを追い抜く瞬間など、重要なシーンを紹介します。ハイライト動画は、イベントのプロモーションや振り返り、アスリートのパーソナルブランド構築において重要です。

ユースケース 2:来場者のパーソナライズドハイライト動画

来場者の体験を向上させるため、アミューズメントパークではパーソナライズされたハイライト動画を作成することがあります。これらの動画は、ローラーコースターでの歓声やカルーセルでの笑い声など、さまざまなアトラクションでのエキサイティングな瞬間を捉えます。このようなコンピレーションは、来場者の思い出としての記念品になったり、パークのソーシャルメディアプロモーションに活用されたりします。

ユースケース 3:イベントのメイキング動画

結婚式業界では、ウェディング動画はカップルの幸せな瞬間を記録し、思い出を保存する重要な手段です。結婚式当日のメイキング映像やカップルの旅行動画は、丁寧な編集と構成が必要で、その愛の物語やロマンチックな雰囲気を効果的に表現します。

ユースケース 4:ファンの顔コンピレーション

大規模なコンサートや音楽フェスティバルでは、主催者が観客の顔コンピレーションを作成し、その熱意や参加感を表現することがよくあります。これらのコンピレーションは、大型スクリーンに表示してライブの雰囲気を盛り上げたり、ソーシャルメディアプロモーションの素材として使用したりできます。

顔合成は、個人的な思い出、家族向け動画、観光プロモーション、企業イベントの振り返りなどにも広く活用されています。

操作手順

前提条件

IMS サーバー側 SDK をインストールします。詳細については、「事前準備」をご参照ください。すでに SDK をインストール済みの場合は、このステップをスキップしてください。

ステップ 1:顔検索で動画クリップを検索する

Intelligent Media Services (IMS) の顔検索機能を使用して、特定の顔を含む動画クリップを検索します。詳細については、「大量のメディアアセットから顔を検索する」をご参照ください。

ステップ 2:動画クリップを編集する

以下のセクションでは、顔合成動画を作成する 3 つの方法について説明します。各セクションでは、ユースケース、手順、SDK 呼び出しのサンプルコード、および例を紹介します。

方法 1:スクリプトから動画生成(Script-to-Video)を使用して動画を作成する

特徴
  • 便利で効率的:スクリプトベースの自動生成により、顔合成動画の作成が簡素化されます。簡単な構成で、複数の類似動画を一括で効率的に生成できます。

  • 使いやすい:ワンクリックでの動画作成機能により、ビデオ編集の経験がなくても高品質な動画を作成できます。

SDK を使用して実装する

サンプルコードを表示

package com.example;

import java.util.*;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;

/**
 *  You must add the following Maven dependencies:
 *   <dependency>
 *      <groupId>com.aliyun</groupId>
 *      <artifactId>ice20201109</artifactId>
 *      <version>2.3.0</version>
 *  </dependency>
 *  <dependency>
 *      <groupId>com.alibaba</groupId>
 *      <artifactId>fastjson</artifactId>
 *      <version>1.2.9</version>
 *  </dependency>
 */
public class SubmitFaceEditingJobService {

    static final String regionId = "cn-shanghai";
    static final String bucket = "<your-bucket>";

    /*** Submit a one-click video creation job for a face compilation based on face search results. ****/
    public static void submitBatchEditingJob(String mediaId, SearchMediaClipByFaceResponse response) throws Exception {

        Client iceClient = initClient();

        JSONArray intervals = buildIntervals(response);
        JSONObject editingTimeline = buildEditingTimeline(mediaId, intervals);

        String openingMediaId = "icepublic-9a2df29956582a68a59e244a5915228c";
        String endingMediaId = "icepublic-1790626066bee650ac93bd12622a921c";
        String mainGroupName = "main";
        String openingGroupName = "opening";
        String endingGroupName = "ending";

        JSONObject inputConfig = buildInputConfig(mediaId, mainGroupName, openingMediaId, openingGroupName, endingMediaId, endingGroupName);
        JSONObject editingConfig = buildEditingConfig(mediaId, mainGroupName, intervals, openingMediaId, openingGroupName, endingMediaId, endingGroupName);
        JSONObject outputConfig = new JSONObject();
        outputConfig.put("MediaURL", "https://ice-auto-test.oss-cn-shanghai.aliyuncs.com/testBatch/" + System.currentTimeMillis() + "{index}.mp4");
        outputConfig.put("Width", 1280);
        outputConfig.put("Height", 720);
        outputConfig.put("FixedDuration", 18);
        outputConfig.put("Count", 2);

        SubmitBatchMediaProducingJobRequest request = new SubmitBatchMediaProducingJobRequest();
        request.setInputConfig(inputConfig.toJSONString());
        request.setEditingConfig(editingConfig.toJSONString());
        request.setOutputConfig(outputConfig.toJSONString());

        SubmitBatchMediaProducingJobResponse response = iceClient.submitBatchMediaProducingJob(request);
        System.out.println("JobId: " + response.getBody().getJobId());
    }

    public Client initClient() throws Exception {
        // An Alibaba Cloud account's AccessKey grants full access to all APIs. We recommend using a RAM user for API calls and daily operations.
        // This example shows how to store your AccessKey ID and AccessKey Secret in environment variables. For more information, see https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials.
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();

        Config config = new Config();
        config.setCredential(credentialClient);

        // If you need to hard-code your AccessKey ID and AccessKey Secret, use the following code. However, we strongly recommend that you do not store your AccessKey ID and AccessKey Secret in your project code. This can lead to an AccessKey leak and compromise the security of all resources in your account.
        // config.accessKeyId = "
コンソールを使用して実装する

コンソールで動画を作成する場合、ステップ 1 をスキップして、以下の手順に従ってください。

ステップ 1: コンソールの左側ナビゲーションウィンドウでインテリジェントバッチ動画生成をクリックします。スクリプトから動画生成タブで[タスクの作成]をクリックし、生成モードを選択します。グローバルスクリプトセグメントスクリプトモードの両方がサポートされています。この例ではセグメントスクリプトモードを使用します。

ステップ 2: スクリプトノード構成セクションで[素材の追加]をクリックします。表示される素材の追加パネルで顔検索を選択し、一致する素材を検索するために顔画像をアップロードします

ステップ 3: 検索結果で、特定の結果の[表示]をクリックして一致した動画クリップを確認します。その後、[一致クリップをインポート][OK]をクリックします。これにより、一致した素材がスクリプトノードに追加されます。

ステップ 4: 顔検索で一致した動画クリップを調整するには、素材にカーソルを合わせて設定アイコンをクリックします。表示されるダイアログボックスのトリミングセクションで、インポイントとアウトポイントを調整できます。調整が不要な場合は、このステップをスキップしてください。

その後、スクリプトから動画生成の標準手順に従って、タイトルBGMステッカーとロゴ合成設定を構成してからタスクを送信します。

方法 2:タイムライン編集を使用して動画を作成する

特徴
  • 動画コンテンツのカスタマイズ性:タイムラインは高いカスタマイズ性を提供し、すべての編集ポイント、エフェクト、トランジション、オーディオトラックを正確に制御できます。クリエイティブなニーズに基づいて素材を自由に組み合わせ・調整し、独自の動画を制作できます。

  • 高い柔軟性:テンプレートとは異なり、タイムライン編集は非常に柔軟です。編集プラン、順序、エフェクト、オーディオをいつでも調整でき、多様なクリエイティブニーズに対応できます。

手順

ステップ 1 の顔検索結果を使用して、SubmitMediaProducingJob 操作のタイムライン構成を使用して顔合成動画を編集できます。例については、SDK 呼び出しのサンプルセクションをご参照ください。エフェクト、トランジション、オーディオ処理などの高度な編集ニーズがある場合は、「ビデオ編集の基本パラメーター」および「タイムライン構成」をご参照いただき、顔合成動画の作成方法をより深く理解してください。

SDK 呼び出しのサンプル

サンプルコードを表示

タイムラインパラメーターのサンプルを表示

{
  "VideoTracks": [
    {
      "VideoTrackClips": [
        {
          "MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
          "In": 54.106018,
          "Effects": [
            {
              "Type": "Volume",
              "Gain": 0
            }
          ],
          "Out": 56.126015
        },
        {
          "MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
          "In": 271.47302,
          "Effects": [
            {
              "Type": "Volume",
              "Gain": 0
            }
          ],
          "Out": 277.393
        },
        {
          "MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
          "In": 326.03903,
          "Effects": [
            {
              "Type": "Volume",
              "Gain": 0
            }
          ],
          "Out": 331.959
        },
        {
          "MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
          "In": 372.20602,
          "Effects": [
            {
              "Type": "Volume",
              "Gain": 0
            }
          ],
          "Out": 375.126
        },
        {
          "MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
          "In": 383.03903,
          "Effects": [
            {
              "Type": "Volume",
              "Gain": 0
            }
          ],
          "Out": 388.959
        },
        {
          "MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
          "In": 581.339,
          "Effects": [
            {
              "Type": "Volume",
              "Gain": 0
            }
          ],
          "Out": 587.25903
        },
        {
          "MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
          "In": 602.339,
          "Effects": [
            {
              "Type": "Volume",
              "Gain": 0
            }
          ],
          "Out": 607.293
        }
      ]
    }
  ],
  "AudioTracks": [
    {
      "AudioTrackClips": [
        {
          "LoopMode": true,
          "MediaId": "icepublic-0c4475c3936f3a8743850f2da942ceee"
        }
      ]
    }
  ]
}

方法 3:高度なテンプレートを使用する

特徴
  • 効率的で高品質:完成済みのテンプレートに素材を配置することで、高品質な動画を迅速に作成できます。また、独自のスタイルと品質向上のためにカスタムテンプレートを設計することも可能です。

  • 動画スタイルの一貫性:テンプレートにより、動画に一貫性がありプロフェッショナルなスタイルを保証し、経験の浅いユーザーでも魅力的な動画を作成できるよう支援します。

手順

ステップ 1 の顔検索結果を使用して、高度なテンプレートと ClipsParam パラメーターを SubmitMediaProducingJob 操作で使用し、顔合成動画を作成できます。例については、SDK 呼び出しのサンプルセクションをご参照ください。この例ではパブリックテンプレート IceSys_VETemplate_s100241 を使用し、顔検索結果に基づいて動画クリップを構成しています。独自の高度なテンプレートを使用して顔合成動画を作成したい場合は、「ユーザーガイド:高度なテンプレートの使用方法」をご参照ください。

SDK 呼び出しのサンプル

サンプルコードを表示

package com.example;

import java.util.*;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;

/**
 *  You must add the following Maven dependencies:
 *   <dependency>
 *      <groupId>com.aliyun</groupId>
 *      <artifactId>ice20201109</artifactId>
 *      <version>2.3.0</version>
 *  </dependency>
 *  <dependency>
 *      <groupId>com.alibaba</groupId>
 *      <artifactId>fastjson</artifactId>
 *      <version>1.2.9</version>
 *  </dependency>
 */
public class SubmitFaceEditingJobService {

    static final String regionId = "cn-shanghai";
    static final String bucket = "<your-bucket>";

    /*** Submit a face compilation editing job based on face search results. ****/
    public static void submitEditingJob(String mediaId, SearchMediaClipByFaceResponse response) throws Exception {

        Client iceClient = initClient();
        JSONArray intervals = buildIntervals(response);

        // Submit an advanced template job. This example uses the public template IceSys_VETemplate_s100241 and configures video clips based on face search results.
        JSONObject clipParams = buildClipParams(mediaId, intervals);

        SubmitMediaProducingJobRequest request2 = new SubmitMediaProducingJobRequest();
        request2.setTemplateId("IceSys_VETemplate_s100241");
        request2.setClipsParam(clipParams.toJSONString());
        request2.setOutputMediaTarget("oss-object");
        outputConfig = new JSONObject();
        outputConfig.put("MediaURL",
                         "https://" + bucket + ".oss-" + regionId + "/testTemplate/" + System.currentTimeMillis() + ".mp4");
        request2.setOutputMediaConfig(outputConfig.toJSONString());

        SubmitMediaProducingJobResponse response2 = iceClient.submitMediaProducingJob(request2);
        System.out.println("JobId: " + response2.getBody().getJobId());
    }

    public Client initClient() throws Exception {
        // An Alibaba Cloud account's AccessKey grants full access to all APIs. We recommend using a RAM user for API calls and daily operations.
        // This example shows how to store your AccessKey ID and AccessKey Secret in environment variables. For more information, see https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials.
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();

        Config config = new Config();
        config.setCredential(credentialClient);

        // If you need to hard-code your AccessKey ID and AccessKey Secret, use the following code. However, we strongly recommend that you do not store your AccessKey ID and AccessKey Secret in your project code. This can lead to an AccessKey leak and compromise the security of all resources in your account.
        // config.accessKeyId = "

clipParams パラメーターのサンプルを表示

{
	"Media0": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media0.clip_start": 54.066017,
	"Media1": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media1.clip_start": 67.33301,
	"Media2": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media2.clip_start": 271.47302,
	"Media3": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media3.clip_start": 326.03903,
	"Media4": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media4.clip_start": 372.20602,
	"Media5": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media5.clip_start": 383.03903,
	"Media6": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media6.clip_start": 581.339,
	"Media7": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media7.clip_start": 587.25903,
	"Media8": "b5a003f0cd3f71ed919fe7e7c45b****",
	"Media8.clip_start": 602.339
}

タイムライン編集を使用して作成された動画

この動画は、白いユニフォームに番号 5 を着用したアスリートの顔合成です。

高度なテンプレートを使用して作成された動画

最終的な動画のトランジションと速度エフェクトは、テンプレートによるものです。

スクリプトから動画生成(SDK)を使用して作成された動画

この動画は、白いユニフォームに番号 5 を着用したアスリートの顔合成です。

スクリプトから動画生成(コンソール)を使用して作成された動画

この動画は、白いユニフォームに番号 17 を着用したアスリートの顔合成です。

関連ドキュメント