透過 Live API,您可以與 Gemini 展開低延遲的雙向語音/視訊互動。使用 Live API,您可以為使用者提供自然、類似人類語音的對話體驗,並讓使用者透過語音指令中斷模型的回覆。Live API 可處理文字、音訊和影片輸入內容,並提供文字和音訊輸出內容。
如要進一步瞭解 Live API,請參閱這篇文章。
功能
Live API 包含下列主要功能:
- 多模態:模型可以看、聽和說話。
- 低延遲即時互動:模型可快速回應。
- 工作階段記憶:模型會保留單一工作階段中的所有互動記錄,並回想先前聽過或看過的資訊。
- 支援函式呼叫、程式碼執行和 Google 搜尋做為工具: 您可以將模型與外部服務和資料來源整合。
Live API 專為伺服器對伺服器通訊而設計。
如果是網站和行動應用程式,建議使用 Daily 合作夥伴的整合服務。
支援的模型
- Gemini 2.5 Flash with Live API native audio (預先發布版)
- Gemini 2.0 Flash with Live API (預先發布版)
- Gemini 2.5 Flash
開始使用
如要試用 Live API,請前往 Vertex AI Studio,然後點選「開始工作階段」。
Live API 是使用 WebSockets 的有狀態 API。
本節提供範例,說明如何使用 Live API 產生文字,並使用 Python 3.9 以上版本。
Python
安裝
pip install --upgrade google-genai
詳情請參閱 SDK 參考說明文件。
設定環境變數,透過 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=global 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 物件必須只包含一個下列物件集中的欄位:
{
"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 } });
伺服器訊息會只包含下列物件集中的一個欄位:
{
"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 |
使用者或模型語音的轉錄稿 |
分批更新內容
使用增量更新傳送文字輸入內容、建立工作階段情境資訊,或還原工作階段情境資訊。如為簡短情境,您可以傳送逐輪互動,代表確切的事件順序。如果脈絡較長,建議提供單一訊息摘要,以釋放脈絡窗口,供後續互動使用。
請參閱以下範例情境訊息:
{ "clientContent": { "turns": [ { "parts":[ { "text": "" } ], "role":"user" }, { "parts":[ { "text": "" } ], "role":"model" } ], "turnComplete": true } }
請注意,雖然內容部分可以是 functionResponse
型別,但 BidiGenerateContentClientContent
不應用於提供模型發出的函式呼叫回覆。請改用 BidiGenerateContentToolResponse
。BidiGenerateContentClientContent
只能用於建立先前的脈絡,或在對話中提供文字輸入內容。
串流音訊和影片
程式碼執行
如要進一步瞭解程式碼執行作業,請參閱「程式碼執行」。
函式呼叫
所有函式都必須在工作階段開始時宣告,方法是在 BidiGenerateContentSetup
訊息中傳送工具定義。
您可以使用 JSON 定義函式,具體來說,就是使用OpenAPI 結構定義格式的選取子集。單一函式宣告可包含下列參數:
name (字串):API 呼叫中函式的專屬 ID。
description (字串):詳細說明函式的用途和功能。
參數 (物件):定義函式所需的輸入資料。
type (字串):指定整體資料類型,例如物件。
properties (物件):列出個別參數,每個參數都包含:
- type (字串):參數的資料類型,例如字串、整數、布林值。
- 說明 (字串):清楚說明參數的用途和預期格式。
必要 (陣列):字串陣列,列出函式運作時必須提供的參數名稱。
如需使用 curl 指令宣告函式的程式碼範例,請參閱「使用 Gemini API 呼叫函式」。如需如何使用 Gemini API SDK 建立函式宣告的範例,請參閱函式呼叫教學課程。
模型可以根據單一提示產生多個函式呼叫,以及串連輸出內容所需的程式碼。這段程式碼會在沙箱環境中執行,產生後續的 BidiGenerateContentToolCall
訊息。執行作業會暫停,直到每個函式呼叫的結果都可用為止,確保處理作業依序進行。
用戶端應回覆 BidiGenerateContentToolResponse
。
詳情請參閱「函式呼叫簡介」。
音訊格式
請參閱支援的音訊格式清單。
系統指示
您可以提供系統指令,進一步控制模型的輸出內容,並指定語音回覆的語調和情緒。
系統指令會在互動開始前加入提示,並在整個工作階段中生效。
系統指令只能在工作階段開始時設定,也就是初始連線後立即設定。如要在工作階段期間提供更多模型輸入內容,請使用增量內容更新。
中斷
使用者隨時可以中斷模型輸出內容。當語音活動偵測 (VAD) 偵測到中斷時,系統會取消並捨棄正在進行的生成作業。工作階段記錄只會保留已傳送給用戶端的資訊。伺服器接著會傳送 BidiGenerateContentServerContent
訊息,回報中斷情形。
此外,Gemini 伺服器會捨棄所有待處理的函式呼叫,並傳送 BidiGenerateContentServerContent
訊息,其中包含已取消呼叫的 ID。
語音
如要指定語音,請在 speechConfig
物件中設定 voiceName
,做為工作階段設定的一部分。
請參閱下列 speechConfig
物件的 JSON 表示法:
{ "voiceConfig": { "prebuiltVoiceConfig": { "voiceName": "VOICE_NAME" } } }
如要查看支援的語音清單,請參閱「變更語音和語言設定」。
限制
規劃專案時,請考量 Live API 和 Gemini 2.0 的下列限制。
用戶端驗證
Live API 僅提供伺服器對伺服器驗證,不建議直接供用戶端使用。用戶端輸入內容應透過中繼應用程式伺服器傳送,以便透過 Live API 進行安全驗證。
工作階段時間上限
對話工作階段的預設時間上限為 10 分鐘。詳情請參閱「工作階段長度」。
語音活動偵測 (VAD)
根據預設,模型會對連續音訊輸入串流自動執行語音活動偵測 (VAD)。VAD 可透過設定訊息的RealtimeInputConfig.AutomaticActivityDetection
欄位進行設定。
如果音訊串流暫停超過一秒 (例如使用者關閉麥克風時),系統會傳送 AudioStreamEnd
事件,清除所有快取音訊。用戶端隨時可以繼續傳送音訊資料。
或者,您也可以在設定訊息中將 RealtimeInputConfig.AutomaticActivityDetection.disabled
設為 true
,關閉自動 VAD。在此設定中,用戶端負責偵測使用者語音,並在適當時間傳送 ActivityStart
和 ActivityEnd
訊息。這個設定未傳送 AudioStreamEnd
。而是以 ActivityEnd
訊息標示串流中斷。
其他限制
系統不支援手動設定端點。
音訊輸入和輸出會對模型使用函式呼叫功能的能力造成負面影響。
權杖數量
不支援權杖計數。
頻率限制
適用下列頻率限制:
- 每個 API 金鑰 5,000 個並行工作階段
- 每分鐘 400 萬個符記
訊息和活動
BidiGenerateContentClientContent
用戶端傳送的目前對話增量更新。系統會將這裡的所有內容無條件附加至對話記錄,並做為提示的一部分,供模型生成內容。
如果在這裡輸入訊息,系統就會中斷目前正在生成模型的作業。
欄位 | |
---|---|
turns[] |
(選用步驟) 附加至目前與模型對話的內容。 如果是單輪查詢,則為單一執行個體。如果是多輪查詢,這個重複欄位會包含對話記錄和最新要求。 |
turn_complete |
(選用步驟) 如果為 true,表示伺服器內容生成作業應從目前累積的提示開始。否則,伺服器會等待其他訊息,然後再開始生成內容。 |
BidiGenerateContentRealtimeInput
即時傳送的使用者輸入內容。
這與 ClientContentUpdate
有以下幾點不同:
- 可持續傳送,不會中斷模型生成作業。
- 如果需要混合交錯在
ClientContentUpdate
和RealtimeUpdate
中的資料,伺服器會盡量提供最佳回應,但無法保證。 - 系統不會明確指定回合結束,而是根據使用者活動 (例如語音結束) 推斷。
- 即使在輪流對話結束前,系統也會逐步處理資料,盡快開始生成模型回覆。
- 一律視為使用者的輸入內容 (無法用於填入對話記錄)。
欄位 | |
---|---|
media_chunks[] |
(選用步驟) 媒體輸入的內嵌位元組資料。 |
activity_start |
(選用步驟) 標記使用者活動的開始時間。只有在停用自動 (即伺服器端) 活動偵測功能時,才能傳送這項資料。 |
activity_end |
(選用步驟) 標記使用者活動的結束時間。只有在停用自動 (即伺服器端) 活動偵測功能時,才能傳送這項資料。 |
ActivityEnd
這個類型沒有任何欄位。
標記使用者活動的結束時間。
ActivityStart
這個類型沒有任何欄位。
一次只能設定這則訊息中的一個欄位。標記使用者活動的開始時間。
BidiGenerateContentServerContent
模型根據用戶端訊息產生的伺服器增量更新。
系統會盡快生成內容,但不會即時生成。用戶端可以選擇緩衝處理並即時播放。
欄位 | |
---|---|
turn_complete |
僅供輸出。如為 true,表示模型已完成生成。系統只會在收到其他用戶端訊息時開始生成內容。可與 |
interrupted |
僅供輸出。如果為 true,表示用戶端訊息已中斷目前模型生成作業。如果用戶即時播放內容,這就是停止並清空目前佇列的好時機。如果用戶端即時播放內容,這項信號就適合用來停止並清空目前的播放佇列。 |
generation_complete |
僅供輸出。如為 true,表示模型已完成生成。 如果模型在生成期間中斷,中斷的回合中不會有「generation_complete」訊息,而是會經歷「interrupted > turn_complete」。 如果模型假設為即時播放,則生成完成和回合完成之間會出現延遲,這是因為模型會等待播放完成。 |
grounding_metadata |
僅供輸出。中繼資料會指定用來生成內容的來源。 |
input_transcription |
(選用步驟) 輸入轉錄內容。轉錄內容與模型回合無關,因此轉錄內容和模型回合之間沒有任何順序關係。 |
output_transcription |
(選用步驟) 輸出轉錄稿。轉錄內容與模型回合無關,因此轉錄內容和模型回合之間沒有任何順序關係。 |
model_turn |
僅供輸出。模型在與使用者進行目前對話時生成的內容。 |
語音轉錄
音訊轉錄訊息。
欄位 | |
---|---|
text |
(選用步驟) 轉錄稿文字。 |
finished |
(選用步驟) 這個布林值表示轉錄作業已結束。 |
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
通知用戶端先前發出的 ToolCallMessage
(具有指定的 id
) 應未執行,且應取消。如果這些工具呼叫產生副作用,用戶端可能會嘗試還原工具呼叫。只有在用戶端中斷伺服器回合時,才會出現這則訊息。
欄位 | |
---|---|
ids[] |
僅供輸出。要取消的工具呼叫 ID。 |
BidiGenerateContentToolResponse
用戶端針對伺服器傳回的 ToolCall
產生回應。個別 FunctionResponse
物件會透過 id
欄位與對應的 FunctionCall
物件相符。
請注意,在 unary 和 server-streaming GenerateContent API 中,函式呼叫是透過交換 Content
部分進行,而在 bidi 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 |
(選用步驟) 系統偵測到語音後,必須經過這段時間才會開始辨識。這個值越低,語音開始偵測的靈敏度就越高,可辨識的語音長度就越短。但這也會增加誤判的可能性。 |
silence_duration_ms |
(選用步驟) 系統偵測到靜音 (或非語音) 的必要時間長度,之後才會提交語音結尾。這個值越大,語音間隔時間就越長,不會中斷使用者的活動,但會增加模型的延遲時間。 |
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),可以緩衝自上次 不會用於稍後「恢復以還原狀態」-- 在這些情況下,可能不需要部分音訊和視訊影格。 |