Alinhar transcrição com tempos SRT e criar legendas
Transforme uma transcrição limpa em texto simples e um mapa de tempos existente em legendas SRT prontas para uso.
Executar grátis
Cada marca de tempo vira uma entrada numerada, enquanto a transcrição fornece as palavras exatas que o público verá. O texto de referência opcional informa quantas palavras pertencem a cada segmento, portanto correções de ortografia e pontuação mantêm a estrutura temporal original. O resultado usa códigos de tempo SRT padrão, numeração estável, linhas em branco entre blocos e um limite configurável de caracteres por linha.
Prepare a transcrição e o mapa de tempos
Comece com a versão final da transcrição exatamente como ela deve aparecer nas legendas. Os espaços entre palavras são normalizados, mas ortografia, maiúsculas e pontuação permanecem intactas. Em seguida, envie uma lista ordenada de marcas de tempo. Cada item precisa de início e fim em segundos e se torna uma entrada SRT. O item também pode conter um texto de referência da transcrição original. A ferramenta não copia esse conteúdo para a saída: ela conta as palavras e consome a mesma quantidade da transcrição corrigida. Assim, você preserva os tempos de uma transcrição automática depois de revisar nomes ou frases. Sem texto de referência, cada marca consome uma palavra, o que atende dados no nível de palavra. A soma das contagens deve cobrir toda a transcrição. Palavras restantes ou contagens que excedam o texto geram um erro claro. Os tempos aceitam segundos decimais, como 1.25 ou 8.9.
Controle o comprimento das linhas
Defina max_chars_per_line conforme o limite exigido pelo seu fluxo de entrega, player, emissora ou padrão de acessibilidade. O padrão é 42 caracteres, com valores aceitos de 8 a 120. A quebra ocorre somente entre palavras. O algoritmo preenche uma linha até que a palavra seguinte ultrapasse o máximo e então inicia outra. Ele não altera palavras, remove pontuação nem insere hífens. Se uma única palavra for maior que o limite, a solicitação é recusada para preservar o texto. Você poderá aumentar o máximo ou editar a palavra de forma consciente. Cada marca continua sendo uma única entrada mesmo quando o conteúdo ocupa várias linhas; nenhum tempo é inventado ou dividido durante a formatação. Para legendas convencionais com duas linhas, prepare segmentos que caibam em duas linhas no limite escolhido. A capacidade controla caracteres por linha e não impõe uma regra oculta para o tamanho total da entrada.
Valide os tempos e use o SRT
Antes de criar os blocos, a ferramenta verifica todas as marcas de tempo. Início e fim precisam ser valores finitos e não negativos, e o fim deve vir depois do início. A ordem também precisa ser cronológica: a próxima entrada não pode começar antes do término da anterior. Entradas adjacentes podem se encostar exatamente. Se houver sobreposição ou intervalo invertido, o processamento para e aponta o item em que a ordem falhou. Essa validação impede que um arquivo aparentemente correto esconda problemas interpretados de maneiras diferentes pelos players. Segundos válidos são arredondados para o milissegundo mais próximo e formatados como HH:MM:SS,mmm. A resposta inclui uma string srt completa para copiar ou salvar e uma lista blocks para aplicações que precisam de dados estruturados. A numeração começa em um e a saída é determinística. Use no navegador ou chame a API por US$ 0,002 em uma esteira automatizada de mídia.
Casos de uso
Aplicar revisões editoriais
Mantenha os tempos da transcrição automática enquanto troca o texto por uma versão corrigida e aprovada.
Converter tempos por palavra em SRT
Transforme uma marca por palavra em entradas SRT válidas sem formatar códigos de tempo ou numeração manualmente.
Cumprir limites de linha
Quebre o texto no limite conhecido de caracteres antes de importá-lo em um player ou editor.
Perguntas frequentes
Quanto custa uma solicitação API?
Cada solicitação API custa US$ 0,002. A versão no navegador pode ser usada de forma interativa sem enviar o trabalho a um modelo remoto.
O texto de referência aparece nas legendas?
Não. Ele apenas define quantas palavras cada marca recebe; o conteúdo visível sempre vem da transcrição.
As marcas de tempo podem se sobrepor?
Não. Cada entrada deve terminar depois de começar, e a próxima precisa iniciar no término da anterior ou depois.
O que acontece quando as contagens não correspondem?
A solicitação falha se restarem palavras ou se as marcas exigirem mais palavras do que a transcrição contém.
Uma palavra longa é dividida para caber no limite?
Não. Uma palavra maior que max_chars_per_line causa um erro e preserva a transcrição sem alterações silenciosas.
Como as frações de segundo são formatadas?
Os segundos são arredondados para o milissegundo mais próximo e usam a vírgula padrão do SRT.
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-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)Exemplo de requisição
{
"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."
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.audio_to_text_srt_align",
"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_items | 10000 |
max_chars | 500000 |
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. |