Voix Google Gemini Live
La classe GeminiLiveVoice fournit des fonctionnalités d'interaction vocale en temps réel au moyen de l'API Gemini Live de Google. Elle prend en charge le streaming audio bidirectionnel, les appels de Tool, la gestion des sessions, ainsi que les méthodes d'authentification standard de l'API Google et de Vertex AI.
Exemple d'utilisationLien direct vers Exemple d'utilisation
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()
ConfigurationLien direct vers Configuration
Options du constructeurLien direct vers Options du constructeur
apiKey?:
model?:
speaker?:
vertexAI?:
project?:
location?:
serviceAccountKeyFile?:
serviceAccountEmail?:
instructions?:
sessionConfig?:
interrupts?:
interrupts.enabled?:
interrupts.allowUserInterruption?:
contextCompression?:
debug?:
MéthodesLien direct vers Méthodes
connect()Lien direct vers connect
Établit une connexion à l'API Gemini Live. Cette méthode doit être appelée avant d'utiliser les méthodes speak, listen ou send.
requestContext?:
returns:
speak()Lien direct vers speak
Convertit le texte en parole et l'envoie au modèle. Accepte en entrée une chaîne ou un stream lisible.
input:
options?:
speaker?:
languageCode?:
responseModalities?:
Renvoie : Promise<void> (les réponses sont émises via les événements speaker et writing)
sendContext()Lien direct vers sendcontext
Envoie l'historique de la conversation dans la session en direct sans déclencher de réponse du modèle. Utilisez cette méthode pour initialiser les tours précédents, par exemple depuis Mastra Memory, lors d'une nouvelle connexion afin que le modèle dispose du contexte avant que l'utilisateur ne parle.
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" ou "assistant") et une chaîne content. Les modèles récents prennent en charge les deux rôles, par exemple gemini-2.5-flash-native-audio-preview-12-2025. Certains modèles plus anciens acceptent uniquement les tours du rôle user.options?:
turnComplete?:
Renvoie : Promise<void>
listen()Lien direct vers listen
Traite une entrée audio pour la reconnaissance vocale. Accepte un stream lisible de données audio et renvoie le texte transcrit.
audioStream:
options?:
Renvoie : Promise<string> - Le texte transcrit
send()Lien direct vers send
Diffuse les données audio en temps réel vers le service Gemini pour les scénarios de streaming audio continu, tels que l'entrée d'un microphone en direct.
audioData:
Renvoie : Promise<void>
updateSessionConfig()Lien direct vers updatesessionconfig
Met à jour la configuration de la session à l'exécution. Cette méthode permet de modifier les paramètres vocaux, la sélection de la voix et d'autres configurations d'exécution.
config:
Renvoie : Promise<void>
addTools()Lien direct vers addtools
Ajoute un ensemble de Tools à l'instance Voice. Les Tools permettent au modèle d'effectuer des actions supplémentaires pendant les conversations. Lorsque GeminiLiveVoice est ajouté à un Agent, tous les Tools configurés pour cet Agent sont automatiquement accessibles à l'interface Voice.
tools:
Renvoie : void
addInstructions()Lien direct vers addinstructions
Ajoute ou met à jour les instructions système du modèle.
instructions?:
Renvoie : void
answer()Lien direct vers answer
Déclenche une réponse du modèle. Cette méthode est principalement utilisée en interne lors de l'intégration avec un Agent.
options?:
Renvoie : Promise<void>
getSpeakers()Lien direct vers getspeakers
Renvoie la liste des voix disponibles pour l'API Gemini Live.
Renvoie : Promise<Array<{ voiceId: string; description?: string }>>
disconnect()Lien direct vers disconnect
Se déconnecte de la session Gemini Live et libère les ressources. Cette méthode asynchrone gère correctement le nettoyage.
Renvoie : Promise<void>
close()Lien direct vers close
Wrapper synchrone de disconnect(). Appelle disconnect() en interne sans attendre sa résolution.
Renvoie : void
on()Lien direct vers on
Enregistre un écouteur d'événements Voice.
event:
callback:
Renvoie : void
off()Lien direct vers off
Supprime un écouteur d'événements précédemment enregistré.
event:
callback:
Renvoie : void
ÉvénementsLien direct vers Événements
La classe GeminiLiveVoice émet les événements suivants :
speaker:
speaking:
writing:
output_audio_transcription du serveur plutôt que de modelTurn.parts.text.thinking:
modelTurn.parts.text. Le callback reçoit { text: string }. N'est pas déclenché sur les modèles non native-audio, où modelTurn.parts.text constitue la réponse prononcée et est émis comme writing.session:
turnComplete:
toolCall:
usage:
error:
interrupt:
Comportement native-audioLien direct vers Comportement native-audio
Les modèles Gemini Live native-audio, c'est-à-dire ceux dont l'identifiant contient native-audio, tels que gemini-2.5-flash-native-audio-preview-12-2025, répartissent la sortie textuelle entre deux canaux :
- La réponse prononcée du modèle est transmise sous forme audio avec une transcription
output_audio_transcription, puis exposée commewritingavecrole: 'assistant'. - Le raisonnement interne du modèle est transmis sous la forme
modelTurn.parts.textet exposé commethinking.
Les modèles non native-audio ne possèdent pas de canal output_audio_transcription ; modelTurn.parts.text constitue donc la réponse prononcée elle-même et est émis comme writing. L'événement thinking n'est pas déclenché.
La transcription de l'entrée et de la sortie, ainsi que la détection des interruptions (realtime_input_config.activity_handling = 'START_OF_ACTIVITY_INTERRUPTS'), sont automatiquement activées dans le payload de configuration. Aucune configuration supplémentaire n'est nécessaire.
Modèles disponiblesLien direct vers Modèles disponibles
Les modèles Gemini Live suivants sont disponibles :
gemini-2.0-flash-exp(par défaut)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
Voix disponiblesLien direct vers Voix disponibles
Les options de voix suivantes sont disponibles :
Puck(par défaut) : conversationnelle, amicaleCharon: profonde, assuréeKore: neutre, professionnelleFenrir: chaleureuse, accessible
Méthodes d'authentificationLien direct vers Méthodes d'authentification
API Gemini (développement)Lien direct vers API Gemini (développement)
La méthode la plus simple utilise une clé d'API provenant de Google AI Studio :
const voice = new GeminiLiveVoice({
apiKey: 'your-api-key', // Required for Gemini API
model: 'gemini-2.0-flash-exp',
})
Vertex AI (production)Lien direct vers Vertex AI (production)
Pour une utilisation en production avec l'authentification OAuth et 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',
})
Fonctionnalités avancéesLien direct vers Fonctionnalités avancées
Gestion des sessionsLien direct vers Gestion des sessions
L'API Gemini Live prend en charge la reprise des sessions afin de gérer les interruptions réseau :
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',
},
})
Appels de ToolLien direct vers Appels de Tool
Autorisez le modèle à appeler des fonctions pendant les conversations :
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)
})
RemarquesLien direct vers Remarques
- L'API Gemini Live utilise WebSockets pour la communication en temps réel
- L'audio est traité en PCM16 à 16 kHz pour l'entrée et en PCM16 à 24 kHz pour la sortie
- L'instance Voice doit être connectée avec
connect()avant d'utiliser les autres méthodes - Appelez toujours
close()lorsque vous avez terminé afin de libérer correctement les ressources - L'authentification Vertex AI nécessite les autorisations IAM appropriées (rôle
aiplatform.user) - La reprise des sessions permet de récupérer après des interruptions réseau
- L'API prend en charge les interactions en temps réel avec du texte et de l'audio