Speech to Text

How to Transcribe Audio With Timestamps (SRT, VTT)

Learn how to transcribe audio with timestamps: segment vs word-level, SRT and VTT export, tools that support them, and fixes for drifting timecodes.

7 min read
By OndaLabs Team

To transcribe audio with timestamps, use a tool or API that returns timing data, choose segment-level or word-level granularity, and export SRT, VTT or JSON. OpenAI's whisper-1 supports both segment and word timestamps, and the open-source Whisper tool can write SRT and VTT files. Check the output against the audio before you publish captions.

Segment-level vs word-level timestamps

A segment is a phrase or sentence with one start time and one end time. A word-level timestamp gives every word its own start and end. Segments are enough for standard subtitles, while word timing helps when you need precise edits or highlighted captions.

| Granularity | What you get | Typical use | Watch for | |---|---|---|---| | Segment | One start and end per phrase | Standard subtitles | Lines can run long | | Word | Start and end for every word | Precise edits, highlighted captions | Often marked experimental |

Word timing is labeled experimental in Whisper's command-line help and in whisper.cpp's documentation. WhisperX takes a different route: it uses wav2vec2 forced alignment to time each word. Its README notes that tokens such as "2014." or "£13.60" can get no timing, and each language needs its own alignment model.

SRT vs VTT vs JSON

The three formats hold similar information, but they differ in structure and in how they write time.

| Format | Timecode style | Structure | Notes | |---|---|---|---| | SRT | 00:02:16,612, with a comma before milliseconds | Numbered blocks, a timing line, then text | No official encoding standard; SubRip defaults to Windows-1252 | | WebVTT | 00:02:16.612, with a period before milliseconds | Starts with a WEBVTT header; cues can have identifiers | UTF-8; a W3C draft dated 20 May 2026 | | JSON | Numeric start and end fields | Nested segments and words | Best for your own code; field names vary by API |

An SRT block looks like this:

1
00:00:02,612 --> 00:00:05,400
Welcome to the show.

A WebVTT file starts with a header line:

WEBVTT

00:00:02.612 --> 00:00:05.400
Welcome to the show.

Format details come from the SubRip article on Wikipedia and the W3C WebVTT specification. Whisper's own writers follow the same comma and period convention.

How to transcribe audio with timestamps, step by step

Open-source Whisper is the most direct route if you want timing on your own computer. The steps below assume you have installed it from the Whisper repository.

  1. Pick a model. The command-line default is turbo.
  2. Run the command with an output format and word timing turned on:
whisper interview.mp3 --model turbo --output_format srt --word_timestamps True
  1. Open the .srt file and check the first and last words of several segments, not only the start of the file.

The main flags to know:

  • --output_format accepts txt, vtt, srt, tsv, json, jsonl or all. The default is all.
  • --word_timestamps is off by default and marked experimental.
  • --max_words_per_line and related line-length options need --word_timestamps True.
  • --hallucination_silence_threshold also needs word timestamps.

Transcription APIs that return timestamps

Hosted APIs return timing in their own units, so read the documentation before you parse the output.

| Service | Timing detail | Price | |---|---|---| | OpenAI whisper-1 | Segment or word timing through timestamp_granularities | $0.006 per minute | | AssemblyAI | Each word has start and end in milliseconds, plus a speaker | $0.15 to $0.21 per hour | | Deepgram | Each word has start and end in seconds | $0.0043 per minute, monolingual | | ElevenLabs Scribe v2 | Word-level timestamps, up to 32 speakers | $0.22 per hour | | Mistral Voxtral Mini Transcribe V2 | Word start and end times, plus speaker labels | $0.003 per minute |

OpenAI's docs say timestamp_granularities works only with whisper-1, so do not expect the same option on gpt-transcribe. Cohere's open model returns no timestamps, so skip it for captions. Prices are published list prices as of 17 October 2026.

Add speaker labels to timestamped transcripts

Speaker labels turn a timed transcript into a readable interview or meeting record. Each service handles them differently:

  • AssemblyAI uses a speaker_labels flag, and each utterance gets an ID such as "A".
  • Deepgram adds a speaker index to every word.
  • OpenAI's gpt-4o-transcribe-diarize returns segments with speaker, start and end fields through the diarized_json format. Audio longer than 30 seconds needs a chunking_strategy setting.

Why timestamps drift, and how to fix them

Whisper processes audio in 30-second windows and predicts start and end times as tokens alongside the text. Long files therefore need chunking. The Whisper paper describes three failure modes: repeat loops, missing the first or last words of a segment, and complete hallucination. The large-v3 card also warns that some predictions include text that was not spoken.

Common fixes:

  • Use voice activity detection. faster-whisper's vad_filter uses Silero VAD, and by default removes only silence longer than 2 seconds.
  • Use forced alignment for word timing. WhisperX aligns words with wav2vec2, and it flags words it cannot time.
  • Set the hallucination threshold. The option works only when word timestamps are on.
  • Add a prompt. For whisper-1, a prompt can carry names and terms, up to 224 tokens.

None of the sources we read publishes a timing accuracy figure, so measure drift on your own file rather than trusting a number.

Which tools return timestamps?

Timing support varies by product and plan. Check these before you buy:

  • Otter Pro and higher export srt files. Basic exports only mp3 and txt.
  • Fireflies lists time-stamped notes as a feature.
  • Rev offers a timestamp option on its human transcripts.
  • Sonix lists speaker labels and timestamps as product features.

Where OndaLabs fits

OndaLabs includes a transcription tool at speech to text in the app. It is part of the Free plan and costs 50 credits per minute. A 10-minute file uses 500 credits, and a 60-minute file uses 3,000 credits, derived from that rate. This article does not say which timing or subtitle formats the tool produces, so check its output for the format you need.

One workflow is to generate a voiceover with OndaLabs text to speech and then transcribe the finished audio to make a caption file. For more options, see the best transcription software roundup.

Frequently asked questions

How do I transcribe audio with timestamps?

Choose a tool or API that returns timing data, pick segment-level or word-level granularity, and export SRT, VTT or JSON. For open-source Whisper, run it with an SRT output format and word timestamps turned on. Check the result against the audio before you publish.

What is the difference between segment-level and word-level timestamps?

Segment-level timestamps give a start and end time for each phrase or sentence, which is enough for most subtitles. Word-level timestamps give timing for every word, which helps with precise edits and highlighted captions. Word timing is sometimes marked experimental, as it is in Whisper's command-line help.

What is the difference between SRT and VTT?

SRT uses a comma before milliseconds and numbered blocks. WebVTT uses a period before milliseconds, starts with a WEBVTT header and is standardized by the W3C. Both are plain text, but WebVTT specifies UTF-8 encoding, while SRT has no official encoding standard.

Can Whisper give word-level timestamps?

Yes. The open-source tool has a word timestamps option, which is marked experimental, and OpenAI's whisper-1 model accepts word granularity. For more precise word timing, WhisperX uses forced alignment, though it cannot time some tokens that are missing from its alignment dictionary.

How do I add speaker labels and timestamps together?

Use a service that returns both. AssemblyAI with speaker labels gives each word a speaker and a timing. OpenAI's gpt-4o-transcribe-diarize model returns segments with a speaker, start and end, and it needs a chunking setting for audio longer than 30 seconds.

Why are my timestamps off or drifting?

Whisper works in 30-second windows and can loop, drop words at the edges of a segment or hallucinate text. Trim silence with voice activity detection, use forced alignment for word timing, and check several points across the file. Measuring the error on a short test clip is more reliable than trusting a tool's general claim.