Azure Open AIを使った動画概要説明の自動生成

2025年12月16日掲載

キービジュアル

この記事はソフトバンクアドベントカレンダー2025の16日目の記事です。

普段は、ビジュアモールムービーライブラリと言うクラウド型動画共有プラットフォームサービスの企画、開発、営業支援をしています。

近年、業務で動画を共有する機会が増え、それに伴い「動画に要約を付けたい」というニーズも高まっています。
そこで本記事では、生成AIを使って動画から要約を自動生成する方法を検証しました。

※本検証は **2025年12月10日時点** の情報に基づいています。

目次

  • 動画データからの要約自動生成に興味のある担当者
  • Python の基礎知識がある方
  • Azure OpenAI の知識がある方、或いは興味がある方

各生成AIの比較(Azure AI / ChatGPT / Gemini)

ここでは、主要な生成AIである Azure AI、ChatGPT、Gemini を比較します。

 

動画概要自動生成に関するモデル毎の比較
項目ChatGPTAzure AIGemini
概要

動画データから直接、要約を生成することはできません

そのため、次の手順を取り動画の要約を生成:

 

1. 動画(MP4 など)を音声データ(MP3 / WAV など)へffmpeg等で変換

2. 変換した音声データを文字起こし(speech to text)

3. 得られたテキストを GPT-x に入力して要約を作成

動画データから直接、要約を生成することはできません

そのため、次の手順を取り動画の要約を生成:

 

1. 動画(MP4 など)を音声データ(MP3 / WAV など)へffmpeg等で変換

2. 変換した音声データを文字起こし(speech to text)

3. 得られたテキストを GPT-x に入力して要約を作成

動画データから要約生成が可能です

Geminiでは動画ファイルは1秒1枚の画像と音声に分解して処理を行います

従って、1秒以内で瞬間的に変わる映像の情報は欠落する可能性があります

使用する機能

* whisper / GPT-4o-transcribe(音声 → テキスト)

* GPT-5(要約生成)

* fast transcription または batch transcription(音声 → テキスト)

   ※fast transcription は高速、batch transcription は非同期で低速だがコスト低め

* blob storage(音声ファイルの保存場所)

   ※API から直接音声を送り込めないため必須

* GPT-4.1(要約生成)

Gemini 2.5 Flash-Lite

制限

* whisper / GPT-4o-transcribe

   → 1回のリクエスト上限:25MB

   → 超える場合はファイルを分割する必要あり

※fast transcription は制限あり(batch transcriptionはなし)

 

* ファイルサイズ上限:20GB

* 動画の長さ上限:2時間(推奨)

* ファイルサイズ:2GB

* 動画の長さ:2時間(推奨 1時間)

料金* whisper / GPT-4o-transcribe:$0.006 / 分

* fast transcription:56.216円 / 時間

* batch transcription:28.108円 / 時間

 ※どちらも standard speech-to-text の料金

※2025/12/10時点の料金

Gemini 2.5 Flash-Lite

・入力 (100万トークン)あたり

$0.10(テキスト / 画像 / 動画)
$0.30(音声)

・出力(100万トークンあたり)

$0.40

Azure AI を使った動画要約作成の概要

今回の検証では、ビジネス利用の多い Azure AI を利用しました。

動作環境は VSCode で、動画 → 音声変換はPCで行っています。

以下に全体の処理フロー(fast transcription を利用した例)を示します。

図1 Azure AIを使った動画概要説明の自動生成

【処理の流れ】

1. ffmpeg で動画 → 音声(mp3)へ変換

2. 変換した音声ファイルを Storage API で Blob Storage にアップロード

3. fast transcription API で文字起こしを実施し、テキストを取得

4. GPT-4.1 API で要約文を生成

事前準備

Azure ポータルで各APIを利用するための情報、並びに環境を作っておく必要があります。

以下、情報の取得方法、環境の構築方法を示します。

※いずれも 2025年12月10日時点 の情報であり、ポータルUIは頻繁に更新される点にご注意ください。

1) Blob Storage 利用に必要な情報

必要な情報:

  • アクセスキー(storage key)
  • 接続文字列(connection string)
  • ストレージアカウント名
  • Blob コンテナー名(事前作成)

a) アクセスキー等の取得

メニュー: 

ストレージアカウント> セキュリティとネットワーク>アクセスキー

ここで取得した

  • ストレージアカウント名
  • アクセスキー
  • 接続文字列

  は控えておきます。

 

b) blobコンテナーの作成

メニュー: 

ストレージアカウント>ストレージブラウザ>blobコンテナー

音声ファイルの保存先となるコンテナーを作成します。

 2) fast transcription 利用で必要な情報

必要な情報:

  • キー
  • リージョン
  • エンドポイント

メニュー:

音声サービス → リソース管理 → キーとエンドポイント

3) GPT-4.1 利用に必要な情報

必要な情報:

  • アクセスキー
  • エンドポイント

a)      キー、エンドポイント、リージョン

メニュー: 

Azure Open AI>リソース管理>キーとエンドポイント

「キー」、場所/地域」(リージョン)、「エンドポイント」をコピーして保存します。

 

a)      デプロイ名、バージョン

GPT-4.1 を割り当てたデプロイ名・バージョンを控えます。

動画概要自動生成プログラムをつくる

Pythonを使用して作成していきます。

0)     ライブラリや環境変数の準備

使用ライブラリを import し、必要なパラメータを設定します。

機密情報は `.env` にまとめ、`load_dotenv` で読み込む形にしています。

import os

import json

import requests

import ffmpeg

from dotenv import load_dotenv

from openai import AzureOpenAI

from azure.storage.blob import BlobServiceClient

 

# .envのファイルを読み込む

load_dotenv()

 

# ====== 環境変数読み込み ======

# Azure Blob Storage環境変数

BLOB_ACCOUNT_NAME = os.getenv("AZURE_STORAGE_ACCOUNT_NAME")    # ストレージアカウント名

BLOB_ACCOUNT_KEY = os.getenv("AZURE_STORAGE_KEY")  # アクセスキー

BLOB_CONNECTION_STRING = os.getenv("AZURE_STORAGE_CONNECTION_STRING") # 接続文字列

BLOB_CONTAINER_NAME = "speek2text"              # コンテナ名

 

# Azure Speech環境変数

SPEECH_KEY = os.getenv("AZURE_SPEECH_KEY")

SPEECH_ENDPOINT = os.getenv("AZURE_SPEECH_ENDPOINT")  # Azure Speechリソースのエンドポイント

SPEECH_REGION = "japaneast"          # Bach Transcription対応リージョンを使用

SPEECH_API_VERSION = "2024-11-15"           # 例:Speech to Text APIのバージョン

LOCALE = "ja-JP"

 

# Azure OpenAI環境変数

OPENAI_KEY = os.getenv("AZURE_OPENAI_API_KEY")

OPENAI_ENDPOINT = os.getenv("AZURE_OPENAI_ENDPOINT") # :Azure OpenAIリソースのエンドポイント

OPENAI_DEPLOYMENT = "gpt-4.1"           # AOAIのモデル(Deployment)名

OPENAI_API_VERSION = "2025-03-01-preview"   # 例:AOAIのAPIバージョン

 

# ====== 設定 ======

MOVIE_DIR = "movies/"           # 動画ファイルディレクトリ

AUDIO_DIR = "audios/"           # 音声ファイルディレクトリ

MOVIE_FILE_EXT = ".mp4"  # 動画ファイル拡張子

AUDIO_FILE_EXT = ".mp3" # 音声ファイル拡張子

 

SUMMARY_LENGTH = 500  # ← ここを変えると文字数変更可

重要なパラメータに関しては情報セキュリティの観点から別のファイルに分けた方が良いため、次のように.envファイルに記述しています。

1) 動画→音声への変換

Azure OpenAI は動画を直接受け付けないため、音声データへ変換する必要があります。

今回は ffmpeg を使用しています。

# ====== 1. MP4 → MP3(64kbpsモノラル) ======

def convert_mp4_to_mp3(input_file, output_file):

    (

        ffmpeg

        .input(input_file)

        .output(output_file, acodec="libmp3lame", ac=1, ab="64k")

        .overwrite_output()

        .run(quiet=True)

    )

容量削減のため、モノラル・64kbpsで出力。

Azure AI は料金が音声時間に依存するため、転送効率の観点で小さくしておくと便利です。

2) blob storageへのアップロード

fast transcription API は音声データを直接送信できないため、

Blob Storage にアップロード → URL をAPIへ渡す必要があります。

# ====== 2.Blob Storageへアップロード ======

def upload_to_blob(BLOB_CONNECTION_STRING, container_name, local_file, blob_name):

    # Blobサービスクライアントを作成

    blob_service_client = BlobServiceClient.from_connection_string(BLOB_CONNECTION_STRING)

 

    # コンテナクライアントを取得

    container_client = blob_service_client.get_container_client(container_name)

 

    # Blobクライアントを取得

    blob_client = container_client.get_blob_client(blob_name)

 

    # ファイルをアップロード

    try:

        with open(local_file, "rb") as data:

            blob_client.upload_blob(data, overwrite=True)

            #print(f"✅ {local_file} をアップロードしました → blob://{container_name}/{blob_name}")

    except Exception as e:

        print("upload_to_blob で例外発生:", repr(e))

        raise

 

    # 完全な URL を返す(SAS は付いていない点を注意)

    try:

        url = blob_client.url

    except Exception:

        url = None

    return url

(3)fast transcriptionによる文字起こし

fast transcription の戻り値は JSON 形式で、

* テキスト

* 経過時間(タイムスタンプ)

  などを含みます。

そのため、テキスト部分のみ抽出する処理を追加しています。

# ====== 3. fast transcriptionでテキストに変換 ======

def fast_transcription(audio_path: str, locales, diarization=False, max_speakers=5):

    url = f"{SPEECH_ENDPOINT}" \

          f"speechtotext/transcriptions:transcribe?api-version={SPEECH_API_VERSION}"

 

    definition = {}

    definition["locales"] = locales

    if diarization:

        definition["diarization"] = {"enabled": True, "maxSpeakers": max_speakers}

 

    headers = {"Ocp-Apim-Subscription-Key": SPEECH_KEY}

    files = {

        # 音声ファイル本体

        "audio": (os.path.basename(audio_path), open(audio_path, "rb")),

        # 設定は JSON 文字列で送る

        "definition": (None, json.dumps(definition), "application/json"),

    }

 

    resp = requests.post(url, headers=headers, files=files, timeout=300)

    resp.raise_for_status()

    data = resp.json()

 

    # 返却JSONの combinedPhrases からテキストを連結

    phrases = data.get("combinedPhrases", [])

    text = "\n".join(p.get("text", "") for p in phrases if p.get("text"))

    return text, data  # 必要に応じて data 全体も利用

 

(4)GPT-4.1による会話の要約

文字起こしテキストを GPT-4.1 に渡して要約を生成します。

今回の検証ではシンプルに以下のプロンプトを使用しました:

「次の文章を {max_chars} 文字以内で日本語で要約してください。」

プロンプトを工夫すれば、より高度で精緻な要約が可能になります

# ====== 4. GPT-4.1 で要約 ======

def summarize_text(text, max_chars=5000, max_output_tokens=2000):

    client = AzureOpenAI(

        api_key=OPENAI_KEY,

        azure_endpoint=OPENAI_ENDPOINT,

        api_version=OPENAI_API_VERSION ,

    )

    prompt = f"次の文章を{max_chars}文字以内で日本語で要約してください:\n\n{text}"

    resp = client.responses.create(

        model=OPENAI_DEPLOYMENT,

        input=prompt,

        max_output_tokens=max_output_tokens,

    )

    # 出力テキスト取得

    output_text = getattr(resp, "output_text", None)

    return (output_text or "")

 

(5)メイン処理

以上の処理を組み合わせてメインロジックを構成します。

 

# ====== メイン処理 ======

def main():

    # ===== set parameters ======

    movie_name = "test09m"   # MP4ファイル名(拡張子なし)

    audio_name = movie_name   # MP3ファイル名(拡張子なし)

    INPUT_MP4 = os.path.join(MOVIE_DIR, movie_name + MOVIE_FILE_EXT)   # 入力MP4ファイルパス

    OUTPUT_MP3 = os.path.join(AUDIO_DIR, audio_name + AUDIO_FILE_EXT)  # 出力MP3ファイルパス

    LOCAL_FILE_PATH = OUTPUT_MP3        # アップロードしたいローカルファイル

    BLOB_NAME = os.path.basename(LOCAL_FILE_PATH)  # Blob上でのファイル名

 

    # 1. mp4 → mp3

    convert_mp4_to_mp3(INPUT_MP4, OUTPUT_MP3)

 

    # (このMP3を自分のAzure Blobにアップロードし、SAS URLを取得しておく)

    upload_to_blob(BLOB_CONNECTION_STRING, BLOB_CONTAINER_NAME, LOCAL_FILE_PATH, BLOB_NAME)

 

    # 2. 文字起こし

    text, raw = fast_transcription(OUTPUT_MP3, locales=[LOCALE], diarization=True, max_speakers=5)

 

    # 3. 要約

    # 明示的にテンプレートファイルを指定する例

    summary = summarize_text(text, SUMMARY_LENGTH, max_output_tokens=2000)

 

    # 4. 表示

    print("\n===== ✅ 要約結果 =====")

    print(summary)

 

 

if __name__ == "__main__":

    main()

 

検証結果

以下の動画を用いて検証を行いました:

(動画)

【ムービーライブラリ】動画を簡単に共有できます!#72-2 (ええじゃないか!!【公式】)
https://www.youtube.com/watch?v=-IKMlwQX6_I

(要約)

===== ✅ 要約結果 =====

「ビジュアモールムービーライブラリ」は、ソフトバンクが提供する法人向け動画共有サービスです。企業が社内で動画を効率的に管理・共有でき、見せたい社員だけに限定公開が可能です。研修やマニュアル、経営メッセージなど様々な用途に利用でき、専用ポータルサイトからPCやスマホで簡単に視聴できます。動画のアップロードはシンプルな操作で実施。たとえば情報セキュリティを学ぶアニメ「Mr.Sのセキュリティチャンネル」も配信され、ポップな短編動画で社員のリテラシー向上にも役立ちます。リモートワーク時代に適したサービスで、特別な機器やアプリ不要、ウェブブラウザとネット環境さえあれば利用可能です。利用人数や動画数に応じてプランも複数用意されており、企業や学校など多様なシーンで活用できます。

結果として、十分実用的なレベルの動画概要を得られることを確認しました。

プロンプトを調整すれば、さらに魅力的な要約文を生成できると考えられます。

Azure AI の音声サービス比較(fast transcription / batch transcription)

AZURE AIの音声サービスには、fast transcription以外にbatch transcriptionがあります。この2つについて比較を行ってみました。

a)      処理時間比較

処理時間比較
動画(尺長さ)処理時間(fast transcription)処理時間(batch transcription)
動画A(長さ25分)66秒336秒
動画B(長さ28分)68秒336秒
動画C(長さ28分)67秒366秒
動画D(長さ32分)96秒214秒

概ね batch transcription は fast transcription の 5〜6倍の処理時間でした。

ただし batch transcription は空きリソースを使う方式のため、タイミングにより差異が出る可能性があります。

 

a)      コスト比較(2025/12/10時点の金額)

Azure AI の音声サービスは音声の長さに応じて課金 されます。

* batch transcription: 28.108円 / 時間

* fast transcription: 56.216円 / 時間

→ batch は fast の 約半額

処理速度とコストのどちらを優先するかで選択が変わります。

まとめ

近年、動画を重要な情報共有手段として活用する企業が増えています。生成AIの活用により動画の取り扱いが容易になり、動画概要説明の自動化に対するニーズも高まっています。今回の検証では、そのニーズに応え得る一定の効果を確認できました

一方で、導入コストや運用面でどのようにメリットを確保していくかといった課題も残っています。これらの課題が解消されれば、動画概要説明の自動化は今後さらに普及していくと期待しています。

現時点では音声情報のみをもとに要約を生成していますが、今後は Gemini  のように「映像に含まれる情報」からも要約を生成できる技術について、さらなる調査を進めていきたいと考えています

関連サービス

ムービーライブラリはクローズドでセキュアな動画共有を簡単に実現できる、法人向け動画共有サービスです。短時間で多くの情報を正確に伝えられる動画で、企業の情報共有を効率化します。

Microsoft Azureは、Microsoftが提供するパブリッククラウドプラットフォームです。コンピューティングからデータ保存、アプリケーションなどのリソースを、必要な時に必要な量だけ従量課金で利用することができます。

おすすめの記事

条件に該当するページがございません