Google Gemini Live 語音
GeminiLiveVoice 類別使用 Google Gemini Live API 提供實時語音互動功能。它支援雙向音訊串流、Tool 調用、工作階段管理,以及標準 Google API 和 Vertex AI 驗證方式。
使用範例使用範例 的直接連結
import { GeminiLiveVoice } from '@mastra/voice-google-gemini-live'
import { playAudio, getMicrophoneStream } from '@mastra/node-audio'
// Initialize with Gemini API (using API key)
const voice = new GeminiLiveVoice({
apiKey: process.env.GOOGLE_API_KEY, // Required for Gemini API
model: 'gemini-2.0-flash-exp',
speaker: 'Puck', // Default voice
debug: true,
})
// Or initialize with Vertex AI (using OAuth)
const voiceWithVertexAI = new GeminiLiveVoice({
vertexAI: true,
project: 'your-gcp-project',
location: 'us-central1',
serviceAccountKeyFile: '/path/to/service-account.json',
model: 'gemini-2.0-flash-exp',
speaker: 'Puck',
})
// Or use the VoiceConfig pattern (recommended for consistency with other providers)
const voiceWithConfig = new GeminiLiveVoice({
speechModel: {
name: 'gemini-2.0-flash-exp',
apiKey: process.env.GOOGLE_API_KEY,
},
speaker: 'Puck',
realtimeConfig: {
model: 'gemini-2.0-flash-exp',
apiKey: process.env.GOOGLE_API_KEY,
options: {
debug: true,
sessionConfig: {
interrupts: { enabled: true },
},
},
},
})
// Establish connection (required before using other methods)
await voice.connect()
// Set up event listeners
voice.on('speaker', audioStream => {
// Handle audio stream (NodeJS.ReadableStream)
playAudio(audioStream)
})
voice.on('writing', ({ text, role }) => {
// Handle transcribed text
console.log(`${role}: ${text}`)
})
voice.on('turnComplete', ({ timestamp }) => {
// Handle turn completion
console.log('Turn completed at:', timestamp)
})
// Convert text to speech
await voice.speak('Hello, how can I help you today?', {
speaker: 'Charon', // Override default voice
responseModalities: ['AUDIO', 'TEXT'],
})
// Process audio input
const microphoneStream = getMicrophoneStream()
await voice.send(microphoneStream)
// Update session configuration
await voice.updateSessionConfig({
speaker: 'Kore',
instructions: 'Be more concise in your responses',
})
// When done, disconnect
await voice.disconnect()
// Or use the synchronous wrapper
voice.close()
設定設定 的直接連結
建構函數選項建構函數選項 的直接連結
apiKey?:
model?:
speaker?:
vertexAI?:
project?:
location?:
serviceAccountKeyFile?:
serviceAccountEmail?:
instructions?:
sessionConfig?:
interrupts?:
interrupts.enabled?:
interrupts.allowUserInterruption?:
contextCompression?:
debug?:
方法方法 的直接連結
connect()connect 的直接連結
建立與 Gemini Live API 的連線。使用 speak、listen 或 send 方法前必須先調用此方法。
requestContext?:
returns:
speak()speak 的直接連結
將文字轉換成語音並傳送至模型。可接受字串或可讀串流作為輸入。
input:
options?:
speaker?:
languageCode?:
responseModalities?:
傳回:Promise<void>(回應透過 speaker 及 writing 事件發出)
sendContext()sendcontext 的直接連結
將對話記錄傳送至即時工作階段,而不觸發模型回應。可在全新連線時使用此方法加入先前的對話輪次(例如來自 Mastra Memory),讓模型在用戶說話前取得上下文。
await voice.sendContext([
{ role: 'user', content: 'What is the weather?' },
{ role: 'assistant', content: 'It is 72°F in San Francisco.' },
])
// Model stays silent until the user actually speaks.
await voice.send(micStream)
turns:
role("user" 或 "assistant")及 content 字串。較新的模型支援兩種角色(例如 gemini-2.5-flash-native-audio-preview-12-2025),部分較舊的模型則只接受用戶角色的輪次。options?:
turnComplete?:
傳回:Promise<void>
listen()listen 的直接連結
處理用於語音辨識的音訊輸入。此方法接收音訊資料的可讀串流,並傳回轉錄文字。
audioStream:
options?:
傳回:Promise<string> — 轉錄文字
send()send 的直接連結
將音訊資料實時串流至 Gemini 服務,適用於即時咪高峰輸入等持續音訊串流情境。
audioData:
傳回:Promise<void>
updateSessionConfig()updatesessionconfig 的直接連結
在執行期間更新工作階段設定。此方法可修改語音設定及講者選擇,也可修改其他執行期間設定。
config:
傳回:Promise<void>
addTools()addtools 的直接連結
向語音實例加入一組 Tool。Tool 讓模型可在對話期間執行其他操作。將 GeminiLiveVoice 加入 Agent 後,為該 Agent 設定的所有 Tool 均會自動供語音介面使用。
tools:
傳回:void
addInstructions()addinstructions 的直接連結
加入或更新模型的系統指示。
instructions?:
傳回:void
answer()answer 的直接連結
觸發模型回應。此方法主要在與 Agent 整合時於內部使用。
options?:
傳回:Promise<void>
getSpeakers()getspeakers 的直接連結
傳回 Gemini Live API 可用的語音講者清單。
傳回:Promise<Array<{ voiceId: string; description?: string }>>
disconnect()disconnect() 的直接連結
中斷 Gemini Live 工作階段的連線並清理資源。這是妥善處理清理工作的非同步方法。
傳回:Promise<void>
close()close 的直接連結
disconnect() 的同步包裝函數。此方法會在內部調用 disconnect(),但不會等待其完成。
傳回:void
on()on 的直接連結
為語音事件註冊事件監聽器。
event:
callback:
傳回:void
off()off 的直接連結
移除先前註冊的事件監聽器。
event:
callback:
傳回:void
事件事件 的直接連結
GeminiLiveVoice 類別會發出以下事件:
speaker:
speaking:
writing:
output_audio_transcription 頻道驅動,而非 modelTurn.parts.text。thinking:
modelTurn.parts.text 的模型思考鏈/推理文字。回呼會接收 { text: string }。此事件不會在非原生音訊模型上觸發;在這些模型中,modelTurn.parts.text 是語音回應,並會改為以 writing 發出。session:
turnComplete:
toolCall:
usage:
error:
interrupt:
原生音訊行為原生音訊行為 的直接連結
原生音訊 Gemini Live 模型(ID 包含 native-audio 的任何模型,例如 gemini-2.5-flash-native-audio-preview-12-2025)會將文字輸出分配至兩個頻道:
- 模型的語音回覆會以音訊連同
output_audio_transcription轉錄提供,並以role: 'assistant'的writing呈現。 - 模型的內部推理會以
modelTurn.parts.text提供,並以thinking呈現。
非原生音訊模型沒有 output_audio_transcription 頻道,因此 modelTurn.parts.text 本身就是語音回應,並會以 writing 發出。thinking 事件不會觸發。
輸入轉錄、輸出轉錄及插話偵測(realtime_input_config.activity_handling = 'START_OF_ACTIVITY_INTERRUPTS')會在設定 payload 中自動啟用,毋須額外設定。
可用模型可用模型 的直接連結
可使用以下 Gemini Live 模型:
gemini-2.0-flash-exp(預設)gemini-2.0-flash-exp-image-generationgemini-2.0-flash-live-001gemini-live-2.5-flash-preview-native-audiogemini-2.5-flash-exp-native-audio-thinking-dialoggemini-live-2.5-flash-previewgemini-2.6.flash-preview-tts
可用語音可用語音 的直接連結
可使用以下語音選項:
Puck(預設):自然對話、親切Charon:低沉、權威Kore:中性、專業Fenrir:溫暖、平易近人
驗證方式驗證方式 的直接連結
Gemini API(開發)Gemini API(開發) 的直接連結
最簡單的方式是使用來自 Google AI Studio 的 API 金鑰:
const voice = new GeminiLiveVoice({
apiKey: 'your-api-key', // Required for Gemini API
model: 'gemini-2.0-flash-exp',
})
Vertex AI(生產環境)Vertex AI(生產環境) 的直接連結
在生產環境中配合 OAuth 驗證及 Google Cloud Platform 使用:
// Using service account key file
const voice = new GeminiLiveVoice({
vertexAI: true,
project: 'your-gcp-project',
location: 'us-central1',
serviceAccountKeyFile: '/path/to/service-account.json',
})
// Using Application Default Credentials
const voice = new GeminiLiveVoice({
vertexAI: true,
project: 'your-gcp-project',
location: 'us-central1',
})
// Using service account impersonation
const voice = new GeminiLiveVoice({
vertexAI: true,
project: 'your-gcp-project',
location: 'us-central1',
serviceAccountEmail: 'service-account@project.iam.gserviceaccount.com',
})
進階功能進階功能 的直接連結
工作階段管理工作階段管理 的直接連結
Gemini Live API 支援恢復工作階段,以處理網絡中斷:
voice.on('sessionHandle', ({ handle, expiresAt }) => {
// Store session handle for resumption
saveSessionHandle(handle, expiresAt)
})
// Resume a previous session
const voice = new GeminiLiveVoice({
sessionConfig: {
enableResumption: true,
maxDuration: '2h',
},
})
Tool 調用Tool 調用 的直接連結
讓模型可在對話期間調用函數:
import { z } from 'zod'
voice.addTools({
weather: {
description: 'Get weather information',
parameters: z.object({
location: z.string(),
}),
execute: async ({ location }) => {
const weather = await getWeather(location)
return weather
},
},
})
voice.on('toolCall', ({ name, args, id }) => {
console.log(`Tool called: ${name} with args:`, args)
})
注意事項注意事項 的直接連結
- Gemini Live API 使用 WebSockets 進行實時通訊
- 輸入音訊以 16kHz PCM16 處理,輸出音訊則以 24kHz PCM16 處理
- 使用其他方法前,必須先使用
connect()連接語音實例 - 完成後務必調用
close(),以妥善清理資源 - Vertex AI 驗證需要適當的 IAM 權限(
aiplatform.user角色) - 恢復工作階段功能可從網絡中斷中復原
- API 支援文字及音訊的實時互動