Multimodal Live API を使用すると、テキスト、音声、動画の入力と音声とテキストの出力を使用して、低レイテンシの双方向インタラクションを実現できます。これにより、モデルをいつでも中断できる、自然で人間のような音声会話が実現します。モデルの動画理解機能により、コミュニケーション モダリティが拡張され、カメラ入力やスクリーンキャストを共有して質問できるようになります。
機能
Multimodal Live API には、次の主な機能が含まれています。
- マルチモーダル: モデルは視覚、聴覚、音声を認識できます。
- 低レイテンシのリアルタイム インタラクション: モデルは高速なレスポンスを提供できます。
- セッション メモリ: モデルは 1 つのセッション内のすべてのインタラクションのメモリを保持し、以前に聞いたことや見たことがある情報を呼び出します。
- 関数呼び出し、コード実行、Search as a Tool のサポート: モデルを外部サービスやデータソースと統合できます。
Multimodal Live API は、サーバー間の通信用に設計されています。
ウェブアプリとモバイルアプリの場合は、Daily のパートナーによる統合を使用することをおすすめします。
始める
Multimodal Live API を試すには、Vertex AI Studio に移動し、[Multimodal Live を試す] をクリックします。
Multimodal Live API は、WebSockets を使用するステートフル API です。
このセクションでは、Python 3.9 以降を使用して、Multimodal Live API を使用して text-to-text 生成を行う方法の例を示します。
Gen AI SDK for Python
Google Gen AI SDK for Python のインストールまたは更新方法を確認する。
詳細については、
Gen AI SDK for Python API リファレンス ドキュメントまたは
python-genai
GitHub リポジトリをご覧ください。
Vertex AI で Gen AI SDK を使用するように環境変数を設定します。
# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values # with appropriate values for your project. export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT export GOOGLE_CLOUD_LOCATION=us-central1 export GOOGLE_GENAI_USE_VERTEXAI=True
統合ガイド
このセクションでは、Multimodal Live API との統合の仕組みについて説明します。
セッション
WebSocket 接続は、クライアントと Gemini サーバー間のセッションを確立します。
クライアントが新しい接続を開始すると、セッションはサーバーとメッセージを交換して、次のことができます。
- テキスト、音声、動画を Gemini サーバーに送信します。
- Gemini サーバーから音声、テキスト、関数呼び出しのリクエストを受信します。
セッション構成は、接続後の最初のメッセージで送信されます。セッション構成には、モデル、生成パラメータ、システム指示、ツールが含まれます。
次の構成例をご覧ください。
{
"model": string,
"generationConfig": {
"candidateCount": integer,
"maxOutputTokens": integer,
"temperature": number,
"topP": number,
"topK": integer,
"presencePenalty": number,
"frequencyPenalty": number,
"responseModalities": [string],
"speechConfig": object
},
"systemInstruction": string,
"tools": [object]
}
詳細については、BidiGenerateContentSetup をご覧ください。
メッセージを送信する
メッセージは、WebSocket 接続を介して交換される JSON 形式のオブジェクトです。
メッセージを送信するには、クライアントがオープンな WebSocket 接続を介して JSON オブジェクトを送信する必要があります。JSON オブジェクトには、次のオブジェクトセットのフィールドを1 つだけ含める必要があります。
{
"setup": BidiGenerateContentSetup,
"clientContent": BidiGenerateContentClientContent,
"realtimeInput": BidiGenerateContentRealtimeInput,
"toolResponse": BidiGenerateContentToolResponse
}
サポートされているクライアント メッセージ
サポートされているクライアント メッセージについては、次の表をご覧ください。
メッセージ | 説明 |
---|---|
BidiGenerateContentSetup |
最初のメッセージで送信されるセッション構成 |
BidiGenerateContentClientContent |
クライアントから提供された現在の会話の増分コンテンツ アップデート |
BidiGenerateContentRealtimeInput |
リアルタイムの音声または動画入力 |
BidiGenerateContentToolResponse |
サーバーから受信した ToolCallMessage へのレスポンス |
メールの受信
Gemini からメッセージを受信するには、WebSocket の「message」イベントをリッスンし、サポートされているサーバー メッセージの定義に従って結果を解析します。
以下をご覧ください。
ws.addEventListener("message", async (evt) => { if (evt.data instanceof Blob) { // Process the received data (audio, video, etc.) } else { // Process JSON response } });
サーバー メッセージには、次のオブジェクトセットのフィールドが1 つだけ含まれます。
{
"setupComplete": BidiGenerateContentSetupComplete,
"serverContent": BidiGenerateContentServerContent,
"toolCall": BidiGenerateContentToolCall,
"toolCallCancellation": BidiGenerateContentToolCallCancellation
}
サポートされているサーバー メッセージ
サポートされているサーバー メッセージを次の表に示します。
メッセージ | 説明 |
---|---|
BidiGenerateContentSetupComplete |
セットアップが完了したときにクライアントから送信される BidiGenerateContentSetup メッセージ |
BidiGenerateContentServerContent |
クライアント メッセージに応答してモデルが生成したコンテンツ |
BidiGenerateContentToolCall |
クライアントに、関数呼び出しを実行して、一致する ID を含むレスポンスを返すようリクエストします。 |
BidiGenerateContentToolCallCancellation |
ユーザーがモデル出力を中断したために関数呼び出しがキャンセルされたときに送信されます。 |
コンテンツの増分更新
増分更新を使用して、テキスト入力の送信、セッション コンテキストの確立、セッション コンテキストの復元を行います。短いコンテキストの場合は、ターンバイターンのインタラクションを送信して、イベントの正確なシーケンスを表すことができます。コンテキストが長い場合は、1 つのメッセージの要約を提供して、フォローアップのやり取り用にコンテキスト ウィンドウを空けておくことをおすすめします。
コンテキスト メッセージの例を次に示します。
{ "clientContent": { "turns": [ { "parts":[ { "text": "" } ], "role":"user" }, { "parts":[ { "text": "" } ], "role":"model" } ], "turnComplete": true } }
コンテンツ部分は functionResponse
型にできますが、モデルから発行された関数呼び出しにレスポンスを提供する際に BidiGenerateContentClientContent
を使用しないでください。代わりに BidiGenerateContentToolResponse
を使用してください。BidiGenerateContentClientContent
は、以前のコンテキストを確立する場合や、会話にテキスト入力を提供する場合にのみ使用してください。
音声と動画のストリーミング
コードの実行
コード実行について詳しくは、コード実行をご覧ください。
関数呼び出し
すべての関数は、BidiGenerateContentSetup
メッセージの一部としてツール定義を送信することで、セッションの開始時に宣言する必要があります。
関数は JSON を使用して定義します。具体的には、OpenAPI スキーマ形式の一部のサブセットを使用します。1 つの関数宣言には、次のパラメータを含めることができます。
name(文字列): API 呼び出し内の関数の一意の識別子。
description(文字列): 関数の目的と機能の包括的な説明。
parameters(オブジェクト): 関数に必要な入力データを定義します。
type(文字列): 全体的なデータ型(オブジェクトなど)を指定します。
properties(オブジェクト): 個々のパラメータがリストされます。各パラメータには次の情報があります。
- type(文字列): パラメータのデータ型(文字列、整数、ブール値など)。
- description(文字列): パラメータの目的と想定される形式の明確な記述。
required(配列): 関数が動作するために必須のパラメータ名を列挙した文字列の配列。
curl コマンドを使用した関数宣言のコード例については、Gemini API による関数呼び出しの概要をご覧ください。Gemini API SDK を使用して関数宣言を作成する方法の例については、関数呼び出しチュートリアルをご覧ください。
モデルは、単一のプロンプトから複数の関数呼び出しと、出力を連結するために必要なコードを生成できます。このコードはサンドボックス環境で実行され、後続の BidiGenerateContentToolCall
メッセージを生成します。各関数呼び出しの結果が利用可能になるまで実行が停止し、順序処理が保証されます。
クライアントは BidiGenerateContentToolResponse
を返すはずです。
詳細については、関数呼び出しの概要をご覧ください。
オーディオ形式
Multimodal Live API は、次の音声形式をサポートしています。
- 入力音声形式: 16 kHz リトル エンディアンの未加工 16 ビット PCM オーディオ
- 出力音声形式: 24 kHz リトル エンディアンの未加工 16 ビット PCM オーディオ
システム指示
システム指示を指定すると、モデルの出力をより適切に制御し、音声レスポンスをトーンやセンチメントで指定できます。
システム指示は、インタラクションの開始前にプロンプトに追加され、セッション全体で有効になります。
システム指示は、最初の接続直後のセッションの開始時にのみ設定できます。セッション中にモデルに追加の入力を提供するには、増分コンテンツ更新を使用します。
中断
モデルの出力はいつでも中断できます。音声アクティビティ検出(VAD)が中断を検出すると、進行中の生成はキャンセルされ、破棄されます。セッション履歴に保持されるのは、クライアントにすでに送信された情報のみです。その後、サーバーは中断を報告する BidiGenerateContentServerContent
メッセージを送信します。
さらに、Gemini サーバーは保留中の関数呼び出しを破棄し、キャンセルされた呼び出しの ID を含む BidiGenerateContentServerContent
メッセージを送信します。
音声
Multimodal Live API は、次の音声をサポートしています。
- ケース
- カロン
- Kore
- フェンリル
- Aoede
音声を指定するには、セッション構成の一部として、speechConfig
オブジェクト内に voiceName
を設定します。
speechConfig
オブジェクトの JSON 表現は次のとおりです。
{ "voiceConfig": { "prebuiltVoiceConfig": { "voiceName": "VOICE_NAME" } } }
制限事項
プロジェクトを計画する際は、Multimodal Live API と Gemini 2.0 の次の制限事項を考慮してください。
クライアント認証
Multimodal Live API はサーバー間認証のみを提供するため、クライアントが直接使用することはおすすめしません。Multimodal Live API で安全に認証を行うには、クライアント入力を中間アプリケーション サーバー経由で転送する必要があります。
会話の履歴
モデルはセッション内のインタラクションを記録しますが、会話履歴は保存されません。セッションが終了すると、対応するコンテキストは消去されます。
以前のセッションを復元したり、ユーザー操作の過去のコンテキストをモデルに提供したりするには、アプリケーションが独自の会話ログを維持し、BidiGenerateContentClientContent
メッセージを使用して新しいセッションの開始時にこの情報を送信する必要があります。
セッションの最大継続時間
セッションの長さは、音声の場合は最大 15 分、音声と動画の場合は最大 2 分に制限されます。セッション時間が上限を超えると、接続が終了します。
また、モデルはコンテキストのサイズによって制限されます。動画ストリームや音声ストリームとともに大量のコンテンツ チャンクを送信すると、セッションが早期に終了する可能性があります。
音声アクティビティの検出(VAD)
このモデルは、連続的な音声入力ストリームに対して音声アクティビティ検出(VAD)を自動的に実行します。VAD は常に有効になっており、そのパラメータは構成できません。
その他の制限事項
手動エンドポイント設定はサポートされていません。
オーディオ入力とオーディオ出力は、モデルが関数呼び出しを使用できる機能に悪影響を及ぼします。
トークン数
トークン数はサポートされていません。
レート上限
次のレート制限が適用されます。
- API キーあたり 3 つの同時実行セッション
- 1 分あたり 400 万トークン
メッセージとイベント
BidiGenerateContentClientContent
クライアントから送信された現在の会話の増分更新。ここで生成されたコンテンツはすべて、無条件で会話履歴に追加され、コンテンツを生成するためのモデルへのプロンプトの一部として使用されます。
メッセージが表示されると、現在のモデルの生成が中断されます。
フィールド | |
---|---|
turns[] |
省略可。モデルとの現在の会話に追加されたコンテンツ。 シングルターンのクエリの場合、これは単一のインスタンスです。マルチターン クエリの場合、これは会話履歴と最新のリクエストを含む繰り返しフィールドです。 |
turn_ |
省略可。true の場合、サーバーのコンテンツ生成は現在蓄積されているプロンプトから開始されることを示します。それ以外の場合は、サーバーは追加のメッセージを待ってから生成を開始します。 |
BidiGenerateContentRealtimeInput
リアルタイムで送信されるユーザー入力。
これは ClientContentUpdate
とはいくつかの点で異なります。
- モデルの生成を中断することなく継続的に送信できます。
ClientContentUpdate
とRealtimeUpdate
にまたがってインターリーブされたデータを混在させる必要がある場合、サーバーは最適なレスポンスを得るために最適化を試みますが、保証はありません。- ターンの終了は明示的に指定されず、ユーザー アクティビティ(音声の終了など)から導出されます。
- ターンが終了する前でも、データは増分処理され、モデルからのレスポンスを迅速に開始できるように最適化されます。
- 常にユーザーの入力と見なされます(会話履歴の入力には使用できません)。
フィールド | |
---|---|
media_ |
省略可。メディア入力用のバイトデータがインライン化されています。 |
BidiGenerateContentServerContent
クライアント メッセージに応答してモデルによって生成された増分サーバー アップデート。
コンテンツはリアルタイムではなく、できるだけ早く生成されます。クライアントは、バッファリングしてリアルタイムで再生することもできます。
フィールド | |
---|---|
turn_ |
出力専用。true の場合、モデルの生成が完了したことを示します。生成は、追加のクライアント メッセージに応答してのみ開始されます。 |
interrupted |
出力専用。true の場合、クライアント メッセージによって現在のモデル生成が中断されたことを示します。クライアントがコンテンツをリアルタイムで再生している場合は、現在のキューを停止して空にするのが適切なタイミングです。クライアントがコンテンツをリアルタイムで再生している場合は、現在の再生キューを停止して空にするのが適切なタイミングです。 |
grounding_ |
出力専用。メタデータには、生成されたコンテンツのグラウンディングに使用されるソースを指定します。 |
model_ |
出力専用。ユーザーとの現在の会話の一部としてモデルが生成したコンテンツ。 |
BidiGenerateContentSetup
最初のクライアント メッセージで送信されるメッセージ(1 回限り)。ストリーミング セッションの期間に適用される構成が含まれます。
クライアントは、BidiGenerateContentSetupComplete
メッセージを待ってから、追加のメッセージを送信する必要があります。
フィールド | |
---|---|
model |
必須。使用するパブリッシャー モデルまたはチューニング済みモデル エンドポイントの完全修飾名。 パブリッシャー モデルの形式: |
generation_ |
省略可。生成構成。 次のフィールドはサポートされていません。
|
system_ |
省略可。ユーザーがモデルに提供するシステム指示。注: パートにはテキストのみを使用します。各パートのコンテンツは別の段落にします。 |
tools[] |
省略可。モデルが次のレスポンスを生成するために使用できる
|
BidiGenerateContentSetupComplete
この型にはフィールドがありません。
クライアントからの BidiGenerateContentSetup
メッセージに応答して送信されます。
BidiGenerateContentToolCall
クライアントに functionCalls
を実行し、一致する id
を含むレスポンスを返すようリクエストします。
フィールド | |
---|---|
function_ |
出力専用。実行される関数呼び出し。 |
BidiGenerateContentToolCallCancellation
指定された id
を使用して以前に発行された ToolCallMessage
は実行されず、キャンセルされる必要があることをクライアントに通知します。これらのツール呼び出しに副作用があった場合、クライアントはツール呼び出しの取り消しを試みることがあります。このメッセージは、クライアントがサーバー ターンを中断した場合にのみ表示されます。
フィールド | |
---|---|
ids[] |
出力専用。キャンセルするツール呼び出しの ID。 |
BidiGenerateContentToolResponse
サーバーから受信した ToolCall
に対するクライアント生成レスポンス。個々の FunctionResponse
オブジェクトは、id
フィールドによってそれぞれの FunctionCall
オブジェクトと照合されます。
なお、単一呼び出しとサーバー ストリーミングの GenerateContent API では、Content
部分を交換することで関数呼び出しが行われますが、双方向の GenerateContent API では、これらの専用のメッセージセットを介して関数呼び出しが行われます。
フィールド | |
---|---|
function_ |
省略可。関数呼び出しへのレスポンス。 |
次のステップ
- 関数呼び出しの詳細を確認する。
- 例については、関数呼び出しリファレンスをご覧ください。