Gemini Live API を使用すると、テキスト、音声、動画の入力に対して音声やテキストの出力を返す低レイテンシの双方向インタラクションを実現できます。これにより、人間とやり取りするような自然な音声会話が可能となります。また、いつでもモデルとのやりとりを中断できます。モデルが動画を理解できるようになることでコミュニケーション手段が多様化し、カメラ入力やスクリーンキャストを共有して質問することが可能になります。
機能
Live API の主な機能は次のとおりです。
- マルチモダリティ: モデルは、見て、聞いて、会話できます。
- 低レイテンシのリアルタイム インタラクション: モデルは、すばやくレスポンスを返すことができます。
- セッション メモリ: モデルは、1 つのセッションで行われたすべてのインタラクションを記憶し、以前に聞いたことや見たことがある情報を思い出すことができます。
- 関数呼び出し、コードの実行、Search as a Tool のサポート: モデルを外部サービスやデータソースと統合できます。
Live API は、サーバー間通信用に設計されています。
ウェブアプリとモバイルアプリについては、Daily のパートナーによるインテグレーションを使用することをおすすめします。
始める
Live API を試すには、Vertex AI Studio に移動し、[セッションを開始] をクリックします。
Live API は、WebSockets を使用するステートフル API です。
このセクションでは、Python 3.9 以降を使用して、Live API でテキストからテキストを生成する方法の例を示します。
Gen AI SDK for Python
インストール
pip install --upgrade google-genai
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
インテグレーション ガイド
このセクションでは、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
"usageMetadata": UsageMetadata
"goAway": GoAway
"sessionResumptionUpdate": SessionResumptionUpdate
"inputTranscription": BidiGenerateContentTranscription
"outputTranscription": BidiGenerateContentTranscription
}
サポートされているサーバー メッセージ
サポートされているサーバー メッセージについては、次の表をご覧ください。
メッセージ | 説明 |
---|---|
BidiGenerateContentSetupComplete |
セットアップが完了したときに、クライアントから送信される BidiGenerateContentSetup メッセージ |
BidiGenerateContentServerContent |
クライアント メッセージに応答してモデルが生成したコンテンツ |
BidiGenerateContentToolCall |
クライアントに関数呼び出しを実行して、一致する ID を含むレスポンスを返すよう求めるリクエスト |
BidiGenerateContentToolCallCancellation |
ユーザーがモデル出力を中断したために関数呼び出しがキャンセルされたときに送信されます |
UsageMetadata |
セッションでこれまでに使用されたトークン数に関するレポート |
GoAway |
現在の接続がまもなく終了することを示すシグナル |
SessionResumptionUpdate |
再開可能なセッション チェックポイント |
BidiGenerateContentTranscription |
ユーザーまたはモデルの音声の文字起こし |
コンテンツの増分更新
増分更新を使用して、テキスト入力の送信、セッション コンテキストの確立、セッション コンテキストの復元を行います。コンテキストが短い場合は、ターンバイターンのインタラクションを送信して、イベントの正確なシーケンスを表すことができます。コンテキストが長い場合は、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
を返します。
詳細については、関数呼び出しの概要をご覧ください。
音声形式
Live API は、次の音声形式をサポートしています。
- 入力音声形式: RAW 16 ビット PCM 音声、16kHz、リトル エンディアン
- 出力音声形式: RAW 16 ビット PCM 音声、24kHz、リトル エンディアン
システム指示
システム指示を指定することで、モデルの出力をより適切に制御し、音声レスポンスのトーンや感情を指定できます。
システム指示は、インタラクションの開始前にプロンプトに追加され、セッション全体で有効になります。
システム指示を設定できるのは、セッションの開始時、初回接続の直後のみです。セッション中にモデルにさらに多くの情報を入力するには、コンテンツの増分更新を使用します。
中断
モデルの出力はいつでも中断できます。音声アクティビティ検出(VAD)が中断を検出すると、進行中の生成はキャンセルされ、破棄されます。クライアントにすでに送信された情報だけが、セッション履歴に保持されます。その後、サーバーは中断を報告する BidiGenerateContentServerContent
メッセージを送信します。
さらに、Gemini サーバーは保留中の関数呼び出しを破棄し、キャンセルされた呼び出しの ID を記載した BidiGenerateContentServerContent
メッセージを送信します。
音声
Live API は、次の音声をサポートしています。
- Puck
- Charon
- Kore
- Fenrir
- Aoede
音声を指定するには、セッション構成の一部として、speechConfig
オブジェクト内に voiceName
を設定します。
次の speechConfig
オブジェクトの JSON 表現をご覧ください。
{ "voiceConfig": { "prebuiltVoiceConfig": { "voiceName": "VOICE_NAME" } } }
制限事項
プロジェクトを計画する際は、Live API と Gemini 2.0 の次の制限事項を考慮してください。
クライアント認証
Live API が提供するのはサーバー間認証のみであるため、クライアントが直接使用することはおすすめしません。クライアントの入力を Live API で安全に認証するには、中間アプリケーション サーバーを経由する必要があります。
会話の履歴
モデルはセッション内のインタラクションを追跡しますが、会話履歴は保存されません。セッションが終了すると、対応するコンテキストは消去されます。
以前のセッションを復元したり、ユーザー インタラクションの過去のコンテキストをモデルに提供したりするには、アプリケーションが独自の会話ログを維持し、BidiGenerateContentClientContent
メッセージを使用して新しいセッションの開始時にこの情報を送信する必要があります。
セッションの最大継続時間
セッション継続時間は、音声では最大 15 分、音声と動画では最大 2 分に制限されます。セッション継続時間が上限を超えると、接続が終了します。
モデルはコンテキストのサイズによっても制限されます。動画ストリームや音声ストリームとともに大量のコンテンツを送信すると、セッションが早期に終了する可能性があります。
音声アクティビティ検出(VAD)
デフォルトでは、モデルは連続した音声入力ストリームに対して音声アクティビティ検出(VAD)を自動的に実行します。VAD は、設定メッセージの RealtimeInputConfig.AutomaticActivityDetection
フィールドで設定できます。
オーディオ ストリームが一秒以上一時停止すると(ユーザーがマイクをオフにしたときなど)、キャッシュに保存されているオーディオをフラッシュするために AudioStreamEnd
イベントが送信されます。クライアントはいつでも音声データの送信を再開できます。
また、設定メッセージで RealtimeInputConfig.AutomaticActivityDetection.disabled
を true
に設定することで、自動 VAD をオフにすることもできます。この構成では、クライアントがユーザーの音声を検出し、適切なタイミングで ActivityStart
メッセージと ActivityEnd
メッセージを送信します。この構成では AudioStreamEnd
は送信されません。代わりに、ストリームの中断は ActivityEnd
メッセージでマークされます。
その他の制限
手動エンドポイントはサポートされていません。
音声入力と音声出力は、モデルが関数呼び出しを使用する機能に悪影響を及ぼします。
トークン数
トークン数はサポートされていません。
レート上限
次のレート制限が適用されます。
- API キーあたり 3 つの同時実行セッション
- 1 分あたり 400 万個のトークン
メッセージとイベント
BidiGenerateContentClientContent
クライアントから送信された現在の会話の増分更新。ここに示されたコンテンツはすべて、無条件で会話履歴に追加され、コンテンツを生成するためのモデルへのプロンプトの一部として使用されます。
次のメッセージが表示されると、現在のモデルの生成が中断されます。
フィールド | |
---|---|
turns[] |
省略可。モデルとの現在の会話に追加されたコンテンツ。 シングルターン クエリの場合、単一のインスタンスです。マルチターン クエリの場合、会話履歴と最新のリクエストを含む繰り返しフィールドです。 |
turn_complete |
省略可。true の場合、現在蓄積されているプロンプトからサーバーのコンテンツ生成が開始することを示します。true ではない場合、サーバーは、メッセージが追加されるのを待って生成を開始します。 |
BidiGenerateContentRealtimeInput
リアルタイムで送信されるユーザー入力。
ClientContentUpdate
とはいくつかの点で異なります。
- モデルの生成を中断せずに連続で送信できます。
ClientContentUpdate
とRealtimeUpdate
にまたがってインターリーブされたデータを混在させる必要がある場合、サーバーは最良のレスポンスになるよう最適化を試みます(ただし、保証はありません)。- ターンの終了は明示的に指定されず、ユーザー アクティビティ(音声の終了など)から導き出されます。
- ターンが終了する前でも、データは増分処理され、モデルからのレスポンスを迅速に開始できるように最適化されます。
- 常にユーザーの入力と見なされます(会話履歴の入力には使用できません)。
フィールド | |
---|---|
media_chunks[] |
省略可。メディア入力用のインライン バイトデータ。 |
activity_start |
省略可。ユーザー アクティビティの開始をマークします。このデータは、自動(サーバーサイド)アクティビティ検出が無効になっている場合にのみ送信されます。 |
activity_end |
省略可。ユーザー アクティビティの終了をマークします。このデータは、自動(サーバーサイド)アクティビティ検出が無効になっている場合にのみ送信されます。 |
ActivityEnd
この型にはフィールドがありません。
ユーザー アクティビティの終了をマークします。
ActivityStart
この型にはフィールドがありません。
このメッセージのフィールドは、一度に 1 つのみ設定する必要があります。ユーザー アクティビティの開始をマークします。
BidiGenerateContentServerContent
クライアント メッセージに応答してモデルが生成するサーバーの増分更新。
コンテンツはリアルタイムではなく、できるだけ早く生成されます。クライアントは、コンテンツをバッファリングしてリアルタイムで再生することもできます。
フィールド | |
---|---|
turn_complete |
出力専用。true の場合、モデルの生成が完了していることを示します。生成は、追加のクライアント メッセージに応答してのみ開始されます。 |
interrupted |
出力専用。true の場合、クライアント メッセージが現在のモデル生成を中断したことを示します。クライアントがリアルタイムでコンテンツを再生している場合、現在のキューを停止して空にする良いタイミングになります。クライアントがリアルタイムでコンテンツを再生している場合、現在の再生キューを停止して空にする良いタイミングになります。 |
generation_complete |
出力専用。true の場合、モデルの生成が完了していることを示します。 生成中にモデルが中断された場合、中断されたターンには「generation_complete」メッセージは表示されず、「interrupted > turn_complete」に進みます。 モデルがリアルタイム再生を想定している場合、再生が完了するのを待機しているため、generation_complete と turn_complete の間に遅延が発生します。 |
grounding_metadata |
出力専用。メタデータが、生成されたコンテンツのグラウンディングに使用されるソースを指定します。 |
input_transcription |
省略可。文字起こしを入力します。音声文字変換はモデルのターンとは独立しています。つまり、音声文字変換とモデルのターンの間に順序付けはありません。 |
output_transcription |
省略可。音声文字変換を出力します。音声文字変換はモデルのターンとは独立しています。つまり、音声文字変換とモデルのターンの間に順序付けはありません。 |
model_turn |
出力専用。ユーザーとの現在の会話の一部としてモデルが生成したコンテンツ。 |
音声文字変換
音声文字変換メッセージ。
フィールド | |
---|---|
text |
省略可。文字起こしテキスト。 |
finished |
省略可。bool は、音声文字変換の終了を示します。 |
BidiGenerateContentSetup
最初のクライアント メッセージでのみ送信されるメッセージ。ストリーミング セッションの期間に適用される構成が含まれています。
クライアントは、BidiGenerateContentSetupComplete
メッセージを待って、追加メッセージを送信する必要があります。
フィールド | |
---|---|
model |
必須。パブリッシャー モデルの完全修飾名。 パブリッシャー モデルの形式: |
generation_config |
省略可。生成の構成。 次のフィールドはサポートされていません。
|
system_instruction |
省略可。ユーザーがモデルに指定するシステム指示。注: パートにはテキストのみを使用します。各パートのコンテンツは別の段落にします。 |
tools[] |
省略可。モデルが次のレスポンスの生成に使用できる
|
session_resumption |
省略可。セッション再開メカニズムを構成します。含まれている場合、サーバーは定期的に |
context_window_compression |
省略可。コンテキスト ウィンドウ圧縮メカニズムを構成します。 指定されている場合、サーバーは指定された長さに収まるようにコンテキスト ウィンドウを圧縮します。 |
realtime_input_config |
省略可。リアルタイム入力の処理を設定します。 |
input_audio_transcription |
省略可。入力の音声文字変換が、入力音声の言語と一致している。 |
output_audio_transcription |
省略可。出力の音声文字変換は、出力音声に指定された言語コードと一致しています。 |
AudioTranscriptionConfig
この型にはフィールドがありません。
音声文字変換の設定。
BidiGenerateContentSetupComplete
この型にはフィールドがありません。
クライアントからの BidiGenerateContentSetup
メッセージに応答して送信されます。
BidiGenerateContentToolCall
クライアントに function_calls
を実行して、一致する id
を含むレスポンスを返すよう求めるリクエスト。
フィールド | |
---|---|
function_calls[] |
出力専用。実行される関数呼び出し。 |
BidiGenerateContentToolCallCancellation
指定の id
を含む、以前発行された ToolCallMessage
を実行せずにキャンセルする必要があることをクライアントに伝える通知。これらのツール呼び出しに副作用があった場合、クライアントはツール呼び出しを取り消すことができます。このメッセージは、クライアントがサーバーのターンを中断した場合にのみ表示されます。
フィールド | |
---|---|
ids[] |
出力専用。キャンセルするツール呼び出しの ID。 |
BidiGenerateContentToolResponse
サーバーから受信した ToolCall
に対してクライアントが生成するレスポンス。個々の FunctionResponse
オブジェクトは、id
フィールドでそれぞれの FunctionCall
オブジェクトと照合されます。
単項およびとサーバー ストリーミングの GenerateContent API では、Content
パートを交換することで関数呼び出しが実行されますが、双方向の GenerateContent API では、専用のメッセージセットを介して関数呼び出しが実行されます。
フィールド | |
---|---|
function_responses[] |
省略可。関数呼び出しに対するレスポンス。 |
RealtimeInputConfig
BidiGenerateContent
でリアルタイム入力の動作を構成します。
フィールド | |
---|---|
automatic_activity_detection |
省略可。設定しない場合、アクティビティの自動検出はデフォルトで有効になります。自動音声検出が無効になっている場合は、クライアントがアクティビティ シグナルを送信する必要があります。 |
activity_handling |
省略可。アクティビティの効果を定義します。 |
turn_coverage |
省略可。ユーザーのターンに含まれる入力を定義します。 |
ActivityHandling
ユーザー アクティビティを処理するさまざまな方法。
列挙型 | |
---|---|
ACTIVITY_HANDLING_UNSPECIFIED |
指定しない場合、デフォルトの動作は START_OF_ACTIVITY_INTERRUPTS です。 |
START_OF_ACTIVITY_INTERRUPTS |
true の場合、アクティビティの開始時にモデルのレスポンスが中断されます(「割り込み」とも呼ばれます)。中断した時点で、モデルの現在のレスポンスはカットされます。これはデフォルトの動作です。 |
NO_INTERRUPTION |
モデルのレスポンスが中断されることはありません。 |
AutomaticActivityDetection
アクティビティの自動検出を構成します。
フィールド | |
---|---|
start_of_speech_sensitivity |
省略可。音声が検出される確率を決定します。 |
end_of_speech_sensitivity |
省略可。検出された音声が終了する可能性を判断します。 |
prefix_padding_ms |
省略可。音声開始が commit される前に検出された音声に必要な時間。この値が小さいほど、音声開始の検出がより敏感になり、認識できる音声が短くなります。ただし、これにより誤検出の可能性も高くなります。 |
silence_duration_ms |
省略可。音声の終了が commit される前に検出される無音(または非音声)の必要な時間。この値を大きくすると、ユーザーのアクティビティを中断することなく音声のギャップを長くできますが、モデルのレイテンシが増加します。 |
disabled |
省略可。有効にすると、検出された音声入力とテキスト入力がアクティビティとしてカウントされます。無効になっている場合は、クライアントがアクティビティ シグナルを送信する必要があります。 |
EndSensitivity
音声終了の感度。
列挙型 | |
---|---|
END_SENSITIVITY_UNSPECIFIED |
デフォルトは END_SENSITIVITY_LOW です。 |
END_SENSITIVITY_HIGH |
自動検出で音声が終了する頻度が増える。 |
END_SENSITIVITY_LOW |
自動検出による音声の終了が減ります。 |
StartSensitivity
音声開始の感度。
列挙型 | |
---|---|
START_SENSITIVITY_UNSPECIFIED |
デフォルトは START_SENSITIVITY_LOW です。 |
START_SENSITIVITY_HIGH |
自動検出により、音声の開始がより頻繁に検出されます。 |
START_SENSITIVITY_LOW |
自動検出で音声の開始が検出される頻度が低下します。 |
TurnCoverage
ユーザーのターンに含まれる入力に関するオプション。
列挙型 | |
---|---|
TURN_COVERAGE_UNSPECIFIED |
指定しない場合、デフォルトの動作は TURN_INCLUDES_ALL_INPUT です。 |
TURN_INCLUDES_ONLY_ACTIVITY |
ユーザーのターンには、前回のターンからのアクティビティのみが含まれ、無操作(音声ストリームの無音など)は含まれません。 |
TURN_INCLUDES_ALL_INPUT |
ユーザーのターンには、前回のターンからのすべてのリアルタイム入力が含まれます(音声ストリームの無音など)。これはデフォルトの動作です。 |
UsageMetadata
キャッシュに保存されたコンテンツの使用に関するメタデータ。
フィールド | |
---|---|
total_token_count |
キャッシュに保存されたコンテンツが消費するトークンの合計数。 |
text_count |
テキスト文字数。 |
image_count |
画像の数。 |
video_duration_seconds |
動画の長さ(秒単位)。 |
audio_duration_seconds |
音声の長さ(秒単位)。 |
GoAway
サーバーがクライアントを処理できなくなります。
フィールド | |
---|---|
time_left |
接続が ABORTED として終了するまでの残り時間。ここで返される最小時間は、特定のモデルのレート制限とともに別途指定します。 |
SessionResumptionUpdate
セッション再開ステータスの更新。
BidiGenerateContentSetup.session_resumption
が設定されている場合にのみ送信されます。
フィールド | |
---|---|
new_handle |
再開可能な状態を表す新しいハンドル。 |
resumable |
この時点でセッションを再開できる場合は true。 場合によっては、セッションを再開できないことがあります。その場合は、空の new_handle と resumable=false を送信します。このようなケースの例としては、モデルが関数呼び出しを実行する場合や、単に生成する場合などがあります。このような状態でセッションを再開すると(以前のセッション トークンを使用)、一部のデータが失われます。 |
last_consumed_client_message_index |
この SessionResumptionToken で表される状態に含まれる、クライアントから送信された最後のメッセージのインデックス。 このインデックスが存在すると、ユーザーは透過的に再接続でき、リアルタイムの音声入力/動画の一部が失われる問題を回避できます。クライアントが(GoAway の受信などにより)一時的に接続を切断する場合は、最後の 後で「再開して状態を復元」する場合は使用されません。そのような場合、部分的な音声フレームと動画フレームは必要ありません。 |
次のステップ
- 関数呼び出しの詳細を確認する。
- 例については、関数呼び出しのリファレンスをご覧ください。