# The transcript is one wall of text with nobody's name on it

> A transcript without speakers answers the wrong question. Speakers are separated in both modes, and the text is stored as turns of speech.

Canonical HTML version: https://mcpbelt.com/problems/know-who-said-what

## The problem

You have the transcript. Four people were in the room, and what comes back is one continuous paragraph in which somebody agrees to send the numbers by Friday. Which somebody is not written anywhere.

That is the question nobody asked out loud but everybody wants answered. Not what was said: who said it. Who took the action, who objected, who committed to the date. A transcript that cannot attribute a sentence turns every conclusion your agent draws into an inference from word choice and turn order, and those inferences are confident and wrong often enough to be worse than nothing.

It gets worse in the places it matters most. Two people talking over each other, a decision reversed twenty minutes later, someone speaking on behalf of a team: exactly the passages you need attributed are the ones a flat block of text destroys.

## Why it fails locally

Splitting a recording into who spoke when is called diarization, and it is a **different model** from the one that turns sound into words. The speech model can be excellent and still hand you an undivided stream, because separating voices was never its job. Installing a transcription package does not get you this, and running the separate model well is not a matter of installing a second one: it needs the same audio, aligned against the word timings, with the number of speakers either known or estimated, and it degrades badly on crosstalk and on short interjections, which is where a meeting actually lives.

The second half of the problem survives even when separation works, and it is the part people discover last. An engine hands back a single text field that does not say who is speaking, plus a list of segments that are roughly one sentence each. Neither is what you want to store. The text field has lost the attribution, and the segments have shredded a two-minute explanation into forty fragments, so a search that lands on one of them gives you a sentence with no argument around it.

Recombining those fragments into turns of speech is a small piece of code that nobody writes until they have already stored a year of transcripts the other way. By then the fix is a migration.

## The code

Speakers are separated by default, in both modes. `result` with `outline=true` returns who spoke and when, and it is free.

```
upload(filename="board-call.m4a", content_type="audio/mp4")
  -> key, upload_url

curl -T board-call.m4a "<upload_url>"

listen(key="<key>", mode="exact", language="it")
  -> handle, engine, used_fallback, cost_eur, structure

result(handle="<handle>", outline=true)
  -> who spoke, and when

result(handle="<handle>", find="Friday")
  -> excerpts, each with its timestamp

result(handle="<handle>", time="21:00-24:00")
  -> that stretch, as turns of speech
```

## What it costs

Attribution is not priced separately. `listen` costs 0.005 EUR per minute in `balanced` mode and 0.008 EUR in `exact`, and **both separate speakers**. There is no tier where you pay more to find out who talked.

That is a guarantee of the mode, not a property of whichever engine happened to answer. An engine that cannot return speakers is not used for this work at all, and if the first engine fails the backup answers with the same guarantees at the same price. Every response tells you which engine ran, in `engine` and `used_fallback`.

Reading the result afterwards is free, however you slice it: `outline` for the speaker map, `find` for a term, `time` for a stretch. You paid when the audio was transcribed, once, on its real duration.

## What this does not do

- Labels are `Speaker A`, `Speaker B` and so on. Nothing identifies who those people are, and no voice is matched against any stored identity.
- Heavy crosstalk is the hard case for every engine. `exact` handles it better than `balanced`, and neither is magic.
- The transcript says who spoke, not what they meant. There is no summary, no sentiment and no judgement of who agreed with whom.
