文字起こしをSRTタイムスタンプに合わせる
確定済みのプレーンテキスト文字起こしと既存の時刻情報から、そのまま利用できるSRT字幕を作成します。各タイムスタンプは番号付きキューになり、画面に表示する正確な文言は文字起こしから取得されます。任意の参照テキストにより各区間へ割り当てる単語数を指定できるため、表記や句読点を校正しても元の時間構造を維持できます。標準SRTタイムコード、安定した連番、ブロック間の空行、設定可能な1行当たり最大文字数を備えた結果が返されます。
無料で実行
文字起こしと時刻情報を準備します
字幕に表示したい最終版の文字起こしをご用意ください。単語間の空白は正規化されますが、つづり、大文字・小文字、句読点は入力どおり保持されます。次に、時刻順に並べたタイムスタンプ配列を指定します。各項目には秒単位の開始時刻と終了時刻が必要で、1つのSRTキューになります。元の文字起こしから得た参照テキストを任意で追加することもできます。参照文そのものは出力されず、その単語数と同じ数だけ校正済み文字起こしから語が割り当てられます。そのため、自動文字起こしで得た区間時刻を保ちながら、固有名詞や表現を修正できます。参照テキストがない項目は1語を使用します。全項目の語数は文字起こし全体と一致させてください。余った語や過剰な割り当ては明示的な入力エラーになります。1.25や8.9のような小数秒も使用できます。
字幕の行長を調整します
納品仕様、プレーヤー、放送局、アクセシビリティ基準に合わせてmax_chars_per_lineを設定してください。既定値は42文字で、8から120まで指定できます。改行は語と語の境界だけで行われます。次の語を加えると上限を超える場合、新しい行が開始されます。語の変更、句読点の削除、ハイフンの挿入は行いません。1語だけで上限を超える場合は、文字起こしを勝手に変えず、分かりやすいエラーを返します。その後、上限を増やすか、意図して該当語を編集できます。複数行に折り返されても、各タイムスタンプは1つのキューのままです。整形時に新しい時刻を作ったり、時刻区間を分割したりしません。一般的な2行字幕にする場合は、選択した上限で2行に収まる長さの区間をご準備ください。この機能は1行の文字数を制御し、非公開のキュー総文字数制限は設けません。
時刻を検証してSRTを利用します
字幕ブロックを作る前に、すべてのタイムスタンプを検証します。開始と終了は有限かつ0以上の秒数で、終了は開始より後でなければなりません。さらに時系列順である必要があり、次のキューを前のキューの終了前に開始することはできません。境界が完全に接するキューは有効です。重複や逆向きの区間が見つかると処理を停止し、問題がある項目番号を示します。これにより、見た目は整ったSRTにプレーヤーごとに異なる表示を招く時刻不良が残りません。有効な秒数は最も近いミリ秒へ丸め、HH:MM:SS,mmm形式にします。結果には保存・コピー用の完全なsrt文字列と、構造化処理向けのblocks配列が含まれます。番号は1から始まり、同じ入力からは常に同じ結果が得られます。対話的にはブラウザーで、自動処理では$0.002のAPIをご利用ください。
活用例
編集済み原稿を反映
自動文字起こしの区間時刻を維持しながら、文言を校正・承認済みの内容へ置き換えます。
単語時刻をSRTへ変換
単語ごとのタイムスタンプから、時刻コードや番号を手作業で整えずにSRTキューを生成します。
納品時の行長制限に対応
プレーヤーや編集システムへ取り込む前に、既知の最大文字数で字幕を折り返します。
よくある質問
APIリクエストの料金はいくらですか?
APIリクエスト1回につき$0.002です。ブラウザー版は内容を外部モデルへ送らず、対話的に利用できます。
参照テキストは字幕に表示されますか?
いいえ。参照テキストは割り当て語数だけを決めます。表示文は常に文字起こしから取得されます。
タイムスタンプを重複させられますか?
できません。各キューの終了は開始より後で、次のキューは前の終了以降に開始する必要があります。
語数が時刻情報と合わない場合はどうなりますか?
未割り当ての語が残る場合や、タイムスタンプが本文より多くの語を要求する場合はエラーになります。
長い単語は上限に合わせて分割されますか?
いいえ。max_chars_per_lineを超える語は入力エラーとなり、文字起こしを無断で変更しません。
小数秒はどのように書式設定されますか?
最も近いミリ秒へ丸め、SRT標準のコンマ区切りで出力します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
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)リクエスト例
{
"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": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.audio_to_text_srt_align",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_items | 10000 |
max_chars | 500000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |