Formater chapitres audio pour apps
Trois chapitres qui commencent à 0, 120 et 1800 secondes deviennent un seul fichier que les applis de podcast lisent pour afficher une table des matières et naviguer dans l'épisode. Les temps doivent toujours avancer, sinon rien n'est exporté. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Tout se passe dans votre navigateur : gratuit, sans envoi de vos données.
Les producteurs connaissent déjà les titres de section et l’instant de début de chacune ; ce dont ils ont besoin est un export correct et lisible par l’app, avec des champs startTime en camelCase, une pochette et des liens optionnels, et la garantie que les horodatages ne reculent jamais.
Ce qu'un fichier de chapitres apporte à l'auditeur
Les applis de podcast qui gèrent les chapitres ne les lisent pas dans le fichier audio lui-même. Elles récupèrent un petit fichier séparé, lié à l'épisode dans votre flux, et s'en servent pour afficher une table des matières, sauter à chaque partie et changer l'image pendant l'écoute. Chaque chapitre a besoin d'une heure de début en secondes depuis le début de l'audio ; un titre est vivement conseillé pour que l'auditeur voie des noms lisibles. Vous pouvez aussi ajouter une image et un lien à n'importe quel chapitre, marquer un chapitre comme silencieux pour qu'il n'apparaisse pas dans la liste et fixer une heure de fin si vous le souhaitez. Comme les applis récupèrent le fichier à la lecture, vous pouvez corriger un titre ou ajouter une image après publication sans réencoder l'épisode.
Préparer les chapitres sans erreur
Écrivez vos parties dans l'ordre, chacune avec son titre et la seconde où elle commence, par exemple une introduction à 0, le sujet principal à 120 et la conclusion à 1800. L'outil les convertit au format standard et renvoie le texte prêt à héberger à une adresse web stable. L'erreur la plus courante est une heure de début répétée ou qui recule. L'outil ne réordonne jamais les chapitres à votre place, car un réordonnancement silencieux pourrait masquer une erreur et associer la mauvaise image au mauvais segment ; il s'arrête et indique la ligne hors d'ordre.
À quoi ressemble un fichier de chapitres de podcast
L’espace de noms Podcasting 2.0 pointe chaque épisode vers un fichier externe de chapitres avec le type MIME application/json+chapters. Chaque chapitre nécessite au minimum startTime sous forme de nombre flottant en secondes depuis le début de l’audio ; title est fortement recommandé pour que les auditeurs voient une table des matières lisible. Les champs optionnels de chapitre incluent img pour l’illustration par section, url pour une page web ou des notes d’épisode, toc à false pour des marqueurs silencieux de métadonnées uniquement, et endTime lorsque vous souhaitez une fin explicite.
L’ordre des chapitres est validé, non deviné : la capacité ne réordonne jamais des temps désordonnés, car un réordonnancement silencieux pourrait masquer des erreurs de production et placer la mauvaise illustration sur le mauvais segment. Elle exige au contraire des heures de début strictement croissantes et échoue clairement lorsqu’une ligne ultérieure est égale ou antérieure à la précédente. Les apps récupèrent le fichier à la lecture, vous pouvez donc corriger des titres ou ajouter des images après publication sans réencoder l’épisode.
Questions fréquentes
Que se passe-t-il si les heures de début ne sont pas strictement croissantes ?
Les temps égaux ou décroissants sont rejetés afin que les apps de podcast ne reçoivent jamais de marqueurs désordonnés.
Puis-je inclure des images et des liens par chapitre ?
Oui. Les chaînes optionnelles img et url de chaque chapitre deviennent les champs img et url Podcasting 2.0. Les chaînes vides sont omises de l’export.
Comment rattacher le fichier à mon flux RSS ?
Les apps récupèrent le fichier à la lecture.
Puis-je modifier un titre après la publication de l'épisode ?
Oui. Les applis récupèrent le fichier de chapitres à la lecture : vous pouvez corriger des titres ou ajouter des images plus tard et héberger le nouveau fichier à la même adresse, sans réencoder l'audio.
Un chapitre peut-il rester hors de la table des matières ?
Oui. Marquez-le comme silencieux : il sert alors de repère que les applis conservent sans l'afficher à l'auditeur. Par défaut, tous les chapitres figurent dans la liste ; ne modifiez que ceux à masquer.
Outils associés
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-chapter-export-format \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"chapters":[{"title":"Intro","start_time":0},{"title":"Main topic","start_time":120,"img":"https://example.com/art/main.jpg","url":"https://example.com/notes/main"},{"title":"Outro","start_time":1800}]}'const res = await fetch("https://api.kit.forhosting.com/audio/audio-chapter-export-format", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"chapters": [
{
"title": "Intro",
"start_time": 0
},
{
"title": "Main topic",
"start_time": 120,
"img": "https://example.com/art/main.jpg",
"url": "https://example.com/notes/main"
},
{
"title": "Outro",
"start_time": 1800
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/audio-chapter-export-format",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"chapters": [
{
"title": "Intro",
"start_time": 0
},
{
"title": "Main topic",
"start_time": 120,
"img": "https://example.com/art/main.jpg",
"url": "https://example.com/notes/main"
},
{
"title": "Outro",
"start_time": 1800
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/audio-chapter-export-format", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"chapters":[{"title":"Intro","start_time":0},{"title":"Main topic","start_time":120,"img":"https://example.com/art/main.jpg","url":"https://example.com/notes/main"},{"title":"Outro","start_time":1800}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"chapters":[{"title":"Intro","start_time":0},{"title":"Main topic","start_time":120,"img":"https://example.com/art/main.jpg","url":"https://example.com/notes/main"},{"title":"Outro","start_time":1800}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/audio-chapter-export-format", 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
{
"chapters": [
{
"title": "Intro",
"start_time": 0
},
{
"title": "Main topic",
"start_time": 120,
"img": "https://example.com/art/main.jpg",
"url": "https://example.com/notes/main"
},
{
"title": "Outro",
"start_time": 1800
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.audio_chapter_export_format",
"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_mb | 200 |
max_minutes | 180 |
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. |
Notes techniques
Les applications de podcast compatibles avec les chapitres Podcasting 2.0 attendent un petit fichier JSON lié à l’élément RSS de l’épisode, et non des balises de chapitre intégrées dans le MP3. Cette capacité prend vos lignes de chapitres ordonnées—titre plus heure de début en secondes, avec image et URL optionnelles par chapitre—et émet l’objet chapters versionné standard ainsi qu’une chaîne json_text mise en forme que vous pouvez héberger et référencer avec la balise podcast:chapters. Si les heures de début ne sont pas strictement croissantes, la tâche échoue avec invalid_input afin que de mauvais marqueurs n’atteignent pas le flux.
À quoi ressemble le JSON de chapitres Podcasting 2.0
Ce fichier est un objet JSON dont les clés obligatoires sont version (souvent 1.2.0) et chapters, un tableau de marqueurs ordonnés par startTime croissant. Des champs optionnels au niveau du fichier tels que author, title, podcastName et description aident les lecteurs web et les archives sans changer la façon dont les apps sautent dans l’audio. Cet exporteur mappe votre entrée par lignes—start_time et title sur chaque chapitre, img et url optionnels—vers cette forme camelCase afin que vous n’éditiez pas les accolades à la main ni n’oubliiez la chaîne de version. Hébergez le json_text résultant à une URL HTTPS stable, puis ajoutez podcast:chapters avec type application/json+chapters dans l’élément.
Contrat d’entrée, forme de la réponse et règles de validation
Les clés de sortie optionnelles sont omises entièrement plutôt que mises à null. Envoyez en POST un corps JSON avec un tableau chapters obligatoire d’au moins un objet. Chaque objet doit inclure title comme chaîne non vide et start_time comme nombre fini non négatif en secondes (des alias tels que startTime sont acceptés sur chaque ligne). Les champs optionnels par chapitre sont img et url comme chaînes non vides, toc comme booléen (false marque un chapitre silencieux ; true est la valeur par défaut et est omis de l’export), et end_time comme nombre non négatif non inférieur au début de ce chapitre. Les chaînes optionnelles au niveau du fichier—version (par défaut 1.2.0), episode_title, author, podcast_name et description—sont copiées dans l’objet chapters lorsqu’elles sont présentes. En cas de succès le corps renvoie version, chapter_count, chapters comme le tableau Podcasting 2.0 avec des clés startTime, json_text comme le fichier mis en forme prêt à téléverser, mime_type égal à application/json+chapters, et les métadonnées d’épisode fournies sous author, title, podcast_name et description. Les échecs de validation lèvent invalid_input et ne sont pas facturés : chapters manquant, title vide, temps négatifs ou non finis, fin avant le début, plus de cinq cents lignes, ou heures de début qui ne sont pas strictement croissantes. Exemple : trois lignes à zéro, cent vingt et mille huit cents secondes avec une image et un lien sur le chapitre du milieu produisent un tableau chapters de trois entrées et une chaîne json_text alignée structurellement sur les exemples publics Podcasting 2.0.
Où un exporteur déterministe de chapitres justifie son coût
Les outils de transcription ou de suggestion de chapitres qui produisent des paires titre et secondes peuvent diriger leur résultat ici pour obtenir le format orienté app sans intégrer la connaissance Podcasting 2.0 dans chaque client. Une validation en échec ne consomme pas de solde. Associez cet exporteur à des produits distincts de génération de chapitres par ASR lorsque vous devez inventer des horodatages à partir de l’audio ; utilisez ce chemin lorsque vous connaissez déjà les marqueurs et n’avez besoin que d’un export conforme au standard. Les producteurs indépendants qui terminent un épisode dans un DAW ont déjà des horodatages dans un tableur ou des notes d’émission ; ils ont besoin d’un fichier JSON correct sans apprendre l’espace de noms par essais et erreurs dans chaque app. Comme l’implémentation est pure parse de niveau A, chaque appel réussi coûte le prix de base publié $0.002 sans jetons de modèle et sans réseau sortant. Gardez les titres de chapitre assez courts pour les interfaces d’index mobile, préférez des URL HTTPS absolues pour img et url, et relancez le formateur après chaque modification afin que l’ordre strictement croissant reste appliqué.
Cas d'intégration
Chapitres prêts à publier depuis le tableau de notes
Collez des lignes titre et heure de début depuis le plan de l’épisode, ajoutez des liens d’illustration optionnels et téléchargez le json_text Podcasting 2.0 à héberger à côté du MP3.
Contrôles du pipeline CMS et d’hébergement
Appelez l’API depuis votre job de publication pour valider que la liste de chapitres de chaque épisode a des temps strictement croissants avant d’écrire la balise RSS podcast:chapters.
Passerelle des marqueurs simples vers le JSON d’app
Convertissez la sortie titre-plus-secondes d’éditeurs ou d’outils de transcription en chapitres startTime camelCase sans éditer manuellement les accolades du JSON.
Questions techniques
Quel format l’export de chapitres audio produit-il ?
Des chapitres JSON Podcasting 2.0 : une chaîne version (par défaut 1.2.0), un tableau chapters avec startTime et title (plus img, url, toc et endTime optionnels), et un fichier json_text mis en forme avec le type MIME application/json+chapters.
Combien coûte le formatage des chapitres audio ?
L’outil navigateur est gratuit. Les requêtes API utilisent le solde prépayé KIT à $0.002 par appel réussi ; une entrée invalide n’est pas facturée.