IGTranscript

How do I get an Instagram transcript that says who said what?

Not from this tool, and the reason is structural rather than a setting you have not found. A transcript here is a list of cues with three fields — a start, an end, and the words — and no fourth field for a voice, so a two-person Reel comes back as one column of text with no speaker column and no turn marks. The recognition call is made with four options — language, task, return_timestamps, chunk_length_s — and none of them asks who is speaking; the string “diariz” appears 0 times in the 147,189 bytes of the recognition library this page loads, and “speaker” 0 times in the 22,349 bytes of app.js. What you do get is a 12-character timecode on every line, which is enough to label turns by ear — and for the case most Reels fall into, one person talking to camera, a label would spend 40 bits on every line to carry 1 bit of information.

InVideo WW

The rest of this page is the arithmetic behind those two sentences: what a cue actually stores, why one cue can hold two voices, what a label costs at 300 lines (1,500 bytes of tags on top of 4,500 characters of timestamps), what the three pages that outrank this one say about speaker separation across 20,385 characters of their Instagram copy — two of them say nothing — and the three routes that do work when you genuinely need to know who spoke.

What a cue actually stores

The segment list is built in toSegments(), and every object it pushes has exactly three keys: start, end and text. That is not a display choice. It is the shape the model’s output is mapped into, and every consumer downstream — the panel, the clipboard, the .txt, the .srt, the .vtt — reads those three fields and nothing else. Across the 22,349 bytes of app.js there is no fourth field and no branch that would fill one, because there is no source for it.

One cue object with three filled fields and a fourth that is empty, feeding five readers that all read the same three fields. The speaker field is drawn as a dashed box with a red cross, because no reader and no writer exists for it. One record, three fields, five readers A speaker would have to be a fourth field, and nothing on this path writes one. what a cue holds one cue pushed by toSegments() start end text speaker the panel the clipboard the .txt download the .srt download the .vtt download Every reader above opens the same three keys. The dashed row has no writer and no reader.
One cue and the five places it goes. The three solid rows are the only keys toSegments() pushes — a start, an end and the words — and all five readers read those three and nothing else, which is why a label has to be added outside this path. The dashed row is the fourth key that would have to exist for a transcript to name its speakers: the 22,349 bytes of app.js contain no read of such a property, and the 147,189 bytes of the recognition library contain “diariz” 0 times. The red cross is the whole answer to the question this page asks: the field is missing, not switched off.

Why one cue can hold two voices

Because the boundaries come from the audio windows, not from the voices. The call sets chunk_length_s: 30, and the library fills in stride_length_s as chunk_length_s / 6 — 5 seconds here — then jumps window - 2 * stride, which is 20 seconds. So a 600-second conversation is handed over in 30 windows, and the cue boundaries you see are spans the model placed inside those windows. Nothing in that loop compares the acoustics of one window with the next to ask whether the voice changed.

Two voices inside one audio window, and the single cue they come out as. The upper bar is one 30-second window divided into three turns of speech, with two changes of voice marked in red. The lower bar is what the transcript holds: one cue, one timestamp prefix at the left, and no division where either voice change happened. Two voices in, one cue out The model is handed 30 seconds at a time. A change of voice is not one of the things it is asked about. one window of audio voice A voice B voice A two changes of voice, both inside the same window one cue, as stored [ start ] Both voice changes land where there is nothing to attach a label to: one cue, three fields, no boundary.
One 30-second window, three turns of speech, and the single cue they become. The cue holds a start, an end and the words — the 12-character stamp is the only structure on the line, and it is 15 characters of prefix once the brackets and the space are counted. At 16 kHz mono a decoded sample is 32 bits, so 43 seconds is 688,000 samples and 2,752,000 bytes, which is 2 windows; 600 seconds is 38,400,000 bytes and 30 windows. The two red dashes are the changes of voice, and the two red crosses are where they would have to be written down: there is no field there to write them into, which is why the label has to be added by hand or by a different tool.

What a speaker label costs, and when it is worth paying

A tag is cheap on one line and expensive in bulk, and the arithmetic is exact because a tag is ASCII. [S1] is 5 characters, which is 40 bits; the choice between two speakers is 1 bit; so 39 of every 40 bits on that line are overhead. [Speaker 1] is 12 characters, 96 bits, for the same 1 bit of information. At 300 lines the short form adds 1,500 bytes and the long form 3,600 bytes to a .txt that would otherwise be unchanged.

What the three pages that outrank this one actually say

Across the four Instagram pages the three sites publish — 20,385 characters of body text, with the heading lists and the scraper’s own metadata stripped, because those are not sentences a reader sees — the word “speaker” appears 4 times and “diarization” 0 times. All four hits are on one site, and all four are navigation rather than explanation.

Three routes that do work

None of them is a checkbox, and the first is the one that fits a Reel. Label by ear against the timecodes: every line already starts with a 12-character stamp, so you read the time, listen to that second, and type a tag in front of the line. It is 1,500 bytes of extra text on a 300-line transcript and about as much work as reading it once.

Can this tool tell me who is speaking?

No. Each cue it stores has three fields — start, end and text — and there is no fourth field for a voice, so the panel, the clipboard, the .txt, the .srt and the .vtt all come out unlabelled. The string “diariz” appears 0 times in the 147,189 bytes of the recognition library this page loads, and “speaker” 0 times in app.js, so there is no hidden path that produces a label you have not seen.

Does the speech model know who is speaking?

It is called as a transcription model, not as a diarization model. The pipeline is invoked with four options — language, task, return_timestamps, chunk_length_s — and the output it is asked for is text with times attached, which is what chunks[i].timestamp and chunks[i].text are read for. Whether a different checkpoint could label voices is a separate question from whether this page asks it to, and this page does not.

How do I tell two people apart in a transcript, then?

Use the timecodes and your ears, or cut the audio first. Every line begins with a 12-character stamp in square brackets — 15 characters of prefix before the first word — so you can play the Reel, stop at a turn, and type [S1] or a name in front of the line. On a 300-line transcript that is 1,500 bytes of added text, and the copy button and the .txt both hand you exactly what is on screen, so the labels travel with the file.

Will a two-person Reel come back as one paragraph?

No, it comes back as one line per cue, which is a different problem. Internal whitespace is collapsed to single spaces before a cue is stored, so a cue is always one line and a turn change inside a cue is invisible; a 43-second clip is 688,000 samples, 2,752,000 bytes and 2 windows, so a fast exchange can end up as two lines holding five turns. What you never get is a blank line or a marker where the speaker changed.

Does adding speaker names break the .srt or the .vtt?

No. A label goes into the text line of the cue, and the timing line is untouched: it stays a fixed 29 characters, which is why the scaffolding of 100 cues is the same 3,492 bytes whether or not the lines start with a name. What the label does change is the file size — 5 bytes per cue for [S1] , so 1,500 bytes across 300 cues — and the .vtt escapes nothing extra, because a colon and a digit are not characters WebVTT treats specially.

Is there a free way to separate the speakers?

Only the manual one, and it is genuinely cheap for a Reel. The transcript arrives with a start time on every line, so labelling is reading and typing rather than listening again from the beginning; at 300 lines it adds 1,500 bytes and about the length of one pass through the text. A 600-second recording is the point where that stops being pleasant, and where a tool built for diarization starts being the better answer.

Last checked: 24 October 2026. The source counts were read from the deployed files on this machine: app.js is 22,349 bytes with “speaker” 0 times and “diariz” 0 times, and the recognition library’s pipeline module held here is 147,189 bytes in which “diariz” appears 0 times and all 21 uses of “speaker” are speaker_embeddings in the text-to-speech path. The window arithmetic is read from the library source, where stride_length_s defaults to chunk_length_s / 6 and the jump is window - 2 * stride: 30, 5 and 20 seconds. The byte figures are arithmetic on RATE = 16000 in app.js and a 32-bit decoded sample — 16,000 × 1 × 4 = 64,000 bytes a second, so 43 seconds is 2,752,000 bytes, 300 seconds is 19,200,000 and 600 seconds is 38,400,000 — printed and re-checked on this machine before they were written down. The tag costs (5 and 12 characters, 40 and 96 bits, 1,500 and 3,600 bytes at 300 lines) and the prefix growth of 33.3% are the same kind of arithmetic. The 43-second clip figures — 688,000 samples, 54 words, 18 to 42 seconds across a dozen runs — are this tool’s own records from an ordinary browser tab on a two-core, 4.2 GB machine. The competitor counts are over 20,385 characters of body text in four files held in this site’s benchmark directory, measured after the heading lists were stripped; the badge text from speakapp.com is reproduced exactly as it appears there. The claim that a turn change and a cue boundary are unrelated events is an inference from the window arithmetic and from the absence of any voice comparison in the source, not a measurement of a boundary-crossing sentence.

If what you need is where a line sits rather than who said it, the timestamps page covers the 12 characters and why none of them is clickable. What to do with a transcript sets out the four outputs and what each costs in bytes, and Instagram’s own captions are the other kind of on-screen text, which carries no speaker either. When the recording is long enough that labelling by hand stops being reasonable, the Live replay page works out how many 30-second windows an hour of audio becomes, and the carousel page covers the case where each slide is a different person talking into the same phone.