Aller au contenu
Se connecter

/docs · General · Practical

Comparer les fournisseurs d'agents vocaux et de synthèse vocale, et contrôler l'audio conversationnel

Trois appels d'API, dix chiffres, et jusqu'où faire confiance à chacun : un guide pour les équipes QA qui comparent des fournisseurs d'agents vocaux, de synthèse vocale ou d'isolation de la voix.

Mis à jour 15 oct. 2026


À qui s’adresse ce guide

Vous avez des enregistrements de deux fournisseurs ou plus d’agents vocaux, de synthèse vocale ou d’isolation de la voix, ou d’un seul fournisseur au fil du temps, et vous voulez les comparer avec des chiffres : quel volume, quel bruit, si quelque chose écrête, quelle largeur de bande, combien de pauses.

Il s’adresse aux équipes qui fixent elles-mêmes leurs règles de réussite et d’échec par-dessus. Il ne sert pas à juger le naturel d’une voix, et il ne lit pas les mots. Voir ce que AudioLab ne fait pas.

Ce que vous obtenez

Pour chaque enregistrement, une dizaine de chiffres. Chacun a un statut qui dit jusqu’où lui faire confiance (demandez measureStatus et la réponse le porte) et, quand nous le savons, une marge qui dit de combien il peut être faux. Nous vous donnons des plages de départ. La décision de valider ou de rejeter un enregistrement reste la vôtre.

Vous préférez ne pas écrire de code ? L’espace de travail compare deux séries d’enregistrements dans votre navigateur : connectez-vous sur /account, ouvrez l’onglet Voice et activez « Compare two sets » dans le traitement par lots. Vous obtenez les mêmes dix chiffres avec les mêmes statuts, et des marges là où nous avons mesuré, votre audio n’est pas téléversé, et le rapport s’exporte en un seul fichier HTML.

Avant de commencer

  1. Obtenez une clé. Elle est gratuite et ne demande pas de carte : connectez-vous sur /account et générez-en une. Le palier gratuit est de 1 000 appels par mois, 2 Go par mois et 60 requêtes par minute. Les dix chiffres coûtent trois appels par enregistrement, et le fichier est décompté de vos données mensuelles une fois par appel, donc trois fois.
  2. Utilisez les mêmes phrases avec chaque fournisseur. Un écart entre fournisseurs ne veut dire quelque chose que sur le même texte, avec le même bruit de fond.
  3. Envoyez l’audio tel que vos utilisateurs l’entendent. Même fréquence d’échantillonnage et même codec qu’en production. Un fournisseur qui sonne bien en WAV de studio peut paraître différent après la ligne téléphonique.
  4. Demandez les options en plus. Ajoutez "round": true et "measureStatus": true à la requête. Les deux sont désactivées par défaut, donc rien ne change dans une intégration existante. round donne moins de décimales (46,7 au lieu de 46,69999999999999). measureStatus ajoute une clé avec le statut de chaque mesure et, quand nous le savons, sa marge. Avec un fichier brut comme corps de requête, placez plutôt les deux options dans la chaîne de requête : ?round=true&measureStatus=true.

Les trois appels

Un enregistrement demande trois requêtes POST avec le même corps : mixlab/analyze pour la loudness, voicelab/qa pour la voix et le fond, et signallab pour la bande passante. Envoyez une URL publique (jusqu’à 150 Mo), ou un petit fichier comme corps brut (environ 4,5 Mo). Pour un fichier local de plus de 4,5 Mo, téléversez-le d’abord par une URL signée et envoyez son objectPath, comme décrit dans la spécification OpenAPI.

curl
export AUDIOLAB_KEY=al_live_...
BODY='{"url":"https://example.com/vendor-a/sentence-01.wav","round":true,"measureStatus":true}'

for route in mixlab/analyze voicelab/qa signallab; do
  curl -s "https://audiolab.tools/v1/$route" \
    -H "Authorization: Bearer $AUDIOLAB_KEY" \
    -H "Content-Type: application/json" \
    -d "$BODY" > "vendor-a_sentence-01_${route//\//_}.json"
done
Python

Le paquet audiolabtools donne les dix chiffres en un seul appel, avec le statut et la marge de chacun :

pip install audiolabtools
from audiolabtools import AudioLab

numbers = AudioLab().ten_numbers("https://example.com/vendor-a/sentence-01.wav")
for field, m in numbers.items():
    print(field, m.value, m.unit, m.status, m.margin)

Il lit la clé dans AUDIOLAB_KEY, fait les trois appels ci-dessous avec round et measureStatus activés, et lève une exception par code d’erreur (DataQuotaExceeded, RateLimited, etc., chacune avec code et docs_url). Le README du paquet donne le reste. Sans le paquet, la même chose avec requests :

import os, requests

KEY = os.environ["AUDIOLAB_KEY"]

def analyze(route, url):
    r = requests.post(
        f"https://audiolab.tools/v1/{route}",
        headers={"Authorization": f"Bearer {KEY}"},
        json={"url": url, "round": True, "measureStatus": True},
        timeout=120,
    )
    if not r.ok:
        # error.code dit ce qui s'est passé, voir https://audiolab.tools/docs/errors
        raise RuntimeError(r.json()["error"]["code"] + ": " + r.json()["error"]["message"])
    return r.json()

def ten_numbers(url):
    mix, voice, sig = (analyze(r, url) for r in ("mixlab/analyze", "voicelab/qa", "signallab"))
    return {
        "integratedLufs": mix["integratedLufs"],
        "truePeakDb": mix["truePeakDb"],
        "peakDb": mix["peakDb"],
        "speechLevelDb": voice["averageSpeechRmsDb"],
        "noiseFloorDb": voice["noiseFloorDb"],
        "signalToNoiseDb": voice["signalToNoiseDb"],
        "clipping": voice["clipping"]["severity"],
        "speechRatio": voice["speechRatio"],
        "longSilences": voice["longSilences"],
        "bandwidthHz": sig["bandwidthHz"],
    }
TypeScript
const KEY = process.env.AUDIOLAB_KEY!;

async function analyze(route: string, url: string) {
  const r = await fetch(`https://audiolab.tools/v1/${route}`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ url, round: true, measureStatus: true }),
  });
  const body = await r.json();
  // En cas d'erreur, body.error.code dit ce qui s'est passé : https://audiolab.tools/docs/errors
  if (!r.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
  return body;
}

export async function tenNumbers(url: string) {
  const [mix, voice, sig] = await Promise.all(['mixlab/analyze', 'voicelab/qa', 'signallab'].map((r) => analyze(r, url)));
  return {
    integratedLufs: mix.integratedLufs, truePeakDb: mix.truePeakDb, peakDb: mix.peakDb,
    speechLevelDb: voice.averageSpeechRmsDb, noiseFloorDb: voice.noiseFloorDb, signalToNoiseDb: voice.signalToNoiseDb,
    clipping: voice.clipping.severity, speechRatio: voice.speechRatio, longSilences: voice.longSilences,
    bandwidthHz: sig.bandwidthHz,
  };
}
MCP (Claude et autres agents)

Connectez le serveur AudioLab comme indiqué sur /connect, puis demandez :

Utilise analyze_loudness, analyze_voice et index_signal sur ces trois URL. Donne-moi un tableau avec, pour chacune, la loudness intégrée, le true peak, la crête, le niveau de parole, le niveau de bruit de fond, le rapport signal sur bruit, l’écrêtage, le taux de parole, les longs silences et la bande passante. Dis-moi lesquels sont validés et lesquels sont des proxys.

Les outils MCP renvoient les mêmes chiffres. Ils n’ajoutent pas le statut à chaque résultat ; la description de chaque outil nomme ses mesures validées et ses proxys (l’outil de voix précise aussi que le champ d’énergie des pauses n’est pas une mesure de réverbération), et cette page le dit champ par champ.

Les dix chiffres

Chiffre Statut Marge
integratedLufs Validé ±0,1 LU
truePeakDb Validé +0,2 / -0,4 dB
peakDb Validé aucune indiquée
averageSpeechRmsDb Validé aucune indiquée
noiseFloorDb Validé aucune indiquée
signalToNoiseDb Validé ±6 dB
clipping Validé aucune indiquée
speechRatio Proxy aucune indiquée
longSilences Proxy aucune indiquée
bandwidthHz Validé aucune indiquée
  1. integratedLufs POST /v1/mixlab/analyze · LUFS Validé

    Le volume de l’ensemble de l’enregistrement.

    Un niveau, pas une qualité. Comparez les fournisseurs sur les mêmes phrases. L’audio conversationnel n’a pas de cible standard (la diffusion utilise -23, les podcasts -16).

    Plage courante : aucune. Déterminé par votre propre gain staging, pas par le fournisseur. Comparez plutôt les fournisseurs au même niveau.
    Marge
    ±0,1 LU. La tolérance de l’EBU Tech 3341, tenue par le benchmark de loudness à chaque build.

    Testé contre, et ce que ce n’est pas : loudness.integrated

  2. truePeakDb POST /v1/mixlab/analyze · dBTP Validé

    Le niveau le plus haut que le signal atteint à la lecture, y compris entre les échantillons.

    Une information pour l’audio conversationnel, pas un critère de réussite ou d’échec. Au-dessus de 0, un décodeur ou un encodeur plus loin dans la chaîne peut l’écrêter.

    Plage courante : aucune. Déterminé par votre propre gain staging, pas par le fournisseur. Comparez plutôt les fournisseurs au même niveau.
    Marge
    +0,2 / -0,4 dB. La tolérance d’un true-peak mètre dans l’ITU-R BS.1770, tenue par le benchmark de loudness à chaque build.

    Testé contre, et ce que ce n’est pas : loudness.truePeak

  3. peakDb POST /v1/mixlab/analyze · dBFS Validé

    L’échantillon le plus élevé.

    0 est la pleine échelle. À 1 dB ou moins de 0, regardez l’écrêtage.

    Plage courante : aucune. Déterminé par votre propre gain staging, pas par le fournisseur. Comparez plutôt les fournisseurs au même niveau.

    Testé contre, et ce que ce n’est pas : level.peak

  4. averageSpeechRmsDb POST /v1/voicelab/qa · dBFS Validé

    Le volume de la voix pendant qu’elle parle.

    Mesuré sur la parole seulement, en dBFS, donc pas sur la même échelle que les LUFS. Comparez les fournisseurs sur le même texte.

    Plage courante : aucune. Déterminé par votre propre gain staging, pas par le fournisseur. Comparez plutôt les fournisseurs au même niveau.

    Testé contre, et ce que ce n’est pas : voice.speechLevel

  5. noiseFloorDb POST /v1/voicelab/qa · dBFS Validé

    Le niveau du dixième le plus calme de l’enregistrement : le fond.

    Plus bas, c’est plus propre. Sur un bruit réel, il se situe de 1 à 8 dB sous le niveau moyen de ce bruit, parce qu’il lit les moments les plus calmes. Les voix synthétiques ont souvent du silence numérique entre les mots : le moteur lit alors son plancher, -120. Il dépend du volume du fichier : comparez les fournisseurs au même niveau de parole, ou utilisez le rapport signal sur bruit, qui n’en dépend pas.

    Voix synthétique, propre
    -120 à -65,4
    Voix humaine, propre
    -56,1 à -54,2
    Voix humaine, bruit 10 dB en dessous
    -38,8 à -37
    Voix synthétique, bande téléphonique
    -120 à -76,1

    Testé contre, et ce que ce n’est pas : voice.noiseFloor

  6. signalToNoiseDb POST /v1/voicelab/qa · dB Validé

    De combien la voix se détache au-dessus de ce fond.

    Une estimation. À 6 dB près quand le vrai rapport est de 10 à 30 dB avec un bruit constant. Sous 10 dB, il se lit trop haut. Au-dessus d’environ 50 dB, il dit seulement que les pauses sont très calmes, souvent du silence numérique : ne comparez pas les chiffres à ce niveau.

    Voix synthétique, propre
    46,8 à 101,3
    Voix humaine, propre
    26,6 à 29,5
    Voix humaine, bruit 10 dB en dessous
    11,9 à 13,8
    Voix synthétique, bande téléphonique
    55,4 à 99,5
    Marge
    ±6 dB. Tient pour de la parole lue avec un bruit de fond constant à un vrai rapport de 10 à 30 dB (90 pour cent des cas). Sous 10 dB, il se lit trop haut, de 3 dB ou plus. Avec le détecteur K2, il tient dès 5 dB pour une place de ville et pour la circulation d’une rue, et regroupé sur cuisine, salon, couloir et cafétéria (90e percentile 4,4 dB à 5 dB) ; à 10 dB, la valeur regroupée sur ces quatre est 6,25 dB et un métro atteint 7,3 dB ; à 0 dB, il se lit encore environ 6 dB trop haut.

    Testé contre, et ce que ce n’est pas : voice.snr

  7. clipping POST /v1/voicelab/qa · gravité Validé

    Si des échantillons ont touché le plafond et ont été aplatis.

    None, Low, Medium ou High, avec le nombre. None sur chaque enregistrement propre que nous avons mesuré. Corrigez cela d’abord : rien d’autre ne se compare bien sur un enregistrement écrêté.

    Voix synthétique, propre
    None 48 sur 48
    Voix humaine, propre
    None 40 sur 40
    Voix humaine, bruit 10 dB en dessous
    None 40 sur 40
    Voix synthétique, bande téléphonique
    None 48 sur 48

    Testé contre, et ce que ce n’est pas : voice.clipping

  8. speechRatio POST /v1/voicelab/qa · part Proxy

    La part de l’enregistrement où la voix est assez forte pour compter comme de la parole.

    Se lit environ 12 points trop bas sur de la parole propre : les débuts et les fins de mots faibles comptent comme de la pause. Utilisez-le pour comparer les fournisseurs sur le même texte, pas comme une vraie part.

    Voix synthétique, propre
    0,63 à 0,72
    Voix humaine, propre
    0,54 à 0,73
    Voix humaine, bruit 10 dB en dessous
    0,36 à 0,58
    Voix synthétique, bande téléphonique
    0,57 à 0,68

    Testé contre, et ce que ce n’est pas : voice.speechRatio

  9. longSilences POST /v1/voicelab/qa · nombre Proxy

    Combien de pauses de plus de 1,5 seconde séparent les passages de parole.

    Du temps mort. Exact sur 7 ou 8 enregistrements propres sur 10, et à un près sur presque tous. Le bruit le rend moins fiable.

    Plage courante : aucune. Cela dépend de votre texte : une seule phrase n’en a aucune, un script avec des pauses en a plusieurs. Comptez-les sur les mêmes phrases pour chaque fournisseur.

    Testé contre, et ce que ce n’est pas : voice.longSilences

  10. bandwidthHz POST /v1/signallab · Hz Validé

    La fréquence la plus haute qui porte encore un vrai contenu.

    Environ 4 000 correspond à une ligne téléphonique. La voix large bande atteint environ 8 000, et un enregistrement échantillonné à 44,1 ou 48 kHz peut montrer plus. Une baisse quand le fond est bruyant peut signifier que le fournisseur coupe les aigus pour le masquer.

    Voix synthétique, propre
    8 000
    Voix humaine, propre
    8 000
    Voix humaine, bruit 10 dB en dessous
    8 000
    Voix synthétique, bande téléphonique
    4 100 à 4 200

    Testé contre, et ce que ce n’est pas : provenance.bandwidthHz

Les plages vont du 5e au 95e percentile de ce que le moteur a mesuré : 48 voix synthétiques néerlandaises, 40 enregistrements de lecture en anglais avec un niveau de bruit de fond très bas, les mêmes enregistrements avec un bruit de salon ajouté 10 dB sous la voix, et les voix synthétiques passées par une bande téléphonique. Elles montrent à quoi s’attendre, pas ce qui est bon.

Les plages sont ce que nous avons mesuré sur des enregistrements propres et bruyants. Ce sont des points de départ, pas des normes. Pour vos propres limites, voir la dernière étape ci-dessous.

Comment les lire

  1. Regardez d’abord l’écrêtage. S’il n’est pas None, corrigez l’audio. Rien d’autre ne se compare bien sur un enregistrement écrêté.
  2. Traitez le true peak comme une information. Il n’existe pas de plafond standard pour l’audio conversationnel. Nos propres préréglages de diffusion et de streaming utilisent -1 ou -2 dBTP, et ils existent pour la livraison, pas pour un agent vocal. Si votre pipeline réencode l’audio, regardez la crête à l’endroit où il est réencodé.
  3. Lisez le bruit avec deux chiffres. Le niveau de bruit de fond dit à quel point le fond est calme. Le rapport signal sur bruit dit de combien la voix se détache au-dessus. Quand ils divergent, regardez d’abord le niveau de bruit de fond : c’est la mesure la plus simple. Il lit le dixième le plus calme de l’enregistrement, donc sur un bruit réel il se situe de 1 à 8 dB sous le niveau moyen de ce bruit.
  4. Regardez la bande passante à côté du bruit. Un fournisseur dont la bande passante chute quand le fond est bruyant coupe peut-être les hautes fréquences pour masquer le bruit. C’est un compromis à observer, pas forcément un défaut.
  5. Utilisez les proxys pour comparer, pas pour énoncer des faits. Le taux de parole et les longs silences sont des proxys : ils vous disent de façon fiable quel fournisseur laisse plus de pauses sur le même texte, mais le taux de parole n’est pas la vraie part de parole.
  6. Ne lisez pas comme un résultat un écart plus petit que la marge. La marge dit de combien un chiffre peut s’écarter de la vérité. Nous n’avons pas mesuré la tenue de la différence entre deux chiffres. Si deux fournisseurs sont à 3 dB l’un de l’autre sur le rapport signal sur bruit et que la marge est de 6 dB, prenez-le comme un indice et écoutez les enregistrements.
  7. Fixez vos propres limites à partir de vos propres bons enregistrements. Prenez vingt enregistrements que vous jugez bons. Utilisez leur 5e et leur 95e percentile comme plage, et gardez les plages de départ ci-dessus comme contrôle de cohérence de la mesure elle-même.
  8. Comparez les fournisseurs sur de nombreuses phrases, pas une seule. Utilisez les mêmes phrases avec chaque fournisseur. Pour chaque chiffre, regardez la médiane et la dispersion sur les phrases, et combien de phrases vont dans le même sens quand vous mettez deux fournisseurs côte à côte. Nous n’avons pas mesuré la tenue de la différence entre deux fournisseurs : un écart qui n’apparaît que sur quelques phrases est donc un indice.

Ce qu’il ne peut pas faire

  • Il ne transcrit pas, et il ne prédit pas les erreurs de transcription à partir de la qualité audio. Dans notre propre test de 1 248 transcriptions, le rapport signal sur bruit n’a pas prédit les erreurs de reconnaissance.
  • Il ne dit pas si une voix sonne naturelle ou robotique, et il ne distingue pas les voix.
  • Il ne mesure ni la latence, ni les interruptions, ni les tours de parole.
  • Ses indices de fond (sceneBackground et les autres champs scene) sont des heuristiques sur les pauses, pas une reconnaissance de ce qui produit le bruit.

La liste complète est sur ce que AudioLab ne fait pas.

Confidentialité et limites

  • Votre audio n’est pas conservé. Il est analysé en mémoire à Francfort. Un fichier compressé (MP3, FLAC, M4A) passe par un fichier temporaire supprimé juste après le décodage. Un fichier que vous téléversez par la voie d’envoi signé est supprimé dans l’heure. Nous conservons les chiffres et, si vous nous y autorisez, le nom du fichier. Voir /privacy.
  • Limites. Gratuit : 1 000 appels et 2 Go par mois, 60 requêtes par minute. Plus : 10 000 appels, 20 Go, 120 par minute. Un fichier peut peser 150 Mo quand vous envoyez une URL publique ou un objectPath. Chaque requête acceptée compte, y compris celle qui échoue ensuite. Une erreur vous dit quoi faire : /docs/errors.
  • Où vous en êtes. GET /v1/usage avec votre clé renvoie l’offre, les appels et les données utilisés ce mois-ci par rapport aux limites, et les requêtes par minute : les mêmes chiffres que /account. La lecture est gratuite et ne compte pas comme un appel. Vérifiez-la avant un gros lot plutôt que de le découvrir par un 402.
  • Questions sur un chiffre. Écrivez à support@audiolab.tools avec le nom du champ et le fichier, et nous vous dirons ce que nous savons.

Pour la suite

  • Voice AI check : mesurez un enregistrement dans votre navigateur, avec le statut à côté de chaque chiffre, et la marge là où nous en avons mesuré une.
  • Une voix concurrente en arrière-plan : un petit test de deux modèles Whisper ouverts, et ce qu’il ne peut pas vous dire.

Ensuite dans General docs

Contrôler la qualité audio en CI : faire échouer un build quand un fichier enfreint vos règles →

Un court script Python et un workflow GitHub qui mesurent chaque fichier audio avec l'API AudioLab, comparent les chiffres à des limites que vous fixez, et font échouer le build avec un message qui dit pourquoi.

More in General docs