L'audio dans les chat completions
L'audio dans les chat completions permet à un modèle d'écouter un enregistrement et de répondre à son sujet sous forme de texte : un résumé, une réponse à une question, une traduction ou des données structurées. Cette page présente la requête une seule fois, puis l'instruction à rédiger pour chaque tâche.
Pour obtenir une transcription mot à mot plutôt que des réponses, utilisez Transcription de fichiers.
Envoyer de l'audio dans une requête de chat
Placez l'audio et votre instruction dans le même message utilisateur : une partie input_audio avec l'enregistrement encodé en base64, et une partie text avec ce que vous voulez savoir. Tous les exemples de cette page utilisent le même enregistrement d'un appel d'assistance, donc seule l'instruction change d'une tâche à l'autre.
import base64
import os
from mistralai.client import Mistral
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
with open("support_call_8k.wav", "rb") as f:
audio_base64 = base64.b64encode(f.read()).decode()
response = client.chat.complete(
model="voxtral-small-latest",
messages=[
{
"role": "user",
"content": [
{"type": "input_audio", "input_audio": audio_base64},
{
"type": "text",
"text": "Summarize this support call in three bullet points: the problem, what was checked, and the outcome.",
},
],
}
],
)
print(response.choices[0].message.content)input_audio prend directement la chaîne base64 du fichier. La représentation sous forme d'objet utilisée par l'API d'OpenAI, avec les champs data et format, est également acceptée.
Voir Limites.
Résumer un enregistrement
Pour obtenir un résumé, décrivez celui dont vous avez besoin dans la partie text : sa longueur, son format et à qui il est destiné. L'exemple de la section Envoyer de l'audio dans une requête de chat demande ceci :
Résume cet appel d'assistance en trois points : le problème, ce qui a été vérifié et le résultat.
Poser des questions sur un enregistrement
Pour poser une question sur un enregistrement, mettez-la dans la partie text, à la place de l'instruction de résumé.
Quel numéro de commande le client donne-t-il, et que l'agent promet-il d'envoyer ?
Traduire un enregistrement
Pour traduire un enregistrement, indiquez dans l'instruction la langue de l'audio et la langue souhaitée. La réponse est du texte écrit, et non de la parole : pour écouter la traduction, envoyez le texte à Synthèse vocale.
Pour obtenir les mots d'origine et la traduction dans une même réponse, demandez deux sections étiquetées. Cette instruction, envoyée avec un enregistrement en français, renvoie la transcription en français et sa traduction en anglais :
Cet enregistrement est en français. Renvoie exactement deux sections : ORIGINAL : la transcription française mot à mot. TRANSLATION : une traduction fidèle en anglais. N'ajoute aucun commentaire.
Les deux sections ne comportent aucun horodatage, vous ne pouvez donc pas associer une ligne de la traduction à un moment de l'audio.
Paires de langues prises en charge
Pour connaître les langues source et cible prises en charge par la traduction, voir Traduction sur la page Langues.
Extraire des données structurées
Avec le function calling, le modèle lit l'enregistrement et remplit les arguments d'une fonction que vous définissez, comme les actions de suivi convenues lors d'un appel. Il n'exécute pas la fonction : c'est votre application qui le fait. Définissez la fonction dans tools, et réglez le choix d'outil sur any pour obliger le modèle à l'appeler.
Pour comprendre comment fonctionne le function calling dans les chat completions, voir Function calling.
import base64
import json
import os
from mistralai.client import Mistral
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
with open("support_call_8k.wav", "rb") as f:
audio_base64 = base64.b64encode(f.read()).decode()
tools = [
{
"type": "function",
"function": {
"name": "record_action_items",
"description": "Record the follow-up actions agreed during the call.",
"parameters": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"owner": {"type": "string", "description": "Who does it (agent, billing, customer...)"},
"task": {"type": "string"},
"due": {"type": "string", "description": "Deadline if one was stated"},
},
"required": ["owner", "task"],
},
},
"order_id": {"type": "string"},
},
"required": ["items"],
},
},
}
]
response = client.chat.complete(
model="voxtral-small-latest",
messages=[
{
"role": "user",
"content": [
{"type": "input_audio", "input_audio": audio_base64},
{"type": "text", "text": "Extract every follow-up action agreed in this call."},
],
}
],
tools=tools,
tool_choice="any",
)
tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.function.name)
print(json.dumps(json.loads(tool_call.function.arguments), indent=2))La réponse contient un appel d'outil vers record_action_items, avec des arguments qui suivent le schéma de la fonction : le numéro de commande, et un élément par action avec son responsable, sa tâche et son échéance. Votre application les lit et agit en conséquence.
Problèmes courants
Ces problèmes sont propres à l'audio dans les requêtes de chat :
| Symptôme | Cause | Solution |
|---|---|---|
| La réponse reformule ce qui a été dit au lieu de le citer | Un modèle de chat répond à votre instruction. Il ne renvoie pas de transcription mot à mot. | Pour obtenir les mots exacts, utilisez Transcription de fichiers. |
Erreur 429, Rate limit exceeded, sur une requête contenant de l'audio | Envoyez un clip plus court, ou un fichier WAV à 8 ou 16 kHz. Voir Limites. | |
| Une partie du MP3 n'est pas lue. | Envoyez l'enregistrement au format WAV. Voir Formats audio. |