Formatar capítulos de áudio para apps
Três capítulos que começam em 0, 120 e 1800 segundos viram um único arquivo que os apps de podcast leem para mostrar um índice e pular pelo episódio. Os tempos precisam sempre avançar, senão nada é exportado. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Roda direto no seu navegador. Grátis, sem cadastro — seus dados não são enviados para lugar nenhum.
Quem produz o episódio já conhece os títulos das seções e o instante de início de cada uma; o que precisa é uma exportação correta e legível pelo app, com campos startTime em camelCase, arte e links opcionais, e a garantia de que os carimbos de tempo nunca regridem.
O que um arquivo de capítulos oferece a quem ouve
Os apps de podcast que aceitam capítulos não os leem do próprio arquivo de áudio. Eles baixam um pequeno arquivo separado, ligado ao episódio no seu feed, e o usam para mostrar um índice, pular para cada seção e trocar a imagem enquanto o episódio toca. Cada capítulo precisa de um tempo de início em segundos desde o começo do áudio; o título é muito recomendado para que apareçam nomes legíveis. Você também pode acrescentar uma imagem e um link a qualquer capítulo, marcar um capítulo como silencioso para que ele não apareça na lista e definir um tempo de fim, se quiser. Como os apps baixam o arquivo na hora de tocar, dá para corrigir um título ou incluir uma imagem depois de publicar, sem recodificar o episódio.
Como preparar os capítulos e evitar erros
Escreva as seções em ordem, cada uma com o título e o segundo em que começa, por exemplo uma abertura em 0, o tema principal em 120 e o encerramento em 1800. A ferramenta converte tudo para o formato padrão e devolve o texto pronto para hospedar em um endereço web estável. O erro mais comum é um tempo de início que se repete ou volta para trás. A ferramenta nunca reordena os capítulos por você, porque uma reordenação silenciosa poderia esconder um erro e colocar a imagem errada no trecho errado; em vez disso, ela para e indica qual linha está fora de ordem.
Como é um arquivo de capítulos de podcast
O namespace Podcasting 2.0 aponta cada episódio para um arquivo externo de capítulos com o tipo MIME application/json+chapters. Cada capítulo precisa ao menos de startTime como float em segundos a partir do início do áudio; title é fortemente recomendado para que a audiência veja um índice legível. Campos opcionais de capítulo incluem img para arte por seção, url para uma página ou notas do episódio, toc em false para marcadores silenciosos só de metadados, e endTime quando você deseja um fim explícito.
A ordem dos capítulos é validada, não adivinhada: a capacidade nunca reordena tempos fora de ordem, porque um reordenamento silencioso poderia ocultar erros de produção e colocar a arte errada no segmento errado. Em vez disso, exige tempos de início estritamente crescentes e falha de forma clara quando uma linha posterior é igual ou anterior à anterior. Os apps buscam o arquivo na reprodução, então você pode corrigir títulos ou adicionar imagens após a publicação sem reencodificar o episódio.
Perguntas frequentes
O que acontece se os tempos de início não forem estritamente crescentes?
Tempos iguais ou decrescentes são rejeitados para que apps de podcast nunca recebam marcadores fora de ordem.
Posso incluir imagens e links por capítulo?
Sim. Strings opcionais img e url em cada capítulo viram os campos img e url do Podcasting 2.0. Strings vazias são omitidas da exportação.
Como adiciono os capítulos ao feed do meu podcast?
Hospede o arquivo que a ferramenta devolve em um endereço web estável e ligue-o ao episódio no seu feed como arquivo de capítulos. Os apps compatíveis o baixam quando o episódio toca.
Posso mudar um título depois de publicar o episódio?
Sim. Os apps baixam o arquivo de capítulos na hora de tocar, então você pode corrigir títulos ou incluir imagens depois e hospedar o novo arquivo no mesmo endereço, sem recodificar o áudio.
Um capítulo pode ficar fora do índice?
Sim. Marque-o como silencioso e ele funcionará como uma marcação que os apps guardam sem mostrar a quem ouve. Por padrão todos os capítulos aparecem na lista, então mude só os que quiser esconder.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"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
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.audio_chapter_export_format",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_mb | 200 |
max_minutes | 180 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Aplicativos de podcast compatíveis com capítulos Podcasting 2.0 esperam um pequeno arquivo JSON ligado ao item RSS do episódio, e não marcadores embutidos no MP3. Esta capacidade recebe as linhas de capítulos ordenadas—título mais tempo de início em segundos, com imagem e URL opcionais por capítulo—e emite o objeto chapters versionado padrão mais uma string json_text formatada que você pode hospedar e referenciar com a tag podcast:chapters. Se os tempos de início não forem estritamente crescentes, a tarefa falha com invalid_input para que marcadores incorretos não cheguem ao feed.
Como é o JSON de capítulos Podcasting 2.0
Esse arquivo é um objeto JSON cujas chaves obrigatórias são version (comumente 1.2.0) e chapters, um array de marcadores ordenados por startTime ascendente. Campos opcionais no nível do arquivo como author, title, podcastName e description ajudam players web e arquivos sem mudar como os apps saltam pelo áudio. Este exportador mapeia a entrada em linhas—start_time e title em cada capítulo, img e url opcionais—para essa forma camelCase, para que você não edite chaves manualmente nem esqueça a string de versão. Hospede o json_text resultante em uma URL HTTPS estável e adicione podcast:chapters com type application/json+chapters no item.
Contrato de entrada, forma da resposta e regras de validação
Chaves de saída opcionais são omitidas por completo em vez de definidas como null. Envie por POST um corpo JSON com um array chapters obrigatório de pelo menos um objeto. Cada objeto deve incluir title como string não vazia e start_time como número finito não negativo em segundos (aliases como startTime são aceitos em cada linha). Campos opcionais por capítulo são img e url como strings não vazias, toc como booleano (false marca um capítulo silencioso; true é o padrão e é omitido na exportação), e end_time como número não negativo não inferior ao início daquele capítulo. Strings opcionais no nível do arquivo—version (padrão 1.2.0), episode_title, author, podcast_name e description—são copiadas para o objeto chapters quando presentes. Em caso de sucesso o corpo retorna version, chapter_count, chapters como o array Podcasting 2.0 com chaves startTime, json_text como o arquivo formatado pronto para upload, mime_type em application/json+chapters, e quaisquer metadados de episódio fornecidos sob author, title, podcast_name e description. Falhas de validação lançam invalid_input e não são cobradas: chapters ausente, title vazio, tempos negativos ou não finitos, fim antes do início, mais de quinhentas linhas, ou tempos de início que não são estritamente crescentes. Exemplo: três linhas em zero, cento e vinte e mil e oitocentos segundos com imagem e link no capítulo do meio produzem um array chapters de três entradas e uma string json_text que coincide em estrutura com os exemplos públicos de Podcasting 2.0.
Onde um exportador determinístico de capítulos vale a pena
Ferramentas de transcrição ou de sugestão de capítulos que emitem pares de título e segundos podem encaminhar o resultado aqui para obter o formato orientado ao app sem embutir o conhecimento de Podcasting 2.0 em cada cliente. Validação com falha não consome saldo. Combine este exportador com produtos separados de geração de capítulos por ASR quando precisar inventar marcas a partir do áudio; use este caminho quando já conhecer os marcadores e só precisar de uma exportação conforme o padrão. Produtores independentes que finalizam um episódio em um DAW já têm carimbos de tempo em uma planilha ou nas notas do programa; precisam de um arquivo JSON correto sem aprender o namespace por tentativa e erro em cada app. Como a implementação é pure parse de nível A, cada chamada bem-sucedida custa o preço base publicado US$ 0,002 sem tokens de modelo e sem rede de saída. Mantenha os títulos de capítulo curtos o bastante para UIs de índice em mobile, prefira URLs HTTPS absolutas para img e url, e execute o formatador de novo após cada edição para que a ordem estritamente crescente continue sendo aplicada.
Casos de integração
Capítulos prontos para publicar a partir da tabela de notas
Cole linhas de título e tempo de início do esboço do episódio, adicione links de arte opcionais e baixe o json_text Podcasting 2.0 para hospedar ao lado do MP3.
Checagens no pipeline de CMS e hospedagem
Chame a API no job de publicação para validar que a lista de capítulos de cada episódio tem tempos estritamente crescentes antes de gravar a tag RSS podcast:chapters.
Ponte de marcadores simples para o JSON do app
Converta a saída de título mais segundos de editores ou ferramentas de transcrição em capítulos startTime camelCase sem editar manualmente as chaves do JSON.
Perguntas técnicas
Qual formato a exportação de capítulos de áudio produz?
Capítulos JSON Podcasting 2.0: uma string version (padrão 1.2.0), um array chapters com startTime e title (mais img, url, toc e endTime opcionais), e um arquivo json_text formatado com tipo MIME application/json+chapters.
Como anexar o arquivo ao feed RSS?
Hospede json_text em uma URL HTTPS pública e adicione <podcast:chapters url="…" type="application/json+chapters" /> no item do episódio. Os apps buscam o arquivo na reprodução.
Quanto custa formatar capítulos de áudio?
A ferramenta do navegador é gratuita. Pedidos API usam saldo pré-pago do KIT a US$ 0,002 por chamada bem-sucedida; entrada inválida não é cobrada.