Google Gemini 라이브 음성
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에 대한 연결을 설정합니다. 말하기, 듣기 또는 보내기 메소드를 사용하기 전에 호출해야 합니다.
requestContext?:
returns:
speak()speak에 대한 직접 링크
텍스트를 음성으로 변환하여 Model로 보냅니다. 문자열이나 읽기 가능한 스트림을 입력으로 받아들일 수 있습니다.
input:
options?:
speaker?:
languageCode?:
responseModalities?:
반환값: Promise<void>(응답은 speaker 및 writing 이벤트를 통해 내보내짐)
sendContext()sendcontext에 대한 직접 링크
Model 응답을 트리거하지 않고 대화 기록을 라이브 세션으로 보냅니다. 이를 사용하여 콜드 연결에서 이전 차례(예: Mastra Memory에서)를 시드하여 사용자가 말하기 전에 Model에 컨텍스트를 제공합니다.
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 문자열이 있습니다. 최신 Model(예: gemini-2.5-flash-native-audio-preview-12-2025)은 두 역할을 모두 지원합니다. 일부 이전 Model은 사용자 역할의 턴만 허용합니다.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을 사용하면 Model이 대화 중에 추가 작업을 수행할 수 있습니다. GeminiLiveVoice가 Agent에 추가되면 Agent에 대해 구성된 모든 Tool을 자동으로 음성 인터페이스에서 사용할 수 있습니다.
tools:
보고:void
addInstructions()addinstructions에 대한 직접 링크
Model에 대한 시스템 지침을 추가하거나 업데이트합니다.
instructions?:
보고:void
answer()answer에 대한 직접 링크
Model의 응답을 트리거합니다. 이 방법은 Agent와 통합될 때 주로 내부적으로 사용됩니다.
options?:
보고:Promise<void>
getSpeakers()getspeakers에 대한 직접 링크
Gemini Live API에 사용 가능한 음성 스피커 목록을 반환합니다.
보고:Promise<Array<{ voiceId: string; description?: string }>>
disconnect()disconnect에 대한 직접 링크
Gemini Live 세션 연결을 끊고 리소스를 정리합니다. 이는 정리를 올바르게 처리하는 비동기 방법입니다.
보고:Promise<void>
close()close에 대한 직접 링크
Disconnect()에 대한 동기 래퍼입니다. 기다리지 않고 내부적으로 연결 해제()를 호출합니다.
보고:void
on()on에 대한 직접 링크
음성 이벤트에 대한 이벤트 리스너를 등록합니다.
event:
callback:
보고:void
off()off에 대한 직접 링크
이전에 등록된 이벤트 리스너를 제거합니다.
event:
callback:
보고:void
이벤트이벤트에 대한 직접 링크
GeminiLiveVoice 클래스는 다음 이벤트를 내보냅니다.
speaker:
speaking:
writing:
modelTurn.parts.text가 아니라 서버의 output_audio_transcription 채널을 통해 제공됩니다.thinking:
modelTurn.parts.text의 Model 사고 과정/추론 텍스트와 함께 발생합니다. 콜백은 { text: string }을 받습니다. 네이티브 오디오가 아닌 Model에서는 발생하지 않습니다. 이 경우 modelTurn.parts.text는 음성 응답이며 대신 writing으로 발생합니다.session:
turnComplete:
toolCall:
usage:
error:
interrupt:
네이티브 오디오 동작네이티브 오디오 동작에 대한 직접 링크
네이티브 오디오 Gemini Live Model(ID에 native-audio가 포함된 모든 Model, 예: gemini-2.5-flash-native-audio-preview-12-2025)은 텍스트 출력을 두 채널로 나눕니다.
- Model의 음성 응답은 오디오와 함께
output_audio_transcription전사로 전달되며role: 'assistant'가 지정된writing으로 노출됩니다. - Model의 내부 추론은
modelTurn.parts.text로 전달되며thinking으로 노출됩니다. 네이티브 오디오가 아닌 Model에는output_audio_transcription채널이 없으므로modelTurn.parts.text자체가 음성 응답이며writing으로 발생합니다.thinking이벤트는 발생하지 않습니다. 입력 전사, 출력 전사, 끼어들기 감지(realtime_input_config.activity_handling = 'START_OF_ACTIVITY_INTERRUPTS')는 설정 페이로드에서 자동으로 활성화됩니다. 추가 구성이 필요하지 않습니다.
사용 가능한 Model사용 가능한 Model에 대한 직접 링크
다음 Gemini Live Model을 사용할 수 있습니다:
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 (개발)에 대한 직접 링크
API 키를 사용하는 가장 간단한 방법Google AI Studio:
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 호출에 대한 직접 링크
대화 중에 Model이 함수를 호출하도록 활성화합니다.
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는 실시간 통신에 WebSocket을 사용합니다.
- 오디오는 입력의 경우 16kHz PCM16, 출력의 경우 24kHz PCM16으로 처리됩니다.
- 다른 메서드를 사용하기 전에 음성 인스턴스를
connect()로 연결해야 합니다. - 완료 후에는 항상
close()를 호출하여 리소스를 올바르게 정리하세요. - Vertex AI 인증에는 적절한 IAM 권한(
aiplatform.user역할)이 필요합니다. - 세션 재개를 통해 네트워크 중단에서 복구할 수 있습니다.
- API는 텍스트 및 오디오를 통한 실시간 상호작용을 지원합니다.