L'API Multimodal Live permet des interactions vocales et vidéo bidirectionnelles à faible latence avec Gemini. L'API Multimodal Live vous permet de proposer aux utilisateurs finaux des conversations vocales naturelles, semblables à celles d'un être humain, et de leur permettre d'interrompre les réponses du modèle à l'aide de commandes vocales. Le modèle peut traiter des entrées textuelles, audio et vidéo, et peut fournir des sorties textuelles et audio.
Capacités
L'API Multimodal Live inclut les principales fonctionnalités suivantes:
- Multimodalité:le modèle peut voir, entendre et parler.
- Interaction en temps réel à faible latence:permet d'obtenir des réponses rapides.
- Mémoire de session:le modèle conserve la mémoire de toutes les interactions au cours d'une même session, en rappelant les informations entendues ou vues précédemment.
- Compatibilité avec l'appel de fonction, l'exécution de code et la recherche en tant qu'outil:permet l'intégration à des services et sources de données externes.
- Détection automatique de l'activité vocale (VAD) : le modèle peut reconnaître avec précision le moment où l'utilisateur commence et arrête de parler. Cela permet des interactions naturelles et conversationnelles, et permet aux utilisateurs d'interrompre le modèle à tout moment.
Vous pouvez essayer l'API Multimodal Live dans Google AI Studio.
Commencer
L'API Multimodal Live est une API avec état qui utilise des WebSockets.
Cette section montre comment utiliser l'API Multimodal Live pour la génération de texte à partir de texte, à l'aide de Python 3.9 ou version ultérieure.
Installer la bibliothèque de l'API Gemini
Pour installer le package google-genai
, utilisez la commande pip
suivante:
!pip3 install google-genai
Importer des dépendances
Pour importer des dépendances:
from google import genai
Envoyer et recevoir un SMS
import asyncio
from google import genai
client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model_id = "gemini-2.0-flash-exp"
config = {"response_modalities": ["TEXT"]}
async def main():
async with client.aio.live.connect(model=model_id, config=config) as session:
while True:
message = input("User> ")
if message.lower() == "exit":
break
await session.send(message, end_of_turn=True)
async for response in session.receive():
if response.text is None:
continue
print(response.text, end="")
if __name__ == "__main__":
asyncio.run(main())
Guide d'intégration
Cette section décrit le fonctionnement de l'intégration avec l'API Multimodal Live.
Sessions
Une session représente une seule connexion WebSocket entre le client et le serveur Gemini.
Une fois qu'un client a établi une nouvelle connexion, la session peut échanger des messages avec le serveur pour:
- Envoyer du texte, de l'audio ou de la vidéo au serveur Gemini
- Recevoir des réponses audio, textuelles ou d'appel de fonction du serveur Gemini
La configuration de la session est envoyée dans le premier message après la connexion. Une configuration de session comprend le modèle, les paramètres de génération, les instructions système et les outils.
Consultez l'exemple de configuration suivant:
{
"model": string,
"generation_config": {
"candidate_count": integer,
"max_output_tokens": integer,
"temperature": number,
"top_p": number,
"top_k": integer,
"presence_penalty": number,
"frequency_penalty": number,
"response_modalities": string,
"speech_config":object
},
"system_instruction": "",
"tools":[]
}
Pour en savoir plus, consultez BidiGenerateContentSetup.
Envoyer des messages
Les messages sont des chaînes au format JSON échangées via la connexion WebSocket.
Pour envoyer un message, le client doit envoyer un message client compatible dans une chaîne au format JSON avec l'une des méthodes suivantes via une connexion WebSocket ouverte.
Messages client compatibles
Consultez les messages client acceptés dans le tableau suivant:
Message | Description |
---|---|
BidiGenerateContentSetup |
Configuration de la session à envoyer dans le premier message |
BidiGenerateContentClientContent |
Mise à jour incrémentielle du contenu de la conversation en cours envoyée par le client |
BidiGenerateContentRealtimeInput |
Entrée audio ou vidéo en temps réel |
BidiGenerateContentToolResponse |
Réponse à un ToolCallMessage reçu du serveur |
Recevoir des messages
Pour recevoir des messages de Gemini, écoutez l'événement "message" WebSocket, puis analysez le résultat conformément à la définition des messages de serveur compatibles.
Consultez les références suivantes :
ws.addEventListener("message", async (evt) => {
if (evt.data instanceof Blob) {
// Process the received data (audio, video, etc.)
} else {
// Process JSON response
}
});
Messages de serveur compatibles
Consultez les messages de serveur compatibles dans le tableau suivant:
Message | Description |
---|---|
BidiGenerateContentSetupComplete |
Message BidiGenerateContentSetup du client, envoyé une fois la configuration terminée |
BidiGenerateContentServerContent |
Contenu généré par le modèle en réponse à un message client |
BidiGenerateContentToolCall |
Demander au client d'exécuter les appels de fonction et de renvoyer les réponses avec les ID correspondants |
BidiGenerateContentToolCallCancellation |
Envoyée lorsqu'un appel de fonction est annulé parce que l'utilisateur interrompt la sortie du modèle |
Mises à jour incrémentielles du contenu
Utilisez des mises à jour incrémentielles pour envoyer une saisie de texte, établir ou restaurer le contexte de session. Pour les contextes courts, vous pouvez envoyer des interactions par étape pour représenter la séquence exacte des événements. Pour les contextes plus longs, nous vous recommandons de fournir un seul résumé de message afin de libérer la fenêtre de contexte pour les interactions de suivi.
Consultez l'exemple de message de contexte suivant:
{
"client_content": {
"turns": [
{
"parts":[
{
"text": ""
}
],
"role":"user"
},
{
"parts":[
{
"text": ""
}
],
"role":"model"
}
],
"turn_complete": true
}
}
Notez que, bien que les parties de contenu puissent être de type functionResponse
, BidiGenerateContentClientContent
ne doit pas être utilisé pour fournir une réponse aux appels de fonction émis par le modèle. Utilisez BidiGenerateContentToolResponse
à la place. BidiGenerateContentClientContent
ne doit être utilisé que pour établir le contexte précédent ou fournir une entrée de texte à la conversation.
Streaming audio et vidéo
Appel de fonction
Toutes les fonctions doivent être déclarées au début de la session en envoyant des définitions d'outils dans le message BidiGenerateContentSetup
.
Pour en savoir plus sur les appels de fonction, consultez le tutoriel sur les appels de fonction.
À partir d'une seule invite, le modèle peut générer plusieurs appels de fonction et le code nécessaire pour enchaîner leurs sorties. Ce code s'exécute dans un environnement bac à sable, générant des messages BidiGenerateContentToolCall
ultérieurs. L'exécution est mise en pause jusqu'à ce que les résultats de chaque appel de fonction soient disponibles, ce qui garantit un traitement séquentiel.
Le client doit répondre avec BidiGenerateContentToolResponse
.
Les entrées et les sorties audio ont un impact négatif sur la capacité du modèle à utiliser l'appel de fonction.
Formats audio
L'API Multimodal Live est compatible avec les formats audio suivants:
- Format audio d'entrée: audio PCM brut 16 bits à 16 kHz, little-endian
- Format audio de sortie: audio PCM brut 16 bits à 24 kHz, little-endian
Instructions système
Vous pouvez fournir des instructions système pour mieux contrôler la sortie du modèle et spécifier le ton et le sentiment des réponses audio.
Les instructions système sont ajoutées à l'invite avant le début de l'interaction et restent en vigueur pendant toute la session.
Les instructions système ne peuvent être définies qu'au début d'une session, immédiatement après la connexion initiale. Pour fournir d'autres informations au modèle pendant la session, utilisez des mises à jour de contenu incrémentielles.
Interruptions
Les utilisateurs peuvent interrompre la sortie du modèle à tout moment. Lorsque la détection d'activité vocale (VAD) détecte une interruption, la génération en cours est annulée et supprimée. Seules les informations déjà envoyées au client sont conservées dans l'historique de la session. Le serveur envoie ensuite un message BidiGenerateContentServerContent
pour signaler l'interruption.
En outre, le serveur Gemini supprime tous les appels de fonction en attente et envoie un message BidiGenerateContentServerContent
avec les ID des appels annulés.
Voix
L'API Multimodal Live est compatible avec les voix suivantes: Aoede, Charon, Fenrir, Kore et Puck.
Pour spécifier une voix, définissez voice_name
dans l'objet speech_config
, dans le cadre de la configuration de la session.
Consultez la représentation JSON suivante d'un objet speech_config
:
{
"voice_config": {
"prebuilt_voice_config ": {
"voice_name": <var>VOICE_NAME</var>
}
}
}
Limites
Tenez compte des limites suivantes de l'API Multimodal Live et de Gemini 2.0 lorsque vous planifiez votre projet.
Authentification client
L'API Multimodal Live ne fournit qu'une authentification de serveur à serveur et n'est pas recommandée pour une utilisation directe par le client. L'entrée client doit être acheminée via un serveur d'application intermédiaire pour une authentification sécurisée avec l'API Multimodal Live.
Pour les applications Web et mobiles, nous vous recommandons d'utiliser l'intégration de nos partenaires Daily.
Historique de la conversation
Bien que le modèle suive les interactions pendant la session, l'historique de la conversation n'est pas stocké. À la fin d'une session, le contexte correspondant est effacé.
Pour restaurer une session précédente ou fournir au modèle le contexte historique des interactions utilisateur, l'application doit gérer son propre journal de conversation et utiliser un message BidiGenerateContentClientContent
pour envoyer ces informations au début d'une nouvelle session.
Durée maximale de la session
La durée de la session est limitée à 15 minutes pour l'audio ou à 2 minutes pour l'audio et la vidéo. Lorsque la durée de la session dépasse la limite, la connexion est interrompue.
Le modèle est également limité par la taille du contexte. L'envoi de grands blocs de contenu en plus des flux vidéo et audio peut entraîner la fin prématurée de la session.
Détection de l'activité vocale (VAD)
Le modèle effectue automatiquement la détection de l'activité vocale (VAD) sur un flux d'entrée audio continu. La suppression de la voix active est toujours activée et ses paramètres ne sont pas configurables.
Nombre de jetons
Le nombre de jetons n'est pas accepté.
Limites de débit
Les limites de débit suivantes s'appliquent:
- 3 sessions simultanées par clé API
- 4 millions de jetons par minute
Messages et événements
BidiGenerateContentClientContent
Mise à jour incrémentielle de la conversation en cours envoyée par le client. Tout le contenu est ajouté sans condition à l'historique de la conversation et utilisé dans l'invite envoyée au modèle pour générer du contenu.
Un message s'affichera pour interrompre toute génération de modèle en cours.
Champs | |
---|---|
turns[] |
Facultatif. Contenu ajouté à la conversation en cours avec le modèle. Pour les requêtes à un seul tour, il s'agit d'une instance unique. Pour les requêtes multitours, il s'agit d'un champ répété contenant l'historique de la conversation et la dernière requête. |
turn_ |
Facultatif. Si la valeur est "true", la génération de contenu du serveur doit commencer par l'invite actuellement accumulée. Sinon, le serveur attend d'autres messages avant de commencer la génération. |
BidiGenerateContentRealtimeInput
Entrée utilisateur envoyée en temps réel.
Cette méthode diffère de BidiGenerateContentClientContent
de plusieurs manières:
- Peut être envoyé en continu sans interruption de la génération du modèle.
- Si vous devez mélanger des données entrelacées sur
BidiGenerateContentClientContent
etBidiGenerateContentRealtimeInput
, le serveur tente d'optimiser la réponse, mais aucune garantie n'est fournie. - La fin du tour n'est pas spécifiée explicitement, mais dérive de l'activité de l'utilisateur (par exemple, la fin de la parole).
- Même avant la fin du tour, les données sont traitées de manière incrémentielle pour optimiser le démarrage rapide de la réponse du modèle.
- Il s'agit toujours d'une entrée utilisateur directe envoyée en temps réel. Ils peuvent être envoyés en continu, sans interruption. Le modèle détecte automatiquement le début et la fin de la parole de l'utilisateur, et lance ou arrête le streaming de la réponse en conséquence. Les données sont traitées de manière incrémentielle à mesure de leur arrivée, ce qui réduit la latence.
Champs | |
---|---|
media_ |
Facultatif. Données d'octets intégrées pour l'entrée multimédia. |
BidiGenerateContentServerContent
Mise à jour incrémentielle du serveur générée par le modèle en réponse aux messages du client.
Le contenu est généré aussi rapidement que possible, et non en temps réel. Les clients peuvent choisir de mettre en mémoire tampon et de lire le contenu en temps réel.
Champs | |
---|---|
turn_ |
Uniquement en sortie. Si la valeur est "true", cela signifie que la génération du modèle est terminée. La génération ne commencera qu'en réponse à des messages client supplémentaires. Peut être défini avec |
interrupted |
Uniquement en sortie. Si la valeur est "true", cela indique qu'un message client a interrompu la génération de modèle en cours. Si le client lit le contenu en temps réel, c'est un bon signal pour arrêter et vider la file d'attente de lecture actuelle. |
grounding_ |
Uniquement en sortie. Métadonnées de référence pour le contenu généré. |
model_ |
Uniquement en sortie. Contenu généré par le modèle dans le cadre de la conversation en cours avec l'utilisateur. |
BidiGenerateContentSetup
Message à envoyer dans le premier et seul message client. Contient la configuration qui s'applique pendant toute la durée de la session de streaming.
Les clients doivent attendre un message BidiGenerateContentSetupComplete
avant d'envoyer des messages supplémentaires.
Champs | |
---|---|
model |
Obligatoire. Nom de la ressource du modèle. Il s'agit d'un identifiant que le modèle doit utiliser. Format : |
generation_ |
Facultatif. Configuration de génération. Les champs suivants ne sont pas acceptés:
|
system_ |
Facultatif. Instructions système fournies par l'utilisateur pour le modèle. Remarque: Seul du texte doit être utilisé dans les parties et le contenu de chaque partie figurera dans un paragraphe distinct. |
tools[] |
Facultatif. Liste des Un |
BidiGenerateContentSetupComplete
Ce type ne comporte aucun champ.
Envoyée en réponse à un message BidiGenerateContentSetup
du client.
BidiGenerateContentToolCall
Demandez au client d'exécuter le function_calls
et de renvoyer les réponses avec les id
correspondants.
Champs | |
---|---|
function_ |
Uniquement en sortie. Appel de fonction à exécuter. |
BidiGenerateContentToolCallCancellation
Notification au client indiquant qu'une ToolCallMessage
précédemment émise avec les id
spécifiées n'aurait pas dû être exécutée et doit être annulée. Si ces appels d'outils ont des effets secondaires, les clients peuvent essayer de les annuler. Ce message ne s'affiche que lorsque les clients interrompent les tours du serveur.
Champs | |
---|---|
ids[] |
Uniquement en sortie. ID des appels d'outil à annuler. |
BidiGenerateContentToolResponse
Réponse générée par le client à un ToolCall
reçu du serveur. Les objets FunctionResponse
individuels sont mis en correspondance avec les objets FunctionCall
respectifs par le champ id
.
Notez que dans les API GenerateContent unary et server-streaming, l'appel de fonction s'effectue en échangeant les parties Content
, tandis que dans les API GenerateContent bidi, l'appel de fonction s'effectue sur cet ensemble de messages dédié.
Champs | |
---|---|
function_ |
Facultatif. Réponse aux appels de fonction. |
En savoir plus sur les types courants
Pour en savoir plus sur les types de ressources d'API couramment utilisés (Blob
, Content
, FunctionCall
, FunctionResponse
, GenerationConfig
, GroundingMetadata
et Tool
), consultez la section Générer du contenu.