Live API 可讓您與 Gemini 進行低延遲的雙向語音/視訊互動。您可以使用 Live API,為使用者提供自然流暢的對話體驗,並讓使用者透過語音指令中斷模型的回覆。模型可處理文字、音訊和影片輸入內容,並提供文字和音訊輸出內容。
您可以在 Google AI Studio 中試用 Live API。
使用 Live API
本節說明如何搭配使用 Live API 和我們的 SDK。如要進一步瞭解基礎 WebSockets API,請參閱下方的 WebSockets API 參考資料。
收發簡訊
import asyncio
from google import genai
client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model = "gemini-2.0-flash-exp"
config = {"response_modalities": ["TEXT"]}
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
while True:
message = input("User> ")
if message.lower() == "exit":
break
await session.send(input=message, end_of_turn=True)
async for response in session.receive():
if response.text is not None:
print(response.text, end="")
if __name__ == "__main__":
asyncio.run(main())
接收音訊
以下範例說明如何接收音訊資料,並將資料寫入 .wav
檔案。
import asyncio
import wave
from google import genai
client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model = "gemini-2.0-flash-exp"
config = {"response_modalities": ["AUDIO"]}
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
wf = wave.open("audio.wav", "wb")
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(24000)
message = "Hello? Gemini are you there?"
await session.send(input=message, end_of_turn=True)
async for idx,response in async_enumerate(session.receive()):
if response.data is not None:
wf.writeframes(response.data)
# Comment this out to print audio data info
# if response.server_content.model_turn is not None:
# print(response.server_content.model_turn.parts[0].inline_data.mime_type)
wf.close()
if __name__ == "__main__":
asyncio.run(main())
音訊格式
Live API 支援下列音訊格式:
- 輸入音訊格式:原始 16 位元 PCM 音訊,位元深度為 16 位元,取樣率為 16 kHz 小端序
- 輸出音訊格式:24 kHz 小端序的原始 16 位元 PCM 音訊
串流音訊和視訊
系統指示
系統指示可讓您根據特定需求和用途,引導模型的行為。系統指示可在設定配置中設定,並在整個工作階段中持續生效。
from google.genai import types
config = {
"system_instruction": types.Content(
parts=[
types.Part(
text="You are a helpful assistant and answer in a friendly tone."
)
]
),
"response_modalities": ["TEXT"],
}
逐步更新內容
使用遞增更新功能傳送文字輸入內容、建立工作階段背景資訊或還原工作階段背景資訊。如果是短時間的內容,您可以傳送逐向互動,以代表確切的事件順序:
from google.genai import types
turns = [
types.Content(parts=[types.Part(text="What is the capital of France?")], role="user"),
types.Content(parts=[types.Part(text="Paris")], role="model")
]
await session.send(input=types.LiveClientContent(turns=turns))
turns = [types.Content(parts=[types.Part(text="What is the capital of Germany?")], role="user")]
await session.send(input=types.LiveClientContent(turns=turns, turn_complete=True))
{
"clientContent": {
"turns": [
{
"parts":[
{
"text": ""
}
],
"role":"user"
},
{
"parts":[
{
"text": ""
}
],
"role":"model"
}
],
"turnComplete": true
}
}
對於較長的背景資訊,建議您提供單一訊息摘要,以便釋出脈絡窗口,供後續互動使用。
變更語音
Live API 支援以下語音:Aoede、Charon、Fenrir、Kore 和 Puck。
如要指定語音,請在 speechConfig
物件中設定語音名稱,做為工作階段設定的一部分:
from google.genai import types
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
speech_config=types.SpeechConfig(
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(voice_name="Kore")
)
)
)
{
"voiceConfig": {
"prebuiltVoiceConfig": {
"voiceName": "Kore"
}
}
}
使用函式呼叫
您可以使用 Live API 定義工具。請參閱函式呼叫教學課程,進一步瞭解函式呼叫。
您必須在工作階段設定中定義工具:
config = types.LiveConnectConfig(
response_modalities=["TEXT"],
tools=[set_light_values]
)
async with client.aio.live.connect(model=model, config=config) as session:
await session.send(input="Turn the lights down to a romantic level", end_of_turn=True)
async for response in session.receive():
print(response.tool_call)
模型可從單一提示產生多個函式呼叫,以及連結輸出的必要程式碼。這個程式碼會在沙箱環境中執行,產生後續的 BidiGenerateContentToolCall 訊息。執行作業會暫停,直到每個函式呼叫的結果可用為止,藉此確保按順序處理。
用戶端應回覆 BidiGenerateContentToolResponse。
音訊輸入和輸出會對模型使用函式呼叫的功能造成負面影響。
處理中斷
使用者隨時可以中斷模型的輸出內容。當語音活動偵測功能 (VAD) 偵測到中斷情形時,系統會取消並捨棄目前的產生作業。只有已傳送至用戶端的資訊會保留在工作階段記錄中。接著,伺服器會傳送 BidiGenerateContentServerContent 訊息,回報中斷情形。
此外,Gemini 伺服器會捨棄任何待處理的函式呼叫,並傳送含有取消呼叫 ID 的 BidiGenerateContentServerContent
訊息。
async for response in session.receive():
if response.server_content.interrupted is not None:
# The generation was interrupted
限制
規劃專案時,請考量 Live API 和 Gemini 2.0 的下列限制。
用戶端驗證
Live API 只提供伺服器對伺服器驗證,不建議直接用於用戶端。用戶端輸入內容應透過中介應用程式伺服器進行轉送,以便透過 Live API 進行安全驗證。
對話記錄
雖然模型會追蹤工作階段中的互動,但不會儲存對話記錄。工作階段結束時,系統會清除對應的上下文。
為了還原先前的會話,或向模型提供使用者互動的歷史背景資訊,應用程式應自行維護對話記錄,並使用 BidiGenerateContentClientContent 訊息,在新的會話開始時傳送這項資訊。
工作階段持續時間上限
音訊工作階段持續時間上限為 15 分鐘,音訊和視訊則為 2 分鐘。如果工作階段時間長度超過限制,連線就會終止。
模型也受限於脈絡大小。與視訊和音訊串流一併傳送大量內容,可能會導致工作階段提早終止。
語音活動偵測 (VAD)
模型會自動對連續音訊輸入串流執行語音活動偵測 (VAD)。VAD 一律會啟用,且其參數無法設定。
符記數
不支援符記數量。
頻率限制
以下頻率限制適用於此 API:
- 每個 API 金鑰 3 個並行工作階段
- 每分鐘 400 萬個符記
WebSockets API 參考資料
Live API 是使用 WebSockets 的具狀態 API。本節將進一步說明 WebSockets API。
工作階段
WebSocket 連線會在用戶端和 Gemini 伺服器之間建立工作階段。用戶端啟動新連線後,工作階段可以與伺服器交換訊息,以便執行下列操作:
- 將文字、音訊或影片傳送至 Gemini 伺服器。
- 接收 Gemini 伺服器傳送的音訊、文字或函式呼叫要求。
連線後的初始訊息會設定工作階段設定,包括模型、產生參數、系統指示和工具。
請參閱以下設定範例。請注意,SDK 中的名稱大小寫可能會有所不同。如要查看 Python SDK 設定選項,請按這裡。
{
"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]
}
傳送訊息
如要透過 WebSocket 連線交換訊息,用戶端必須透過已開啟的 WebSocket 連線傳送 JSON 物件。JSON 物件必須包含下列物件集的單一欄位:
{
"setup": BidiGenerateContentSetup,
"clientContent": BidiGenerateContentClientContent,
"realtimeInput": BidiGenerateContentRealtimeInput,
"toolResponse": BidiGenerateContentToolResponse
}
支援的用戶端訊息
請參閱下表中支援的用戶端訊息:
訊息 | 說明 |
---|---|
BidiGenerateContentSetup |
要在第一則訊息中傳送的工作階段設定 |
BidiGenerateContentClientContent |
從用戶端傳送的目前對話內容增量更新 |
BidiGenerateContentRealtimeInput |
即時音訊或視訊輸入 |
BidiGenerateContentToolResponse |
回應伺服器傳回的 ToolCallMessage |
接收訊息
如要接收 Gemini 的訊息,請接聽 WebSocket 的「message」事件,然後根據支援的伺服器訊息定義剖析結果。
請參閱以下資訊:
async with client.aio.live.connect(model='...', config=config) as session:
await session.send(input='Hello world!', end_of_turn=True)
async for message in session.receive():
print(message)
伺服器訊息會包含下列物件集合中單一欄位:
{
"setupComplete": BidiGenerateContentSetupComplete,
"serverContent": BidiGenerateContentServerContent,
"toolCall": BidiGenerateContentToolCall,
"toolCallCancellation": BidiGenerateContentToolCallCancellation
}
支援的伺服器訊息
請參閱下表中支援的伺服器訊息:
訊息 | 說明 |
---|---|
BidiGenerateContentSetupComplete |
來自用戶端的 BidiGenerateContentSetup 訊息,在設定完成時傳送 |
BidiGenerateContentServerContent |
模型針對用戶端訊息產生的內容 |
BidiGenerateContentToolCall |
要求用戶端執行函式呼叫,並傳回與相符 ID 的回應 |
BidiGenerateContentToolCallCancellation |
當使用者中斷模型輸出作業,導致函式呼叫取消時傳送 |
訊息和事件
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
要求用戶端執行函式呼叫,並傳回與相符 id
的回應。
欄位 | |
---|---|
function_ |
僅供輸出。要執行的函式呼叫。 |
BidiGenerateContentToolCallCancellation
通知用戶端,先前發出的 ToolCallMessage
應不含指定的 id
,因此不應執行,應予以取消。如果這些工具呼叫有副作用,用戶端可能會嘗試撤銷工具呼叫。只有在用戶端中斷伺服器轉換時,才會出現這則訊息。
欄位 | |
---|---|
ids[] |
僅供輸出。要取消的工具呼叫 ID。 |
BidiGenerateContentToolResponse
用戶端針對從伺服器收到的 ToolCall
產生回應。個別 FunctionResponse
物件會透過 id
欄位與相應的 FunctionCall
物件配對。
請注意,在單向和伺服器串流 GenerateContent API 中,函式呼叫會透過交換 Content
部分,而在雙向 GenerateContent API 中,函式呼叫會透過這些專用訊息組進行。
欄位 | |
---|---|
function_ |
選用設定。函式呼叫的回應。 |
進一步瞭解常見類型
如要進一步瞭解常用的 API 資源類型 Blob
、Content
、FunctionCall
、FunctionResponse
、GenerationConfig
、GroundingMetadata
和 Tool
,請參閱產生內容。
第三方整合
如要部署網站和行動應用程式,您可以參考以下選項: