2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

もうフレーム抽出はいらない: Databricksで動画・音声を基盤モデルに直接入力する

2
Posted at

はじめに

以前、Databricksにおけるビジョンモデルに対するクエリーという記事で、Claude Sonnetなどのマルチモーダルモデルに画像を渡して問い合わせる方法を試しました。あのときは入力できるのは画像 (image_url) だけでした。

新しいマニュアルのページが作成されていて、今度は音声と動画をそのまま基盤モデルに渡せるようになっていました。

これまでDatabricks上のモデルに動画を分析させるには、いったんフレームを画像として切り出してから1枚ずつ渡す必要がありました。音声も文字起こししてからテキストとして渡すのが定番でした。今回のアップデートで、動画ファイルや音声ファイルをそのまま投げられるようになっています。画像でできていたことが、音声・動画にも広がった格好です。

なお、画像のときはClaudeなども使えましたが、音声・動画の入力に対応しているのは現状Geminiの基盤モデルです。この点だけ最初に押さえておきます。

要件

入力方法

音声・動画の入力は2通りの方法で渡せます。

  • URL: メディアファイルへの公開アクセス可能なURLを渡します。動画についてはYouTubeのURLもサポートされています。
  • Base64インラインデータ: ファイルをbase64文字列にエンコードし、データURI (例: data:video/mp4;base64,<encoded_data>) として渡します。

公開URLが使える場合はURL方式がいちばん手軽です。ローカルやボリューム上のファイルを使いたい場合はbase64で渡します。

セットアップ

ライブラリをインストールします。

%pip install -U openai mlflow
%restart_python

Spark設定とノートブックのコンテキストからベースURLとパーソナルアクセストークンを取得します。

# Databricksノートブック内で実行する場合
workspace_url = spark.conf.get("spark.databricks.workspaceUrl")
base_url = f"https://{workspace_url}/serving-endpoints"

api_token = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().get()

MLflowのトレースをオンにしておきます。

import mlflow
mlflow.openai.autolog()

この記事で使うdatabricks-gemini-3-1-proは推論モデルなので、レスポンスのmessage.contentがプレーンな文字列ではなく、テキストブロックと推論の署名 (thoughtSignature) を含むリストで返ってきます。そのままprintするとリストが表示されて読みにくいので、テキスト部分だけを取り出すヘルパーを用意しておきます。

def extract_text(message):
    content = message.content
    if isinstance(content, list):
        return "".join(
            part.get("text", "")
            for part in content
            if isinstance(part, dict) and part.get("type") == "text"
        )
    return content

以降の出力はこのヘルパーを通します。非推論モデル (databricks-gemini-2-5-flashなど) を使う場合はcontentが文字列で返るので、ヘルパーを通してもそのまま返るだけで害はありません。

Chat Completions APIで動画を分析する

Chat Completions APIでは、messages配列の中でvideo_urlというコンテンツタイプを使って動画を渡します。urlにはWeb URLまたはbase64データURIのどちらかを指定できます。

まずはいちばん手軽なYouTubeのURLを渡すパターンから。

from openai import OpenAI

client = OpenAI(
    api_key=api_token,
    base_url=base_url,
)

response = client.chat.completions.create(
    model="databricks-gemini-3-1-pro",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この動画で何が起きているか説明してください。"},
                {
                    "type": "video_url",
                    "video_url": {"url": "https://www.youtube.com/watch?v=Fz8OQLdkVSs"},
                },
            ],
        }
    ],
    max_tokens=1024,
)

print(extract_text(response.choices[0].message))
この動画では、インコが本の上に立ち、くちばしを使って紙の端を噛みちぎり、それを自分の体に巻きつけています。その後、インコは紙の端を噛みちぎり、それを自分の体に巻きつけています。

使った動画はこちらです。

ローカルやボリューム上の動画ファイルを使いたい場合は、base64にエンコードしてデータURIとして渡します。

import base64

# 動画ファイルをbase64エンコード
with open("video.mp4", "rb") as f:
    video_b64 = base64.standard_b64encode(f.read()).decode("utf-8")

response = client.chat.completions.create(
    model="databricks-gemini-3-1-pro",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この動画を要約してください。"},
                {
                    "type": "video_url",
                    "video_url": {"url": f"data:video/mp4;base64,{video_b64}"},
                },
            ],
        }
    ],
    max_tokens=1024,
)

print(extract_text(response.choices[0].message))

1つのリクエストにURL指定とbase64指定を混在させたり、複数の動画をまとめて渡したりもできます。

Chat Completions APIで音声を分析する

音声の場合はaudio_urlコンテンツタイプを使います。書き方は動画とほぼ同じです。

ここでは手元で録音した16秒ほどの日本語音声を使ってみます。あらかじめボリュームにアップロードしておき、そのパスから読み込んでbase64エンコードします。

import base64

# ボリュームに置いた音声ファイルをbase64エンコード
audio_path = "/Volumes/<catalog>/<schema>/<volume>/recording.mp3"
with open(audio_path, "rb") as f:
    audio_b64 = base64.standard_b64encode(f.read()).decode("utf-8")

response = client.chat.completions.create(
    model="databricks-gemini-3-1-pro",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この音声を文字起こしして、要点をまとめてください。"},
                {
                    "type": "audio_url",
                    "audio_url": {"url": f"data:audio/mp3;base64,{audio_b64}"},
                },
            ],
        }
    ],
    max_tokens=1024,
)

print(extract_text(response.choices[0].message))
ご提示いただいた音声(テキスト)の文字起こしと要点は以下の通りです。

### 文字起こし
「データブリックスではGemini基盤モデルに動画もしくは音声を入力することが可能となっております。チャットコンプリーションズAPIまたはGoogle Gemini APIを使用してURLまたはBase64エンコードされたデータを提供できます。」
※音声の「力する」は文脈から「入力する」と補完しています。

---

### 要点まとめ
* **新機能**: Databricks上で、Gemini基盤モデルに対して**動画や音声の入力**が可能になった。
* **利用可能なAPI**: 
  * Chat Completions API
  * Google Gemini API
* **データの入力方法**: 
  * URLでの指定
  * Base64エンコードされたデータでの提供

文字起こしのために別途音声認識モデルを呼ぶ必要がなく、文字起こしと要約をまとめて1回のリクエストで頼めるのが便利なところです。

対応モデル

音声・動画の入力は、Gemini仮想単位の従量課金基盤モデルでサポートされています。利用可能なリージョンはDatabricksでホストされている基盤モデルを参照してください。

  • databricks-gemini-3-1-pro
  • databricks-gemini-3-pro
  • databricks-gemini-2-5-pro
  • databricks-gemini-3-1-flash-lite
  • databricks-gemini-3-flash
  • databricks-gemini-2-5-flash

制限事項

  • 音声・動画の入力はGemini仮想単位の従量課金基盤モデルでのみ利用できます。プロビジョンドスループットエンドポイントはサポートされていません。
  • 1つのリクエストに複数の音声・動画を含められますが、ファイルサイズが大きいほどレイテンシーとトークン使用量が増加します。

おわりに

これまで動画を分析させるにはフレームを切り出して画像として渡す前処理が必要でしたが、動画をそのまま投げられるようになったことで、その手間がまるごと省けます。カメラ映像から異常を検知したり、会議の録画や録音から要点を抜き出したりといった用途が、ぐっと書きやすくなりました。

画像に続いて音声・動画もカバーされたことで、Databricks上でマルチモーダルなアプリケーションを組む際の選択肢がさらに広がっています。

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?