Live API 可讓您與 Gemini 進行低延遲的雙向語音/視訊互動。您可以使用 Live API,為使用者提供自然流暢的對話體驗,並讓使用者透過語音指令中斷模型的回覆。Live API 可處理文字、音訊和影片輸入內容,並提供文字和音訊輸出內容。
如要進一步瞭解 Live API,請參閱 Live API。
功能
Live API 提供下列主要功能:
- 多模態:模型可看、聽和說。
- 低延遲即時互動:模型可提供快速回應。
- 工作階段記憶:模型會保留單一工作階段內所有互動的記憶,回想先前聽到或看到的資訊。
- 支援函式呼叫、程式碼執行和搜尋做為工具:您可以將模型與外部服務和資料來源整合。
Live API 是用於伺服器對伺服器的通訊。
如果是網頁和行動應用程式,建議您使用Daily 合作夥伴提供的整合服務。
支援的模型
開始使用
如要試用 Live API,請前往 Vertex AI Studio,然後點選「Start Session」。
Live API 是使用 WebSockets 的具狀態 API。
本節將舉例說明如何使用 Live API 將文字轉換為文字,並使用 Python 3.9 以上版本。
Gen AI SDK for 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 (字串):參數的資料類型,例如字串、整數、布林值。
- description (字串):清楚說明參數的用途和預期格式。
required (陣列):字串陣列,列出函式運作時必須使用的參數名稱。
如需使用 curl 指令的函式宣告程式碼範例,請參閱「使用 Gemini API 的函式呼叫」。如需使用 Gemini API SDK 建立函式宣告的範例,請參閱函式呼叫教學課程。
模型可從單一提示產生多個函式呼叫,以及連結輸出的必要程式碼。這段程式碼會在沙箱環境中執行,產生後續 BidiGenerateContentToolCall
訊息。執行作業會暫停,直到每個函式呼叫的結果可用為止,藉此確保依序處理。
用戶端應回覆 BidiGenerateContentToolResponse
。
詳情請參閱「函式呼叫簡介」。
音訊格式
請參閱支援的音訊格式清單。
系統指示
您可以提供系統指令,進一步控制模型的輸出內容,並指定音訊回覆的語調和情緒。
系統指令會在互動開始前加入提示,並在整個工作階段持續生效。
系統指令只能在工作階段開始時 (即初始連線後) 設定。如要在工作階段期間為模型提供更多輸入內容,請使用增量內容更新功能。
中斷
使用者隨時可以中斷模型的輸出內容。當語音活動偵測 (VAD) 偵測到中斷情形時,系統會取消並捨棄目前的產生作業。只有已傳送給用戶端的資訊會保留在工作階段記錄中。接著,伺服器會傳送 BidiGenerateContentServerContent
訊息,回報中斷情形。
此外,Gemini 伺服器會捨棄任何待處理的函式呼叫,並傳送含有已取消呼叫 ID 的 BidiGenerateContentServerContent
訊息。
語音
如要指定語音,請在 speechConfig
物件中設定 voiceName
,做為工作階段設定的一部分。
請參閱以下 speechConfig
物件的 JSON 表示法:
{ "voiceConfig": { "prebuiltVoiceConfig": { "voiceName": "VOICE_NAME" } } }
如要查看支援的語音清單,請參閱「變更語音和語言設定」。
限制
規劃專案時,請考量 Live API 和 Gemini 2.0 的下列限制。
用戶端驗證
Live API 只提供伺服器對伺服器的驗證,不建議直接用於用戶端。用戶端輸入內容應透過中介應用程式伺服器進行轉送,以便透過 Live API 進行安全驗證。
工作階段持續時間上限
對話會話的預設最長時間為 10 分鐘。詳情請參閱「工作階段長度」。
語音活動偵測 (VAD)
根據預設,模型會自動對連續音訊輸入串流執行語音活動偵測 (VAD)。您可以使用設定訊息的 RealtimeInputConfig.AutomaticActivityDetection
欄位設定 VAD。
當音訊串流暫停超過一秒 (例如使用者關閉麥克風時),系統會傳送 AudioStreamEnd
事件,以清除任何快取音訊。用戶端隨時可以恢復傳送音訊資料。
或者,您也可以在設定訊息中將 RealtimeInputConfig.AutomaticActivityDetection.disabled
設為 true
,藉此關閉自動 VAD。在這個設定中,用戶端負責偵測使用者的語音,並在適當時間傳送 ActivityStart
和 ActivityEnd
訊息。這個設定不會傳送 AudioStreamEnd
。而是會在串流中斷時標示 ActivityEnd
訊息。
其他限制
系統不支援手動端點設定。
音訊輸入和輸出會對模型使用函式呼叫的功能造成負面影響。
符記數
不支援符記數量。
頻率限制
適用下列頻率限制:
- 每個 API 金鑰 3 個並行工作階段
- 每分鐘 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」。 當模型假設即時播放時,在 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
通知用戶端,先前發出的 ToolCallMessage
應未執行,且應取消。id
如果這些工具呼叫有副作用,用戶端可能會嘗試撤銷工具呼叫。只有在用戶端中斷伺服器轉換時,才會顯示這則訊息。
欄位 | |
---|---|
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 |
(非必要) 系統偵測到語音後,需要等待多久才能提交語音開始時間。這個值越低,語音開始偵測的靈敏度就越高,可辨識的語音越短。不過,這也會增加偽陽性的機率。 |
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 |
連線會在剩餘時間過後終止,並顯示為「已中止」。此處傳回的最短時間會與特定模型的速率限制一起指定。 |
SessionResumptionUpdate
更新工作階段恢復狀態。
只有在設定 BidiGenerateContentSetup.session_resumption
時才會傳送。
欄位 | |
---|---|
new_handle |
代表可繼續執行的狀態的新句柄。如果 |
resumable |
如果此時可恢復工作階段,則為 true。 在某些情況下,您可能無法繼續工作階段。在這種情況下,我們會傳送空白的 new_handle 更新,並將 resumable 設為 false。這類情況的例子包括模型執行函式呼叫或只是產生函式呼叫。在這種狀態下,使用先前的工作階段權杖繼續工作階段,可能會導致部分資料遺失。 |
last_consumed_client_message_index |
用戶端傳送的最後一則訊息索引,這則訊息包含在這個 SessionResumptionToken 所代表的狀態中。只有在設定 這個索引的存在可讓使用者以透明的方式重新連線,避免發生部分即時音訊輸入/影片遺失的問題。如果用戶端希望暫時斷線 (例如收到 GoAway 後),可以透過緩衝上次 這項功能不會用於稍後的「暫停以還原狀態」-- 在這種情況下,可能不需要部分音訊和視訊影格。 |