チュートリアル

TwelveLabs API を使用した AI 駆動型講義分析プラットフォームの構築

ネイサン・チェ

このチュートリアルでは、AWS Bedrock上でTwelve LabsのPegasusおよびMarengoモデルを使用して、講義動画から学習ガイド、練習問題、章ごとのタイムライン、および文字起こしを自動生成する「講義分析プラットフォーム(Lecture Analysis Platform)」の構築手順を解説します。また、Twelve Labs、Google Gemini、AWS Novaを、出力品質、推論時間、およびコストの観点から並べて比較したベンチマーク評価も掲載しています。

このチュートリアルでは、AWS Bedrock上でTwelve LabsのPegasusおよびMarengoモデルを使用して、講義動画から学習ガイド、練習問題、章ごとのタイムライン、および文字起こしを自動生成する「講義分析プラットフォーム(Lecture Analysis Platform)」の構築手順を解説します。また、Twelve Labs、Google Gemini、AWS Novaを、出力品質、推論時間、およびコストの観点から並べて比較したベンチマーク評価も掲載しています。

この記事の内容

No headings found on page

ニュースレターに登録する

ニュースレターに登録する

ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします

ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします

AIを活用してビデオを検索、分析、探索します。

2025/09/12

15分

記事へのリンクをコピー

注意: 本記事では、ソフトウェアのステップバイステップのチュートリアルに加え、モデル間のベンチマーク検証やコスト分析についても深く掘り下げています。非常に包括的な内容となっているため、ご自身の役割に応じて一部のセクションをスキップすることをお勧めします。

  1. ソフトウェアエンジニア — アプリを一から学び、構築したい方。

    1. 最初から最後まで進めて問題ありませんが、「ディープダイブ(深掘り)」セクションは必要に応じて読み飛ばしてください。

  1. ソフトウェアアーキテクト — TwelveLabsとAWSの統合方法を学びたい方。

    1. 技術的なコードの詳細は読み飛ばし、テクニカルアーキテクチャ図を参照・分析してください。

  1. 意思決定者 — TwelveLabsが自社のビジネスに最適なソリューションであるか検討している方。

    1. ベンチマーク検証とコスト分析に関する「ディープダイブ」トピックへ直接進んでください。

どの役割の方も、私たちが構築したものの全体像を把握するために、少なくともアプリケーションのデモ動画は視聴することを強くお勧めします。


はじめに

もし教師が、従来の静的な講義ビデオを、授業外での学生の学習を豊かにするためのインタラクティブな学習ガイド、チャプター、練習問題に即座に変換できたらどうでしょうか?✨

このチュートリアルでは、TwelveLabsとAWSを使用して「講義コンテンツ分析プラットフォーム」を構築します。これは、教師が静的なビデオコンテンツを1回アップロードするだけで、以下のようなコンテンツに変換できるエンドツーエンドのシステムです。

  1. ターゲットを絞った練習問題

  2. カスタム学習ガイド

  3. タイムスタンプ付きのビデオチャプター 

  4. アクセシビリティ向上のための文字起こし(トランスクリプト)

  5. 講義のペースに関する推奨事項

  6. 詳細なノートおよび要約

  7. その他多数…

システムの核となる部分には、TwelveLabsのPegasusおよびMarengoモデルを採用しており、高度な秒単位のビデオ理解と、包括的なマルチモーダル埋め込み(embeddings)を提供します。これにより、ビデオに正確に適合した極めて関連性の高いコンテンツや、レコメンデーション用の埋め込みを生成できます。 

このマルチモーダル理解はAWS上で構築されており、最新のAWS BedrockとTwelveLabsのパートナーシップにより、TwelveLabsをAWSに簡単に統合し、システムをサポートするための100以上のAWSサービスへアクセスすることが可能になります。

さらに、TwelveLabs PegasusとGoogle Gemini、AWS Novaを可視化して比較することも可能です。各モデルのモデルベンチマーク視覚的な比較、および詳細なコスト分析について深く掘り下げていきます。


アプリケーションデモ

実際の動作を確認したい場合は、チュートリアルを開始する前に、以下のビデオデモをご覧いただくか、このGithubリポジトリのコードを手元に用意して進めてください。

ライブアプリケーションのリンク: https://twelve-labs-education-poc-s7sz.vercel.app/


学習目標

このチュートリアルでは、以下の内容を学びます。

  • TwelveLabsがAWSサービスとどのようにシームレスに統合されるかを学ぶ

  • DynamoDBやS3を含む独自のAWSサービスを設定する

  • 出力推論品質、インデックス作成時間、推論時間などの重要な概念を理解する

  • 市場にある様々なマルチモーダルモデル間の詳細なコスト分析を行う

  • マルチモーダルモデルがフロントエンドのインターフェースで高いパフォーマンスを発揮するための技術アーキテクチャ図と設計の意思決定を分析する


事前準備

  1. Python 3.8以上: Pythonのダウンロード | Python.org

  2. Node.js 3.8以上: Node.js — Node.js®のダウンロード

  3. AWS CLI: AWS CLIの設定 - AWS Command Line Interface

  4. Terraform (任意): Terraformのインストール | Terraform | HashiCorp Developer

  5. TwelveLabs APIキー: 認証 | TwelveLabs

  6. TwelveLabsインデックス: Python SDK | TwelveLabs

  7. AWSアクセスキー: 資格情報 - Boto3 1.40.12 ドキュメント

  8. Google Gemini APIキー: Gemini API キーの使用  |  開発者向け Google AI

  9. PythonおよびJavaScriptの中級レベルの理解。


ローカル環境のセットアップ

1 - リポジトリをローカル環境にプルします。

>> git

2 - ローカルリポジトリからTerraformスクリプトを実行し、必要なAWSリソースをプロビジョニングします。


* AWSとの統合を理解し、手動で各サービスを設定したい場合は、READMEの手動セットアップ手順に従ってください: GitHubリポジトリのREADME

3 - フロントエンドとバックエンドのフォルダーに環境変数を追加します。

.env.local (/frontend/)

TWELVE_LABS_API_KEY=...
NEXT_PUBLIC_TWELVE_LABS_INDEX_ID=...


AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_S3_BUCKET_NAME=twelvelabs-lecture-content-poc
AWS_REGION=us-east-1


GEMINI_API_KEY=...


BLOB_READ_WRITE_TOKEN=...
NEXT_PUBLIC_API_URL

.env (/api/)

TWELVE_LABS_API_KEY=...
TWELVE_LABS_INDEX_ID=...


AWS_ACCESS_KEY=...
AWS_SECRET_ACCESS_KEY=...
AWS_ACCOUNT_ID=...


DYNAMODB_CONTENT_TABLE_NAME=twelvelabs-education-video-poc
DYNAMODB_CONTENT_USER_NAME=twelvelabs-education-user-poc
S3_BUCKET_NAME=twelvelabs-lecture-content-poc


GOOGLE_API_KEY

4 - 仮想環境を作成し、Pythonパッケージをインストールします。

GitHubリポジトリのディレクトリに移動し、次のコマンドを実行します。

>> python -m

次に、仮想環境を有効化し、以下のコマンドを実行して必要なすべてのPython要件ファイルをインストールします。

>> .\venv\Scripts\activate
>> pip install -r

5 - Node.JSのパッケージマネージャー(NPM)を使用して、フロントエンドのサンプルアプリケーションを起動します。

GitHubリポジトリ内のフロントエンドフォルダーにコンソールで移動し、以下を入力します。

>> npm

その後、localhost:3000にアクセスしてサイトを表示します。

* NPMがインストールされていることを確認してください: Node.jsとnpmのダウンロードとインストール | npm Docs

6 - GitHubリポジトリのAPIフォルダー内にある main.py を実行してバックエンドを起動します。

GitHubリポジトリ内のAPIフォルダーにコンソールで移動し、以下を入力します。

これはAWSコンソールやAIモデルに接続するREST APIをホストするため、実行したままにしてください。


フェーズ1: 講義のインデックス作成

素晴らしいです!ローカル環境とAWSインフラストラクチャがセットアップされたので、開始できます。まずは、ビデオを各種クラウドプロバイダーにインデックス登録することから始めましょう。このプロセスのテクニカルアーキテクチャは次のとおりです。

ウェブサイトは、ビデオを受け取るとすぐにブラウザのメモリ内にあるビデオBLOB(Binary Large Object)に変換し、バイトデータに変換できるようにします。このバイトデータは、すべてのコンピュータで理解できる共通の言語として機能し、MP4ファイルに変換した上で、Google Cloud ProviderおよびAWS S3バケットにそれぞれAPIリクエストとともに送信されます。

/frontend/…/api/upload-gemini/route.js (23〜58行目)

// Convert file to buffer
const bytes = await file.arrayBuffer();
const buffer = Buffer.from(bytes);


// Create a temporary file path
const tempFileName = `${userName}-${Date.now()}-${file.name}`;
const tempFilePath = join(tmpdir(), tempFileName);


// Write the buffer to a temporary file
await writeFile(tempFilePath, buffer);


try {
     // Upload file to GCP using Google Client SDK.
     const myfile = await googleClient.files.upload({
          file: tempFilePath,
          config: {
              mimeType: file.type || 'video/mp4'
          },
      });


      return NextResponse.json({
          success: true,
          geminiFileId: myfile.uri,
          fileName: file.name
      });
} finally {
      await writeFile(tempFilePath, ''); 
}

💡 設計上の選択: なぜTwelveLabsにもアップロードしないのですか?それが私たちのメインのマルチモーダルAIモデルなのでは?

これは、TwelveLabsがAWS Bedrockに直接統合された最近のAWSとの提携によるものです。これにより、以下が可能になります。

  1. S3側へのビデオストレージ統合: TwelveLabsモデルは、直接TwelveLabsにアップロードするのではなく、S3バケット内の動画を直接抽出して分析できるようになりました。

  1. データコンプライアンスとセキュリティ: 動画をAWSインフラストラクチャ内に保持したまま、AWSのクラウドコンプライアンス基準を満たすことができるため、TwelveLabsを使用する際に追加のコンプライアンスを気にする必要がなくなります。

  1. 容易な開発者向け統合: TwelveLabsとAWS用のBoto3の個別のSDKをダウンロードする代わりに、すべてBoto3内で対応できるようになります!これにより開発プロセスが簡素化され、本番環境でのコードベースがよりスリムになります。

最近のパートナーシップの詳細については、こちらをご覧ください: TwelveLabs x AWS Amazon Bedrock - Twelve Labs

このビデオをアップロードするクラウドプロバイダーの数を減らすことで、インデックス登録やビデオのアップロード時間が大幅に短縮され、ユーザーはシームレスなエクスペリエンスを体験できます。以下のコードでは、Promise.allを使用してGoogle Cloud ProviderとAWS S3に並行してアップロードしています。

/frontend/…/dashboard/courses/page.js

// Upload asynchronously to all cloud providers.
const [s3UploadResult, geminiUploadResult] = await Promise.all([
    uploadToS3(),
    uploadToGemini(),
]);

💡 設計上の選択: AWS S3バケットのような単一のビデオデータベースを利用する代わりに、なぜGoogleにもアップロードしたのですか?その方が費用を節約できるのでは?

その理由は、Google Geminiなどのプロバイダーが、20MBを超えるファイルを自社のクラウドプロバイダーであるGoogle Cloud Providerにアップロードすることを要求しているためです。これには追加料金が発生します。AWSとの連携前はTwelveLabsインデックスにも動画を保存する必要がありましたが、今回の新しい提携により、動画データをすべて単一のAWSインフラストラクチャに集約できるようになりました

追記: なお、TwelveLabsのネイティブプラットフォームでも、埋め込みビジュアライゼーションなどの強力な機能を提供しています。

最後に、後で簡単に取得できるように、ビデオに関するメタデータをAWS DynamoDBテーブルに保存します。

/api/main.py (71〜79行目)

async def upload_video(video_params: VideoRequest = Depends(get_video_id_from_request)):
    try:
        db_handler = DBHandler()
           db_handler.upload_video_ids(twelve_labs_video_id=video_params.twelve_labs_video_id, s3_key=video_params.s3_key, gemini_file_id=video_params.gemini_file_id)
    except Exception as e:
        return DefaultResponse(status='error', message=str(e), status_code=500)


    return DefaultResponse(status='success', message='Video uploaded successfully', status_code=200)

詳しく知りたい場合は、APIフォルダーのhelpersモジュールを自由に覗いてみてください。ただし、このチュートリアルのコード量が多いため、必須ではありません。以下は、DYNAMODB_CONTENT_TABLE_NAME テーブルにキーをアップロードするために使用される upload_video_ids() メソッドです。

def upload_video_ids(self, twelve_labs_video_id: str, s3_key: str, gemini_file_id: str):


      table_name = os.getenv('DYNAMODB_CONTENT_TABLE_NAME')
           
      if not table_name:
           logger.error("DYNAMODB_TABLE_NAME environment variable not set")
           raise Exception("DYNAMODB_TABLE_NAME environment variable not set")


      table = self.dynamodb.Table(table_name)
      logger.info("DynamoDB table reference obtained")


      item = {
          'video_id': twelve_labs_video_id,
          's3_key': s3_key,
          'gemini_file_id': gemini_file_id,
          'created_at': boto3.dynamodb.types.Decimal(str(int(time.time()))),
      }
           
      logger.info(f"Preparing to upload item: {item}")


      response = table.put_item(Item=item)
      logger.info(f"DynamoDB put_item response: {response}")


      return response

動画をそれぞれのプロバイダーにアップロードできたので、AI推論ステージに送り、学生向けのコンテンツ生成や、教育者向けの改善インサイトの獲得を行う準備が整いました!


フェーズ2: 講義コンテンツのAI推論

ここからはお楽しみのAI推論パートです!TwelveLabsのPegasus API呼び出しのコードスニペットを読む前に、まず呼び出しの背後にある技術アーキテクチャを理解する必要があります。適切なAPIアーキテクチャを選択することは、推論時間が30秒未満で済むか、それとも5分以上かかるかの決定的な違いとなります

上記に示すように、ASGI(Asynchronous Server Gateway Interface)FastAPIエンドポイントを使用して、講義分析の異なる各セクションのコンテンツを生成します。 これは一見些細な細部に見えますが、ユーザーエクスペリエンスにとっては大きな影響を与えます

このAPIエンドポイントを整理しておくために、以下に示すように各種プロバイダーのファクトリクラスを作成します。

/api/providers/llm.py (1〜31行目)

from abc import ABC, abstractmethod


class LLMProvider(ABC):


    @abstractmethod
    def __init__(self, *args, **kwargs):
        pass
   
    @abstractmethod
    def generate_chapters(self):
        pass
   
    @abstractmethod
    def generate_key_takeaways(self):
        pass
   
    @abstractmethod
    def generate_pacing_recommendations(self):
        pass


    @abstractmethod
    def generate_quiz_questions(self):
        pass
   
    @abstractmethod
    def generate_engagement(self):
        pass
   
    @abstractmethod
    def generate_gist(self):
        pass

以下では、ファイル構造がどのように開発されているかと、この抽象クラスを使用する各プロバイダーを確認できます。

/api/providers

これにより、FastAPIサーバー内のAPIエンドポイントは、適切なクラスとメソッドを簡単に呼び出すことができます。

各データポイントを個別のREST APIエンドポイントに分離することにより、AIが結果を返すまでの時間を左右する重要な指標である「推論時間」を個別に測定することができます。また、Pythonにおけるこのクラス設計により、新しいプロバイダーをいかに「安全」に追加できるか、また、どのメソッドが必要なのかを他のメンバーがどれほど簡単に確認できるかがお分かりいただけるでしょう。


ディープダイブ: ベンチマーク検証 & コスト分析

結果をお見せるする前に、どのようにモデルのベンチマークをとっているかを理解することが重要です。

  1. TopP、topK、temperature、その他カスタムモデルの推論設定は初期値のままにしています。

    1. 通常、デフォルトの設定が「一般的なユースケース」においてモデルが最も最適に動作する状態です。 

    2. 各設定についての詳細: Temperature, Top-P, Top-K: A Comprehensive Guide | MoonlightDevs - Tech Blog (提供: MoonlightDevs)

  1. すべてのモデルに同じプロンプトを入力し、各コンテンツセクションにおいて公平な比較を行います。

    1. プロンプトは /api/helpers/prompts.py フォルダで確認できます。

  1. 構造化出力をサポートするモデルには、Pydanticによる支援を行います。

    1. これはJSONスキーマの出力を保証するための一般的な開発者向けツールです。これが提供されていない場合、スキーマ出力はエンジニア泣かせの複雑なオブジェクト生成となってしまい、多くの場合それは開発者にとっての設計上の課題となります。

    2. Pydanticの動作についての詳細はこちら: Welcome to Pydantic - Pydantic

  1. すべてのモデルに同じ動画を入力します: https://www.youtube.com/watch?v=5LeZflr8Zfs

以上の前置きを踏まえて、出力の推論品質についての結果を見てみましょう! これは、生成されるコンテンツのフォーマットや正確性を決定づける主な指標となります。

上記を見るとわかるように、モデルごとに品質に様々な違いが見られます。もちろん、この「品質」という指標は完全にユースケースに依存しますが、このYouTube動画に基づくテイクアウェイ(要点)は以下の通りです。

  1. Google Gemini: 非常に正確ですが、厳密さに欠ける部分があります。ビデオ内の詳細をすべてリストアップしてしまわないように、ファインチューニングとプロンプト調整が必要です。推奨タグが過剰にリストアップされたため、タグに依存する推奨システムとしては過剰な推薦につながる危険性があります。

  1. AWS Nova: 非常に正確で厳密ですが、構造化出力に関して物足りなさを感じます。執筆時点のAWS NovaはPydanticを使用した構造化出力をサポートしておらず、温度調整(temperature)やプロンプト指示による強引な調整が必要になってしまいます。 

    1. 詳細情報: 構造化出力の要件 - Amazon Nova

  1. TwelveLabs: 正確さと厳密さのバランスが良く、しかも高精度な構造化出力を提供しています。トピックの数はもう少し詳細であってもよかったかもしれませんが、プロンプトで「少なくとも1つのトピック」と指定していたため、これはプロンプトの調整次第で改善できます。

次に、より客観的な指標である、各モデルの推論時間についてです。

上記を見るとわかるように、TwelveLabsとGoogleのモデルの生成時間は非常に近いものでした。ただし、いくつかの重要な違いを挙げる必要があります。

  1. TwelveLabsのキャッシュデータ: TwelveLabsでは、文字起こし(トランスクリプト)と要約(gist)がほぼ瞬時に読み込まれることにお気づきかもしれません。これは、ビデオタイトルなどの共通情報は常に必要になると認識しているため、プラットフォーム内部でデータをキャッシュし、ほぼ瞬時の取得を実現しているためです

  1. 長文コンテンツ vs. 短文コンテンツ

    1. Geminiは長文テキストコンテンツの生成において高速です。チャプターやタイムスタンプが必要な重要事項など、より長文のJSON構造データの出力で優位に立っていることが分かります。

    2. TwelveLabsは、箇条書き(弾丸ポイント)や一言サマリーのような短文のコンテンツ生成において高速です。

最後に最重要パートである、各モデルのコスト分析です!公平かつ簡単に進めるため、1時間の動画を例にとり、各プロバイダーそれぞれのドキュメントを参考にして計算します。

* 推論API呼び出し回数: 8回(カテゴリーごとに1回)

  1. TwelveLabs: $2.79

    1. 算出方法: TwelveLabs | 料金計算ツール

    2. ビデオアップロード時間 = 1時間

    3. 埋め込みAPIの利用は「なし」(他のモデルとの公正な比較のため余計な埋め込みはしていません)

    4. 分析APIの利用数 = 8回(各カテゴリーデータに1回分)

    5. 検索APIの利用数 = 0

  1. Google Gemini: $10.62(GCP上のインフラ手数料を除く料金)

    1. Google Geminiはトークンベースの課金であり、入力と出力トークンの量に依存します。

    2. 公式ドキュメント: トークン数の理解とカウント  |  Gemini API  |  Google AI for Developers

      1. 動画1秒あたり、およそ295トークンを消費します。

      2. 100万トークンあたり$1.25

      3. 1時間のビデオでのトークン量:3,600秒 * 295トークン/秒 = 1,062,000トークン

    3. 計算式: (1,062,000 / 1,000,000) * 1.25 * 8回 = $10.62

  1. AWS Nova: $0.22(AWSインフラの利用手数料を除く料金)

    1. トークンについて: ビデオ理解 - Amazon Nova

      1. 1時間のビデオに対して 276,480 トークン ほど消費すると試算されています。

    2. 料金設定について: AWS Bedrockの料金設定

      1. AWS Nova Pro モデル = 1,000入力トークンあたり$0.0008

    3. 計算式: (276,480 / 1,000) * 0.0008 = $0.22

以下は、比較して最適な結論を導くための、各インサイトを一覧にしたテーブルです。

指標

TwelveLabs

Google Gemini

AWS Nova

出力推論品質

バランス良く構造化されている: 正確さと厳密さの良いミックス。

🎯 正確だが冗長: 高い精度を持つ反面、詳細やタグをすべて並び立ててしまう傾向があります。

⚙️ 正確だが構造化されていない: 高い正確性と精密性を持ちますが、フォーマットの処理に苦労します。

構造化出力の対応

可能(信頼性:高): ネイティブ環境で構造化データを確実に返します。

可能(信頼性:高): ネイティブ環境で構造化データを確実に返します。

難(信頼性:低): 構造化出力が保証されておらず、レスポンスを別途手動でプログラム解析する開発負担が増えます。

推論にかかる時間

高速(特にキャッシュ時): 短文フォーマットへの対応や、インデックスに登録されている共通データの取得が高速です。

高速(長文コンテンツ時): 全般的な速度は同じくらいですが、長文かつ複雑なコンテンツの生成で一歩リードしています。

平均的: 瞬間的には速い場合もありますが、多くの場合他のモデルと比べて完了まで追加で10〜20秒かかります。

キャッシュの仕組み

あり: 動画をアップロードすると、書き起こしや要約などを事前に処理・キャッシュし、即アクセスできるように設計されています。

なし: クエリを実行するたびに動画全体の再処理が発生します。

なし: クエリを実行するたびに動画全体の再処理が発生します。

料金(コスト)

💸💸 $2.79

💸💸💸 $10.62

💵 $0.22

料金請求モデル

時間ベース & 呼び出し回数: 動画の長さに応じて1度請求されたあと、分析ごとの少額手数料が発生します。

トークン従量課金: 個別のクエリを実行するたびに動画全体のトークンコストが発生します。

トークン従量課金: 個別のクエリを実行するたびに動画全体のトークンコストが発生します。

追加料金の目安

(プラットフォーム内に全て込み)

GCPインフラ利用料金

AWSインフラ利用料金

もちろん、各モデルは日々進歩を続けており、これらの検証数値も変わっていきます。しかし、この講義コンテンツ分析プラットフォームを活用すれば、あなた自身の実際の講義動画などを使って直接テストして、どの動画理解モデルが一番相性が良いのかを自分の目で確認できます!


フェーズ3: 学生へのフィードバックループとクラスルーム全体の傾向抽出

いよいよ最後のセクションです。ここでは、教育現場でのフィードバックを反映するフィードバックループを構築し、教師がクラス全体の状況を把握できるようにする仕組みと、TwelveLabsがAWSテクノロジースタックにどのように統合できるかを実際に体験します。

上の画像で確認できるように、学生側はTwelveLabsにより生成された練習問題やチャプター表示、要約などの豊富なデータに直接アクセスできるようになりました。TwelveLabsのPegasusモデルの能力と、AWSの確実な配信インフラが組み合わさることで、作成に何時間もかかっていた自習用の教材が一瞬で作成できる仕組みです。 

学生がこの練習問題を解き、講義ビデオを見終えると、彼らに以下のようなパーソナライズされた学習状況レポートが送られます。:

  1. チャプターごとのクイズ成果 — どこの部分を間違えたか、具体的な課題を明確にする詳細レポート。

  1. 個人用の学習お勧めプラン — 苦手箇所の克服に必要な箇所をピンポイントでおすすめします。

  1. 推奨される別の講義動画 — TwelveLabsのMarengoモデルが作成した「意味の似ている」埋め込み情報をベースとし、S3に保存されているアーカイブ群から自動マッチングします。

  1. 理解度スコア表示 — 課題・トピックごとの点数評価を視覚的に示します。

こうした機能のアイデアを踏まえた上で、実際にこれがどのようにサーバー側のアーキテクチャ上で組み上がっているのか、そしてなぜAWSと強固に一体化することがこのようなプロダクトの鍵となるのかを見てみましょう。

このアーキテクチャ図に描かれている通り、私たちはAWS Bedrock経由でClaude 3.5 Sonnetを利用しています。何らかの新しいサードパーティ製ライブラリのセットアップなどをすることなく、純粋にAWS DynamoDB内に保存されているデータをベースにして、思考力に優れたこの最新の大規模言語モデルを用いて直接データ操作を実行できている点に注目してください。

さらに、学生のインプットを助けるために、ベクトル検索による動画レコメンデーション機能を統合しています。TwelveLabsのMarengoモデルを使って、動画内容の「意味合い」を深く捉えた情報の濃いベクトル埋め込み空間データを構築し、これをユークリッド距離に基づく「k近傍法(K-nearest neighbor search / KNN)」を使用してデータベースから探し出します。

/api/helpers/reasoning.py (262〜289行目)

def fetch_related_videos(self, video_id: str):

        # Fetch original video from S3 Bucket.
        presigned_urls = DBHandler().fetch_s3_presigned_urls()
       
        # Fetch embedding stored in Marengo Model
        video_object = self.twelvelabs_client.index.video.retrieve(index_id=os.getenv('TWELVE_LABS_INDEX_ID'), id=video_id, embedding_option=['visual-text'])
        video_duration = video_object.system_metadata.duration
        video_embedding_segments = video_object.embedding.video_embedding.segments
       
        combined_embedding = np.array([])
        for segment in video_embedding_segments:
            combined_embedding = np.concatenate([combined_embedding, segment.embeddings_float])
       
        # Generate embeddings of other YouTube videos.
        other_video_embeddings = {}
        for video_url in presigned_urls:
            video_embedding = self.generate_new_video_embeddings(video_url, combined_embedding, video_duration)
            other_video_embeddings[video_url] = video_embedding


        # Conduct K-Nearest Neighbor Search with Euclidian Distance.
        knn_results = self.knn_search(combined_embedding, other_video_embeddings, 5)
       
        return knn_results

これらの非常に洗練された機能群が、一貫した1つのAPI/プラットフォーム環境(AWS)内だけで構築されていることを今一度実感してください。これによって開発作業は大幅に合理化され、企業クラスのデータ保護基準を簡単に実装することが可能になります。

そして、学生たちが問題を提出し終えると、教師用ダッシュボードにはクラス全体の提出結果が蓄積され、クラスの総合傾向の分析を開始できます。

この理想的なフィードバックループにより、生徒側は先進的なAIによる支援コンテンツで学びを深め、同時に教師側は個々の理解データを手元に置いて次なる授業をどう設計するかの準備時間を大幅に節約することができます。 

これらすべてが、ビデオの「コンテクストを真に正確に理解できる」TwelveLabsをはじめとする動画理解AIの圧倒的な性能、そして、従来なら数日を要していたコンテンツ作成業務を瞬座に自動化する力のおかげです。


まとめ

ここまでお読みいただきありがとうございます!本チュートリアルを通じて、教育現場という舞台でTwelveLabsがいかに威力を発揮できるかを体験いただけただけでなく、以下のような様々な有意義な学びを得られたかと思います。:

  1. TwelveLabsとAWSのインライン連携 — TwelveLabsがAWS Bedrock経由で利用できるようになり、インフラの一体管理と、開発の圧倒的なスムーズさを両立するのがどれほど画期的であるかについて理解しました。

  1. 開発における設計選定の基準 — 単に技術的な性能や話題性だけでなく、実際のコスト管理やユーザーへのラグを如何に避けるかというビジネス要件に基づいたサーバー・言語設計の思考力を養いました。

  1. 実際のモデル検証結果 — 動画市場を引っ張る代表的なAIモデルの出力の質の特色、それからコスト試算方法を確認し、明日から作る新しいプログラムに導入するベストなモデル選びの目を養いました。

本プロジェクトの設計にあたってさらに細かく把握しておきたい場合は、下記資料へのリンクもそれぞれ整備していますのでご参照ください。:

  1. TwelveLabs向けテクニカルレポート全文: Googleドキュメントを見る

  1. 詳細なシステムのシーケンス・アーキテクチャ図: LucidChartsで開く

  1. 提供API一覧、およびそのエンドポイント詳細ドキュメント: Googleドキュメントを見る

  1. 完成版のソースコードがあるGitHubリポジトリ: https://github.com/nathanchess/twelve-labs-education-poc 

  1. 実際の動作をブラウザ上で検証できる本番動作検証URL: https://twelve-labs-education-poc-s7sz.vercel.app/ 

TwelveLabsの高度な動画の文脈理解能力と、日々世界中で使用されている安定したAWSのコンピュートプラットフォーム、それを彩る周辺ソリューションを正しく組み合わせることで、私たちは教育業界にとどまらずあらゆる領域で、最先端のビジネス向け情報処理システムを自らの手でつくり上げることができるようになります。

注意: 本記事では、ソフトウェアのステップバイステップのチュートリアルに加え、モデル間のベンチマーク検証やコスト分析についても深く掘り下げています。非常に包括的な内容となっているため、ご自身の役割に応じて一部のセクションをスキップすることをお勧めします。

  1. ソフトウェアエンジニア — アプリを一から学び、構築したい方。

    1. 最初から最後まで進めて問題ありませんが、「ディープダイブ(深掘り)」セクションは必要に応じて読み飛ばしてください。

  1. ソフトウェアアーキテクト — TwelveLabsとAWSの統合方法を学びたい方。

    1. 技術的なコードの詳細は読み飛ばし、テクニカルアーキテクチャ図を参照・分析してください。

  1. 意思決定者 — TwelveLabsが自社のビジネスに最適なソリューションであるか検討している方。

    1. ベンチマーク検証とコスト分析に関する「ディープダイブ」トピックへ直接進んでください。

どの役割の方も、私たちが構築したものの全体像を把握するために、少なくともアプリケーションのデモ動画は視聴することを強くお勧めします。


はじめに

もし教師が、従来の静的な講義ビデオを、授業外での学生の学習を豊かにするためのインタラクティブな学習ガイド、チャプター、練習問題に即座に変換できたらどうでしょうか?✨

このチュートリアルでは、TwelveLabsとAWSを使用して「講義コンテンツ分析プラットフォーム」を構築します。これは、教師が静的なビデオコンテンツを1回アップロードするだけで、以下のようなコンテンツに変換できるエンドツーエンドのシステムです。

  1. ターゲットを絞った練習問題

  2. カスタム学習ガイド

  3. タイムスタンプ付きのビデオチャプター 

  4. アクセシビリティ向上のための文字起こし(トランスクリプト)

  5. 講義のペースに関する推奨事項

  6. 詳細なノートおよび要約

  7. その他多数…

システムの核となる部分には、TwelveLabsのPegasusおよびMarengoモデルを採用しており、高度な秒単位のビデオ理解と、包括的なマルチモーダル埋め込み(embeddings)を提供します。これにより、ビデオに正確に適合した極めて関連性の高いコンテンツや、レコメンデーション用の埋め込みを生成できます。 

このマルチモーダル理解はAWS上で構築されており、最新のAWS BedrockとTwelveLabsのパートナーシップにより、TwelveLabsをAWSに簡単に統合し、システムをサポートするための100以上のAWSサービスへアクセスすることが可能になります。

さらに、TwelveLabs PegasusとGoogle Gemini、AWS Novaを可視化して比較することも可能です。各モデルのモデルベンチマーク視覚的な比較、および詳細なコスト分析について深く掘り下げていきます。


アプリケーションデモ

実際の動作を確認したい場合は、チュートリアルを開始する前に、以下のビデオデモをご覧いただくか、このGithubリポジトリのコードを手元に用意して進めてください。

ライブアプリケーションのリンク: https://twelve-labs-education-poc-s7sz.vercel.app/


学習目標

このチュートリアルでは、以下の内容を学びます。

  • TwelveLabsがAWSサービスとどのようにシームレスに統合されるかを学ぶ

  • DynamoDBやS3を含む独自のAWSサービスを設定する

  • 出力推論品質、インデックス作成時間、推論時間などの重要な概念を理解する

  • 市場にある様々なマルチモーダルモデル間の詳細なコスト分析を行う

  • マルチモーダルモデルがフロントエンドのインターフェースで高いパフォーマンスを発揮するための技術アーキテクチャ図と設計の意思決定を分析する


事前準備

  1. Python 3.8以上: Pythonのダウンロード | Python.org

  2. Node.js 3.8以上: Node.js — Node.js®のダウンロード

  3. AWS CLI: AWS CLIの設定 - AWS Command Line Interface

  4. Terraform (任意): Terraformのインストール | Terraform | HashiCorp Developer

  5. TwelveLabs APIキー: 認証 | TwelveLabs

  6. TwelveLabsインデックス: Python SDK | TwelveLabs

  7. AWSアクセスキー: 資格情報 - Boto3 1.40.12 ドキュメント

  8. Google Gemini APIキー: Gemini API キーの使用  |  開発者向け Google AI

  9. PythonおよびJavaScriptの中級レベルの理解。


ローカル環境のセットアップ

1 - リポジトリをローカル環境にプルします。

>> git

2 - ローカルリポジトリからTerraformスクリプトを実行し、必要なAWSリソースをプロビジョニングします。


* AWSとの統合を理解し、手動で各サービスを設定したい場合は、READMEの手動セットアップ手順に従ってください: GitHubリポジトリのREADME

3 - フロントエンドとバックエンドのフォルダーに環境変数を追加します。

.env.local (/frontend/)

TWELVE_LABS_API_KEY=...
NEXT_PUBLIC_TWELVE_LABS_INDEX_ID=...


AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_S3_BUCKET_NAME=twelvelabs-lecture-content-poc
AWS_REGION=us-east-1


GEMINI_API_KEY=...


BLOB_READ_WRITE_TOKEN=...
NEXT_PUBLIC_API_URL

.env (/api/)

TWELVE_LABS_API_KEY=...
TWELVE_LABS_INDEX_ID=...


AWS_ACCESS_KEY=...
AWS_SECRET_ACCESS_KEY=...
AWS_ACCOUNT_ID=...


DYNAMODB_CONTENT_TABLE_NAME=twelvelabs-education-video-poc
DYNAMODB_CONTENT_USER_NAME=twelvelabs-education-user-poc
S3_BUCKET_NAME=twelvelabs-lecture-content-poc


GOOGLE_API_KEY

4 - 仮想環境を作成し、Pythonパッケージをインストールします。

GitHubリポジトリのディレクトリに移動し、次のコマンドを実行します。

>> python -m

次に、仮想環境を有効化し、以下のコマンドを実行して必要なすべてのPython要件ファイルをインストールします。

>> .\venv\Scripts\activate
>> pip install -r

5 - Node.JSのパッケージマネージャー(NPM)を使用して、フロントエンドのサンプルアプリケーションを起動します。

GitHubリポジトリ内のフロントエンドフォルダーにコンソールで移動し、以下を入力します。

>> npm

その後、localhost:3000にアクセスしてサイトを表示します。

* NPMがインストールされていることを確認してください: Node.jsとnpmのダウンロードとインストール | npm Docs

6 - GitHubリポジトリのAPIフォルダー内にある main.py を実行してバックエンドを起動します。

GitHubリポジトリ内のAPIフォルダーにコンソールで移動し、以下を入力します。

これはAWSコンソールやAIモデルに接続するREST APIをホストするため、実行したままにしてください。


フェーズ1: 講義のインデックス作成

素晴らしいです!ローカル環境とAWSインフラストラクチャがセットアップされたので、開始できます。まずは、ビデオを各種クラウドプロバイダーにインデックス登録することから始めましょう。このプロセスのテクニカルアーキテクチャは次のとおりです。

ウェブサイトは、ビデオを受け取るとすぐにブラウザのメモリ内にあるビデオBLOB(Binary Large Object)に変換し、バイトデータに変換できるようにします。このバイトデータは、すべてのコンピュータで理解できる共通の言語として機能し、MP4ファイルに変換した上で、Google Cloud ProviderおよびAWS S3バケットにそれぞれAPIリクエストとともに送信されます。

/frontend/…/api/upload-gemini/route.js (23〜58行目)

// Convert file to buffer
const bytes = await file.arrayBuffer();
const buffer = Buffer.from(bytes);


// Create a temporary file path
const tempFileName = `${userName}-${Date.now()}-${file.name}`;
const tempFilePath = join(tmpdir(), tempFileName);


// Write the buffer to a temporary file
await writeFile(tempFilePath, buffer);


try {
     // Upload file to GCP using Google Client SDK.
     const myfile = await googleClient.files.upload({
          file: tempFilePath,
          config: {
              mimeType: file.type || 'video/mp4'
          },
      });


      return NextResponse.json({
          success: true,
          geminiFileId: myfile.uri,
          fileName: file.name
      });
} finally {
      await writeFile(tempFilePath, ''); 
}

💡 設計上の選択: なぜTwelveLabsにもアップロードしないのですか?それが私たちのメインのマルチモーダルAIモデルなのでは?

これは、TwelveLabsがAWS Bedrockに直接統合された最近のAWSとの提携によるものです。これにより、以下が可能になります。

  1. S3側へのビデオストレージ統合: TwelveLabsモデルは、直接TwelveLabsにアップロードするのではなく、S3バケット内の動画を直接抽出して分析できるようになりました。

  1. データコンプライアンスとセキュリティ: 動画をAWSインフラストラクチャ内に保持したまま、AWSのクラウドコンプライアンス基準を満たすことができるため、TwelveLabsを使用する際に追加のコンプライアンスを気にする必要がなくなります。

  1. 容易な開発者向け統合: TwelveLabsとAWS用のBoto3の個別のSDKをダウンロードする代わりに、すべてBoto3内で対応できるようになります!これにより開発プロセスが簡素化され、本番環境でのコードベースがよりスリムになります。

最近のパートナーシップの詳細については、こちらをご覧ください: TwelveLabs x AWS Amazon Bedrock - Twelve Labs

このビデオをアップロードするクラウドプロバイダーの数を減らすことで、インデックス登録やビデオのアップロード時間が大幅に短縮され、ユーザーはシームレスなエクスペリエンスを体験できます。以下のコードでは、Promise.allを使用してGoogle Cloud ProviderとAWS S3に並行してアップロードしています。

/frontend/…/dashboard/courses/page.js

// Upload asynchronously to all cloud providers.
const [s3UploadResult, geminiUploadResult] = await Promise.all([
    uploadToS3(),
    uploadToGemini(),
]);

💡 設計上の選択: AWS S3バケットのような単一のビデオデータベースを利用する代わりに、なぜGoogleにもアップロードしたのですか?その方が費用を節約できるのでは?

その理由は、Google Geminiなどのプロバイダーが、20MBを超えるファイルを自社のクラウドプロバイダーであるGoogle Cloud Providerにアップロードすることを要求しているためです。これには追加料金が発生します。AWSとの連携前はTwelveLabsインデックスにも動画を保存する必要がありましたが、今回の新しい提携により、動画データをすべて単一のAWSインフラストラクチャに集約できるようになりました

追記: なお、TwelveLabsのネイティブプラットフォームでも、埋め込みビジュアライゼーションなどの強力な機能を提供しています。

最後に、後で簡単に取得できるように、ビデオに関するメタデータをAWS DynamoDBテーブルに保存します。

/api/main.py (71〜79行目)

async def upload_video(video_params: VideoRequest = Depends(get_video_id_from_request)):
    try:
        db_handler = DBHandler()
           db_handler.upload_video_ids(twelve_labs_video_id=video_params.twelve_labs_video_id, s3_key=video_params.s3_key, gemini_file_id=video_params.gemini_file_id)
    except Exception as e:
        return DefaultResponse(status='error', message=str(e), status_code=500)


    return DefaultResponse(status='success', message='Video uploaded successfully', status_code=200)

詳しく知りたい場合は、APIフォルダーのhelpersモジュールを自由に覗いてみてください。ただし、このチュートリアルのコード量が多いため、必須ではありません。以下は、DYNAMODB_CONTENT_TABLE_NAME テーブルにキーをアップロードするために使用される upload_video_ids() メソッドです。

def upload_video_ids(self, twelve_labs_video_id: str, s3_key: str, gemini_file_id: str):


      table_name = os.getenv('DYNAMODB_CONTENT_TABLE_NAME')
           
      if not table_name:
           logger.error("DYNAMODB_TABLE_NAME environment variable not set")
           raise Exception("DYNAMODB_TABLE_NAME environment variable not set")


      table = self.dynamodb.Table(table_name)
      logger.info("DynamoDB table reference obtained")


      item = {
          'video_id': twelve_labs_video_id,
          's3_key': s3_key,
          'gemini_file_id': gemini_file_id,
          'created_at': boto3.dynamodb.types.Decimal(str(int(time.time()))),
      }
           
      logger.info(f"Preparing to upload item: {item}")


      response = table.put_item(Item=item)
      logger.info(f"DynamoDB put_item response: {response}")


      return response

動画をそれぞれのプロバイダーにアップロードできたので、AI推論ステージに送り、学生向けのコンテンツ生成や、教育者向けの改善インサイトの獲得を行う準備が整いました!


フェーズ2: 講義コンテンツのAI推論

ここからはお楽しみのAI推論パートです!TwelveLabsのPegasus API呼び出しのコードスニペットを読む前に、まず呼び出しの背後にある技術アーキテクチャを理解する必要があります。適切なAPIアーキテクチャを選択することは、推論時間が30秒未満で済むか、それとも5分以上かかるかの決定的な違いとなります

上記に示すように、ASGI(Asynchronous Server Gateway Interface)FastAPIエンドポイントを使用して、講義分析の異なる各セクションのコンテンツを生成します。 これは一見些細な細部に見えますが、ユーザーエクスペリエンスにとっては大きな影響を与えます

このAPIエンドポイントを整理しておくために、以下に示すように各種プロバイダーのファクトリクラスを作成します。

/api/providers/llm.py (1〜31行目)

from abc import ABC, abstractmethod


class LLMProvider(ABC):


    @abstractmethod
    def __init__(self, *args, **kwargs):
        pass
   
    @abstractmethod
    def generate_chapters(self):
        pass
   
    @abstractmethod
    def generate_key_takeaways(self):
        pass
   
    @abstractmethod
    def generate_pacing_recommendations(self):
        pass


    @abstractmethod
    def generate_quiz_questions(self):
        pass
   
    @abstractmethod
    def generate_engagement(self):
        pass
   
    @abstractmethod
    def generate_gist(self):
        pass

以下では、ファイル構造がどのように開発されているかと、この抽象クラスを使用する各プロバイダーを確認できます。

/api/providers

これにより、FastAPIサーバー内のAPIエンドポイントは、適切なクラスとメソッドを簡単に呼び出すことができます。

各データポイントを個別のREST APIエンドポイントに分離することにより、AIが結果を返すまでの時間を左右する重要な指標である「推論時間」を個別に測定することができます。また、Pythonにおけるこのクラス設計により、新しいプロバイダーをいかに「安全」に追加できるか、また、どのメソッドが必要なのかを他のメンバーがどれほど簡単に確認できるかがお分かりいただけるでしょう。


ディープダイブ: ベンチマーク検証 & コスト分析

結果をお見せるする前に、どのようにモデルのベンチマークをとっているかを理解することが重要です。

  1. TopP、topK、temperature、その他カスタムモデルの推論設定は初期値のままにしています。

    1. 通常、デフォルトの設定が「一般的なユースケース」においてモデルが最も最適に動作する状態です。 

    2. 各設定についての詳細: Temperature, Top-P, Top-K: A Comprehensive Guide | MoonlightDevs - Tech Blog (提供: MoonlightDevs)

  1. すべてのモデルに同じプロンプトを入力し、各コンテンツセクションにおいて公平な比較を行います。

    1. プロンプトは /api/helpers/prompts.py フォルダで確認できます。

  1. 構造化出力をサポートするモデルには、Pydanticによる支援を行います。

    1. これはJSONスキーマの出力を保証するための一般的な開発者向けツールです。これが提供されていない場合、スキーマ出力はエンジニア泣かせの複雑なオブジェクト生成となってしまい、多くの場合それは開発者にとっての設計上の課題となります。

    2. Pydanticの動作についての詳細はこちら: Welcome to Pydantic - Pydantic

  1. すべてのモデルに同じ動画を入力します: https://www.youtube.com/watch?v=5LeZflr8Zfs

以上の前置きを踏まえて、出力の推論品質についての結果を見てみましょう! これは、生成されるコンテンツのフォーマットや正確性を決定づける主な指標となります。

上記を見るとわかるように、モデルごとに品質に様々な違いが見られます。もちろん、この「品質」という指標は完全にユースケースに依存しますが、このYouTube動画に基づくテイクアウェイ(要点)は以下の通りです。

  1. Google Gemini: 非常に正確ですが、厳密さに欠ける部分があります。ビデオ内の詳細をすべてリストアップしてしまわないように、ファインチューニングとプロンプト調整が必要です。推奨タグが過剰にリストアップされたため、タグに依存する推奨システムとしては過剰な推薦につながる危険性があります。

  1. AWS Nova: 非常に正確で厳密ですが、構造化出力に関して物足りなさを感じます。執筆時点のAWS NovaはPydanticを使用した構造化出力をサポートしておらず、温度調整(temperature)やプロンプト指示による強引な調整が必要になってしまいます。 

    1. 詳細情報: 構造化出力の要件 - Amazon Nova

  1. TwelveLabs: 正確さと厳密さのバランスが良く、しかも高精度な構造化出力を提供しています。トピックの数はもう少し詳細であってもよかったかもしれませんが、プロンプトで「少なくとも1つのトピック」と指定していたため、これはプロンプトの調整次第で改善できます。

次に、より客観的な指標である、各モデルの推論時間についてです。

上記を見るとわかるように、TwelveLabsとGoogleのモデルの生成時間は非常に近いものでした。ただし、いくつかの重要な違いを挙げる必要があります。

  1. TwelveLabsのキャッシュデータ: TwelveLabsでは、文字起こし(トランスクリプト)と要約(gist)がほぼ瞬時に読み込まれることにお気づきかもしれません。これは、ビデオタイトルなどの共通情報は常に必要になると認識しているため、プラットフォーム内部でデータをキャッシュし、ほぼ瞬時の取得を実現しているためです

  1. 長文コンテンツ vs. 短文コンテンツ

    1. Geminiは長文テキストコンテンツの生成において高速です。チャプターやタイムスタンプが必要な重要事項など、より長文のJSON構造データの出力で優位に立っていることが分かります。

    2. TwelveLabsは、箇条書き(弾丸ポイント)や一言サマリーのような短文のコンテンツ生成において高速です。

最後に最重要パートである、各モデルのコスト分析です!公平かつ簡単に進めるため、1時間の動画を例にとり、各プロバイダーそれぞれのドキュメントを参考にして計算します。

* 推論API呼び出し回数: 8回(カテゴリーごとに1回)

  1. TwelveLabs: $2.79

    1. 算出方法: TwelveLabs | 料金計算ツール

    2. ビデオアップロード時間 = 1時間

    3. 埋め込みAPIの利用は「なし」(他のモデルとの公正な比較のため余計な埋め込みはしていません)

    4. 分析APIの利用数 = 8回(各カテゴリーデータに1回分)

    5. 検索APIの利用数 = 0

  1. Google Gemini: $10.62(GCP上のインフラ手数料を除く料金)

    1. Google Geminiはトークンベースの課金であり、入力と出力トークンの量に依存します。

    2. 公式ドキュメント: トークン数の理解とカウント  |  Gemini API  |  Google AI for Developers

      1. 動画1秒あたり、およそ295トークンを消費します。

      2. 100万トークンあたり$1.25

      3. 1時間のビデオでのトークン量:3,600秒 * 295トークン/秒 = 1,062,000トークン

    3. 計算式: (1,062,000 / 1,000,000) * 1.25 * 8回 = $10.62

  1. AWS Nova: $0.22(AWSインフラの利用手数料を除く料金)

    1. トークンについて: ビデオ理解 - Amazon Nova

      1. 1時間のビデオに対して 276,480 トークン ほど消費すると試算されています。

    2. 料金設定について: AWS Bedrockの料金設定

      1. AWS Nova Pro モデル = 1,000入力トークンあたり$0.0008

    3. 計算式: (276,480 / 1,000) * 0.0008 = $0.22

以下は、比較して最適な結論を導くための、各インサイトを一覧にしたテーブルです。

指標

TwelveLabs

Google Gemini

AWS Nova

出力推論品質

バランス良く構造化されている: 正確さと厳密さの良いミックス。

🎯 正確だが冗長: 高い精度を持つ反面、詳細やタグをすべて並び立ててしまう傾向があります。

⚙️ 正確だが構造化されていない: 高い正確性と精密性を持ちますが、フォーマットの処理に苦労します。

構造化出力の対応

可能(信頼性:高): ネイティブ環境で構造化データを確実に返します。

可能(信頼性:高): ネイティブ環境で構造化データを確実に返します。

難(信頼性:低): 構造化出力が保証されておらず、レスポンスを別途手動でプログラム解析する開発負担が増えます。

推論にかかる時間

高速(特にキャッシュ時): 短文フォーマットへの対応や、インデックスに登録されている共通データの取得が高速です。

高速(長文コンテンツ時): 全般的な速度は同じくらいですが、長文かつ複雑なコンテンツの生成で一歩リードしています。

平均的: 瞬間的には速い場合もありますが、多くの場合他のモデルと比べて完了まで追加で10〜20秒かかります。

キャッシュの仕組み

あり: 動画をアップロードすると、書き起こしや要約などを事前に処理・キャッシュし、即アクセスできるように設計されています。

なし: クエリを実行するたびに動画全体の再処理が発生します。

なし: クエリを実行するたびに動画全体の再処理が発生します。

料金(コスト)

💸💸 $2.79

💸💸💸 $10.62

💵 $0.22

料金請求モデル

時間ベース & 呼び出し回数: 動画の長さに応じて1度請求されたあと、分析ごとの少額手数料が発生します。

トークン従量課金: 個別のクエリを実行するたびに動画全体のトークンコストが発生します。

トークン従量課金: 個別のクエリを実行するたびに動画全体のトークンコストが発生します。

追加料金の目安

(プラットフォーム内に全て込み)

GCPインフラ利用料金

AWSインフラ利用料金

もちろん、各モデルは日々進歩を続けており、これらの検証数値も変わっていきます。しかし、この講義コンテンツ分析プラットフォームを活用すれば、あなた自身の実際の講義動画などを使って直接テストして、どの動画理解モデルが一番相性が良いのかを自分の目で確認できます!


フェーズ3: 学生へのフィードバックループとクラスルーム全体の傾向抽出

いよいよ最後のセクションです。ここでは、教育現場でのフィードバックを反映するフィードバックループを構築し、教師がクラス全体の状況を把握できるようにする仕組みと、TwelveLabsがAWSテクノロジースタックにどのように統合できるかを実際に体験します。

上の画像で確認できるように、学生側はTwelveLabsにより生成された練習問題やチャプター表示、要約などの豊富なデータに直接アクセスできるようになりました。TwelveLabsのPegasusモデルの能力と、AWSの確実な配信インフラが組み合わさることで、作成に何時間もかかっていた自習用の教材が一瞬で作成できる仕組みです。 

学生がこの練習問題を解き、講義ビデオを見終えると、彼らに以下のようなパーソナライズされた学習状況レポートが送られます。:

  1. チャプターごとのクイズ成果 — どこの部分を間違えたか、具体的な課題を明確にする詳細レポート。

  1. 個人用の学習お勧めプラン — 苦手箇所の克服に必要な箇所をピンポイントでおすすめします。

  1. 推奨される別の講義動画 — TwelveLabsのMarengoモデルが作成した「意味の似ている」埋め込み情報をベースとし、S3に保存されているアーカイブ群から自動マッチングします。

  1. 理解度スコア表示 — 課題・トピックごとの点数評価を視覚的に示します。

こうした機能のアイデアを踏まえた上で、実際にこれがどのようにサーバー側のアーキテクチャ上で組み上がっているのか、そしてなぜAWSと強固に一体化することがこのようなプロダクトの鍵となるのかを見てみましょう。

このアーキテクチャ図に描かれている通り、私たちはAWS Bedrock経由でClaude 3.5 Sonnetを利用しています。何らかの新しいサードパーティ製ライブラリのセットアップなどをすることなく、純粋にAWS DynamoDB内に保存されているデータをベースにして、思考力に優れたこの最新の大規模言語モデルを用いて直接データ操作を実行できている点に注目してください。

さらに、学生のインプットを助けるために、ベクトル検索による動画レコメンデーション機能を統合しています。TwelveLabsのMarengoモデルを使って、動画内容の「意味合い」を深く捉えた情報の濃いベクトル埋め込み空間データを構築し、これをユークリッド距離に基づく「k近傍法(K-nearest neighbor search / KNN)」を使用してデータベースから探し出します。

/api/helpers/reasoning.py (262〜289行目)

def fetch_related_videos(self, video_id: str):

        # Fetch original video from S3 Bucket.
        presigned_urls = DBHandler().fetch_s3_presigned_urls()
       
        # Fetch embedding stored in Marengo Model
        video_object = self.twelvelabs_client.index.video.retrieve(index_id=os.getenv('TWELVE_LABS_INDEX_ID'), id=video_id, embedding_option=['visual-text'])
        video_duration = video_object.system_metadata.duration
        video_embedding_segments = video_object.embedding.video_embedding.segments
       
        combined_embedding = np.array([])
        for segment in video_embedding_segments:
            combined_embedding = np.concatenate([combined_embedding, segment.embeddings_float])
       
        # Generate embeddings of other YouTube videos.
        other_video_embeddings = {}
        for video_url in presigned_urls:
            video_embedding = self.generate_new_video_embeddings(video_url, combined_embedding, video_duration)
            other_video_embeddings[video_url] = video_embedding


        # Conduct K-Nearest Neighbor Search with Euclidian Distance.
        knn_results = self.knn_search(combined_embedding, other_video_embeddings, 5)
       
        return knn_results

これらの非常に洗練された機能群が、一貫した1つのAPI/プラットフォーム環境(AWS)内だけで構築されていることを今一度実感してください。これによって開発作業は大幅に合理化され、企業クラスのデータ保護基準を簡単に実装することが可能になります。

そして、学生たちが問題を提出し終えると、教師用ダッシュボードにはクラス全体の提出結果が蓄積され、クラスの総合傾向の分析を開始できます。

この理想的なフィードバックループにより、生徒側は先進的なAIによる支援コンテンツで学びを深め、同時に教師側は個々の理解データを手元に置いて次なる授業をどう設計するかの準備時間を大幅に節約することができます。 

これらすべてが、ビデオの「コンテクストを真に正確に理解できる」TwelveLabsをはじめとする動画理解AIの圧倒的な性能、そして、従来なら数日を要していたコンテンツ作成業務を瞬座に自動化する力のおかげです。


まとめ

ここまでお読みいただきありがとうございます!本チュートリアルを通じて、教育現場という舞台でTwelveLabsがいかに威力を発揮できるかを体験いただけただけでなく、以下のような様々な有意義な学びを得られたかと思います。:

  1. TwelveLabsとAWSのインライン連携 — TwelveLabsがAWS Bedrock経由で利用できるようになり、インフラの一体管理と、開発の圧倒的なスムーズさを両立するのがどれほど画期的であるかについて理解しました。

  1. 開発における設計選定の基準 — 単に技術的な性能や話題性だけでなく、実際のコスト管理やユーザーへのラグを如何に避けるかというビジネス要件に基づいたサーバー・言語設計の思考力を養いました。

  1. 実際のモデル検証結果 — 動画市場を引っ張る代表的なAIモデルの出力の質の特色、それからコスト試算方法を確認し、明日から作る新しいプログラムに導入するベストなモデル選びの目を養いました。

本プロジェクトの設計にあたってさらに細かく把握しておきたい場合は、下記資料へのリンクもそれぞれ整備していますのでご参照ください。:

  1. TwelveLabs向けテクニカルレポート全文: Googleドキュメントを見る

  1. 詳細なシステムのシーケンス・アーキテクチャ図: LucidChartsで開く

  1. 提供API一覧、およびそのエンドポイント詳細ドキュメント: Googleドキュメントを見る

  1. 完成版のソースコードがあるGitHubリポジトリ: https://github.com/nathanchess/twelve-labs-education-poc 

  1. 実際の動作をブラウザ上で検証できる本番動作検証URL: https://twelve-labs-education-poc-s7sz.vercel.app/ 

TwelveLabsの高度な動画の文脈理解能力と、日々世界中で使用されている安定したAWSのコンピュートプラットフォーム、それを彩る周辺ソリューションを正しく組み合わせることで、私たちは教育業界にとどまらずあらゆる領域で、最先端のビジネス向け情報処理システムを自らの手でつくり上げることができるようになります。

注意: 本記事では、ソフトウェアのステップバイステップのチュートリアルに加え、モデル間のベンチマーク検証やコスト分析についても深く掘り下げています。非常に包括的な内容となっているため、ご自身の役割に応じて一部のセクションをスキップすることをお勧めします。

  1. ソフトウェアエンジニア — アプリを一から学び、構築したい方。

    1. 最初から最後まで進めて問題ありませんが、「ディープダイブ(深掘り)」セクションは必要に応じて読み飛ばしてください。

  1. ソフトウェアアーキテクト — TwelveLabsとAWSの統合方法を学びたい方。

    1. 技術的なコードの詳細は読み飛ばし、テクニカルアーキテクチャ図を参照・分析してください。

  1. 意思決定者 — TwelveLabsが自社のビジネスに最適なソリューションであるか検討している方。

    1. ベンチマーク検証とコスト分析に関する「ディープダイブ」トピックへ直接進んでください。

どの役割の方も、私たちが構築したものの全体像を把握するために、少なくともアプリケーションのデモ動画は視聴することを強くお勧めします。


はじめに

もし教師が、従来の静的な講義ビデオを、授業外での学生の学習を豊かにするためのインタラクティブな学習ガイド、チャプター、練習問題に即座に変換できたらどうでしょうか?✨

このチュートリアルでは、TwelveLabsとAWSを使用して「講義コンテンツ分析プラットフォーム」を構築します。これは、教師が静的なビデオコンテンツを1回アップロードするだけで、以下のようなコンテンツに変換できるエンドツーエンドのシステムです。

  1. ターゲットを絞った練習問題

  2. カスタム学習ガイド

  3. タイムスタンプ付きのビデオチャプター 

  4. アクセシビリティ向上のための文字起こし(トランスクリプト)

  5. 講義のペースに関する推奨事項

  6. 詳細なノートおよび要約

  7. その他多数…

システムの核となる部分には、TwelveLabsのPegasusおよびMarengoモデルを採用しており、高度な秒単位のビデオ理解と、包括的なマルチモーダル埋め込み(embeddings)を提供します。これにより、ビデオに正確に適合した極めて関連性の高いコンテンツや、レコメンデーション用の埋め込みを生成できます。 

このマルチモーダル理解はAWS上で構築されており、最新のAWS BedrockとTwelveLabsのパートナーシップにより、TwelveLabsをAWSに簡単に統合し、システムをサポートするための100以上のAWSサービスへアクセスすることが可能になります。

さらに、TwelveLabs PegasusとGoogle Gemini、AWS Novaを可視化して比較することも可能です。各モデルのモデルベンチマーク視覚的な比較、および詳細なコスト分析について深く掘り下げていきます。


アプリケーションデモ

実際の動作を確認したい場合は、チュートリアルを開始する前に、以下のビデオデモをご覧いただくか、このGithubリポジトリのコードを手元に用意して進めてください。

ライブアプリケーションのリンク: https://twelve-labs-education-poc-s7sz.vercel.app/


学習目標

このチュートリアルでは、以下の内容を学びます。

  • TwelveLabsがAWSサービスとどのようにシームレスに統合されるかを学ぶ

  • DynamoDBやS3を含む独自のAWSサービスを設定する

  • 出力推論品質、インデックス作成時間、推論時間などの重要な概念を理解する

  • 市場にある様々なマルチモーダルモデル間の詳細なコスト分析を行う

  • マルチモーダルモデルがフロントエンドのインターフェースで高いパフォーマンスを発揮するための技術アーキテクチャ図と設計の意思決定を分析する


事前準備

  1. Python 3.8以上: Pythonのダウンロード | Python.org

  2. Node.js 3.8以上: Node.js — Node.js®のダウンロード

  3. AWS CLI: AWS CLIの設定 - AWS Command Line Interface

  4. Terraform (任意): Terraformのインストール | Terraform | HashiCorp Developer

  5. TwelveLabs APIキー: 認証 | TwelveLabs

  6. TwelveLabsインデックス: Python SDK | TwelveLabs

  7. AWSアクセスキー: 資格情報 - Boto3 1.40.12 ドキュメント

  8. Google Gemini APIキー: Gemini API キーの使用  |  開発者向け Google AI

  9. PythonおよびJavaScriptの中級レベルの理解。


ローカル環境のセットアップ

1 - リポジトリをローカル環境にプルします。

>> git

2 - ローカルリポジトリからTerraformスクリプトを実行し、必要なAWSリソースをプロビジョニングします。


* AWSとの統合を理解し、手動で各サービスを設定したい場合は、READMEの手動セットアップ手順に従ってください: GitHubリポジトリのREADME

3 - フロントエンドとバックエンドのフォルダーに環境変数を追加します。

.env.local (/frontend/)

TWELVE_LABS_API_KEY=...
NEXT_PUBLIC_TWELVE_LABS_INDEX_ID=...


AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_S3_BUCKET_NAME=twelvelabs-lecture-content-poc
AWS_REGION=us-east-1


GEMINI_API_KEY=...


BLOB_READ_WRITE_TOKEN=...
NEXT_PUBLIC_API_URL

.env (/api/)

TWELVE_LABS_API_KEY=...
TWELVE_LABS_INDEX_ID=...


AWS_ACCESS_KEY=...
AWS_SECRET_ACCESS_KEY=...
AWS_ACCOUNT_ID=...


DYNAMODB_CONTENT_TABLE_NAME=twelvelabs-education-video-poc
DYNAMODB_CONTENT_USER_NAME=twelvelabs-education-user-poc
S3_BUCKET_NAME=twelvelabs-lecture-content-poc


GOOGLE_API_KEY

4 - 仮想環境を作成し、Pythonパッケージをインストールします。

GitHubリポジトリのディレクトリに移動し、次のコマンドを実行します。

>> python -m

次に、仮想環境を有効化し、以下のコマンドを実行して必要なすべてのPython要件ファイルをインストールします。

>> .\venv\Scripts\activate
>> pip install -r

5 - Node.JSのパッケージマネージャー(NPM)を使用して、フロントエンドのサンプルアプリケーションを起動します。

GitHubリポジトリ内のフロントエンドフォルダーにコンソールで移動し、以下を入力します。

>> npm

その後、localhost:3000にアクセスしてサイトを表示します。

* NPMがインストールされていることを確認してください: Node.jsとnpmのダウンロードとインストール | npm Docs

6 - GitHubリポジトリのAPIフォルダー内にある main.py を実行してバックエンドを起動します。

GitHubリポジトリ内のAPIフォルダーにコンソールで移動し、以下を入力します。

これはAWSコンソールやAIモデルに接続するREST APIをホストするため、実行したままにしてください。


フェーズ1: 講義のインデックス作成

素晴らしいです!ローカル環境とAWSインフラストラクチャがセットアップされたので、開始できます。まずは、ビデオを各種クラウドプロバイダーにインデックス登録することから始めましょう。このプロセスのテクニカルアーキテクチャは次のとおりです。

ウェブサイトは、ビデオを受け取るとすぐにブラウザのメモリ内にあるビデオBLOB(Binary Large Object)に変換し、バイトデータに変換できるようにします。このバイトデータは、すべてのコンピュータで理解できる共通の言語として機能し、MP4ファイルに変換した上で、Google Cloud ProviderおよびAWS S3バケットにそれぞれAPIリクエストとともに送信されます。

/frontend/…/api/upload-gemini/route.js (23〜58行目)

// Convert file to buffer
const bytes = await file.arrayBuffer();
const buffer = Buffer.from(bytes);


// Create a temporary file path
const tempFileName = `${userName}-${Date.now()}-${file.name}`;
const tempFilePath = join(tmpdir(), tempFileName);


// Write the buffer to a temporary file
await writeFile(tempFilePath, buffer);


try {
     // Upload file to GCP using Google Client SDK.
     const myfile = await googleClient.files.upload({
          file: tempFilePath,
          config: {
              mimeType: file.type || 'video/mp4'
          },
      });


      return NextResponse.json({
          success: true,
          geminiFileId: myfile.uri,
          fileName: file.name
      });
} finally {
      await writeFile(tempFilePath, ''); 
}

💡 設計上の選択: なぜTwelveLabsにもアップロードしないのですか?それが私たちのメインのマルチモーダルAIモデルなのでは?

これは、TwelveLabsがAWS Bedrockに直接統合された最近のAWSとの提携によるものです。これにより、以下が可能になります。

  1. S3側へのビデオストレージ統合: TwelveLabsモデルは、直接TwelveLabsにアップロードするのではなく、S3バケット内の動画を直接抽出して分析できるようになりました。

  1. データコンプライアンスとセキュリティ: 動画をAWSインフラストラクチャ内に保持したまま、AWSのクラウドコンプライアンス基準を満たすことができるため、TwelveLabsを使用する際に追加のコンプライアンスを気にする必要がなくなります。

  1. 容易な開発者向け統合: TwelveLabsとAWS用のBoto3の個別のSDKをダウンロードする代わりに、すべてBoto3内で対応できるようになります!これにより開発プロセスが簡素化され、本番環境でのコードベースがよりスリムになります。

最近のパートナーシップの詳細については、こちらをご覧ください: TwelveLabs x AWS Amazon Bedrock - Twelve Labs

このビデオをアップロードするクラウドプロバイダーの数を減らすことで、インデックス登録やビデオのアップロード時間が大幅に短縮され、ユーザーはシームレスなエクスペリエンスを体験できます。以下のコードでは、Promise.allを使用してGoogle Cloud ProviderとAWS S3に並行してアップロードしています。

/frontend/…/dashboard/courses/page.js

// Upload asynchronously to all cloud providers.
const [s3UploadResult, geminiUploadResult] = await Promise.all([
    uploadToS3(),
    uploadToGemini(),
]);

💡 設計上の選択: AWS S3バケットのような単一のビデオデータベースを利用する代わりに、なぜGoogleにもアップロードしたのですか?その方が費用を節約できるのでは?

その理由は、Google Geminiなどのプロバイダーが、20MBを超えるファイルを自社のクラウドプロバイダーであるGoogle Cloud Providerにアップロードすることを要求しているためです。これには追加料金が発生します。AWSとの連携前はTwelveLabsインデックスにも動画を保存する必要がありましたが、今回の新しい提携により、動画データをすべて単一のAWSインフラストラクチャに集約できるようになりました

追記: なお、TwelveLabsのネイティブプラットフォームでも、埋め込みビジュアライゼーションなどの強力な機能を提供しています。

最後に、後で簡単に取得できるように、ビデオに関するメタデータをAWS DynamoDBテーブルに保存します。

/api/main.py (71〜79行目)

async def upload_video(video_params: VideoRequest = Depends(get_video_id_from_request)):
    try:
        db_handler = DBHandler()
           db_handler.upload_video_ids(twelve_labs_video_id=video_params.twelve_labs_video_id, s3_key=video_params.s3_key, gemini_file_id=video_params.gemini_file_id)
    except Exception as e:
        return DefaultResponse(status='error', message=str(e), status_code=500)


    return DefaultResponse(status='success', message='Video uploaded successfully', status_code=200)

詳しく知りたい場合は、APIフォルダーのhelpersモジュールを自由に覗いてみてください。ただし、このチュートリアルのコード量が多いため、必須ではありません。以下は、DYNAMODB_CONTENT_TABLE_NAME テーブルにキーをアップロードするために使用される upload_video_ids() メソッドです。

def upload_video_ids(self, twelve_labs_video_id: str, s3_key: str, gemini_file_id: str):


      table_name = os.getenv('DYNAMODB_CONTENT_TABLE_NAME')
           
      if not table_name:
           logger.error("DYNAMODB_TABLE_NAME environment variable not set")
           raise Exception("DYNAMODB_TABLE_NAME environment variable not set")


      table = self.dynamodb.Table(table_name)
      logger.info("DynamoDB table reference obtained")


      item = {
          'video_id': twelve_labs_video_id,
          's3_key': s3_key,
          'gemini_file_id': gemini_file_id,
          'created_at': boto3.dynamodb.types.Decimal(str(int(time.time()))),
      }
           
      logger.info(f"Preparing to upload item: {item}")


      response = table.put_item(Item=item)
      logger.info(f"DynamoDB put_item response: {response}")


      return response

動画をそれぞれのプロバイダーにアップロードできたので、AI推論ステージに送り、学生向けのコンテンツ生成や、教育者向けの改善インサイトの獲得を行う準備が整いました!


フェーズ2: 講義コンテンツのAI推論

ここからはお楽しみのAI推論パートです!TwelveLabsのPegasus API呼び出しのコードスニペットを読む前に、まず呼び出しの背後にある技術アーキテクチャを理解する必要があります。適切なAPIアーキテクチャを選択することは、推論時間が30秒未満で済むか、それとも5分以上かかるかの決定的な違いとなります

上記に示すように、ASGI(Asynchronous Server Gateway Interface)FastAPIエンドポイントを使用して、講義分析の異なる各セクションのコンテンツを生成します。 これは一見些細な細部に見えますが、ユーザーエクスペリエンスにとっては大きな影響を与えます

このAPIエンドポイントを整理しておくために、以下に示すように各種プロバイダーのファクトリクラスを作成します。

/api/providers/llm.py (1〜31行目)

from abc import ABC, abstractmethod


class LLMProvider(ABC):


    @abstractmethod
    def __init__(self, *args, **kwargs):
        pass
   
    @abstractmethod
    def generate_chapters(self):
        pass
   
    @abstractmethod
    def generate_key_takeaways(self):
        pass
   
    @abstractmethod
    def generate_pacing_recommendations(self):
        pass


    @abstractmethod
    def generate_quiz_questions(self):
        pass
   
    @abstractmethod
    def generate_engagement(self):
        pass
   
    @abstractmethod
    def generate_gist(self):
        pass

以下では、ファイル構造がどのように開発されているかと、この抽象クラスを使用する各プロバイダーを確認できます。

/api/providers

これにより、FastAPIサーバー内のAPIエンドポイントは、適切なクラスとメソッドを簡単に呼び出すことができます。

各データポイントを個別のREST APIエンドポイントに分離することにより、AIが結果を返すまでの時間を左右する重要な指標である「推論時間」を個別に測定することができます。また、Pythonにおけるこのクラス設計により、新しいプロバイダーをいかに「安全」に追加できるか、また、どのメソッドが必要なのかを他のメンバーがどれほど簡単に確認できるかがお分かりいただけるでしょう。


ディープダイブ: ベンチマーク検証 & コスト分析

結果をお見せるする前に、どのようにモデルのベンチマークをとっているかを理解することが重要です。

  1. TopP、topK、temperature、その他カスタムモデルの推論設定は初期値のままにしています。

    1. 通常、デフォルトの設定が「一般的なユースケース」においてモデルが最も最適に動作する状態です。 

    2. 各設定についての詳細: Temperature, Top-P, Top-K: A Comprehensive Guide | MoonlightDevs - Tech Blog (提供: MoonlightDevs)

  1. すべてのモデルに同じプロンプトを入力し、各コンテンツセクションにおいて公平な比較を行います。

    1. プロンプトは /api/helpers/prompts.py フォルダで確認できます。

  1. 構造化出力をサポートするモデルには、Pydanticによる支援を行います。

    1. これはJSONスキーマの出力を保証するための一般的な開発者向けツールです。これが提供されていない場合、スキーマ出力はエンジニア泣かせの複雑なオブジェクト生成となってしまい、多くの場合それは開発者にとっての設計上の課題となります。

    2. Pydanticの動作についての詳細はこちら: Welcome to Pydantic - Pydantic

  1. すべてのモデルに同じ動画を入力します: https://www.youtube.com/watch?v=5LeZflr8Zfs

以上の前置きを踏まえて、出力の推論品質についての結果を見てみましょう! これは、生成されるコンテンツのフォーマットや正確性を決定づける主な指標となります。

上記を見るとわかるように、モデルごとに品質に様々な違いが見られます。もちろん、この「品質」という指標は完全にユースケースに依存しますが、このYouTube動画に基づくテイクアウェイ(要点)は以下の通りです。

  1. Google Gemini: 非常に正確ですが、厳密さに欠ける部分があります。ビデオ内の詳細をすべてリストアップしてしまわないように、ファインチューニングとプロンプト調整が必要です。推奨タグが過剰にリストアップされたため、タグに依存する推奨システムとしては過剰な推薦につながる危険性があります。

  1. AWS Nova: 非常に正確で厳密ですが、構造化出力に関して物足りなさを感じます。執筆時点のAWS NovaはPydanticを使用した構造化出力をサポートしておらず、温度調整(temperature)やプロンプト指示による強引な調整が必要になってしまいます。 

    1. 詳細情報: 構造化出力の要件 - Amazon Nova

  1. TwelveLabs: 正確さと厳密さのバランスが良く、しかも高精度な構造化出力を提供しています。トピックの数はもう少し詳細であってもよかったかもしれませんが、プロンプトで「少なくとも1つのトピック」と指定していたため、これはプロンプトの調整次第で改善できます。

次に、より客観的な指標である、各モデルの推論時間についてです。

上記を見るとわかるように、TwelveLabsとGoogleのモデルの生成時間は非常に近いものでした。ただし、いくつかの重要な違いを挙げる必要があります。

  1. TwelveLabsのキャッシュデータ: TwelveLabsでは、文字起こし(トランスクリプト)と要約(gist)がほぼ瞬時に読み込まれることにお気づきかもしれません。これは、ビデオタイトルなどの共通情報は常に必要になると認識しているため、プラットフォーム内部でデータをキャッシュし、ほぼ瞬時の取得を実現しているためです

  1. 長文コンテンツ vs. 短文コンテンツ

    1. Geminiは長文テキストコンテンツの生成において高速です。チャプターやタイムスタンプが必要な重要事項など、より長文のJSON構造データの出力で優位に立っていることが分かります。

    2. TwelveLabsは、箇条書き(弾丸ポイント)や一言サマリーのような短文のコンテンツ生成において高速です。

最後に最重要パートである、各モデルのコスト分析です!公平かつ簡単に進めるため、1時間の動画を例にとり、各プロバイダーそれぞれのドキュメントを参考にして計算します。

* 推論API呼び出し回数: 8回(カテゴリーごとに1回)

  1. TwelveLabs: $2.79

    1. 算出方法: TwelveLabs | 料金計算ツール

    2. ビデオアップロード時間 = 1時間

    3. 埋め込みAPIの利用は「なし」(他のモデルとの公正な比較のため余計な埋め込みはしていません)

    4. 分析APIの利用数 = 8回(各カテゴリーデータに1回分)

    5. 検索APIの利用数 = 0

  1. Google Gemini: $10.62(GCP上のインフラ手数料を除く料金)

    1. Google Geminiはトークンベースの課金であり、入力と出力トークンの量に依存します。

    2. 公式ドキュメント: トークン数の理解とカウント  |  Gemini API  |  Google AI for Developers

      1. 動画1秒あたり、およそ295トークンを消費します。

      2. 100万トークンあたり$1.25

      3. 1時間のビデオでのトークン量:3,600秒 * 295トークン/秒 = 1,062,000トークン

    3. 計算式: (1,062,000 / 1,000,000) * 1.25 * 8回 = $10.62

  1. AWS Nova: $0.22(AWSインフラの利用手数料を除く料金)

    1. トークンについて: ビデオ理解 - Amazon Nova

      1. 1時間のビデオに対して 276,480 トークン ほど消費すると試算されています。

    2. 料金設定について: AWS Bedrockの料金設定

      1. AWS Nova Pro モデル = 1,000入力トークンあたり$0.0008

    3. 計算式: (276,480 / 1,000) * 0.0008 = $0.22

以下は、比較して最適な結論を導くための、各インサイトを一覧にしたテーブルです。

指標

TwelveLabs

Google Gemini

AWS Nova

出力推論品質

バランス良く構造化されている: 正確さと厳密さの良いミックス。

🎯 正確だが冗長: 高い精度を持つ反面、詳細やタグをすべて並び立ててしまう傾向があります。

⚙️ 正確だが構造化されていない: 高い正確性と精密性を持ちますが、フォーマットの処理に苦労します。

構造化出力の対応

可能(信頼性:高): ネイティブ環境で構造化データを確実に返します。

可能(信頼性:高): ネイティブ環境で構造化データを確実に返します。

難(信頼性:低): 構造化出力が保証されておらず、レスポンスを別途手動でプログラム解析する開発負担が増えます。

推論にかかる時間

高速(特にキャッシュ時): 短文フォーマットへの対応や、インデックスに登録されている共通データの取得が高速です。

高速(長文コンテンツ時): 全般的な速度は同じくらいですが、長文かつ複雑なコンテンツの生成で一歩リードしています。

平均的: 瞬間的には速い場合もありますが、多くの場合他のモデルと比べて完了まで追加で10〜20秒かかります。

キャッシュの仕組み

あり: 動画をアップロードすると、書き起こしや要約などを事前に処理・キャッシュし、即アクセスできるように設計されています。

なし: クエリを実行するたびに動画全体の再処理が発生します。

なし: クエリを実行するたびに動画全体の再処理が発生します。

料金(コスト)

💸💸 $2.79

💸💸💸 $10.62

💵 $0.22

料金請求モデル

時間ベース & 呼び出し回数: 動画の長さに応じて1度請求されたあと、分析ごとの少額手数料が発生します。

トークン従量課金: 個別のクエリを実行するたびに動画全体のトークンコストが発生します。

トークン従量課金: 個別のクエリを実行するたびに動画全体のトークンコストが発生します。

追加料金の目安

(プラットフォーム内に全て込み)

GCPインフラ利用料金

AWSインフラ利用料金

もちろん、各モデルは日々進歩を続けており、これらの検証数値も変わっていきます。しかし、この講義コンテンツ分析プラットフォームを活用すれば、あなた自身の実際の講義動画などを使って直接テストして、どの動画理解モデルが一番相性が良いのかを自分の目で確認できます!


フェーズ3: 学生へのフィードバックループとクラスルーム全体の傾向抽出

いよいよ最後のセクションです。ここでは、教育現場でのフィードバックを反映するフィードバックループを構築し、教師がクラス全体の状況を把握できるようにする仕組みと、TwelveLabsがAWSテクノロジースタックにどのように統合できるかを実際に体験します。

上の画像で確認できるように、学生側はTwelveLabsにより生成された練習問題やチャプター表示、要約などの豊富なデータに直接アクセスできるようになりました。TwelveLabsのPegasusモデルの能力と、AWSの確実な配信インフラが組み合わさることで、作成に何時間もかかっていた自習用の教材が一瞬で作成できる仕組みです。 

学生がこの練習問題を解き、講義ビデオを見終えると、彼らに以下のようなパーソナライズされた学習状況レポートが送られます。:

  1. チャプターごとのクイズ成果 — どこの部分を間違えたか、具体的な課題を明確にする詳細レポート。

  1. 個人用の学習お勧めプラン — 苦手箇所の克服に必要な箇所をピンポイントでおすすめします。

  1. 推奨される別の講義動画 — TwelveLabsのMarengoモデルが作成した「意味の似ている」埋め込み情報をベースとし、S3に保存されているアーカイブ群から自動マッチングします。

  1. 理解度スコア表示 — 課題・トピックごとの点数評価を視覚的に示します。

こうした機能のアイデアを踏まえた上で、実際にこれがどのようにサーバー側のアーキテクチャ上で組み上がっているのか、そしてなぜAWSと強固に一体化することがこのようなプロダクトの鍵となるのかを見てみましょう。

このアーキテクチャ図に描かれている通り、私たちはAWS Bedrock経由でClaude 3.5 Sonnetを利用しています。何らかの新しいサードパーティ製ライブラリのセットアップなどをすることなく、純粋にAWS DynamoDB内に保存されているデータをベースにして、思考力に優れたこの最新の大規模言語モデルを用いて直接データ操作を実行できている点に注目してください。

さらに、学生のインプットを助けるために、ベクトル検索による動画レコメンデーション機能を統合しています。TwelveLabsのMarengoモデルを使って、動画内容の「意味合い」を深く捉えた情報の濃いベクトル埋め込み空間データを構築し、これをユークリッド距離に基づく「k近傍法(K-nearest neighbor search / KNN)」を使用してデータベースから探し出します。

/api/helpers/reasoning.py (262〜289行目)

def fetch_related_videos(self, video_id: str):

        # Fetch original video from S3 Bucket.
        presigned_urls = DBHandler().fetch_s3_presigned_urls()
       
        # Fetch embedding stored in Marengo Model
        video_object = self.twelvelabs_client.index.video.retrieve(index_id=os.getenv('TWELVE_LABS_INDEX_ID'), id=video_id, embedding_option=['visual-text'])
        video_duration = video_object.system_metadata.duration
        video_embedding_segments = video_object.embedding.video_embedding.segments
       
        combined_embedding = np.array([])
        for segment in video_embedding_segments:
            combined_embedding = np.concatenate([combined_embedding, segment.embeddings_float])
       
        # Generate embeddings of other YouTube videos.
        other_video_embeddings = {}
        for video_url in presigned_urls:
            video_embedding = self.generate_new_video_embeddings(video_url, combined_embedding, video_duration)
            other_video_embeddings[video_url] = video_embedding


        # Conduct K-Nearest Neighbor Search with Euclidian Distance.
        knn_results = self.knn_search(combined_embedding, other_video_embeddings, 5)
       
        return knn_results

これらの非常に洗練された機能群が、一貫した1つのAPI/プラットフォーム環境(AWS)内だけで構築されていることを今一度実感してください。これによって開発作業は大幅に合理化され、企業クラスのデータ保護基準を簡単に実装することが可能になります。

そして、学生たちが問題を提出し終えると、教師用ダッシュボードにはクラス全体の提出結果が蓄積され、クラスの総合傾向の分析を開始できます。

この理想的なフィードバックループにより、生徒側は先進的なAIによる支援コンテンツで学びを深め、同時に教師側は個々の理解データを手元に置いて次なる授業をどう設計するかの準備時間を大幅に節約することができます。 

これらすべてが、ビデオの「コンテクストを真に正確に理解できる」TwelveLabsをはじめとする動画理解AIの圧倒的な性能、そして、従来なら数日を要していたコンテンツ作成業務を瞬座に自動化する力のおかげです。


まとめ

ここまでお読みいただきありがとうございます!本チュートリアルを通じて、教育現場という舞台でTwelveLabsがいかに威力を発揮できるかを体験いただけただけでなく、以下のような様々な有意義な学びを得られたかと思います。:

  1. TwelveLabsとAWSのインライン連携 — TwelveLabsがAWS Bedrock経由で利用できるようになり、インフラの一体管理と、開発の圧倒的なスムーズさを両立するのがどれほど画期的であるかについて理解しました。

  1. 開発における設計選定の基準 — 単に技術的な性能や話題性だけでなく、実際のコスト管理やユーザーへのラグを如何に避けるかというビジネス要件に基づいたサーバー・言語設計の思考力を養いました。

  1. 実際のモデル検証結果 — 動画市場を引っ張る代表的なAIモデルの出力の質の特色、それからコスト試算方法を確認し、明日から作る新しいプログラムに導入するベストなモデル選びの目を養いました。

本プロジェクトの設計にあたってさらに細かく把握しておきたい場合は、下記資料へのリンクもそれぞれ整備していますのでご参照ください。:

  1. TwelveLabs向けテクニカルレポート全文: Googleドキュメントを見る

  1. 詳細なシステムのシーケンス・アーキテクチャ図: LucidChartsで開く

  1. 提供API一覧、およびそのエンドポイント詳細ドキュメント: Googleドキュメントを見る

  1. 完成版のソースコードがあるGitHubリポジトリ: https://github.com/nathanchess/twelve-labs-education-poc 

  1. 実際の動作をブラウザ上で検証できる本番動作検証URL: https://twelve-labs-education-poc-s7sz.vercel.app/ 

TwelveLabsの高度な動画の文脈理解能力と、日々世界中で使用されている安定したAWSのコンピュートプラットフォーム、それを彩る周辺ソリューションを正しく組み合わせることで、私たちは教育業界にとどまらずあらゆる領域で、最先端のビジネス向け情報処理システムを自らの手でつくり上げることができるようになります。