Nodes/arkennemasis - ChatGPT / Codex / fal AI nodes/arkennemasis fal · ElevenLabs Speech to Text Scribe v2 · $0.008/min
ComfyUI Node

arkennemasis fal · ElevenLabs Speech to Text Scribe v2 · $0.008/min

The cheap transcription node, with a keyterm trick

By Hishamahmer·Created 3 months ago·Updated 10 days ago· 11
arkennemasis fal · ElevenLabs Speech to Text Scribe v2 · $0.008/min
  • audio
  • language_probability
  • language_code
  • text
  • words
  • info
◄language_code►
◄tag_audio_eventstrue►
◄diarizetrue►
◄keyterms►
◄max_cost_usd20.0►
◄reuse_identical_runtrue►
◄extra_json►
◄max_concurrent1►

Same job as the Speech to Text node next door, roughly a quarter of the price: $0.008 per audio minute against $0.03. Here's why you'd still sometimes pick the other one - this node's schema has one extra widget, keyterms, and using it costs 30% more. So the honest reading is: Scribe v2 is the cheap fast default, and it becomes a slightly more expensive node than its sibling only after you've told it what words to expect.

Which is, weirdly, the feature worth having. Transcription errors cluster on proper nouns - product names, surnames, jargon, place names. Feeding those in as keyterms fixes the spelling, and at this price level an extra 30% is still almost nothing. A ninety-minute meeting is 72 cents at the base rate and 94 cents with keyterms. Compare that to a caption file full of the wrong version of a client's name.

How it works

Audio goes to fal's CDN, one billed call comes back, and the result is unpacked into the node's outputs with the request logged in output/fal/_requests.jsonl. The model is fal-hosted and closed; the node is generated from the endpoint's schema, so what you see is what fal accepts, in fal's order.

The inputs that matter

audio is required. The rest shape the answer:

  • keyterms - a JSON string of words or sentences to bias the model toward. The tooltip's limits are the ones to remember: up to 100 keyterms, 50 characters each. Empty leaves it out, and this is the only widget on the node that isn't also on the plain Speech to Text node.
  • diarize - true by default; annotates who's speaking. Keep it for interviews, bin it for narration.
  • tag_audio_events - true by default; tags laughter, applause and friends inline. Excellent for a transcript, mildly ruinous if you pipe the raw text into subtitles.
  • language_code - empty means detect.

Outputs: language_probability, language_code, text, words (per-word timings as a JSON string), and info.

How to use keyterms properly

It's a JSON field, and this is where people fumble it. Feed it a list of the strings you expect to hear - the names of the people in the room, the product being discussed, the acronyms. Don't dump a glossary in; the endpoint biases toward the terms you give it, and a long list of words that aren't in the recording is a good way to get them hallucinated into the transcript. Ten to twenty real terms beats a hundred speculative ones.

Since it's a string input, you can drive it from a text node in the graph - which in this pack means you can generate the term list with an LLM node upstream and feed it in, or reuse one list across a whole session of recordings.

Money

$0.008 per input audio minute, plus 30% when keyterms are in play. That is cheap enough that transcription stops being a budgeting decision and starts being a preprocessing step you just do: transcribe the clip, feed the text to a language model, use the answer to build a shot list. The max_cost_usd cap at its $20 default would allow a very long day of audio.

Install

Manager → search comfyui-arkennemasis, or:

cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis

Restart, then FAL_KEY=your-key in the .env beside run_nvidia_gpu.bat. There is no key widget on the node - the file is the only route, by design, so a shared workflow carries no credential.

Common issues & troubleshooting

Your keyterms are being hallucinated back at you. The list is too long or too speculative. Trim it to terms you're confident appear in the audio.

keyterms rejected. It's parsed as JSON. A list of plain strings is what you want; a single bare word isn't a list.

Garbled output with high confidence. Confidence reflects language classification, not audio quality. Two people talking over music will confuse any transcriber - clean the source with ElevenLabs Audio Isolation first, then re-run.

You want character-level timing. words gives word-level. If captions need to land on individual characters or syllables, feed text to the Forced Alignment node with the original audio - different node, different price model, real character timings.

Captions drifting by the end of a long clip. Build them from words rather than from a script-length estimate; the timings here are the real ones.

Categoryarkennemasis/fal/Audio/ElevenLabs

Inputs (9)

NameTypeDefaultDescription
audioAUDIOURL of the audio file to transcribe
language_codeSTRINGLanguage code of the audio Empty leaves it out.
tag_audio_eventsBOOLEANtrueTag audio events like laughter, applause, etc.
diarizeBOOLEANtrueWhether to annotate who is speaking
keytermsSTRINGWords or sentences to bias the model towards transcribing. Up to 100 keyterms, max 50 characters each. Adds 30% premium over base transcription price. JSON. Empty leaves it out.
max_cost_usdoptFLOAT20.00–100000Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap.
reuse_identical_runoptBOOLEANtrueIf these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings.
extra_jsonoptSTRINGAdvanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally.
max_concurrentoptINT11–32How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed.

Outputs (5)

NameTypeDescription
language_probabilityFLOAT—
language_codeSTRING—
textSTRING—
wordsSTRING—
infoSTRINGJSON: request id, cost estimate, saved files and fal's full answer.