Aligner une transcription sur des horodatages SRT
Transformez une transcription finale en texte brut et un minutage existant en sous-titres SRT prêts à l’emploi.
Lancer gratuitement
Chaque horodatage devient un repère numéroté, tandis que la transcription fournit exactement les mots affichés. Le texte de référence facultatif indique combien de mots appartiennent à chaque segment : les corrections orthographiques ou typographiques ne détruisent donc pas la structure temporelle. Le résultat respecte les codes temporels SRT, une numérotation stable, les lignes vides entre blocs et une limite configurable de caractères par ligne.
Préparez la transcription et le minutage
Partez de la transcription définitive, telle qu’elle doit apparaître à l’écran. Les espaces entre les mots sont normalisés, mais l’orthographe, les majuscules et la ponctuation sont conservées. Fournissez ensuite une liste chronologique d’horodatages. Chaque élément doit comporter un début et une fin en secondes et devient un repère SRT. Il peut aussi contenir un texte de référence issu de la transcription initiale. L’outil ne recopie pas ce texte : il compte ses mots et prélève le même nombre de mots dans la version corrigée. Vous pouvez ainsi garder le minutage produit automatiquement après avoir rectifié les noms ou la formulation. Sans référence, chaque horodatage consomme un mot. Les comptes cumulés doivent couvrir toute la transcription ; tout mot restant ou dépassement provoque une erreur explicite. Les secondes décimales, comme 1.25 ou 8.9, sont acceptées.
Maîtrisez la longueur des lignes
Réglez max_chars_per_line selon les exigences de votre chaîne de diffusion, lecteur ou référentiel d’accessibilité. La valeur par défaut est 42 caractères et la plage admise va de 8 à 120. Le retour à la ligne intervient uniquement entre les mots. L’algorithme remplit une ligne jusqu’à ce que le mot suivant dépasse la limite, puis en ouvre une nouvelle. Il ne modifie aucun mot, ne supprime aucune ponctuation et n’ajoute aucun trait d’union. Un mot à lui seul trop long entraîne une erreur claire afin de préserver la transcription. Vous pouvez alors relever la limite ou modifier volontairement ce mot. Chaque horodatage reste un seul repère même si son texte occupe plusieurs lignes ; aucun temps n’est inventé ni divisé. Pour viser deux lignes, préparez des segments assez courts pour la limite choisie. Seul le nombre de caractères par ligne est imposé.
Validez les temps et exploitez le SRT
Avant toute génération, chaque horodatage est contrôlé. Le début et la fin doivent être des secondes finies et positives ou nulles, avec une fin postérieure au début. L’ordre doit rester chronologique : le repère suivant ne peut pas commencer avant la fin du précédent. Deux repères peuvent toutefois se toucher exactement. En cas de chevauchement ou d’intervalle inversé, le traitement s’arrête et désigne l’élément fautif. Ce contrôle évite qu’un fichier apparemment propre masque des défauts rendus différemment selon les lecteurs. Les secondes sont arrondies à la milliseconde et formatées en HH:MM:SS,mmm. La réponse contient une chaîne srt complète à copier ou enregistrer et un tableau blocks destiné aux intégrations structurées. La numérotation commence à un et le résultat est déterministe. Utilisez le navigateur pour une préparation ponctuelle ou l’API pour $0.002 dans une chaîne multimédia automatisée.
Cas d’usage
Appliquer des corrections éditoriales
Conservez le minutage automatique tout en remplaçant le texte par une transcription corrigée et validée.
Convertir le minutage mot à mot en SRT
Transformez un horodatage par mot en repères SRT valides sans formater manuellement temps et numéros.
Respecter les limites de ligne
Recomposez les sous-titres selon un maximum connu avant leur importation dans un lecteur ou un logiciel de montage.
Questions fréquentes
Quel est le prix d’une requête API ?
Chaque requête API coûte $0.002. La version dans le navigateur fonctionne de manière interactive sans envoyer le contenu à un modèle distant.
Le texte de référence apparaît-il dans les sous-titres ?
Non. Il détermine uniquement le nombre de mots attribués ; le texte visible vient toujours de la transcription.
Les horodatages peuvent-ils se chevaucher ?
Non. Chaque repère doit finir après son début, et le suivant doit commencer à la fin du précédent ou plus tard.
Que se passe-t-il si les comptes de mots divergent ?
La requête échoue si des mots restent sans affectation ou si les horodatages en réclament davantage que la transcription.
Un mot trop long est-il coupé ?
Non. Un mot dépassant max_chars_per_line provoque une erreur afin de préserver le texte sans modification silencieuse.
Comment les fractions de seconde sont-elles formatées ?
Les secondes sont arrondies à la milliseconde la plus proche et utilisent la virgule normalisée du format SRT.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/audio/audio-to-text-srt-align \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"transcript":"Welcome to the demonstration. This subtitle wraps cleanly.","timestamps":[{"start":0,"end":2.4,"text":"Welcome to the demonstration."},{"start":2.4,"end":5.2,"text":"This subtitle wraps cleanly."}]}'const res = await fetch("https://api.kit.forhosting.com/audio/audio-to-text-srt-align", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"transcript": "Welcome to the demonstration. This subtitle wraps cleanly.",
"timestamps": [
{
"start": 0,
"end": 2.4,
"text": "Welcome to the demonstration."
},
{
"start": 2.4,
"end": 5.2,
"text": "This subtitle wraps cleanly."
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/audio-to-text-srt-align",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"transcript": "Welcome to the demonstration. This subtitle wraps cleanly.",
"timestamps": [
{
"start": 0,
"end": 2.4,
"text": "Welcome to the demonstration."
},
{
"start": 2.4,
"end": 5.2,
"text": "This subtitle wraps cleanly."
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/audio-to-text-srt-align", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"transcript":"Welcome to the demonstration. This subtitle wraps cleanly.","timestamps":[{"start":0,"end":2.4,"text":"Welcome to the demonstration."},{"start":2.4,"end":5.2,"text":"This subtitle wraps cleanly."}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"transcript":"Welcome to the demonstration. This subtitle wraps cleanly.","timestamps":[{"start":0,"end":2.4,"text":"Welcome to the demonstration."},{"start":2.4,"end":5.2,"text":"This subtitle wraps cleanly."}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/audio-to-text-srt-align", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"transcript": "Welcome to the demonstration. This subtitle wraps cleanly.",
"timestamps": [
{
"start": 0,
"end": 2.4,
"text": "Welcome to the demonstration."
},
{
"start": 2.4,
"end": 5.2,
"text": "This subtitle wraps cleanly."
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.audio_to_text_srt_align",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_items | 10000 |
max_chars | 500000 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |