Multimodal Live API を使用すると、Gemini との低レイテンシの双方向音声とビデオのやり取りが可能になります。Multimodal Live API を使用すると、エンドユーザーに自然で人間のような音声会話のエクスペリエンスを提供できます。また、音声コマンドを使用してモデルのレスポンスを中断することもできます。このモデルは、テキスト、音声、動画の入力を処理し、テキストと音声の出力を生成できます。
機能
Multimodal Live API には、次の主な機能が含まれています。
- マルチモーダル: モデルは視覚、聴覚、音声を認識できます。
- 低レイテンシのリアルタイム インタラクション: 迅速なレスポンスを提供します。
- セッション メモリ: モデルは、1 つのセッション内のすべてのインタラクションのメモリを保持し、以前に聞いたことや見たことがある情報を呼び出します。
- 関数呼び出し、コード実行、ツールとしての検索のサポート: 外部サービスやデータソースとの統合が可能になります。
- 自動音声アクティビティ検出(VAD): モデルは、ユーザーが発話を開始および停止したタイミングを正確に認識できます。これにより、自然な会話型のやり取りが可能になり、ユーザーはいつでもモデルを中断できます。
Multimodal Live API は Google AI Studio で試すことができます。
使ってみる
Multimodal Live API は、WebSockets を使用するステートフル API です。
このセクションでは、Python 3.9 以降を使用して、Multimodal Live API を使用して text-to-text 生成を行う方法の例を示します。
Gemini API ライブラリをインストールする
google-genai
パッケージをインストールするには、次の pip
コマンドを使用します。
!pip3 install google-genai
依存関係をインポートする
依存関係をインポートするには:
from google import genai
テキスト メッセージを送受信する
import asyncio
from google import genai
client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model_id = "gemini-2.0-flash-exp"
config = {"response_modalities": ["TEXT"]}
async def main():
async with client.aio.live.connect(model=model_id, config=config) as session:
while True:
message = input("User> ")
if message.lower() == "exit":
break
await session.send(message, end_of_turn=True)
async for response in session.receive():
if response.text is None:
continue
print(response.text, end="")
if __name__ == "__main__":
asyncio.run(main())
統合ガイド
このセクションでは、Multimodal Live API との統合の仕組みについて説明します。
セッション
セッションは、クライアントと Gemini サーバー間の単一の WebSocket 接続を表します。
クライアントが新しい接続を開始すると、セッションはサーバーとメッセージを交換して、次のことができます。
- テキスト、音声、動画を Gemini サーバーに送信する。
- Gemini サーバーから音声、テキスト、関数呼び出しのレスポンスを受け取る。
セッション構成は、接続後の最初のメッセージで送信されます。セッション構成には、モデル、生成パラメータ、システム指示、ツールが含まれます。
次の構成例をご覧ください。
{
"model": string,
"generation_config": {
"candidate_count": integer,
"max_output_tokens": integer,
"temperature": number,
"top_p": number,
"top_k": integer,
"presence_penalty": number,
"frequency_penalty": number,
"response_modalities": string,
"speech_config":object
},
"system_instruction": "",
"tools":[]
}
詳細については、BidiGenerateContentSetup をご覧ください。
メッセージを送信する
メッセージは、WebSocket 接続を介して交換される JSON 形式の文字列です。
メッセージを送信するには、クライアントが、開いている WebSocket 接続を介して、サポートされているクライアント メッセージを JSON 形式の文字列で送信する必要があります。
サポートされているクライアント メッセージ
サポートされているクライアント メッセージを次の表に示します。
メッセージ | 説明 |
---|---|
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
}
});
サポートされているサーバー メッセージ
サポートされているサーバー メッセージを次の表に示します。
メッセージ | 説明 |
---|---|
BidiGenerateContentSetupComplete |
セットアップが完了したときにクライアントから送信される BidiGenerateContentSetup メッセージ |
BidiGenerateContentServerContent |
クライアント メッセージに応答してモデルが生成したコンテンツ |
BidiGenerateContentToolCall |
クライアントに、関数呼び出しを実行して、一致する ID を含むレスポンスを返すようリクエストします。 |
BidiGenerateContentToolCallCancellation |
ユーザーがモデル出力を中断したために関数呼び出しがキャンセルされたときに送信されます。 |
コンテンツの増分更新
増分更新を使用して、テキスト入力の送信、セッション コンテキストの確立、復元を行います。短いコンテキストの場合は、ターンバイターン インタラクションを送信して、イベントの正確な順序を表すことができます。コンテキストが長い場合は、1 つのメッセージの要約を提供することによって、フォローアップのやり取り用にコンテキスト ウィンドウを空けておくことをおすすめします。
コンテキスト メッセージの例を次に示します。
{
"client_content": {
"turns": [
{
"parts":[
{
"text": ""
}
],
"role":"user"
},
{
"parts":[
{
"text": ""
}
],
"role":"model"
}
],
"turn_complete": true
}
}
コンテンツ部分は functionResponse
型にできますが、モデルによって発行された関数呼び出しに応答するために BidiGenerateContentClientContent
を使用することはできません。代わりに BidiGenerateContentToolResponse
を使用してください。BidiGenerateContentClientContent
は、以前のコンテキストを確立する場合や、会話にテキスト入力を提供する場合にのみ使用してください。
音声と動画のストリーミング
関数呼び出し
すべての関数は、BidiGenerateContentSetup
メッセージの一部としてツール定義を送信して、セッションの開始時に宣言する必要があります。
関数呼び出しの詳細については、関数呼び出しチュートリアルをご覧ください。
モデルは、単一のプロンプトから複数の関数呼び出しと、出力を連結するために必要なコードを生成できます。このコードはサンドボックス環境で実行され、後続の BidiGenerateContentToolCall
メッセージを生成します。各関数呼び出しの結果が利用可能になるまで実行が停止し、順序処理が保証されます。
クライアントは BidiGenerateContentToolResponse
を返すはずです。
オーディオ入力とオーディオ出力は、モデルが関数呼び出しを使用できる能力に悪影響を及ぼします。
オーディオ形式
Multimodal Live API は、次の音声形式をサポートしています。
- 入力音声形式: 16 kHz リトル エンディアンの未加工 16 ビット PCM オーディオ
- 出力音声形式: 24 kHz リトル エンディアンの未加工 16 ビット PCM オーディオ
システム指示
システム指示を指定すると、モデルの出力をより適切に制御し、音声レスポンスをトーンやセンチメントで指定できます。
システム指示は、インタラクションの開始前にプロンプトに追加され、セッション全体で有効になります。
システム インストラクションは、最初の接続直後のセッションの開始時にのみ設定できます。セッション中にモデルに追加の入力を提供するには、増分コンテンツ更新を使用します。
割り込み
モデルの出力はいつでも中断できます。音声アクティビティ検出(VAD)が中断を検出すると、進行中の生成はキャンセルされ、破棄されます。セッション履歴に保持されるのは、クライアントにすでに送信された情報のみです。その後、サーバーは中断を報告する BidiGenerateContentServerContent
メッセージを送信します。
さらに、Gemini サーバーは保留中の関数呼び出しを破棄し、キャンセルされた呼び出しの ID を含む BidiGenerateContentServerContent
メッセージを送信します。
音声
Multimodal Live API は、Aoede、Charon、Fenrir、Kore、Puck の音声をサポートしています。
音声を指定するには、セッション構成の一部として、speech_config
オブジェクト内に voice_name
を設定します。
speech_config
オブジェクトの JSON 表現は次のとおりです。
{
"voice_config": {
"prebuilt_voice_config ": {
"voice_name": <var>VOICE_NAME</var>
}
}
}
制限事項
プロジェクトを計画する際は、Multimodal Live API と Gemini 2.0 の次の制限事項を考慮してください。
クライアント認証
Multimodal Live API はサーバー間認証のみを提供するため、クライアントが直接使用することはおすすめしません。Multimodal Live API で安全に認証を行うには、クライアント入力を中間アプリケーション サーバー経由で転送する必要があります。
ウェブアプリとモバイルアプリの場合は、Daily のパートナーによる統合を使用することをおすすめします。
会話の履歴
モデルはセッション内のインタラクションを記録しますが、会話履歴は保存されません。セッションが終了すると、対応するコンテキストは消去されます。
以前のセッションを復元したり、ユーザー操作の過去のコンテキストをモデルに提供したりするには、アプリケーションが独自の会話ログを維持し、BidiGenerateContentClientContent
メッセージを使用して新しいセッションの開始時にこの情報を送信する必要があります。
セッションの最大継続時間
セッションの長さは、音声の場合は最大 15 分、音声と動画の場合は最大 2 分に制限されます。セッション時間が上限を超えると、接続が終了します。
また、モデルはコンテキストのサイズによって制限されます。動画ストリームや音声ストリームとともに大量のコンテンツ チャンクを送信すると、セッションが早期に終了する可能性があります。
音声アクティビティの検出(VAD)
このモデルは、連続的な音声入力ストリームに対して音声アクティビティ検出(VAD)を自動的に実行します。VAD は常に有効になっており、そのパラメータは構成できません。
トークン数
トークン数はサポートされていません。
レート制限
次のレート制限が適用されます。
- API キーごとに 3 つの同時実行セッション
- 1 分あたり 400 万トークン
メッセージとイベント
BidiGenerateContentClientContent
クライアントから送信された現在の会話の増分更新。ここでのコンテンツはすべて、無条件で会話履歴に追加され、コンテンツを生成するモデルへのプロンプトの一部として使用されます。
メッセージが表示されると、現在のモデルの生成が中断されます。
フィールド | |
---|---|
turns[] |
省略可。モデルとの現在の会話に追加されたコンテンツ。 シングルターンのクエリの場合、これは単一のインスタンスです。マルチターン クエリの場合、これは会話履歴と最新のリクエストを含む繰り返しフィールドです。 |
turn_ |
省略可。true の場合、サーバーのコンテンツ生成は現在蓄積されているプロンプトから開始されることを示します。それ以外の場合は、サーバーは追加のメッセージを待ってから生成を開始します。 |
BidiGenerateContentRealtimeInput
リアルタイムで送信されるユーザー入力。
これは BidiGenerateContentClientContent
とはいくつかの点で異なります。
- モデルの生成を中断することなく継続的に送信できます。
BidiGenerateContentClientContent
とBidiGenerateContentRealtimeInput
にまたがってインターリーブされたデータを混在させる必要がある場合、サーバーは最適なレスポンスを得るために最適化を試みますが、保証はされません。- ターンの終了は明示的に指定されず、ユーザー アクティビティ(音声の終了など)から導出されます。
- ターンが終了する前でも、データは増分処理され、モデルからのレスポンスを迅速に開始できるように最適化されます。
- 常にリアルタイムで送信される直接のユーザー入力です。中断することなく継続的に送信できます。このモデルは、ユーザーの音声の開始と終了を自動的に検出し、それに応じてレスポンスをストリーミングを開始または終了します。データは受信時に増分処理されるため、レイテンシが最小限に抑えられます。
フィールド | |
---|---|
media_ |
省略可。メディア入力用のバイトデータがインライン化されています。 |
BidiGenerateContentServerContent
クライアント メッセージに応答してモデルによって生成された増分サーバー アップデート。
コンテンツはリアルタイムではなく、できるだけ早く生成されます。クライアントは、バッファリングしてリアルタイムで再生することもできます。
フィールド | |
---|---|
turn_ |
出力専用。true の場合、モデルの生成が完了したことを示します。生成は、追加のクライアント メッセージに応答してのみ開始されます。 |
interrupted |
出力専用。true の場合、クライアント メッセージによって現在のモデル生成が中断されたことを示します。クライアントがコンテンツをリアルタイムで再生している場合は、現在の再生キューを停止して空にするのが適切なタイミングです。 |
grounding_ |
出力専用。生成されたコンテンツのグラウンドング メタデータ。 |
model_ |
出力専用。ユーザーとの現在の会話の一部としてモデルが生成したコンテンツ。 |
BidiGenerateContentSetup
最初のクライアント メッセージで送信されるメッセージ(最初のメッセージでのみ送信されます)。ストリーミング セッションの期間に適用される構成が含まれます。
クライアントは、BidiGenerateContentSetupComplete
メッセージを待ってから、追加のメッセージを送信する必要があります。
フィールド | |
---|---|
model |
必須。モデルのリソース名。これは、モデルが使用する ID として機能します。 形式: |
generation_ |
省略可。生成構成。 次のフィールドはサポートされていません。
|
system_ |
省略可。ユーザーがモデルに提供するシステム指示。 注: パートにはテキストのみを使用します。各パートのコンテンツは別の段落にします。 |
tools[] |
省略可。モデルが次のレスポンスを生成するために使用する可能性がある
|
BidiGenerateContentSetupComplete
この型にはフィールドがありません。
クライアントからの BidiGenerateContentSetup
メッセージに応答して送信されます。
BidiGenerateContentToolCall
クライアントに function_calls
を実行し、一致する id
を含むレスポンスを返すようリクエストします。
フィールド | |
---|---|
function_ |
出力専用。実行される関数呼び出し。 |
BidiGenerateContentToolCallCancellation
指定された id
を使用して以前に発行された ToolCallMessage
は実行されず、キャンセルされる必要があることをクライアントに通知します。これらのツール呼び出しに副作用があった場合、クライアントはツール呼び出しの取り消しを試みることがあります。このメッセージは、クライアントがサーバー ターンを中断した場合にのみ表示されます。
フィールド | |
---|---|
ids[] |
出力専用。キャンセルするツール呼び出しの ID。 |
BidiGenerateContentToolResponse
サーバーから受信した ToolCall
に対するクライアント生成レスポンス。個々の FunctionResponse
オブジェクトは、id
フィールドによってそれぞれの FunctionCall
オブジェクトと照合されます。
なお、単一呼び出しとサーバー ストリーミングの GenerateContent API では、Content
部分を交換することで関数呼び出しが行われますが、双方向の GenerateContent API では、これらの専用のメッセージセットを介して関数呼び出しが行われます。
フィールド | |
---|---|
function_ |
省略可。関数呼び出しへのレスポンス。 |
一般的なタイプの詳細
よく使用される API リソース タイプ Blob
、Content
、FunctionCall
、FunctionResponse
、GenerationConfig
、GroundingMetadata
、Tool
について詳しくは、コンテンツの生成をご覧ください。