Nodes/PopNow/Grok STT · Speech to Text
ComfyUI Node

Grok STT · Speech to Text

Subtitles and transcripts inside ComfyUI, for about four cents an hour

By popnow-ai·Created 24 days ago·Updated about 20 hours ago· 0
Grok STT · Speech to Text
  • audio_url
  • text
  • task id
◄languagemodel default►
◄text_normalizationfalse►
◄keyterms►
◄filler_wordsfalse►
◄multichannelfalse►

ComfyUI has no real speech-to-text story. Audio support grew as a bolt-on once video got good enough to want a soundtrack, and the community's effort went into making voices, not pulling words back out of a waveform. So if your workflow needs the text of a clip - a transcript, a caption track, a prompt for the next stage - the practical route is a hosted model. This one is weirdly cheap: 0.01 credits per second of audio, so an hour of footage is about 36 credits. Under a nickel.

What it gives you back

A STRING. That's it, and it's exactly right: text plus task id. Which means the output is a normal string socket you can wire into anything that takes text - a note/display node, a save-text node, or a prompt field. The pipeline that makes this node worth having is the one where you transcribe a first pass, then feed the transcript forward: the words become the prompt for the next generation, or the caption source for the deliverable.

The model is xAI's, so the field set is theirs: transcripts in 25 languages, with word timings on the service side, though what comes back into ComfyUI through this node is plain text.

The fields

audio_url is an AUDIO socket despite the name - the pack uploads your waveform. Input can be a file or a public URL to common audio or video formats, 1 second to 2 hours. Realistically you'll be plugging in a ComfyUI AUDIO value, whether that's a file you loaded or generated earlier in the graph.

language is a dropdown of language codes, defaulting to the model default sentinel, which leaves the field out of the request so the service auto-detects. Leave it alone for single-language material. Set it when you already know, particularly for short, technical or heavily accented audio where detection has less to chew on.

text_normalization writes spoken numbers, prices, dates and units as digits. The tooltip states a dependency most people would never guess: it needs language. Turn normalisation on with language left on default and you're asking for an error the API will happily give you.

keyterms is the vocabulary list - up to 100 names and terms that should be spelled the way you type them. In ComfyUI this arrives as a multiline string box, JSON in, and the shape is a list of objects with a term key:

[{"term": "PopNow"}, {"term": "HunyuanVideo"}, {"term": "Q4"}]

It's the single most useful field here if you're transcribing anything with product names, handles or jargon in it. Without it you get "honey video one point five" and you'll be fixing it by hand.

filler_words keeps the ums and uhs. Off by default because subtitles read terribly with them; on if you want a faithful transcript for analysis, or if you're feeding the words into a TTS model and want the disfluency.

multichannel transcribes each channel separately, one line per channel. Only meaningful when the speakers were recorded on separate channels - an interview with two mics - and useless on a mixed stereo file.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/popnow-ai/popnow-comfyui

or install PopNow from ComfyUI Manager and restart, or comfy node install popnow-comfyui. Nothing is downloaded and nothing is compiled: the model runs on PopNow's servers, and the pack is a Python client for api.popnow.ai that leans only on packages ComfyUI already ships.

Get a key from popnow.ai/api/console/keys and set it as POPNOW_API_KEY or in Settings > PopNow, then restart once more - the node list is rebuilt from your account's catalog at startup, so a first boot right after adding the key can look sparse.

Where it goes wrong

Your input has to be AUDIO, not a video file path. If your source is a video, get its audio track out first with a loader that exposes audio. The API accepts video URLs, but in the graph you need a value of the audio type on that socket.

Normalisation without a language is the predictable 400. Set language or leave normalisation off.

keyterms is JSON, not a comma list. The tooltip says JSON and the API means it. A bare PopNow, Vidu string is what most people try first.

Long files are cheap but not instant. Two hours of audio is pennies and a real wait; the node shows queue and generation time, so don't assume it's hung.

PopNow 401 is a bad or missing key - recreate it in the console. 40201 is out of credits, which at this rate means an empty wallet rather than a spend problem. 40310 is the unverified-email error and it's easy to hit on a fresh account.

Cancelling stops the wait, not the job. The transcription continues server-side and the text lands in the API console, not your graph - interrupt a long file and you may have paid for a transcript you can't reach.

CategoryPopNow/Audio/xAI

Inputs (6)

NameTypeDefaultDescription
audio_urlAUDIOAudio to transcribe: an uploaded MP3 or WAV, or a public URL to a common audio or video format. 1 second to 2 hours.
languageCOMBOmodel defaultSpoken language. Leave empty to detect it; required when text_normalization is on.
text_normalizationBOOLEANfalseWrite spoken numbers, prices, dates and units in digits. Needs language.
keytermsSTRINGNames and terms to spell the way you list them, up to 100. JSON. A list of objects with "term".
filler_wordsBOOLEANfalseKeep filler words such as um and uh in the transcript.
multichannelBOOLEANfalseTranscribe each channel separately, one line per channel. Turn on when speakers are on separate channels.

Outputs (2)

NameTypeDescription
textSTRING—
task idSTRINGThe PopNow task id, for the API console logs or support.