フォーム読み込み中
この記事はソフトバンクアドベントカレンダー2025の16日目の記事です。
普段は、ビジュアモールムービーライブラリと言うクラウド型動画共有プラットフォームサービスの企画、開発、営業支援をしています。
近年、業務で動画を共有する機会が増え、それに伴い「動画に要約を付けたい」というニーズも高まっています。
そこで本記事では、生成AIを使って動画から要約を自動生成する方法を検証しました。
※本検証は **2025年12月10日時点** の情報に基づいています。
ここでは、主要な生成AIである Azure AI、ChatGPT、Gemini を比較します。
| 項目 | ChatGPT | Azure AI | Gemini |
|---|---|---|---|
| 概要 | 動画データから直接、要約を生成することはできません。 そのため、次の手順を取り動画の要約を生成:
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(テキスト / 画像 / 動画) ・出力(100万トークンあたり) $0.40 |
今回の検証では、ビジネス利用の多い 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は頻繁に更新される点にご注意ください。
必要な情報:
a) アクセスキー等の取得
メニュー:
ストレージアカウント> セキュリティとネットワーク>アクセスキー
ここで取得した
は控えておきます。
b) blobコンテナーの作成
メニュー:
ストレージアカウント>ストレージブラウザ>blobコンテナー
音声ファイルの保存先となるコンテナーを作成します。
必要な情報:
メニュー:
音声サービス → リソース管理 → キーとエンドポイント
必要な情報:
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ファイルに記述しています。
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 は料金が音声時間に依存するため、転送効率の観点で小さくしておくと便利です。
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 |
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 全体も利用 |
文字起こしテキストを 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 "") |
以上の処理を組み合わせてメインロジックを構成します。
# ====== メイン処理 ====== 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があります。この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が提供するパブリッククラウドプラットフォームです。コンピューティングからデータ保存、アプリケーションなどのリソースを、必要な時に必要な量だけ従量課金で利用することができます。
条件に該当するページがございません