Aller au contenu principal
Leçon 8 sur 16 · Voxtral Audio — Transcription et Speech-to-Text

Context Biasing : Améliorer la Précision

Leçon 8 sur 16 Mis à jour le 3 novembre 2026 Développeur
Sur cette page
  1. Le problème des termes spécialisés
  2. Utiliser le context biasing
  3. Construire une liste efficace
  4. Gérer le vocabulaire par projet
  5. Ce qui marche, ce qui ne marche pas
  6. Points clés à retenir

Cours mis à jour le 3 novembre 2026 pour Voxtral 3, d’après le guide Migrate from Voxtral 2 de Mistral : les modèles Voxtral 2 (voxtral-mini-2602, voxtral-mini-transcribe-realtime-2602, voxtral-mini-tts-2603), dépréciés le 31 octobre 2026 et retirés le 30 avril 2027, sont remplacés dans les exemples par voxtral-mini-transcribe-3, voxtral-mini-transcribe-realtime-3 et voxtral-mini-tts-3-0. À connaître : horodatage par segment uniquement (word renvoie une erreur 400), diarisation possible en temps réel, réglages d’une session temps réel figés dès le premier morceau d’audio, entrées context_bias libres (phrases avec espaces). Sources : Migrate from Voxtral 2 · Speech to Text.

Le problème des termes spécialisés

Les modèles de transcription sont entraînés sur du langage courant. Lorsque votre audio contient des noms propres, des acronymes, du jargon technique ou des termes métier peu courants, le modèle peut mal les transcrire : « Voxtral » devient « vox trail », « RGPD » ressort en « RG PD ». Sur une réunion d’une heure, ces erreurs se comptent par dizaines et ce sont précisément les mots que vous cherchiez à extraire.

Le context biasing résout ce problème en fournissant au modèle une liste de termes attendus. Le modèle ajuste alors ses probabilités pour favoriser ces termes lorsqu’il les détecte dans l’audio. Ce n’est pas un remplacement automatique après coup, mais une orientation du décodage pendant la transcription — la nuance explique pourquoi le résultat reste naturel.

Utiliser le context biasing

Le paramètre context_bias accepte une liste de termes : en Python, une liste de chaînes. Avec Voxtral 3, une entrée peut contenir des espaces — un nom de produit complet, « Alder Creek Design » — et le nombre d’entrées n’est plus plafonné. Les entrées partagent toutefois la fenêtre de contexte avec l’audio : une requête qui la dépasse est refusée (erreur 400), d’où l’intérêt d’une liste courte.

import os
from mistralai.client import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

with open("reunion_tech.mp3", "rb") as f:
    response = client.audio.transcriptions.complete(
        model="voxtral-mini-transcribe-3",
        file={"content": f, "file_name": "reunion_tech.mp3"},
        context_bias=["Voxtral", "Mistral AI", "RGPD", "Kubernetes", "PostgreSQL", "FastAPI"]
    )

print(response.text)

L’effet se mesure immédiatement. Sans context biasing, une réunion d’ingénierie peut produire ceci :

On a déployé le nouveau service sur cubernétisse avec fast API
et la base post grès cul.

Avec la liste ["Kubernetes", "FastAPI", "PostgreSQL"], la même phrase devient exploitable :

On a déployé le nouveau service sur Kubernetes avec FastAPI
et la base PostgreSQL.

Hors temps réel, une entrée peut même être une phrase de contexte libre, qui décrit la conversation : « Appel au support de Northwind au sujet d’une commande de casques Quillara expédiée de l’entrepôt de Rotterdam ». Le modèle s’en sert pour orienter la reconnaissance des noms qu’elle contient.

Construire une liste efficace

Quatre familles de termes méritent d’y figurer. Les noms propres d’abord : personnes, entreprises, produits, c’est-à-dire tout ce que le modèle n’a aucune raison de connaître. Les termes techniques ensuite : acronymes, noms de technologies, protocoles. Le jargon métier propre à votre industrie, celui qui ne figure dans aucun dictionnaire généraliste. Et enfin les noms de lieux : villes, bâtiments, salles de réunion, souvent cités et rarement bien transcrits.

Le contenu de la liste dépend entièrement du contexte. Une réunion de startup technologique n’appelle pas le même vocabulaire qu’une consultation médicale ou qu’un entretien en cabinet d’avocats. Voici trois listes réelles pour vous servir de gabarit.

Réunion tech startup :

context_bias = [
    "Mistral AI", "Voxtral", "Claude", "GPT-5.6",
    "Kubernetes", "PostgreSQL", "FastAPI", "Redis",
    "RGPD", "HIPAA", "SOC 2",
    "sprint", "backlog", "user story",
    "CI/CD", "Docker", "Terraform"
]

Cabinet médical :

context_bias = [
    "paracétamol", "ibuprofène", "amoxicilline",
    "IRM", "scanner", "échographie",
    "glycémie", "hémoglobine", "créatinine",
    "Dr Martin", "Dr Dubois",
    "CHU Pitié-Salpêtrière"
]

Cabinet d’avocats :

context_bias = [
    "SARL", "SAS", "SASU",
    "article L.225-1", "Code de commerce",
    "assignation", "mise en demeure",
    "TGI", "Cour d'appel",
    "Maître Dupont", "Maître Leroy"
]

Gérer le vocabulaire par projet

Coder la liste en dur ne tient pas dès que plusieurs clients ou plusieurs services entrent en jeu. Le script suivant charge le vocabulaire depuis un fichier JSON, autorise l’ajout de termes ponctuels et déduplique l’ensemble. Il n’impose plus de plafond, Voxtral 3 n’en ayant pas, mais signale une liste trop longue : c’est elle qui risque de faire dépasser la fenêtre de contexte.

import os
import json
from pathlib import Path
from mistralai.client import Mistral

SEUIL_ALERTE = 50  # repère interne : au-delà, vérifiez la taille de la requête


def charger_vocabulaire(chemin_config: str) -> list[str]:
    """Charge le vocabulaire de context biasing depuis un fichier JSON."""
    config = json.loads(Path(chemin_config).read_text(encoding="utf-8"))
    termes = list(dict.fromkeys(config.get("termes", [])))

    if len(termes) > SEUIL_ALERTE:
        print(f"Attention : {len(termes)} termes ; une liste longue réduit "
              f"la place laissée à l'audio dans la fenêtre de contexte.")

    return termes

def transcrire_avec_vocabulaire(
    chemin_audio: str,
    chemin_config: str = None,
    termes_supplementaires: list = None
) -> str:
    """Transcrit avec context biasing optionnel."""
    client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

    # Construire la liste de termes
    tous_les_termes = []

    if chemin_config and Path(chemin_config).exists():
        config = json.loads(
            Path(chemin_config).read_text(encoding="utf-8")
        )
        tous_les_termes.extend(config.get("termes", []))

    if termes_supplementaires:
        tous_les_termes.extend(termes_supplementaires)

    # Dédupliquer en gardant l'ordre
    tous_les_termes = list(dict.fromkeys(tous_les_termes))
    bias = tous_les_termes or None

    # Transcrire
    with open(chemin_audio, "rb") as f:
        kwargs = {
            "model": "voxtral-mini-transcribe-3",
            "file": {"content": f, "file_name": Path(chemin_audio).name}
        }
        if bias:
            kwargs["context_bias"] = bias
            print(f"Context biasing actif : {len(tous_les_termes)} termes")

        response = client.audio.transcriptions.complete(**kwargs)

    return response.text

# Fichier de configuration vocabulaire.json
# {
#   "termes": [
#     "Mistral AI", "Voxtral", "Kubernetes",
#     "PostgreSQL", "RGPD", "Dr Martin"
#   ]
# }

# Utilisation
texte = transcrire_avec_vocabulaire(
    "reunion.mp3",
    chemin_config="vocabulaire.json",
    termes_supplementaires=["nouveau_terme", "autre_terme"]
)
print(texte)

Ce qui marche, ce qui ne marche pas

Le context biasing donne ses meilleurs résultats sur des termes précis et distincts : noms propres, acronymes, vocabulaire technique rare. Il suppose aussi que les termes fournis soient effectivement présents dans l’audio — ajouter par précaution des mots qui ne seront jamais prononcés dilue le signal sans rien apporter. Une liste de vingt à cinquante termes bien choisis suffit dans la plupart des situations.

À l’inverse, inscrire des mots courants ne sert à rien : le modèle les reconnaît déjà très bien, et vous consommez une place utile. Les phrases longues fonctionnent mal, privilégiez les mots ou expressions courtes. Enfin, méfiez-vous du réflexe consistant à verser tout le glossaire de l’entreprise dans le paramètre : un vocabulaire trop large noie les quelques termes qui comptaient vraiment.

Un point de vigilance pour vos projets francophones : le context biasing est optimisé pour l’anglais, et le support des autres langues, dont le français, est qualifié d’expérimental par Mistral AI. En pratique, il fonctionne correctement pour les noms propres et les acronymes dans toutes les langues, mais peut être moins efficace pour les termes courants dans les langues non anglaises. Testez sur un extrait représentatif avant de généraliser à tout un corpus.

Points clés à retenir

  • Le context biasing améliore la reconnaissance des termes spécialisés via context_bias
  • Une liste de termes (phrases avec espaces autorisées), sans plafond fixe mais limitée par la fenêtre de contexte
  • Efficace pour : noms propres, acronymes, jargon technique, noms de lieux
  • Optimisé pour l’anglais, support expérimental pour les autres langues
  • Privilégiez des termes précis et effectivement présents dans l’audio
  • Utilisez un fichier de configuration pour gérer le vocabulaire par projet