Desplace el tiempo de letras de karaoke en milisegundos
Ajuste unas letras de karaoke completas para que aparezcan antes o después sin editar cada entrada a mano.
Ejecutar — gratis
Proporcione las líneas en orden de reproducción con marcas en milisegundos y elija un desplazamiento positivo o negativo. La herramienta suma ese valor a cada marca, lleva a cero cualquier resultado anterior al comienzo de la pista y conserva exactamente el texto recibido. Además, rechaza una salida cuyos tiempos retrocedan, para que usted detecte un orden defectuoso antes de exportar o publicar las letras sincronizadas.
Corrija un desfase constante
Un archivo de karaoke puede ser coherente internamente y, aun así, mostrar todas las letras demasiado pronto o demasiado tarde. Suele ocurrir cuando una nueva versión del audio incorpora una introducción, se elimina silencio inicial o el texto sincronizado procede de otra edición de la misma grabación. Si la diferencia es constante, no hace falta rehacer cada señal. Envíe las líneas con marcas de tiempo ordenadas e indique un valor con signo en offset_ms. Un desplazamiento positivo retrasa todas las líneas; uno negativo las adelanta. El resultado conserva los textos y el orden, pero recalcula cada timestamp_ms. Como la operación es global, los intervalos entre señales no cambian, salvo cuando valores negativos muy tempranos alcanzan el inicio de la pista. Trabaje en milisegundos para obtener un ajuste explícito y repetible: un segundo equivale a 1000 milisegundos. Antes de confirmar la corrección, localice una referencia musical clara, mida su diferencia respecto a la línea mostrada y utilice esa diferencia como desplazamiento.
Comprenda el recorte a cero y el control del orden
Una línea de tiempo de audio no admite un instante reproducible anterior a cero, por lo que cada marca desplazada tiene cero como límite inferior. Por ejemplo, si adelanta 1000 milisegundos dos señales situadas en 300 y 900 milisegundos, ambas quedan en cero en vez de resultar negativas. La separación relativa se pierde inevitablemente en ese límite, pero se mantienen la secuencia de entrada y el texto. Esto resulta útil cuando una edición elimina más introducción de la que contenían las primeras señales. Tras calcular cada valor, la herramienta comprueba la secuencia resultante. Se permiten tiempos iguales porque varias líneas pueden aparecer juntas de forma intencionada, incluidas varias entradas recortadas a cero. Una marca inferior a la anterior constituye una inversión y genera un error de entrada no válida en lugar de ordenar los registros silenciosamente. Ordenarlos podría ocultar una fuente defectuosa y separar el orden semántico de la intención de quien creó las letras. Corrija el origen y vuelva a ejecutar el ajuste.
Integre el resultado corregido con seguridad
Considere las líneas devueltas como una tabla de tiempos corregida para la siguiente etapa de su flujo de karaoke. Reprodúzcalas con la versión exacta del audio que distribuirá y revise especialmente la primera voz, los cambios de sección y las líneas recortadas a cero. Si la diferencia aumenta o disminuye durante la canción, una sola compensación no es adecuada: ese patrón indica deriva, una variación de tempo o ediciones internas y exige reajustar señales individuales. Conserve los datos originales para poder revertir la operación y registre el desplazamiento elegido junto a la edición. La función es determinista, no realiza solicitudes de red y no modifica palabras, puntuación ni orden. Por eso encaja en scripts de construcción, preparación por lotes y controles de publicación repetibles. Mediante la API, cada solicitud cuesta $0.002; el navegador utiliza el mismo cálculo puro. Para una validación predecible, envíe entre 1 y 10,000 líneas por solicitud.
Qué puede hacer con ella
Sincronizar tras recortar una introducción
Adelante todas las señales exactamente la duración eliminada al comienzo del audio.
Reservar espacio para una apertura nueva
Retrase las letras si añade una cuenta atrás, una identificación o una introducción instrumental.
Normalizar una exportación de karaoke
Aplique una corrección global documentada antes de exportar las líneas a un reproductor o subtítulo.
Preguntas frecuentes
¿Qué hace un desplazamiento positivo?
Retrasa cada línea al sumar los milisegundos indicados a todas las marcas.
¿Qué ocurre si un desplazamiento negativo lleva una línea antes de cero?
Esa línea recibe la marca cero; la salida nunca contiene tiempos negativos.
¿Pueden varias líneas tener la misma marca resultante?
Sí. Los tiempos iguales son válidos, también cuando varias líneas iniciales se recortan a cero.
¿Por qué un orden invertido causa un error en vez de ordenarse?
La ordenación automática podría ocultar tiempos defectuosos y alterar la secuencia prevista; por eso debe corregir la entrada.
¿Sirve para corregir una deriva durante toda la canción?
No. Una compensación global solo corrige una diferencia constante; una deriva progresiva exige reajuste individual o escalado temporal.
¿Cuánto cuesta una solicitud API?
Cada solicitud API cuesta $0.002. También puede ejecutar el cálculo localmente en el navegador.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
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)Ejemplo de solicitud
{
"lines": [
{
"timestamp_ms": 1200,
"text": "First line"
},
{
"timestamp_ms": 3500,
"text": "Second line"
}
],
"offset_ms": -1500
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.karaoke_lyrics_sync_shift",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_mb | 200 |
max_minutes | 180 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |