Your transcript JSON won’t import as subtitles anywhere
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
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.
Choose SRT or VTT
SRT for Premiere, Resolve, Avid and Final Cut. VTT for web players and YouTube. Both keep millisecond timing.
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.