/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
- 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.
- 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.
- 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.
- Demandez les options en plus. Ajoutez
"round": trueet"measureStatus": trueà la requête. Les deux sont désactivées par défaut, donc rien ne change dans une intégration existante.rounddonne moins de décimales (46,7 au lieu de 46,69999999999999).measureStatusajoute 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"
donePython
Le paquet audiolabtools donne les dix chiffres en un seul appel, avec le statut et la marge de chacun :
pip install audiolabtoolsfrom 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 | Ce qu’il vous dit |
|---|---|---|---|
| integratedLufs | Validé | ±0,1 LU | Le volume de l’ensemble de l’enregistrement. |
| truePeakDb | Validé | +0,2 / -0,4 dB | Le niveau le plus haut que le signal atteint à la lecture, y compris entre les échantillons. |
| peakDb | Validé | aucune indiquée | L’échantillon le plus élevé. |
| averageSpeechRmsDb | Validé | aucune indiquée | Le volume de la voix pendant qu’elle parle. |
| noiseFloorDb | Validé | aucune indiquée | Le niveau du dixième le plus calme de l’enregistrement : le fond. |
| signalToNoiseDb | Validé | ±6 dB | De combien la voix se détache au-dessus de ce fond. |
| clipping | Validé | aucune indiquée | Si des échantillons ont touché le plafond et ont été aplatis. |
| speechRatio | Proxy | aucune indiquée | La part de l’enregistrement où la voix est assez forte pour compter comme de la parole. |
| longSilences | Proxy | aucune indiquée | Combien de pauses de plus de 1,5 seconde séparent les passages de parole. |
| bandwidthHz | Validé | aucune indiquée | La fréquence la plus haute qui porte encore un vrai contenu. |
-
integratedLufsPOST /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).
- Marge
- ±0,1 LU. La tolérance de l’EBU Tech 3341, tenue par le benchmark de loudness à chaque build.
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 : loudness.integrated
-
truePeakDbPOST /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.
- 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.
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 : loudness.truePeak
-
peakDbPOST /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
-
averageSpeechRmsDbPOST /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
-
noiseFloorDbPOST /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
-
signalToNoiseDbPOST /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
-
clippingPOST /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
-
speechRatioPOST /v1/voicelab/qa · part ProxyLa 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
-
longSilencesPOST /v1/voicelab/qa · nombre ProxyCombien 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
-
bandwidthHzPOST /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
- 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é.
- 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é.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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 (
sceneBackgroundet les autres champsscene) 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/usageavec 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
- Practical
Auditer un jeu de conversations : d'où vient vraiment l'audio
Mesurez un dossier d'enregistrements d'appels, d'agents vocaux ou de synthèse vocale pour y repérer une source avec pertes, un suréchantillonnage, des raccords, du mono déguisé, de l'écrêtage et la profondeur de bits, 20 fichiers à la fois, et sachez quand l'audio est téléversé et quand il ne l'est pas.
- Intro
Lire une réponse : ce que signifie chaque champ et jusqu'où lui faire confiance
Une vraie réponse de l'API, champ par champ : ce qu'elle dit, son statut et sa marge, et ce que vous pouvez ou ne pouvez pas en conclure.
- Intro
Ce que AudioLab ne fait pas
Les limites de l'analyse, énoncées simplement : il ne transcrit pas, ne prédit pas les erreurs de reconnaissance, ne note pas le naturel, n'identifie pas les locuteurs et ne mesure pas la latence, et ses indices de fond sont des suppositions.
- Intro
Changements et dépréciation : ce qui change, quand, et comment vous le savez
La promesse derrière /v1, ce qui compte comme un changement qui demande un préavis, comment nous l'annonçons, et ce qui est déprécié aujourd'hui.