Blog

    Transcripts that know who said what

    A transcript of a two-person interview used to arrive as one undifferentiated block of text. Every word was there, and it was still hard to read, because a conversation without attribution isn't really a conversation. Uploads are now separated by voice automatically.

    · 6 min read

    Here's the whole feature in twenty-four seconds: the block of text, the automatic split, the naming, and the subtitle export.

    Speaker identification on an uploaded interview, start to finish.

    Key takeaways

    • Uploads are diarized automatically. No voice samples, no enrollment, no speaker count to declare up front.
    • Lines are built from word-level speaker tags, not utterances, because utterances split on a pause of about 0.8 seconds and misattribute fast exchanges.
    • Name each speaker once and the name follows into the reader, the shared link, and SRT or WebVTT exports.
    • Separation is best-effort, so every line, timestamp, and speaker is editable by hand.

    Why does a two-person interview transcribe as one block?

    Because speech-to-text answers one question: what was said. It has no obligation to answer the second one, who said it. For a single narrator that's the whole job. For anything with more than one voice in it, an interview, a panel, a podcast, an earnings call with a Q&A section, it leaves half the meaning on the floor.

    Consider a line like "September is live, but it isn't decided." Said by the guest, that's a forecast. Said by the interviewer, it's a challenge. Same words, opposite meaning. When the transcript is a flat list of timestamped lines, you recover the difference by inference: reading around the line, or scrubbing the audio back and listening for the voice.

    That's fine once. It doesn't scale to a ninety-minute recording you're trying to search.

    What diarization actually does

    Diarization clusters a recording by voice and tags each word with a speaker index. It's a separate job from transcription, and holding the two apart in your head makes the rest of this much clearer:

    • Transcription answers what was said. It turns audio into words.
    • Diarization answers who spoke when. It clusters the audio by voice and tags each word with a speaker.

    Run both and every line arrives attributed. The property that makes this practical is that diarization is unsupervised: it works from the sound of the voices alone. Nothing to set up beforehand. No voice samples to enroll. No need to tell it how many people are in the room. That's why it can be on by default for every upload instead of being a setting you have to find.

    The trade-off is that the clusters come back anonymous. The engine can tell two voices apart; it has no idea whose they are. So speakers arrive as Speaker 1 and Speaker 2, and putting real names on them is your job, once per recording.

    Why utterances lie about who spoke

    Speech engines hand back two views of the same audio, and picking the wrong one silently corrupts your speaker labels. Utterances are pre-grouped chunks, split on silence at a pause of roughly 0.8 seconds. Words are individually timed and individually tagged. Building the transcript from utterances is the obvious move, and it's the wrong one.

    Here's the failure. A fast exchange has no 0.8-second pause in it. Two people talking over the top of each other land inside a single utterance, that utterance carries a single speaker label, and one person's words get quietly credited to the other. Nothing errors. The transcript just says the wrong thing, confidently, in exactly the passages where the conversation got interesting.

    So we build lines from the word level instead. A new line starts wherever the speaker tag changes, which puts turn boundaries at the actual change of voice rather than at the pauses. Long uninterrupted turns are then split at sentence ends once they pass 320 characters, so a five-minute monologue stays a set of scannable, clickable rows instead of one wall of text.

    Naming, and then correcting

    Automatic separation gets you most of the way, and treating it as finished is where transcription tools tend to go wrong. It's a probabilistic pass over audio, so it will be imperfect on hard recordings. The design assumption here runs the other way: the automatic pass is a first draft, and everything in it is editable.

    Name each speaker once

    Type a real name over Speaker 1. It's saved with the transcript and applied everywhere: every line in the reader, the subtitle exports, and the view anyone you share the link with sees. Each speaker also carries their own accent colour, so a long transcript stays readable at a glance while you scroll past it.

    Fix what the pass got wrong

    The failure modes are predictable, and each one has a direct fix:

    • A line attributed to the wrong person. Reassign it to a different speaker.
    • A line where the speaker changes mid-sentence. Split it in two at the cursor, then give each half its own speaker.
    • A speaker the pass never found. Add one by hand and assign lines to them.
    • One person split across two labels. Give both labels the same name. Merging is just naming.
    • A misheard word or a drifted timestamp. Edit the text or the time directly, or insert and delete lines.

    A recording that separated cleanly needs two edits: two names. A messy one needs a few more. Neither case makes you start over.

    Do the names follow into subtitles?

    They do, and whether they're written into each caption is a toggle rather than a fixed decision about the format. Downloads come as SRT or WebVTT. The reason it's a choice is that the right answer genuinely differs by destination: a video editor cutting an interview wants to see who's talking, while a subtitle track burned onto the finished video usually doesn't want a name prefix on every line.

    1
    00:00:04,000 --> 00:00:08,600
    Ana Reyes: Thanks for coming on. Let's start with the September meeting.
    
    2
    00:00:09,000 --> 00:00:14,400
    Mark Feld: Happy to be here. September is live, but it is not decided.

    Cues only store a start time, so end times have to be derived. A caption runs until the next one begins, sized to its own text length at about 15 characters per second of reading time, and held between 1.2 and 8 seconds. That upper cap is what stops a long silence from leaving a subtitle parked on screen for minutes.

    The honest limitations

    Three things are worth knowing before you rely on this for something that matters.

    Separation is best-effort. Distinct voices on a clean recording separate well. Overlapping speech, similar-sounding voices, and several people sharing one microphone are the hard cases, and on those you should expect to correct some lines by hand. In our experience a panel recorded on one room mic is the worst case by a distance.

    Speaker numbering is per file. Indexes are only stable within a single recording. The same guest across two uploads isn't recognised as the same person, so you name them in each. If you interview the same people weekly, that's a real cost, and it's worth knowing up front rather than discovering on episode nine.

    Uploads only, for now. Speaker identification runs on uploaded audio and video files. Live stream transcripts and YouTube backfills are transcribed without speaker separation.

    Try it on a recording you already have

    Take an interview or a panel that's sitting on your disk and upload it. The transcript comes back separated by voice, you put two names on it, and you have something you can read, search, archive, and hand to an editor. Instead of a block of text you have to listen back to in order to understand.

    The full list of what shipped is in the changelog, and the API reference covers reading cues and speaker names programmatically.

    Frequently asked questions

    What is speaker diarization?

    Diarization is the step that answers 'who spoke when'. It clusters a recording by voice and tags each word with a speaker index, separately from transcription, which answers 'what was said'. Running both gives you a transcript where every line is attributed to a person rather than one continuous block of text.

    Do I need to provide voice samples or say how many speakers there are?

    No. Separation is unsupervised: it works from the sound of the voices alone, with no enrollment step and no speaker count to specify up front. You upload the file and the transcript comes back with speakers already split out as Speaker 1, Speaker 2 and so on.

    How accurate is speaker separation?

    It's a best-effort automatic pass, not a guarantee. Clean recordings with distinct voices and little crosstalk separate well. Overlapping speech, similar-sounding voices, or several people sharing one microphone can attribute lines to the wrong person or split one person across two labels. Every part of the transcript is editable for exactly that reason.

    Are speaker numbers the same across two uploads?

    No. Speaker indexes are only stable within a single file. The same person appearing in two different uploads is not linked automatically, so Speaker 1 in one recording has nothing to do with Speaker 1 in another.

    Do live stream transcripts have speaker labels?

    Not currently. Speaker identification runs on uploaded audio and video files. Live stream transcripts and YouTube backfills are transcribed without speaker separation.

    Can I get speaker names in my subtitle files?

    Yes, and it's a choice at download time. Subtitles export as SRT or WebVTT with speaker names either written into each caption as a prefix, or left out entirely, so the same recording can go to a video editor with names in and to a subtitle workflow with them out.

    What if two labels are actually the same person?

    Give them the same name. Merging is a naming operation rather than a separate tool, so two labels that turn out to be one person read as one person throughout the transcript and in every export.

    Why are transcript lines split by word rather than by utterance?

    Because utterances are split on silence, at a pause of roughly 0.8 seconds, and a fast exchange contains no such pause. Two people talking over each other land in one utterance carrying one speaker label, so one person's words get credited to the other. Building lines from word-level speaker tags puts the boundary at the actual change of voice instead.

    Transcribe a stream that's live right now

    Paste the URL of any live YouTube or Twitch stream and watch the transcript build in real time. Free plan, no credit card.