カラオケ歌詞のタイミングをミリ秒単位でずらす
各行を手作業で直さずに、カラオケ歌詞全体の表示を早めたり遅らせたりできます。再生順に並べた歌詞行とミリ秒単位のタイムスタンプを入力し、正または負のオフセットを指定してください。各時刻に同じ値を加え、トラック開始前になる結果はゼロへ補正し、歌詞本文は入力どおり保持します。さらに、処理後の時刻が逆行する場合はエラーにするため、同期歌詞を書き出したり公開したりする前に不正な並びを発見できます。
無料で実行
一定のタイミングずれを補正します
カラオケファイル内の間隔が正しくても、すべての歌詞が一様に早すぎたり遅すぎたりすることがあります。新しい音源にイントロが追加された場合、冒頭の無音が削除された場合、または同じ録音の別版から同期テキストを流用した場合によく起こります。ずれが一定なら、キューを一つずつ作り直す必要はありません。再生順のタイムスタンプ付き歌詞行を渡し、offset_msに符号付きの値を指定してください。正の値では全行が遅くなり、負の値では早くなります。返される歌詞と並びはそのままで、各timestamp_msだけが再計算されます。一括処理のため、非常に早い負の結果がトラック先頭に達する場合を除き、キュー間隔は変わりません。明確で再現可能な調整にはミリ秒を使います。1秒は1000ミリ秒です。確定前に、最初の歌声など分かりやすい音楽上の基準点を選び、表示行との差を測って、その差をオフセットにしてください。
ゼロ補正と順序検査の動作を確認します
音声の時間軸にはゼロより前の再生時刻がないため、移動後の各タイムスタンプは最低でもゼロになります。たとえば300ミリ秒と900ミリ秒のキューを1000ミリ秒早めると、負の値ではなく両方ともゼロになります。この境界では相対的な間隔が失われますが、入力された順番と歌詞本文は維持されます。先頭キューより長いイントロ部分を編集で削った場合に便利です。値を計算するたびに、最終的な並びも検査します。複数の歌詞を意図的に同時表示できるため、同一時刻は有効です。ゼロへ補正された複数行も同様です。ある時刻が直前の結果より小さければ逆転と判断し、自動で並べ替えずに入力エラーを返します。自動整列は不正な元データを隠し、制作者が意図した意味上の順序を変えるおそれがあるためです。元の順番または時刻を修正してから、もう一度実行してください。
補正結果を安全にワークフローへ組み込みます
返された行は、カラオケ制作工程の次の段階へ渡す補正済み時刻表として扱ってください。実際に配布する音源と組み合わせてプレビューし、特に最初の歌い出し、セクションの切り替わり、ゼロに補正された行を確認します。曲が進むにつれてずれが増減する場合、一括オフセットでは修正できません。その現象はドリフト、テンポの違い、録音途中の編集を示すため、個別のキュー調整が必要です。操作を元に戻せるように原本を保存し、採用したオフセットを対象版と一緒に記録してください。この機能は決定的に動作し、ネットワーク通信を行わず、歌詞の語句、句読点、並びを変更しません。そのため、ビルドスクリプト、一括準備、再現可能な公開前検査に適しています。APIでは各リクエストが$0.002で、ブラウザーでも同じ純粋な計算を実行します。安定した検証のため、1回につき1行から10,000行までを送信してください。
活用例
イントロ削除後に同期し直す
音源冒頭から削除した正確な長さだけ、すべてのキューを早めます。
新しいオープニングの余白を作る
カウントダウン、識別音、器楽イントロを追加したときに歌詞全体を遅らせます。
カラオケ書き出しを標準化する
字幕やプレーヤーへ渡す前に、記録可能な一括補正を適用します。
よくある質問
正のオフセットにはどのような効果がありますか?
指定したミリ秒数を全タイムスタンプに加え、各歌詞行の表示を遅らせます。
負のオフセットでゼロより前になる行はどうなりますか?
その行の時刻はゼロになります。負のタイムスタンプは出力されません。
複数行が同じ処理後時刻になってもよいですか?
はい。同一時刻は有効で、複数の先頭行がゼロに補正された場合も含まれます。
順序が逆転すると、自動整列ではなくエラーになるのはなぜですか?
自動整列は不正な元時刻を隠し、意図した歌詞順を変えるおそれがあるため、入力の修正を求めます。
曲全体で増えていくタイミングのずれも直せますか?
いいえ。一括オフセットは一定のずれだけを補正します。進行するドリフトには個別調整または時間伸縮が必要です。
APIリクエストの料金はいくらですか?
APIリクエストは1回$0.002です。同じ計算をブラウザー内で実行することもできます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
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)リクエスト例
{
"lines": [
{
"timestamp_ms": 1200,
"text": "First line"
},
{
"timestamp_ms": 3500,
"text": "Second line"
}
],
"offset_ms": -1500
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.karaoke_lyrics_sync_shift",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_mb | 200 |
max_minutes | 180 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |