Timestamped transcripts — formats, word-level timing, and how to add or remove timestamps
By VexaScribe Editorial · Published June 23, 2026
A timestamped transcript ties each line of text to a specific moment in the original audio. The markers themselves are free (every modern transcription tool includes them), but the granularity, format, and export options vary widely. This page is a reference for both directions of the problem — how to get timestamps in a transcript and how to remove them when you want clean prose. Word-level vs sentence-level is the most important distinction. SRT, VTT, JSON, and TXT bracket notation each have different syntax. And eight use cases by profession need different precision. Updated June 2026, with current tool-by-tool support.
Key takeaways
- →Word-level vs sentence-level is the distinction that matters. Word-level: one timestamp per word (~10-50ms precision). Sentence-level: one per sentence (~3-7 seconds). Phrase-level: ~3-5 word chunks. Most consumer tools default to sentence-level; Whisper-based tools (VexaScribe, OpenAI Whisper API, AssemblyAI, Deepgram) give word-level.
- →Format syntax differs by file type. SRT uses commas (00:00:01,500), VTT uses periods (00:00:01.500), JSON uses fractional seconds, TXT uses bracket notation. The SRT/VTT decimal separator difference catches developers off guard regularly.
- →Timestamps cost nothing extra in 2026. Every modern transcription tool includes them. The difference is granularity (word vs sentence) and which export formats they appear in (some tools include timestamps in SRT but not in TXT).
- →To remove timestamps, re-export without them. Most tools have a TXT or DOCX export option that omits timestamps. This is cleaner than find-replace in Word, which works but breaks on edge cases (commas in dialogue, bracket characters in text).
- →Word-level matters for subtitles. Cue boundaries on real word starts and ends sync precisely with speech. Interpolated sentence-level timing causes visible subtitle drift. See cue timing and reading speed for how this is applied in practice.
- →You generally can't add timestamps to text alone. Timestamps come from aligning text to audio during transcription. If you only have text, the practical answer is re-transcribe the audio with timestamps enabled.
What is a timestamp in transcription?
A timestamp is a marker that ties a piece of transcribed text to a specific moment in the original audio. It typically takes the form of a time offset from the start of the recording — 00:01:23,450 means “1 minute, 23 seconds, 450 milliseconds from the start.” In a transcript file, timestamps appear in different places depending on the format: at the beginning of each subtitle cue (SRT, VTT), as numeric properties on each word (JSON), or in brackets before a paragraph (TXT).
Disambiguation. “Timestamp” in transcription is different from a few related concepts. A timecode in video editing usually refers to SMPTE timecode (HH:MM:SS:FF, frames-based) used for video synchronization. An offset is the raw seconds-from-start number (e.g., 83.45) used internally by transcription engines. A cue is the subtitle/caption unit that contains a timestamp range (start and end), not a single moment. For transcription work, “timestamp” usually means “an HH:MM:SS,mmm formatted marker tying text to audio time.”
Modern transcription engines produce timestamps automatically as a byproduct of the speech recognition process — the model aligns each detected word against the audio waveform as part of generating the text. There's no separate “timestamping” step in 2026; if you have a transcript from a current tool, the timing data exists, even if the export you're looking at doesn't show it.
Word-level vs sentence-level vs phrase-level
The most important distinction on this page. Granularity is how often a timestamp appears in the transcript — once per word, once per sentence, once per phrase, or once per paragraph. The right level depends on what you're going to do with the transcript.
| Granularity | Example | Precision |
|---|---|---|
| Word-level | { "hello": [1.50, 1.89], "world": [1.91, 2.34] } | ~10-50ms per word |
| Sentence-level | [00:01.50] Hello, world. How are you? | One timestamp per sentence (~3-7 seconds) |
| Phrase-level | [00:01.50 - 00:04.20] Hello, world. How are you? | One timestamp per 3-5 word chunk |
| Paragraph-level | [00:01.50] Hello, world. How are you? I'm doing great... | One timestamp per paragraph (~15-60 seconds) |
When word-level is worth it. Three cases: (1) subtitle generation, where cue boundaries need to land on real word starts and ends to sync with speech; (2) interactive transcripts (word-by-word highlighting as audio plays, jump-to-word UX); (3) video editing where you're cutting on specific words. For these, sentence-level timing interpolated across a sentence is noticeably wrong.
When sentence-level is fine. Reading the transcript as prose. Qualitative research coding in NVivo/ATLAS.ti/MAXQDA. Show notes with chapter markers at structural breakpoints. Meeting summaries. Most note-taking workflows. Adding word-level data here adds noise without analytical benefit.
The honest catch. Most consumer transcription tools default to sentence-level in their UI even when the engine produces word-level timing data. Otter, Sonix, Trint, and Rev all use Whisper-class engines (or proprietary equivalents) that produce word-level timing internally, but the default exports show sentence-level. If you need word-level, check your tool's export options — the data usually exists; it's a checkbox away.
Word-level timestamps from a transcription API
Every major speech-to-text API can return a start and end time for each word. They differ in whether you get it by default, what the fields are called, and what else rides along with each word. Those differences decide how much parsing code you write.
What the JSON actually looks like
We run two engines, so we put the same file through both. Standard tier is Whisper Large-v3 Turbo — the thomasmol faster-whisper build on Replicate, paired with pyannote for diarization. Premium tier is Speechmatics Melia-1. The output below is unedited, from an 11-second clip of John F. Kennedy’s 1961 inaugural address — the jfk.flac fixture shipped with OpenAI’s Whisper repository, which is public domain.
Whisper Large-v3 Turbo — the first word, “And”
{
"start": 0.22,
"end": 0.52,
"word": " And",
"probability": 0.83447265625,
"speaker": "SPEAKER_00"
}Speechmatics Melia-1 — the same word, same audio
{
"alternatives": [
{ "content": "And", "confidence": 1.0, "language": "en", "speaker": "S1" }
],
"start_time": 0.24,
"end_time": 0.68,
"type": "word"
}| Behaviour | Whisper Large-v3 Turbo | Speechmatics Melia-1 | OpenAI Whisper API |
|---|---|---|---|
| Word timing by default | Yes | Yes, in the default JSON output | No — needs verbose_json plus timestamp_granularities |
| Time fields | start / end | start_time / end_time | start / end |
| Per-word confidence | probability | confidence | Not returned |
| Per-word speaker label | Yes, added by pyannote | Yes | Not returned |
| Punctuation | Attached to the word string | Separate token, type punctuation | Attached to the word string |
| Model restriction | None | None | whisper-1 only |
Field names verified against the cog-whisper-diarization source, Speechmatics batch output docs and the OpenAI speech-to-text guide, August 2026.
Where the two engines put the same word
Both engines produced 22 word tokens for this clip and identical text. What differs is where each one places the boundaries, because they treat the silence around a word differently.
| Word | Whisper start – end | Speechmatics start – end |
|---|---|---|
| And | 0.22 – 0.52 | 0.24 – 0.68 |
| so | 0.52 – 0.86 | 0.68 – 1.04 |
| my | 1.08 – 1.20 | 1.08 – 1.36 |
| fellow | 1.20 – 1.54 | 1.36 – 1.68 |
| Americans | 1.54 – 2.12 | 1.68 – 2.48 |
| ask | 3.32 – 3.78 | 3.28 – 3.96 |
Neither is wrong. A word boundary is a modelling choice, not a fact in the audio — the gap before a word and the breath after it have to be assigned somewhere. The practical consequence is that timings from two engines are not interchangeable. If you build subtitle cues against one and later switch, the cue boundaries move even though the text is identical.
Punctuation, shown on one word
The clearest illustration in this clip is the comma after “so”. Whisper returns it attached to the word string. Speechmatics returns it as a separate token with zero duration:
// Whisper: the comma is inside the word
{ "start": 0.52, "end": 0.86, "word": " so,", ... }
// Speechmatics: two tokens for the same audio
{ "start_time": 0.68, "end_time": 1.04, "type": "word",
"alternatives": [{ "content": "so", ... }] }
{ "start_time": 1.04, "end_time": 1.04, "type": "punctuation",
"attaches_to": "previous", "is_eos": false,
"alternatives": [{ "content": ",", ... }] }In this file that produced 22 word tokens plus 4 punctuation tokens from Speechmatics, against 22 word entries from Whisper. Iterate the Speechmatics results array without checking type and you get 26 “words”, four of which have identical start and end times. The upside is that is_eos marks sentence-ending punctuation for you — in this clip it was true on both full stops and false on both commas, which is enough to split a transcript into sentences without writing your own rules.
Three things that catch developers out
The leading space is part of the string. Every word Whisper returned in this file begins with a space, including the first: " And", not "And". Joining without trimming gives you double spaces; trimming every word gives you none. Concatenate the raw strings, then normalise once at the end. Speechmatics returns bare content with no padding, so the same join logic will not work across both.
Speaker labels use different conventions. Whisper with pyannote returned SPEAKER_00; Speechmatics returned S1 for the same single speaker. Neither format is a standard, so any code that merges or compares output from both needs a mapping layer. Labels are also per-file: SPEAKER_00 in one recording has no relationship to SPEAKER_00 in the next. Identifying the same person across recordings is speaker recognition, a different problem from diarization.
Content sits inside an array. Speechmatics nests the word under alternatives[0].content, not a flat content field. The array shape leaves room for N-best hypotheses; in the batch output here it contained exactly one entry on every token. Read it as an array anyway — assuming a flat field is the kind of thing that works in testing and breaks later.
Fields you should not assume are always populated. From our own production runs rather than this clip: Whisper can return speaker: null when pyannote cannot attribute a segment, with the word and timing still present. Speechmatics uses "UU" for the same situation. And we have seen probability come back a hair above 1.0 on rare tokens — floating-point rounding, not a meaningful value. If you bucket by speaker or assert a 0–1 range, handle all three.
What to test before committing to an API
Vendor accuracy figures are measured on clean, read speech. The cases that break word alignment are the ones nobody publishes numbers for, so test them on your own audio:
- Overlapping speech. Published diarization error rates on spontaneous overlapping conversation sit in the 10–20% range across commercial and academic systems alike. Word timing degrades along with it, because the boundary between two speakers is exactly where alignment is least certain.
- Long silences and music. Gaps give the model nothing to anchor against, and timing after a long pause can shift.
- Accented and non-English speech. Both vendors state that accuracy varies by language. Neither publishes per-language word-alignment figures, so your language is an open question until you test it.
- Punctuation settings. Speechmatics documents that restricting punctuation through permitted_marks reduces diarization accuracy. Timing and speaker assignment are coupled more tightly than the API surface suggests.
Download the full output
Both files below are the complete, unedited API responses for the clip used above — 22 words, one speaker, 11 seconds. Useful if you want to write a parser against real output before signing up for anything.
- word-level-timestamps-whisper.json — Whisper Large-v3 Turbo, 4 KB
- word-level-timestamps-speechmatics.json — Speechmatics Melia-1, 8 KB
Source audio is the jfk.flac test fixture from OpenAI’s Whisper repository — a 1961 US government recording, public domain.
What the vendors do not tell you. Neither OpenAI nor Speechmatics publishes word-alignment accuracy figures, and neither documents where alignment drifts. That absence is worth knowing on its own: if timing precision matters to your product, no published number will answer the question for your audio. Run one real file through both engines and compare the word boundaries against what you hear.
Timestamp format syntax — SRT, VTT, JSON, TXT
Reference table for each format. The decimal separator difference between SRT and VTT is the most common cause of conversion bugs.
| Format | Syntax | Decimal | Granularity | Use for |
|---|---|---|---|---|
| SRT | 00:00:01,500 --> 00:00:04,200 | Comma | Sentence or phrase | Universal subtitles (YouTube, video editors) |
| WebVTT | 00:00:01.500 --> 00:00:04.200 | Period | Sentence or phrase | HTML5 video, styled web captions |
| JSON | { "word": "hello", "start": 1.5, "end": 1.89 } | Period | Word-level (typical) | Developer pipelines, search indexing |
| TXT (bracket) | [00:01.50] Hello, welcome to the... | Period or comma | Sentence or paragraph | Human-readable transcripts, notes |
| SCC (broadcast) | 01:00:00;00 9420 9420 ... | Semicolon (drop-frame) | Caption-level | US broadcast TV (CEA-608) |
SRT format example
1
00:00:01,500 --> 00:00:04,200
Hello, welcome to the show. Today we're going
2
00:00:04,201 --> 00:00:07,850
to talk about something genuinely useful.SRT is the universal subtitle format — every video editor, YouTube and standalone player accepts it. Each cue is a sequential number, a timestamp range, and one or more lines of text. Milliseconds are separated by a comma.
VTT (WebVTT) format example
WEBVTT
00:00:01.500 --> 00:00:04.200
Hello, welcome to the show. Today we're going
00:00:04.201 --> 00:00:07.850
to talk about something genuinely useful.VTT is what HTML5 video expects. The differences that matter in practice: a WEBVTT header line, optional cue numbers, a period rather than a comma before the milliseconds, and support for cue styling that SRT has no equivalent for.
Translation preserves timestamps exactly. When a subtitle file is machine-translated — via a subtitle translator that preserves timestamps or equivalent tool — timestamps carry through byte-identical. Only the text content changes. This is what enables the same video track to work with any of 133 language versions without re-syncing: the 00:00:04,500 --> 00:00:08,200 timing anchors stay stable regardless of whether the dialogue line is 25% longer in Spanish or 40% shorter in Chinese.
JSON format example (word-level)
{
"text": "Hello, welcome to the show.",
"words": [
{ "word": "Hello,", "start": 1.500, "end": 1.890 },
{ "word": "welcome", "start": 1.920, "end": 2.380 },
{ "word": "to", "start": 2.410, "end": 2.530 },
{ "word": "the", "start": 2.560, "end": 2.680 },
{ "word": "show.", "start": 2.710, "end": 3.150 }
]
}JSON preserves the most data, normally word-level timing as fractional seconds. This is what you want for search indexing, interactive transcripts, clip extraction and word-by-word highlighting. Schemas differ between tools — see the engine comparison above for two real examples.
TXT bracket notation
[00:01.50] Hello, welcome to the show. Today we're going to
talk about something genuinely useful.
[00:07.85] Let's get started with the first topic.Bracketed plain text is the most readable format and the least standardised — conventions vary by tool. Used for note-taking, show notes and research transcripts, where a human reads the timestamps rather than a parser.
How to add timestamps to a transcript
In modern transcription tools, timestamps are generated automatically as part of the transcription — you don't add them separately. The question is usually whether they appear in your specific export. Here's the practical workflow:
- Upload your audio or video to a transcription tool (VexaScribe, Otter, Sonix, Rev, etc.) and wait for processing.
- When exporting, check the timestamp options. Most tools default to including timestamps in SRT and VTT exports automatically. For TXT and DOCX exports, the “include timestamps” checkbox is often unchecked by default — toggle it on.
- Choose the right granularity if your tool supports it. Word-level is best for subtitles and developer use; sentence-level for prose reading and research coding.
- For JSON output (developer use): export to JSON; word-level timing is standard.
What if you only have the text (no audio)? You generally can't add real timestamps to text alone — timing data comes from aligning the text against the audio waveform during transcription, and that step requires the audio file. Two workarounds:
- ● Re-transcribe the audio with timestamps enabled. This is the practical answer for most workflows. If the original audio is available, run it through your transcription tool again with timestamp output configured. You can then use the new transcript's timestamps with your edited text.
- ● Forced alignment — upload existing text plus the audio, get word-by-word timing matched. Uncommon in consumer tools but available in some research-focused platforms (Montreal Forced Aligner, FAVE, some academic Whisper wrappers). Setup is non-trivial; the re-transcribe path is usually faster.
How to remove timestamps from a transcript
The reverse-intent search. You have a transcript with bracket-style timestamps or SRT timing lines, and you want clean prose for publishing, blog posts, or quote extraction. Three methods, ranked from cleanest to most fragile:
Method 1: Re-export without timestamps (cleanest)
Open the original transcription in your tool's editor (VexaScribe, Otter, Sonix, Rev, Trint) and export again — this time as TXT or DOCX with the “include timestamps” option unchecked. Most tools produce clean prose paragraphs in this mode, with paragraph breaks at speaker turns. No regex required. This is the right path if you have access to the original transcription.
Method 2: Find & replace in Microsoft Word with regex
When you only have the file (not access to the original transcription tool). Open the document in Word, press Cmd/Ctrl + H for Find and Replace, click More, check Use wildcards. Common patterns:
- ● Bracket-style: search
\[[0-9]@:[0-9]@\]or\[[0-9:.,]@\], replace with nothing - ● SRT timing line:
[0-9]@:[0-9]@:[0-9]@,[0-9]@ --> [0-9]@:[0-9]@:[0-9]@,[0-9]@ - ● Cue numbers (SRT): search
^[0-9]@^p
Word's wildcards use @ for “one or more” (not +) and don't support full PCRE syntax. The patterns above work for most timestamp formats but break on edge cases — verify on a copy first.
Method 3: Command line with sed (TXT files at scale)
For developers or anyone comfortable with a terminal. On macOS or Linux:
# Remove bracket-style timestamps
sed -E 's/\[[0-9:.,]+\]//g' transcript.txt > clean.txt
# Remove SRT timing lines and cue numbers
sed -E '/^[0-9]+$/d; /^[0-9:.,]+ --> [0-9:.,]+$/d' subtitles.srt > prose.txtThe grep/sed approach is the most reliable for batch processing. Test on a copy first; sed's in-place editing (-i) is platform-dependent and can lose data if interrupted.
When you want timestamps removed
Publishing a transcript as a blog post or article. Extracting quotes for citation. Importing into a CMS or word processor where the timestamps are noise. Sharing a clean transcript with a non-technical collaborator. Note: if you might want timestamps back later, keep the original timestamped version. Removing timestamps is lossy.
Which granularity each job needs
Granularity is a workflow decision, not a quality ranking. Word-level timing costs nothing extra on either of our tiers, so the question is not whether you can have it — it is whether it changes anything for the job in front of you.
For most reading and searching, it does not. Where it matters is anywhere a machine consumes the timing rather than a person: subtitle cues that have to land on a real word boundary, playback that highlights the word being spoken, or alignment against a second track.
| Job | Granularity needed | Why |
|---|---|---|
| Video editors | Word-level | Cue boundaries land on real word starts, so subtitles do not drift visibly against the picture |
| Journalists | Sentence-level | You need to find and verify a quote in the audio, not align it to the frame |
| Qualitative researchers | Sentence-level | NVivo, ATLAS.ti and MAXQDA import sentence-level cleanly; word-level adds noise to coding |
| Podcasters | Either | Sentence-level for show notes and chapters; word-level only if you publish synced transcripts |
| Legal review | Sentence-level | Timestamps locate a passage for verification. An AI transcript is a working draft, not a certified record |
| Developers | Word-level | Search highlighting, karaoke-style playback and forced alignment all need per-word timing |
Two caveats worth stating plainly. Sentence-level timing is not a downgrade — for coding interviews in NVivo or ATLAS.ti it imports more cleanly than word-level, which adds noise the analysis does not use. And for legal work, timestamps of either kind locate a passage for a human to verify; an AI transcript is a working draft, not a certified record, and no granularity setting changes that.
Why word-level timestamps matter for subtitles
Subtitle generation is the use case where word-level vs sentence-level granularity has the most visible impact. Here's why.
The drift problem. When a transcription tool only has sentence-level timing (one timestamp per sentence), it must interpolate across the sentence to figure out where to break subtitle cues. The interpolation is linear: if a 6-second sentence is split into two cues at the comma, the first cue gets ~3 seconds and the second cue gets ~3 seconds, regardless of where the comma actually falls in the speech. If the speaker said the first half quickly and paused before the second half, the subtitle for the first half stays on screen too long (~3 seconds vs the actual ~1.5 seconds of speech) and the second half appears late. Viewers see subtitles drift visibly relative to speech.
The word-level fix. When each word has its own start and end time, cue boundaries can land on real word starts and ends. If the comma falls after “world,” at 2.4 seconds, the first cue ends at 2.4 seconds — not at the interpolated halfway point of 3 seconds. The subtitle appears and disappears in sync with what's being said.
Dramatic pauses. Word-level timing also handles dramatic pauses correctly. In a motivational speech with 2-3 seconds of silence between sentences, sentence-level interpolation produces a sub-second subtitle flash followed by a blank screen. Word-level lets a cue stay on screen across the silence (the cue ends at the real end of the last word and the next cue starts at the real start of the next word — closer to professional captioner behavior).
See cue timing and reading speed for how word-level timestamps map onto subtitle cues, and the reading-speed standards to aim for.
Which transcription tools give which granularity
Honest snapshot of where the major tools stand as of June 2026. Verify with each vendor before committing — defaults change.
| Tool | Default granularity | Export formats | Note |
|---|---|---|---|
| VexaScribe (Standard) | Word-level | TXT, DOCX, SRT, VTT, JSON | Whisper Large-v3 Turbo. Word timing returned by default, with a per-word speaker label |
| VexaScribe (Premium) | Word-level | TXT, DOCX, SRT, VTT, JSON | Speechmatics Melia-1. Word timing by default; punctuation arrives as separate tokens |
| OpenAI Whisper API | Word-level | JSON (with timestamp_granularities=word) | Same Whisper model, dev-API access |
| AssemblyAI Universal-2 | Word-level | JSON, SRT, VTT, TXT | Word-level + LLM features (LeMUR) for downstream tasks |
| Deepgram Nova-3 | Word-level | JSON, SRT, VTT | Word-level + lowest streaming latency in the category |
| Self-hosted Whisper (Large-v3) | Word-level (with WhisperX or faster-whisper) | JSON, SRT, VTT | Free + open source; word-level requires WhisperX or faster-whisper wrappers |
| Otter.ai | Sentence-level (default), word-level (paid) | TXT, DOCX, SRT, VTT, MP3, PDF | Sentence-level standard; word-level available in some plans |
| Sonix | Sentence-level (default) | TXT, DOCX, SRT, VTT, JSON | Sentence-level standard; structured editor for cue editing |
| Rev (AI tier) | Sentence-level | TXT, DOCX, SRT, VTT, JSON, PDF | Sentence-level on AI tier; human tier uses time-coded markers per speaker turn |
| Trint | Sentence-level | TXT, DOCX, SRT, VTT | Sentence-level standard; sentence-level editing UI |
| YouTube auto-captions | Phrase-level (3-5 words) | SRT, VTT (via download) | Coarser than sentence-level; designed for live caption display |
The honest summary: word-level timestamps are not unique to any single tool in 2026. Every Whisper-based tool (VexaScribe, Whisper API, AssemblyAI, Deepgram, self-hosted) exposes them. The differentiator is in how the word-level data is used downstream — specifically, whether the SRT/VTT exports use word-level timing for cue splitting or fall back to sentence-level interpolation. That's where downstream subtitle quality genuinely varies.
Editing timestamps when they're off
Sometimes a transcript's timestamps are close but not quite right — drift, a missed cue boundary, a translated subtitle that needs shifting. Three tiers of editing tools:
Plain text editors (any platform)
SRT, VTT, and JSON are all plain text. Open in Notepad, VS Code, or Sublime Text and edit timestamp values directly. Use for one-off corrections of specific cues. Caveat: changing one timestamp doesn't cascade to neighbors — you can end up with overlapping cues if you're not careful.
Dedicated subtitle editors (free)
Subtitle Edit (Windows, free) and Aegisub (cross-platform, free) are purpose-built for SRT/VTT work. They show timing visually against a waveform, let you shift entire blocks (“move all cues forward by 500ms”), scale timing (“cues are 1.04× too slow, stretch them”), and resync against the audio. For more than a handful of corrections, use one of these.
In-app editor in the transcription tool
Most transcription tools have a built-in editor where you can edit text and timestamps together. VexaScribe, Otter, Sonix, Rev, Trint all support this. The advantage: timestamps stay synced as you edit text (deletions and insertions don't break timing). The disadvantage: limited to the tool's editing UX; advanced operations (bulk shifts, regex transforms) require export to a dedicated subtitle editor.
Frequently asked questions
How do I remove timestamps from a transcript?
Three options depending on where your transcript is. (1) Re-export from the transcription tool without timestamps. Most platforms (VexaScribe, Otter, Sonix, Rev) have a TXT or DOCX export option that lets you toggle timestamps off. This is the cleanest path — no manual cleanup needed. (2) Find and replace in Microsoft Word using regex. Open Find > Advanced Find > More > Use wildcards, then search for patterns like \[[0-9]+:[0-9]+\] for bracket-style timestamps or [0-9]+:[0-9]+:[0-9]+,[0-9]+ --> [0-9]+:[0-9]+:[0-9]+,[0-9]+ for SRT timing lines. Replace with nothing. (3) For TXT files at scale: use sed on macOS/Linux (sed -E 's/\[[0-9]+:[0-9]+\]//g' transcript.txt) or PowerShell on Windows. The TXT re-export route is always cleanest if it's available — Word's regex syntax is finicky and breaks on edge cases.
What's the standard timestamp format for transcription?
There isn't one universal standard — the format depends on the file type. SRT (SubRip) uses HH:MM:SS,mmm with a comma as the decimal separator: 00:00:01,500 --> 00:00:04,200. WebVTT (W3C standard for HTML5 video) uses HH:MM:SS.mmm with a period: 00:00:01.500 --> 00:00:04.200. JSON typically uses fractional seconds as a number: { "word": "hello", "start": 1.500, "end": 1.890 }. Plain text often uses bracket notation: [00:01:30] or [00:01.50]. The SRT comma versus VTT period distinction is a real source of bugs — converting between them requires sed/find-replace, not a one-click tool in many editors.
Are word-level timestamps worth it over sentence-level?
It depends on what you're doing. For reading a transcript as prose, sentence-level is fine — you don't need to know exactly when each word was spoken. For subtitle generation, word-level is meaningfully better because cue boundaries land on real word starts and ends instead of being interpolated across a sentence (subtitles drift visibly when sentence-level timing is interpolated). For video editing, word-level matters when you're cutting on specific words. For quote-checking in journalism, word-level lets you jump to the exact word; sentence-level gets you within a few seconds. For research coding in NVivo/ATLAS.ti/MAXQDA, sentence-level is usually sufficient. The rule of thumb: if downstream use involves syncing to specific moments (subtitles, video edits, exact-word quotes), word-level. Otherwise sentence-level is fine.
Can I add timestamps to a transcript I already have?
Generally no — at least not accurately. Timestamps come from aligning the transcript text against the original audio during transcription; the timing data is generated at that step. If you only have the text (no audio), there's no way to recover real timestamps. If you have the original audio plus the text, you can re-run the audio through a transcription tool and use the new transcript's timestamps. Some tools also offer forced alignment — uploading an existing transcript plus the audio and getting timing matched word-by-word — but this is uncommon in consumer transcription tools. For most workflows, the practical answer is: re-transcribe the audio with timestamps enabled, then use that as your new master file.
Do timestamps cost extra in transcription services?
No — timestamps are universally included with transcription at no extra cost in 2026. They're a property of the transcription engine output, not a separate billable feature. Where pricing varies is granularity: sentence-level timestamps are standard everywhere (Otter, Rev, Sonix, Trint), but word-level timestamps were historically a premium feature on some platforms. As of 2026, word-level is also standard on Whisper-based tools (VexaScribe, OpenAI Whisper API, Deepgram, AssemblyAI, self-hosted Whisper). The remaining differentiation is in export formats: some tools include timestamps in SRT/VTT but not in plain TXT exports, requiring you to re-export to get the timestamps you want.
Which transcription tools give word-level versus sentence-level timestamps?
Word-level: VexaScribe (Whisper Large-v3), OpenAI Whisper API, AssemblyAI Universal-2, Deepgram Nova-3, self-hosted Whisper, WhisperX, faster-whisper. Sentence-level by default (with word-level available in some plans): Otter, Trint, Sonix, Rev AI. Phrase-level (groups of 3-5 words): YouTube auto-captions, some legacy services. The word-level vs sentence-level distinction has narrowed in 2026 because Whisper-based tools all expose word-level timing — but the consumer UI on many tools still defaults to sentence-level in exports. If you need word-level, check the export options in your transcription tool's UI; the data usually exists, it's just a setting away.
Can I edit timestamps manually if they're slightly off?
Yes, in any text editor or specialized subtitle tool. SRT and VTT are plain text formats — you can open them in Notepad, VS Code, or Notepad++ and edit the HH:MM:SS,mmm values directly. For larger adjustments, dedicated subtitle editors (Subtitle Edit on Windows, Aegisub cross-platform, both free) let you shift entire blocks, scale timing, or resync against the audio. JSON output is similarly editable in any text editor. The main caveat: changing one timestamp doesn't automatically cascade to neighbors. If you shift cue 5 by 200ms, cue 6 still starts at its original time — you might end up with overlap. Most subtitle editors detect this and warn you.
Methodology & disclosure
Sources: SRT format conventions verified against the original SubRip specification (1996) and the Matroska container wiki. WebVTT format verified against the W3C WebVTT 1.0 specification. Word-level timestamp capabilities verified against vendor API documentation: OpenAI Whisper API docs, AssemblyAI docs, Deepgram docs, Whisper paper (arXiv:2212.04356). Tool-by-tool granularity defaults verified against each vendor's help documentation as of June 2026.
Engine output: the JSON examples and the word-boundary table come from a single 11-second file — the jfk.flac fixture from OpenAI’s Whisper repository, public domain — submitted once to each engine on 26 August 2026. Standard tier ran Whisper Large-v3 Turbo via the thomasmol/whisper-diarization build on Replicate; Premium tier ran Speechmatics Melia-1 in json-v2 batch format. Both responses are published above unedited and downloadable. This is a structural comparison of output shape and boundary placement on one recording, not an accuracy measurement, and one clip of clean single-speaker speech should not be read as representative of either engine across languages, speakers or recording conditions. Where we describe behaviour we have seen in production rather than in this file, we say so in the text.
Disclosure: This page is published by VexaScribe. Word-level timestamps are not unique to us — every Whisper-based tool exposes them. The differentiator we describe (using word-level data for SRT cue splitting) is documented on our SRT generator page; the same approach is feasible for any tool built on Whisper or equivalent engines.
Editorial standards: See our editorial standards.
Related guides
SRT generator
How VexaScribe builds readable cues using word-level timing
Captions vs subtitles
Format and terminology disambiguation
Transcript formatting
Verbatim vs intelligent verbatim vs edited — styles, conventions, workflows
Speaker labeling
Diarization — the other precision dimension
pyannote.audio
Word-level timing used in Whisper + pyannote alignment
Transcribe audio to text
General audio transcription guide
Whisper transcription
Where word-level timestamps come from
Research transcription
Timestamps for NVivo, ATLAS.ti, MAXQDA workflows
Subtitle translator (timestamps preserved)
Translate SRT/VTT/SCC to 133 languages — every timestamp byte-identical after translation