attribute_speakers
Assign each spoken word to the speaker whose mic was loudest, using the existing transcript without re-transcribing. Reports ambiguous spans for human review, with optional apply.
Instructions
Label each word with the mic that was loudest while it was spoken.
For a co-hosted recording captured on one mic per speaker. It is one pass over the transcript that is already attached — never a second ASR run, and transcribing each mic separately is measured and dead: half of each mic's own transcript is the other person, at every isolation tried. Transcribe once, from the mix or either mic, then call this.
streams are ffmpeg audio ordinals into the registered container (0,
1), and labels names them in the same order — one label per stream,
defaulting to speaker1, speaker2. The speaker lands on the word: it
is a label and never an address, so every cue, description, mark, music
anchor and caption still resolves through (clip_id, word_index) and
nothing else moves.
It reports; it does not decide below the floor. apply is off by
default. The rule is ~99% correct per word on clear speech and at
chance on words spoken over each other, and margin_db is what
half-knows the difference — anything under it comes back in
ambiguous_spans to go and listen to, with the three words either side.
Read unmeasurable separately from ambiguous: it means the mics ran
out before the transcript did, which is a different recording problem.
Applying keeps any label already on a word this refuses to call.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The project directory to act on. Omit it — the usual case — when this server is bound to a project (started as `proofcut -C DIR mcp`, or inside a project; `ping` says which): it then resolves to that one bound project, a relative path resolves against it, and a path outside it is refused by name. Unbound, `path` is the whole address and omitting it refuses rather than guessing. | |
| apply | No | Write the labels onto the words. Off by default — it reports first, and applying keeps any label already on a word this refuses to call. | |
| limit | No | How many ambiguous spans to return; the reply also says how many there are in total. | |
| labels | No | What to call each stream, in the same order — one per stream. Unset, `speaker1`, `speaker2`. | |
| clip_id | Yes | The co-hosted clip: one container, one mic per speaker, one transcript already attached. | |
| streams | No | Which audio streams the speakers are on, as ffmpeg audio ordinals (`[0, 1]`). Unset, the container's readable audio streams in order. | |
| margin_db | No | How much louder one mic has to be to be believed, in dB. It reports a default and is not a threshold to trust: on words spoken over each other the rule is at chance, and anything under this margin comes back in `ambiguous_spans` to go and listen to. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||