Gemini Live API 支援與 Gemini 進行低延遲、即時的語音和視訊互動。它能夠處理連續的音訊、視訊或文字串流,以提供即時、自然逼真的語音回覆。
主要特性:
- ✅ 主動音訊:可控制模型何時回應以及在哪些情境下回應
- ✅ 音訊轉錄:提供使用者輸入和模型輸出的文字轉錄內容
- ✅ 工具使用:整合函式呼叫和 Google 搜尋等工具
- ✅ 共情對話:根據使用者輸入內容的情緒表達調整回覆風格和語氣
- ✅ 打斷功能:使用者可以隨時中斷模型,以便進行回應式互動
- ✅ 多語言支援:支援用 24 種語言進行對話
- ✅ 高音質:提供多種語言的自然、逼真的語音
介面說明
端點: wss://console.mixroute.io/v1beta/models/{model}/liveStream
特點:
- 支援 Gemini 所有原生特性
- 直接透傳,無協定轉換
- 使用 Gemini Live API 原生格式
範例:
const ws = new WebSocket('wss://console.mixroute.io/v1beta/models/gemini-live-2.5-flash-native-audio/liveStream', {
headers: {
'Authorization': 'Bearer sk-xxxx'
}
});
Bearer Token,如 Bearer sk-xxxxxxxxxx
支援的模型
以下模型支援 Gemini Live API:
| 模型 ID | 可用性 | 使用情境 | 主要特性 |
|---|
gemini-live-2.5-flash-native-audio | 已全面推出 | 推薦。低延遲語音代理。支援無縫多語言切換和情感基調。 | 原生音訊、音訊轉錄、語音活動偵測、共情對話、主動音訊、工具使用 |
音色和語言設定
音色設定
Gemini Live API 支援 30 種不同風格的預設音色,每種音色都有獨特的表達特點:
| 音色名稱 | 風格特點 | 音色名稱 | 風格特點 | 音色名稱 | 風格特點 |
|---|
| Zephyr | 明快 | Puck | 歡快 | Charon | 資訊豐富 |
| Kore | 堅定 | Fenrir | 興奮 | Leda | 青春活力 |
| Orus | 堅定 | Aoede | 輕快 | Callirrhoe | 輕鬆愉快 |
| Autonoe | 明快 | Enceladus | 氣聲 | Iapetus | 清晰明瞭 |
| Umbriel | 輕鬆 | Algieba | 流暢 | Despina | 流暢自然 |
| Erinome | 清晰 | Algenib | 沙啞 | Rasalgethi | 資訊豐富 |
| Laomedeia | 歡快 | Achernar | 柔和 | Alnilam | 堅定有力 |
| Schedar | 平穩 | Gacrux | 成熟 | Pulcherrima | 積極向上 |
| Achird | 友好 | Zubenelgenubi | 隨意 | Vindemiatrix | 溫柔舒緩 |
| Sadachbia | 活潑 | Sadaltager | 博學 | Sulafat | 溫暖舒適 |
預設音色:Zephyr(明快)
語言設定
支援 24 種語言,透過 BCP-47 語言代碼指定:
| 語言 | 代碼 | 語言 | 代碼 |
|---|
| 阿拉伯語(埃及) | ar-EG | 德語(德國) | de-DE |
| 英語(美國) | en-US | 西班牙語(美國) | es-US |
| 法語(法國) | fr-FR | 印地語(印度) | hi-IN |
| 印尼語 | id-ID | 義大利語(義大利) | it-IT |
| 日語(日本) | ja-JP | 韓語(韓國) | ko-KR |
| 葡萄牙語(巴西) | pt-BR | 俄語(俄羅斯) | ru-RU |
| 荷蘭語(荷蘭) | nl-NL | 波蘭語(波蘭) | pl-PL |
| 泰語(泰國) | th-TH | 土耳其語(土耳其) | tr-TR |
| 越南語(越南) | vi-VN | 羅馬尼亞語 | ro-RO |
| 烏克蘭語 | uk-UA | 孟加拉語 | bn-BD |
| 英語(印度) | en-IN | 馬拉地語(印度) | mr-IN |
| 泰米爾語(印度) | ta-IN | 泰盧固語(印度) | te-IN |
| 中文(繁體) | zh-TW | | |
預設語言:根據系統指令中的語言自動推斷
使用範例
const ws = new WebSocket('wss://console.mixroute.io/v1beta/models/gemini-live-2.5-flash-native-audio/liveStream', {
headers: {
'Authorization': 'Bearer sk-xxxx'
}
});
ws.onopen = () => {
console.log('WebSocket connected');
// 發送 setup 訊息
ws.send(JSON.stringify({
setup: {
model: "gemini-live-2.5-flash-native-audio",
generationConfig: {
temperature: 0.7,
responseModalities: ["AUDIO"]
},
systemInstruction: {
parts: [
{ text: "You are a helpful assistant. Speak naturally and conversationally." }
]
},
speechConfig: {
voiceConfig: {
prebuiltVoiceConfig: {
voiceName: "Puck"
}
}
}
}
}));
};
ws.onmessage = (event) => {
const message = JSON.parse(event.data);
console.log('Received:', message);
if (message.serverContent) {
// 處理輸出轉錄(音訊轉文字)
if (message.serverContent.outputTranscription) {
const text = message.serverContent.outputTranscription.text;
if (text) {
console.log('[轉錄]', text);
}
}
if (message.serverContent.modelTurn) {
// 處理模型輸出
message.serverContent.modelTurn.parts.forEach(part => {
if (part.text) {
console.log('Text:', part.text);
}
if (part.inlineData && part.inlineData.mimeType === "audio/pcm") {
// 處理音訊資料
const audioData = part.inlineData.data;
// audioData 是 base64 編碼的 PCM 音訊
}
});
}
if (message.serverContent.turnComplete) {
console.log('Turn complete');
}
}
if (message.setupComplete) {
console.log('Setup complete');
}
};
// 發送即時音訊輸入
function sendRealtimeAudio(audioBuffer) {
const base64Audio = btoa(
String.fromCharCode(...new Uint8Array(audioBuffer))
);
ws.send(JSON.stringify({
realtimeInput: {
mediaChunks: [
{
mimeType: "audio/pcm;rate=16000",
data: base64Audio
}
]
}
}));
}
// 發送文字訊息
function sendText(text) {
ws.send(JSON.stringify({
clientContent: {
turns: [
{
role: "user",
parts: [
{ text: text }
]
}
],
turnComplete: true
}
}));
}
import websocket
import json
import base64
import threading
def on_message(ws, message):
data = json.loads(message)
print(f"Received: {data}")
# 處理輸出轉錄
if "serverContent" in data:
server_content = data["serverContent"]
if "outputTranscription" in server_content:
transcription = server_content["outputTranscription"]
text = transcription.get("text", "")
if text:
print(f"[轉錄] {text}")
if "modelTurn" in server_content:
model_turn = server_content["modelTurn"]
if "parts" in model_turn:
for part in model_turn["parts"]:
if "text" in part:
print(f"Text: {part['text']}")
elif "inlineData" in part:
inline_data = part["inlineData"]
if inline_data.get("mimeType") == "audio/pcm":
audio_b64 = inline_data.get("data", "")
if audio_b64:
audio_data = base64.b64decode(audio_b64)
# 處理音訊資料
def on_error(ws, error):
print(f"Error: {error}")
def on_close(ws, close_status_code, close_msg):
print("Connection closed")
def on_open(ws):
print("WebSocket connected")
# 發送 setup 訊息
setup_message = {
"setup": {
"model": "gemini-live-2.5-flash-native-audio",
"generationConfig": {
"temperature": 0.7,
"responseModalities": ["AUDIO"]
},
"systemInstruction": {
"parts": [
{"text": "You are a helpful assistant."}
]
},
"speechConfig": {
"voiceConfig": {
"prebuiltVoiceConfig": {
"voiceName": "Puck"
}
}
}
}
}
ws.send(json.dumps(setup_message))
# 連接 WebSocket
ws_url = "wss://console.mixroute.io/v1beta/models/gemini-live-2.5-flash-native-audio/liveStream"
ws = websocket.WebSocketApp(
ws_url,
header={"Authorization": "Bearer sk-xxxx"},
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever()
設定範例
{
"setup": {
"model": "gemini-live-2.5-flash-native-audio",
"generationConfig": {
"temperature": 0.7,
"responseModalities": ["AUDIO"],
"speechConfig": {
"voiceConfig": {
"prebuiltVoiceConfig": {
"voiceName": "Zephyr"
}
},
"languageCode": "zh-TW"
}
},
"systemInstruction": {
"parts": [
{"text": "你是一個友好的助手,請用自然、對話式的方式回答問題。"}
]
}
}
}
{
"setup": {
"model": "gemini-live-2.5-flash-native-audio",
"generationConfig": {
"temperature": 0.7,
"responseModalities": ["AUDIO", "TEXT"],
"speechConfig": {
"voiceConfig": {
"prebuiltVoiceConfig": {
"voiceName": "Zephyr"
}
},
"languageCode": "zh-TW"
}
},
"systemInstruction": {
"parts": [
{"text": "你是一個友好的助手,請用自然、對話式的方式回答問題。"}
]
},
"tools": {
"googleSearch": {}
},
"proactivity": {
"proactiveAudio": false,
"empatheticMode": true
},
"outputAudioTranscription": {},
"realtimeInputConfig": {
"automaticActivityDetection": {
"disabled": false,
"startOfSpeechSensitivity": "START_SENSITIVITY_LOW",
"endOfSpeechSensitivity": "END_SENSITIVITY_HIGH",
"prefixPaddingMs": 0,
"silenceDurationMs": 0
}
}
}
}
設定說明:
responseModalities: 回應模態,只能選擇以下兩種之一:
["AUDIO"] - 僅音訊輸出
["AUDIO", "TEXT"] - 音訊 + 文字轉錄(推薦,可同時取得音訊和文字)
voiceName: 音色名稱,支援 30 種預設音色(見上方音色設定表)
languageCode: 語言代碼,支援 24 種語言(見上方語言設定表)
googleSearch: 啟用 Google 搜尋功能
proactiveAudio: 主動音訊,模型可以選擇不回應無關音訊
empatheticMode: 共情對話,根據情緒調整回覆風格
outputAudioTranscription: 啟用輸出音訊轉文字(需要在 responseModalities 中包含 "TEXT" 才能看到轉錄文字)
automaticActivityDetection: 語音活動偵測設定
訊息類型
客戶端訊息
| 訊息類型 | 說明 |
|---|
setup | 會話設定 |
clientContent | 客戶端內容(文字/音訊) |
realtimeInput | 即時音訊輸入 |
toolResponse | 工具回應 |
伺服器訊息
| 訊息類型 | 說明 |
|---|
setupComplete | 設定完成確認 |
serverContent | 伺服器內容(文字/音訊/轉錄) |
toolCall | 工具呼叫 |
toolCallCancellation | 工具呼叫取消 |
usageMetadata | 使用量統計 |
Token 統計
系統會分別統計:
- 總 Token 數
- 音訊 Token(輸入/輸出)
- 文字 Token(輸入/輸出)
使用量資訊會在 usageMetadata 訊息中回傳:
{
"usageMetadata": {
"totalTokenCount": 100,
"inputTokenCount": 50,
"outputTokenCount": 50,
"inputTokenDetails": {
"textTokens": 30,
"audioTokens": 20
},
"outputTokenDetails": {
"textTokens": 25,
"audioTokens": 25
}
}
}
定價說明
模型價格可能會變動,具體定價請以模型廣場顯示的最新價格為準。
Gemini Live API 按 token 計費,分別統計文字和音訊 tokens:
- 文字 Token:用於輸入的文字內容和輸出的文字轉錄
- 音訊 Token:用於輸入的音訊和輸出的音訊內容
系統會在 usageMetadata 訊息中回傳詳細的使用量統計,包括文字和音訊的輸入/輸出 token 數量。
技術規格
音訊格式
輸入音訊:
- 格式:16-bit PCM
- 取樣率:16kHz
- 位元組序:小端序
- 編碼:Base64
輸出音訊:
- 格式:16-bit PCM
- 取樣率:24kHz
- 位元組序:小端序
- 編碼:Base64
常見問題
在 setup 訊息的 speechConfig.voiceConfig.prebuiltVoiceConfig.voiceName 中指定音色名稱。支援 30 種預設音色,完整列表請查看上方的音色設定章節。預設音色為 Zephyr。
需要同時滿足兩個條件:
- 在 setup 訊息中添加
outputAudioTranscription: {} 欄位
- 在
generationConfig.responseModalities 中包含 "TEXT"(例如:["AUDIO", "TEXT"])
啟用後,伺服器會在 serverContent.outputTranscription 中回傳音訊的文字轉錄。
在 setup 訊息中添加 tools: { googleSearch: {} } 欄位。啟用後,模型可以在回答問題時搜尋最新的網路資訊。
發送新的 realtimeInput 或 clientContent 訊息會中斷當前回應。
是的,Gemini Live API 支援視訊輸入。在 clientContent 中可以包含視訊資料(JPEG 格式,1 FPS)。
系統會在回應過程中或回應完成時發送 usageMetadata 訊息,包含詳細的使用量統計資訊。
參考文件
wscat -c "wss://console.mixroute.io/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent?key=sk-xxxxxxxxxx"