Skip to content
CutConvert

Your transcript JSON won’t import as subtitles anywhere

What you searched for
Transcript JSON won’t import as captions

Seen in: Premiere Pro, DaVinci Resolve, YouTube

What is actually wrong

Transcription APIs return JSON because it carries everything: segments, words, confidences, speaker labels. No NLE or video platform imports JSON as a caption track. Renaming the file to .srt only changes the icon; Premiere, Resolve and YouTube all open it, find braces, and stop.

Fix it here: JSON to SRT

Drop the file. It is detected and converted in your browser; nothing is uploaded. Free to start, no signup.

Convert a file now

Conversions …

Drop EDL, SRT, VTT, .prtranscript, or transcript files

Any caption, transcript or timeline file: CutConvert picks the converter and shows what survives · up to 100 KB per file

The fix, step by step

  1. Drop the JSON file

    The converter recognises Whisper verbose_json, whisper.cpp, WhisperX, AssemblyAI, Deepgram, Rev.ai, YouTube timedtext and CapCut draft JSON, and reads the segment or word timing it finds.

  2. Choose SRT or VTT

    SRT for Premiere, Resolve, Avid and Final Cut. VTT for web players and YouTube. Both keep millisecond timing.

  3. Import the caption file

    Use your application’s caption import, not media import. Speaker labels, when present, are written as a name prefix on each cue.

Why JSON is not a subtitle file

A subtitle file is a list of cues: a start, an end, some text. Transcript JSON is a data dump. Whisper’s verbose_json has a segments array with float seconds and, if you asked for it, a words array with per-word times. AssemblyAI puts words at the top level with millisecond integers and a speaker field. Deepgram nests everything under results.channels[0].alternatives[0]. Rev.ai uses monologues and elements. YouTube’s timedtext JSON uses events with tStartMs and segs.

Every one of those is a different dialect, and none of them is something a caption importer has ever been taught to read. That is the whole reason a converter exists: it knows the dialects and writes the one format everything reads.

How the cues get built

Segment-level timing (Whisper segments, Rev.ai monologues) maps directly to cues. Word-level timing is grouped into cues by pause and by length, so a 40-second monologue becomes a series of readable two-line cues rather than one enormous block. Speaker labels from a diarization step become a NAME: prefix on the cue text, which is what Premiere and Resolve display.

What is dropped is the per-word timing itself: SRT and VTT have no per-word field. If you need the words, the JSON to Word converter writes a transcript document with timestamps, and the JSON to VTT converter keeps VTT’s cue granularity.

Common trip-ups

  • You asked for plain `json`, not `verbose_json`. Whisper’s plain JSON has only text, with no timing. There is nothing to convert; re-run with timestamps.
  • The file is a whole API response wrapped in `{ "data": ... }`. The converter looks inside common wrappers, but a custom envelope may need unwrapping.
  • Seconds versus milliseconds. The converter detects which unit a dialect uses. A hand-written JSON with mixed units produces cues that look shifted.

Privacy

The JSON is parsed in your browser. Transcripts are often the most sensitive artefact in a project, and they never leave your machine here.

FAQ

Which JSON dialects are recognised?
Whisper verbose_json and whisper.cpp, WhisperX, AssemblyAI, Deepgram, Rev.ai, YouTube timedtext, CapCut draft_content.json, and generic arrays of {start, end, text} objects.
Do I lose word-level timestamps?
In SRT and VTT, yes: those formats have no per-word field. Words are grouped into cues. Use JSON to Word if you need the timestamps as a document.
Are speaker labels kept?
Yes, as a "Speaker:" prefix on the cue text, which every NLE displays.

↑ Back to top