Live API 可讓您與 Gemini 展開低延遲的雙向語音/視訊互動。使用 Live API,您可以為使用者提供自然、類似人類語音的對話體驗,並讓使用者透過語音指令中斷模型的回覆。Live API 可處理文字、音訊和影片輸入內容,並提供文字和音訊輸出內容。
如要進一步瞭解 Live API,請參閱這篇文章。
功能
Live API 包含下列主要功能:
- 多模態:模型可以看、聽和說話。
- 低延遲即時互動:模型可快速回應。
- 工作階段記憶:模型會保留單一工作階段中的所有互動記錄,並回想先前聽過或看過的資訊。
- 支援函式呼叫、程式碼執行和 Google 搜尋做為工具: 您可以將模型與外部服務和資料來源整合。
Live API 專為伺服器對伺服器通訊而設計。
如果是網站和行動應用程式,建議使用 Daily 合作夥伴的整合服務。
支援的模型
開始使用
如要試用 Live API,請前往 Vertex AI Studio,然後點選「開始工作階段」。
Live API 是使用 WebSockets 的有狀態 API。
本節提供範例,說明如何使用 Python 3.9 以上版本,透過 Live API 生成文字。
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),可以緩衝自上次 不會用於稍後「恢復以還原狀態」-- 在這些情況下,可能不需要部分音訊和視訊影格。 |