Come ottenere il timestamp di ogni parola da una registrazione
Chiama POST /transcribe impostando output_format su json e word_timestamps su true (sono già i valori predefiniti). Nella risposta, ogni passaggio contiene un array words con oggetti {start, end, word} e i tempi in secondi. Qui vediamo com’è strutturato il risultato, quali modelli forniscono i tempi per parola e cosa puoi costruirci.
La richiesta
{
"audio_url": "https://example.com/interview.mp3",
"model": "oracle",
"language": "auto",
"word_timestamps": true,
"output_format": "json"
}
Avvia la trascrizione con POST /transcribe e interroga GET /transcribe/{jobId} finché lo stato non passa a COMPLETED. Specifica sempre il parametro model, altrimenti l’API userà di default il vecchio modello core.
La risposta
{
"jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57",
"status": "COMPLETED",
"result": {
"language": "en",
"segments": [
{
"start": 1.0,
"end": 3.75,
"text": "Hello everyone and welcome to the show.",
"speaker": "Speaker 1",
"words": [
{ "start": 1.0, "end": 1.35, "word": "Hello" },
{ "start": 1.4, "end": 1.75, "word": "everyone" }
]
}
]
}
}
segments[]: contienestartedendin secondi,text,speaker(se la diarizzazione è attiva) e l’arraywords[].words[]: contienestart,endeword, con i tempi in secondi arrotondati al terzo decimale.- Una parola molto breve può durare pochi centesimi di secondo, o persino avere lo stesso valore per
startedend. Evita quindi nel codice di dividere per la durata di una parola. - Se imposti
word_timestampssufalse, oppure usi un modello che calcola i tempi solo per intero segmento, il campowordsnon sarà presente e avrai solostartedenda livello di segmento.
Quali modelli restituiscono i tempi per parola
| Modello | Tempi per parola |
|---|---|
base, oracle, oracle_pro, oracle_max | Sì |
oracle_mini | Tempi per segmento nella trascrizione standard; tempi per parola quando è attivo il riconoscimento degli interlocutori (diarizzazione o separazione dei canali) |
core, edge (legacy) | Sì |
Il testo (txt) non ha tempi. L’SRT costruito dall’API segue lo stesso interruttore; vedi la guida all’SRT.
Trovare il punto esatto in cui viene detta una frase
Se unisci tutte le parole in un unico elenco, puoi cercare un testo e ricavarne l’intervallo di tempo. È così che un agente può rispondere a «dove cita i prezzi?» indicando il momento esatto, o ritagliare quella frase per farne una clip.
find.py
# find.py — where is a phrase said? Returns (start, end) in seconds.
import re
def find_phrase(result, phrase):
words = [w for segment in result["segments"] for w in segment.get("words", [])]
clean = lambda text: re.sub(r"[^\w]", "", text.lower())
target = [clean(p) for p in phrase.split()]
tokens = [clean(w["word"]) for w in words]
for i in range(len(tokens) - len(target) + 1):
if tokens[i:i + len(target)] == target:
return words[i]["start"], words[i + len(target) - 1]["end"]
return None
# start, end = find_phrase(result, "welcome to the show")
# ffmpeg -ss <start> -to <end> -i talk.mp4 -c:v libx264 -c:a aac clip.mp4
Estrarre un clip a partire da un intervallo di tempo:
ffmpeg -ss 41.2 -to 47.8 -i talk.mp4 -c:v libx264 -c:a aac clip.mp4
Accorciare le pause e creare jump cut
Conoscendo inizio e fine di ogni parola puoi calcolare la durata delle pause. Mantieni il parlato continuo e taglia i silenzi che superano una certa soglia:
silences.py
# silences.py — keep the speech, drop pauses longer than max_gap seconds
def speech_ranges(words, max_gap=0.7, pad=0.1):
ranges = []
for word in words:
if ranges and word["start"] - ranges[-1][1] <= max_gap:
ranges[-1][1] = word["end"]
else:
ranges.append([word["start"], word["end"]])
return [[max(0.0, s - pad), e + pad] for s, e in ranges]
# Pass the ranges to cut() from cut.py to build the tightened video.
Poi unisci gli intervalli usando la funzione cut() mostrata nella guida al montaggio video.
Altri modi per usare i timestamp
- Testo sincronizzato in un player web: evidenzia via via la parola il cui intervallo contiene il valore
currentTimedel player. - Trascrizioni interattive: trasforma ogni parola in un link che punta a
?t=<start>per far saltare il player a quel punto. - Capitoli e momenti chiave: fai scegliere a un LLM i numeri dei segmenti più rilevanti e usa il tuo codice per convertirli in timestamp.
- Ricerca in un archivio: salva nel database le parole insieme al loro tempo di inizio, così chi cerca un termine può aprire il file direttamente al secondo esatto.
- Allineamento e lavoro sui corpora: puoi convertire i tempi delle parole dal JSON nei formati di annotazione che i tuoi strumenti sanno leggere.
Quanto costa
I timestamp per parola non comportano costi aggiuntivi. Paghi solo i secondi di audio elaborati in base al modello scelto, a partire da 0,48 US$ all’ora con base (un’ora con oracle costa 1,44 US$). Trovi il listino completo in /llms/pricing.md.
Domande e risposte
Come ottengo i timestamp per singola parola dall’API di trascrizione?
Passa nella richiesta output_format: "json" e word_timestamps: true. Ogni segmento della risposta includerà l’array words[] con i campi start, end e word espressi in secondi.
Quali modelli supportano i timestamp per parola?
I modelli base, oracle, oracle_pro e oracle_max li restituiscono. oracle_mini fornisce i tempi dei passaggi, a meno che non sia attiva una modalità per gli interlocutori. L'output di testo non include invece i tempi.
Quanto sono precisi i tempi delle parole?
KolWrite non pubblica metriche di precisione divise per lingua per questa API. I tempi sono pensati per evidenziare il testo a schermo e per tagliare l’audio tra una parola e l’altra; ti consigliamo comunque di fare una prova sulle tue registrazioni e di lasciare un piccolo margine attorno ai punti di taglio.
Posso ottenere i timestamp da un file video?
Sì. L’API legge la traccia audio del video che invii. Per file oltre 100 MiB estrai prima l’audio con ffmpeg.
I timestamp sono espressi in secondi o millisecondi?
In secondi, formattati come numeri con un massimo di tre cifre decimali (ad esempio 41.236).