D46. What a recording says, heard on this computer: NVIDIA's Parakeet TDT 0.6B v3, downloaded once; ElevenLabs' Scribe v2 only when the author asks (15 Oct 2026)
On 15 October no flow made a line from an audio file, nor gave a line the text its own recording says once an actor said it differently. Both need speech to text; the preference is free, private and local where it is good enough, a paid service told as a share of the quota (D30). Compared:
- French and English. The Open ASR Leaderboard’s results (9 Oct 2026), French word error rate on FLEURS, Common Voice and MLS: ElevenLabs Scribe v2 2.9, 4.4, 2.5; Parakeet TDT 0.6B v3 4.7, 6.4, 5.1; Whisper large-v3 4.8, 10.0, 3.9; Whisper large-v3-turbo 4.9, 11.1, 4.2 (small and medium are far behind, the distilled Whispers English only). Measured here on D27’s corpus (80 lines said by the ten product voices, 415 s, int8): Parakeet 10.2 % of French words and 9.6 % of English ones differ from the script, almost all numbers said in words (« 9 h 30 », « neuf heures trente »; « 3,5 % », « trois virgule cinq pourcent ») and proper names (« Marc », « Mark »; « SUP-NET-04 », « Supnet zéro quatre »), punctuation and capitals in place; D27’s greedy wav2vec2 draft had 28 % and 20 %.
- Size and speed. Parakeet in int8: 671 MB; on an Apple M5 33 times faster than real time (a line of 7 s in a quarter of a second, 193 s in 5.6 s), 1.3 GB of memory for a line, 1.5 GB for 30 s; onnx-asr measured 31 times on a desktop CPU, and Whisper turbo 5 times (1.1 GB in int8). Not measured on an Intel Mac or a Windows laptop.
- The runtime. Ilya Stupakov’s ONNX export (for onnx-asr) runs on onnxruntime-node 1.23.2 as it is: opset 17, standard operators and one that ships with every build (DynamicQuantizeLSTM): no new dependency. Whisper’s export runs there too, but needs a mel spectrogram, a byte-level tokenizer and an autoregressive decoder with timestamp tokens in TypeScript, and makes up words in silences; Parakeet’s decoding (a token and how many frames to move on, frame by frame) is fifty lines.
- Licences. Parakeet’s weights CC-BY-4.0 (NVIDIA, credited in the app’s licences as Kyutai’s are), the export the same; Whisper MIT. Both fine.
- Privacy and cost. On this computer nothing leaves it and nothing is paid. Scribe v2 sends the recording to ElevenLabs, which keeps the transcript unless it is deleted (keeping nothing is an enterprise plan’s option).
- Word times. Parakeet’s are a frame of 80 ms, and NeMo’s 80 ms models placed word starts 95 to 103 ms off (D27); Scribe’s are characters’. Neither replaces the aligner: once the text is known the line’s words are timed by D27’s aligner when its model is here (else in proportion, as before). The aligner needs no seed: its Viterbi search finds the known text in the whole recording. The transcriber’s times stay in what a transcription returns, for information.
Decided:
- The local transcriber. Parakeet TDT 0.6B v3 int8, pinned at revision 8f23f0c (
nemo128.onnxthe features,encoder-model.int8.onnx,decoder_joint-model.int8.onnx,vocab.txt), decoded greedily in TypeScript as onnx-asr does (@elabora/nodetranscribe/parakeet.ts). 25 European languages, French and English among them; it hears the language itself, it cannot be told one. Audio longer than 30 s is heard in windows ending in the quietest 20 ms of their last third (windows). Its text keeps the model’s punctuation and capitals, without a space before a comma or a full stop, with French’s before « ? ! : ; » (transcribe/text.ts). It runs in a process of its own, as the aligner (models/process.ts, which both use): ONNX Runtime aborting takes the transcription with it (E_TRANSCRIBE_CRASHED), never the engine. - An optional download (D38): the kind
transcriber, one download for every language (idtranscriber), 671 MB, into<local app data>/transcribers/<model>/(ELABORA_TRANSCRIBER_MODELS_DIR,_URL,_MANIFESTas the aligner’s;test/isolate.tsgives tests a folder of their own); held while it transcribes (E_TRANSCRIBE_IN_USE). The app offers it in one click the first time a recording is to be heard; the command line and agents download it on first use, as the aligner.ELABORA_TRANSCRIBER_FAKEanswers from a file without the model’s inference, for the app’s tests only. - It replaces D27’s greedy transcription (
transcribeRecording,elabora narration transcribe, the transcription of « Importer des enregistrements… »): the wav2vec2 models only align. - A line made from a recording (
add_narration_line_with_audio,@elabora/coreaddNarrationLineWithAudio,@elabora/nodeaddNarrationLineFromAudio; « Nouvelle réplique depuis un fichier audio… » and audio dropped on the script;elabora narration add-from-audio, MCPelabora_narration_line_from_audio): the recording trimmed and encoded as an imported one (D24, providerrecording, its file’s name as its voice), its text what it says (transcribed in that encoded audio, or given), its words timed, the line after the last (or the line given) in that line’s step and with its speaker unless told otherwise: the line and its audio in one undoable change. In the course’s language only (a translation comes from it). - A line’s text from its recording (
set_narration_text_from_audio; « Régénérer le texte d’après l’audio »;elabora narration retranscribe [--dry-run], MCPelabora_narration_text_from_audiowithpreview): what the recording says beside the text now is shown first (enginetranscribeLine), then the text is replaced and the recording kept, in one undoable change: the text throughupdate_narration_line’s rules (its word anchors follow their words, those whose words are gone are lost and said), the sidecar throughkeep_narration_audio’s (it says the new text), the words timed again; the line’s translations become « Modifié depuis », their source having changed, as with any edit. Refused for a generated voice (it says its text), a line without audio, a translation (its text is written in the translation), and when the line’s audio changed after it was heard (audioHash). - ElevenLabs’ Scribe v2, on request (
service: 'elevenlabs',transcribe/elevenlabs.ts):POST /v1/speech-to-textwith the line’s language, word times andtag_audio_events=false(« (rires) » would enter the text), thenDELETE /v1/speech-to-text/transcripts/{id}at once. The key needs the « Speech to Text » permission, not among D29’s three: without it the service refuses and nothing is charged (E_VOICE_KEY_PERMISSION, which says so). Its cost is told as a share of the quota before anything is sent (D30’s threshold,approvedPercent,E_TRANSCRIBE_SPENDand the CLI’s exit code 3), at the list price until measured: ElevenLabs’ pricing page says 330 credits a minute, its API page $0.22 an hour; the key used for measurements lacked the permission on 15 October (refused, nothing charged), so the ledger’s periodelevenlabs/scribe_v2/starterhas the list price only (5.5 credits a second) and an estimate is « at most » (a minute is 0.8 % of a 40,000-credit quota). The app offers it beside the local result only to an author who gave a key. Revisit if: authors want numbers and symbols written as in their scripts (« 9 h 30 »: an inverse normalization of numbers, or Whisper, which writes them so), a language outside Parakeet’s 25 is needed (Whisper turbo in q4, 760 MB, on the same runtime), Intel Macs or Windows laptops prove too slow, Scribe’s charge is measured (a period with its share, D36), or a translation’s line should take its text from its own recording.
Revised by D57 (19 Oct 2026): the transcriber’s files are downloaded from Elabora’s mirror of istupakov’s repository (elabora/parakeet-tdt-0.6b-v3-onnx), the same bytes, sizes and SHA-256, so the installed model stays current; the upstream and revision named above are the mirror’s.