Ajuste o tempo da letra de karaokê em milissegundos
Ajuste uma letra de karaokê inteira para aparecer mais cedo ou mais tarde sem editar cada trecho manualmente.
Executar grátis
Informe as linhas na ordem de reprodução com tempos em milissegundos e escolha um deslocamento positivo ou negativo. A ferramenta soma esse valor a cada marca, limita a zero qualquer resultado anterior ao início da faixa e mantém exatamente o texto enviado. Ela também rejeita uma saída com tempos em ordem decrescente, ajudando você a encontrar sequências incorretas antes de exportar ou publicar a letra sincronizada.
Corrija uma diferença constante de sincronização
Um arquivo de karaokê pode estar coerente internamente e ainda exibir toda a letra cedo ou tarde demais. Isso costuma acontecer quando uma nova versão do áudio recebe uma introdução, quando o silêncio inicial é removido ou quando o texto sincronizado veio de outra edição da mesma gravação. Se a diferença for constante, você não precisa refazer cada indicação. Envie as linhas com marcação de tempo na ordem correta e defina um valor com sinal em offset_ms. Um valor positivo atrasa todas as linhas; um valor negativo as adianta. O resultado mantém os textos e a sequência, recalculando cada timestamp_ms. Como a operação é global, os intervalos permanecem iguais, exceto quando resultados negativos muito próximos do começo encontram o limite da faixa. Trabalhe em milissegundos para ter um ajuste explícito e repetível: um segundo corresponde a 1000 milissegundos. Antes de confirmar, encontre uma referência musical clara, meça a diferença para a linha exibida e use essa medida como deslocamento.
Entenda o limite em zero e a verificação da ordem
Uma linha do tempo de áudio não possui um instante reproduzível anterior a zero, portanto cada tempo deslocado tem zero como limite inferior. Por exemplo, ao adiantar em 1000 milissegundos trechos marcados em 300 e 900 milissegundos, ambos passam para zero em vez de ficarem negativos. A distância relativa inevitavelmente desaparece nesse limite, mas a sequência recebida e a letra permanecem intactas. Isso ajuda quando uma edição remove mais introdução do que havia antes dos primeiros trechos. Depois de calcular cada valor, a ferramenta verifica a sequência final. Tempos iguais são aceitos porque várias linhas podem aparecer juntas de propósito, inclusive quando são limitadas a zero. Um tempo menor que o resultado anterior é uma inversão e gera erro de entrada inválida, sem ordenar os registros silenciosamente. A ordenação poderia esconder uma fonte defeituosa e contrariar a intenção de quem preparou a letra. Corrija os dados de origem e execute novamente.
Use o resultado corrigido com segurança
Trate as linhas devolvidas como uma tabela corrigida para a próxima etapa do seu fluxo de karaokê. Faça uma prévia com a versão exata do áudio que será distribuída e observe principalmente a primeira entrada vocal, as mudanças de seção e qualquer linha limitada a zero. Se a diferença aumentar ou diminuir ao longo da música, um deslocamento global não resolve: esse padrão indica deriva, mudança de andamento ou cortes internos e exige a remarcação individual. Guarde os dados originais para poder reverter a operação e registre o deslocamento escolhido junto à edição. A função é determinística, não acessa a rede e não altera palavras, pontuação nem sequência. Assim, ela funciona bem em scripts de build, processamento em lote e verificações repetíveis antes da publicação. Pela API, cada solicitação custa US$ 0,002; no navegador, o mesmo cálculo puro é usado. Para uma validação previsível, envie de 1 a 10,000 linhas de letra por solicitação.
Casos de uso
Sincronizar após cortar a introdução
Adiante todas as marcações pela duração exata removida do início do áudio.
Abrir espaço para uma nova abertura
Atrase a letra quando uma contagem, vinheta ou introdução instrumental for adicionada.
Padronizar uma exportação de karaokê
Aplique uma correção global documentada antes de enviar as linhas a legendas ou players.
Perguntas frequentes
O que um deslocamento positivo faz?
Ele atrasa cada linha somando a quantidade indicada de milissegundos a todas as marcas.
O que ocorre se um valor negativo levar uma linha para antes de zero?
Essa linha recebe o tempo zero; a saída nunca apresenta marcas negativas.
Várias linhas podem ter o mesmo tempo final?
Sim. Tempos iguais são válidos, inclusive quando várias linhas iniciais são limitadas a zero.
Por que uma inversão gera erro em vez de ser ordenada?
A ordenação automática poderia esconder uma origem incorreta e mudar a sequência pretendida; por isso você deve corrigir a entrada.
Isso corrige uma deriva de sincronização ao longo da música?
Não. O ajuste global resolve apenas uma diferença constante; a deriva progressiva requer remarcação ou escala temporal.
Quanto custa uma solicitação de API?
Cada solicitação de API custa US$ 0,002. Você também pode executar o cálculo localmente no navegador.
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/karaoke-lyrics-sync-shift \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"lines":[{"timestamp_ms":1200,"text":"First line"},{"timestamp_ms":3500,"text":"Second line"}],"offset_ms":-1500}'const res = await fetch("https://api.kit.forhosting.com/audio/karaoke-lyrics-sync-shift", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"lines": [
{
"timestamp_ms": 1200,
"text": "First line"
},
{
"timestamp_ms": 3500,
"text": "Second line"
}
],
"offset_ms": -1500
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/karaoke-lyrics-sync-shift",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"lines": [
{
"timestamp_ms": 1200,
"text": "First line"
},
{
"timestamp_ms": 3500,
"text": "Second line"
}
],
"offset_ms": -1500
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/karaoke-lyrics-sync-shift", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"lines":[{"timestamp_ms":1200,"text":"First line"},{"timestamp_ms":3500,"text":"Second line"}],"offset_ms":-1500}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"lines":[{"timestamp_ms":1200,"text":"First line"},{"timestamp_ms":3500,"text":"Second line"}],"offset_ms":-1500}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/karaoke-lyrics-sync-shift", 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
{
"lines": [
{
"timestamp_ms": 1200,
"text": "First line"
},
{
"timestamp_ms": 3500,
"text": "Second line"
}
],
"offset_ms": -1500
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.karaoke_lyrics_sync_shift",
"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. |