v0.9.0
Added
--backend elevenlabs— transcription through ElevenLabs Scribe, the first trx backend that reports who is speaking. Modelsscribe_v2(default) andscribe_v1. The upload limit is 5 GB rather than the 25 MB and 100 MB of the other cloud backends, so this one never chunks.--diarizeand--speakers <n>— separate speakers. Every SRT cue is prefixed with its speaker ([speaker_0]) and the.txtbecomes a conversation, one paragraph per turn.--speakerstakes 1 to 32, the range the API accepts, and implies--diarize. Both are rejected onlocal,openaiandvercelinstead of being ignored: no other backend returns labels, and dropping the flag quietly would return an undiarized transcript that looks like the request succeeded.- Keychain fallback for the API key —
ELEVENLABS_API_KEYis read from the environment first, and on macOS from theelevenlabslogin Keychain entry when the variable is unset, so a key already stored there does not have to be exported into every shell.trx doctorresolves it through the same path a real run uses, so it cannot report a key missing that trx would have used. - ISO 639-3 language codes on this backend — Scribe accepts
esandspaalike and normalizes both tospa. The other backends still take ISO 639-1 only, which is the set whisper.cpp accepts.
Notes
Scribe timestamps every word, so cues are grouped rather than emitted one word each: a pause of 0.6s or more starts a new cue, a cue is capped at 84 characters, and a change of speaker always cuts. Those first two thresholds are subtitle conventions picked to read well, not measurements. The speaker rule is not subject to them, because a cue holding two voices misattributes the line.
Verified end to end on a 26 minute two-speaker Spanish interview: 488 cues, no cue mixing speakers, monotonic timestamps, transcript covering 25:56 of a 25:59 recording.
Upgrade
bun add -g @crafter/trx@latest --force
trx init --backend elevenlabs
trx interview.m4a -b elevenlabs --speakers 2