Qwen3 Forced Align
Word-level timestamps for subtitles and karaoke — with one big language caveat
- aligner
- audio
- timestamps
- text_list
- start_times
- end_times
This is the node that makes the pack worth more than a plain speech-to-text pipe. Qwen3 Forced Align takes an audio file, a transcript, and the aligner model, and returns the timing of each segment - "你准备好了吗" starts at 0.400s, "OK" at 2.960s, and so on. If you've ever wanted to auto-generate subtitles, karaoke lyrics, or a lip-sync schedule, this is the piece that produces the data to build them.
What it does
Forced alignment means: given the text, find where each word is in the audio. It's not a transcription - you supply the text yourself, pasted from the Transcribe node's output or written by hand. The inputs that matter:
aligner- theQWEN3_ALIGNERoutput from Qwen3 ForcedAligner Loader.audio- the same ComfyUIAUDIOyou fed the transcribe node.text- the transcript in a multiline box. It should match what's actually said.language- here's the caveat: only 11 languages, defaulting to Chinese. Nothing like the 52 the ASR side advertises. Hindi, Thai, Arabic, Vietnamese are all out, so check this list before you align anything exotic.segment_by_sentence(default true) - splits output into sentence/phrase spans using punctuation. Turn it off for per-word timing instead.
Four STRING outputs come out: timestamps (one text\tstart\tend per line), plus text_list, start_times, and end_times as parallel one-per-line lists - handy when you're processing downstream rather than parsing the tab format.
How it works
The aligner model matches the transcript's words against the audio and returns a start and end time per word. With segment_by_sentence on, the node splits your input on punctuation and groups the per-word times into sentence spans - which is why the output reads like subtitle cues ("你准备好了吗\t0.400\t2.960") instead of a word-by-word dump. Times are floats in seconds to three decimal places. Two README caveats: alignment handles up to ~3 minutes natively with auto-chunking for longer audio, and the whole thing runs on the same bf16 / cuda:0 GPU setup as the loaders.
Installing
One of four nodes in the SynVow pack:
cd ComfyUI/custom_nodes
git clone https://github.com/shumoLR/Comfyui_SynVow_Qwen3ASR
cd Comfyui_SynVow_Qwen3ASR
pip install -r requirements.txt
…or search "Comfyui_SynVow_Qwen3ASR" in ComfyUI Manager and restart. First use downloads the aligner model.
Common issues
- Timestamps drift or drop words. Almost always a transcript that doesn't match the audio - the aligner is matching, not guessing. Fix the text.
- Defaults bite.
languagedefaults to Chinese andsegment_by_sentencedefaults to on. If the output looks wrong, check both before you blame the model. - Your language isn't in the 11. The aligner simply can't do it - this is a model limitation, not a bug. Hindi is the classic community complaint.
- VRAM. The aligner (~4GB) plus an ASR model in the same graph gets tight on 8GB cards.
Worth the setup cost, though: timestamped transcripts are the difference between a text blob and data you can cut video with.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| aligner | QWEN3_ALIGNER | — | |
| audio | AUDIO | — | |
| text | STRING | — | |
| language | COMBO | Chinese | 11 options: Chinese, English, Cantonese, French, German, Italian, +5 |
| segment_by_sentence | BOOLEAN | true | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| timestamps | STRING | — |
| text_list | STRING | — |
| start_times | STRING | — |
| end_times | STRING | — |