Transkript an SRT-Zeitstempeln ausrichten
Erstellen Sie aus einem bereinigten Klartext-Transkript und einer vorhandenen Zeitzuordnung sofort einsetzbare SRT-Untertitel.
Im Browser ausführen – kostenlos
Jeder Zeitstempel wird zu einem nummerierten Eintrag, während das Transkript den genauen sichtbaren Wortlaut liefert. Ein optionaler Referenztext legt fest, wie viele Wörter zu jedem Segment gehören. Korrekturen an Rechtschreibung und Zeichensetzung verändern dadurch die ursprüngliche Zeitstruktur nicht. Die Ausgabe verwendet normgerechte SRT-Zeitcodes, eine stabile Nummerierung, Leerzeilen zwischen Blöcken und eine einstellbare Höchstzahl von Zeichen pro Zeile.
Transkript und Zeitzuordnung vorbereiten
Verwenden Sie die endgültige Fassung des Transkripts genau so, wie sie in den Untertiteln erscheinen soll. Abstände zwischen Wörtern werden vereinheitlicht; Schreibweise, Großschreibung und Satzzeichen bleiben erhalten. Übergeben Sie anschließend eine chronologisch sortierte Liste von Zeitstempeln. Jeder Eintrag benötigt einen Start- und Endwert in Sekunden und erzeugt einen SRT-Block. Zusätzlich kann Referenztext aus der ursprünglichen Transkription enthalten sein. Das Werkzeug übernimmt diesen Text nicht, sondern zählt dessen Wörter und entnimmt dieselbe Anzahl aus dem korrigierten Transkript. So bleiben automatisch erzeugte Segmentzeiten trotz redaktioneller Korrekturen nutzbar. Ohne Referenztext verbraucht jeder Zeitstempel genau ein Wort. Alle Wortzahlen zusammen müssen das vollständige Transkript abdecken. Übrig gebliebene Wörter oder zu hohe Zählwerte führen zu einer eindeutigen Fehlermeldung. Dezimale Sekundenwerte wie 1.25 oder 8.9 sind zulässig.
Zeilenlänge der Untertitel steuern
Setzen Sie max_chars_per_line auf den Grenzwert Ihres Auslieferungsprozesses, Players, Senders oder Barrierefreiheitsstandards. Voreingestellt sind 42 Zeichen; erlaubt sind Werte von 8 bis 120. Ein Umbruch erfolgt ausschließlich zwischen Wörtern. Der Algorithmus füllt eine Zeile, bis das nächste Wort den Grenzwert überschreiten würde, und beginnt dann eine neue. Wörter und Satzzeichen werden weder verändert noch getrennt. Ist bereits ein einzelnes Wort länger als erlaubt, wird die Eingabe mit einer klaren Meldung abgelehnt. Sie können anschließend den Grenzwert erhöhen oder das Wort bewusst bearbeiten. Ein Zeitstempel bleibt auch bei mehreren Textzeilen genau ein Untertitelblock; Zeiten werden beim Formatieren weder erfunden noch aufgeteilt. Für übliche zweizeilige Untertitel sollten Sie Segmente wählen, deren Wörter beim gewünschten Grenzwert auf zwei Zeilen passen. Die Funktion erzwingt Zeichen pro Zeile, aber keine verborgene Gesamtlänge.
Zeitangaben prüfen und SRT verwenden
Vor der Ausgabe prüft das Werkzeug sämtliche Zeitstempel. Start und Ende müssen endliche, nicht negative Sekundenwerte sein; das Ende muss nach dem Start liegen. Außerdem ist eine chronologische Reihenfolge erforderlich: Der nächste Block darf nicht vor dem Ende des vorherigen beginnen. Direkt aneinandergrenzende Blöcke sind zulässig. Bei einer Überschneidung oder umgekehrten Spanne stoppt die Verarbeitung und nennt den fehlerhaften Listeneintrag. Dadurch verbergen scheinbar saubere SRT-Dateien keine Zeitfehler, die Player unterschiedlich darstellen könnten. Gültige Sekunden werden auf die nächste Millisekunde gerundet und als HH:MM:SS,mmm formatiert. Das Ergebnis enthält eine vollständige srt-Zeichenfolge zum Kopieren oder Speichern sowie ein blocks-Array für strukturierte Weiterverarbeitung. Die Nummerierung beginnt bei eins, und gleiche Eingaben ergeben stets dieselbe Ausgabe. Nutzen Sie die Browserversion interaktiv oder die API für $0.002 in automatisierten Medienabläufen.
Anwendungsfälle
Redaktionelle Korrekturen übernehmen
Behalten Sie automatisch erzeugte Segmentzeiten bei und ersetzen Sie den Wortlaut durch ein geprüftes Transkript.
Wortzeiten in SRT umwandeln
Erzeugen Sie aus einem Zeitstempel je Wort gültige SRT-Blöcke ohne manuelle Zeitcode- oder Nummernformatierung.
Zeilengrenzen einhalten
Brechen Sie Untertitel vor dem Import in einen Player oder ein Schnittsystem an einem bekannten Zeichenlimit um.
Häufige Fragen
Was kostet eine API-Anfrage?
Jede API-Anfrage kostet $0.002. Die Browserversion lässt sich interaktiv verwenden, ohne den Inhalt an ein entferntes Modell zu senden.
Erscheint der Referenztext im Untertitel?
Nein. Er bestimmt nur die Wortanzahl pro Zeitstempel; der sichtbare Wortlaut stammt stets aus dem Transkript.
Dürfen sich Zeitstempel überschneiden?
Nein. Jeder Block muss nach seinem Start enden; der nächste darf frühestens am Ende des vorherigen beginnen.
Was geschieht bei abweichenden Wortzahlen?
Die Anfrage schlägt fehl, wenn Wörter unzugeordnet bleiben oder die Zeitstempel mehr Wörter verlangen als vorhanden.
Wird ein langes Wort geteilt?
Nein. Überschreitet ein Wort max_chars_per_line, entsteht ein Eingabefehler, damit das Transkript unverändert bleibt.
Wie werden Sekundenbruchteile formatiert?
Sekunden werden auf die nächste Millisekunde gerundet und mit dem für SRT üblichen Komma ausgegeben.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
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)Beispiel-Anfrage
{
"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."
}
]
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.audio_to_text_srt_align",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_items | 10000 |
max_chars | 500000 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |