Vibe Music Engine
Turn a song into a shot list, subtitles, and lyric prompts
- audio
- beats_audio
- Lyrics
- frame_based_text
- Frame_long
- frame_numbers
- text_lines
- start_frame_numbers
- end_frame_numbers
- num_of_elements
- durations
- Start_ms
- Duration_ms
This is the node the pack is named after, and it's genuinely clever. Vibe Music Engine takes an AUDIO input - a song, a voiceover, anything with a vocal - and turns it into a complete plan for a lyric/music video: the transcribed lyrics, frame-accurate per-frame text you can use to prompt image generation, shot boundary timings, and written-out EDL and SRT files. It's Whisper-based speech-to-text bolted onto a music-video production pipeline, and it's the most interesting thing in lazniak's suite by a wide margin.
Under the hood: it dumps your audio to a temp WAV, runs OpenAI's Whisper with word-level timestamps, groups the words into lyric lines (words_per_line, default 3), converts timestamps to frames at your fps, enforces shot lengths between min_shot_length_frames (default 25) and max_shot_length_frames (default 125) so cuts feel deliberate instead of frantic, and writes the results to ComfyUI/output/<prefix>/ as an EDL (CMX3600 format, readable by NLEs) and SRT subtitles. There's also optional numba-accelerated beat detection that can align your cuts to the music. That's a lot of pipeline for one node.
Inputs worth caring about
audio(AUDIO) - wire this from any node that outputs ComfyUI's AUDIO type. The tooltip's advice is the actual requirement: clear vocal content transcribes dramatically better.choose_model- Whisper size, defaultbase. This is where the whole thing can bite you: the model downloads on first run, and it's not tiny.base≈ 142 MB,medium≈ 1.5 GB,large-v3≈ 3 GB+. The.envariants are faster if you only work in English. It loads for the run and frees VRAM after, so it won't sit in memory, but budget the download and the run time.source_language(defaultauto) /target_language(defaultsource) - auto-detect, or force a language; set a different target to get a translated transcription.fps(default 25) - the master clock. Every frame number and EDL timecode derives from this, so match it to your video workflow or nothing lines up.words_per_line,min_shot_length_frames,max_shot_length_frames- the editorial controls. Short lines = more cuts; min shot length stops seizure-inducing staccato.filename_prefix(defaultsc) andfiles_in_edl(defaultmp4) - name the output clips and tell the EDL what files to reference.beat_detection,beat_sensitivity,beat_brutality- the music-sync layer. Sensitivity finds beats (higher = more, plus false positives), brutality is how hard cuts snap to them.save_edl/save_srt(overwrite/no/iterate) andsrt_mode(raw/clean/word/original/all) -rawkeeps system markers,cleanis dialogue only,wordis karaoke-style word-by-word timing.
What comes out
Eleven outputs. The ones you'll actually use: Lyrics (the full transcription as a string), text_lines plus frame_numbers/start_frame_numbers/end_frame_numbers (lists that let you drive per-shot image generation - feed each line's frame range into an image-gen pass with the lyric as its prompt), Frame_long (total frames), num_of_elements (how many shots/lines), and the Start_ms/Duration_ms/durations lists for finer timing work. frame_based_text is the assembled per-frame text stream.
Install & first-run reality
Same pack: Manager search "videoclipgenerator", or
cd ComfyUI/custom_nodes
git clone https://github.com/lazniak/videoclipgenerator
cd videoclipgenerator
pip install -r requirements.txt # pulls openai-whisper + numba
Restart. First real run downloads the Whisper model - give it time and bandwidth. Troubleshooting-wise: missing whisper or numba imports mean the requirements didn't fully install (re-run the pip install against the ComfyUI Python, not your system one); a garbled transcription usually means the audio's too quiet or buried in music - the tooltip's "clear vocal content" isn't a suggestion; and the buy_me_a_coffee checkbox opens a browser tab, as it does everywhere in this pack. Expect the README's grander claims (99-language dialect handling, cross-lingual pivot translation) to be flattered marketing - the real code is Whisper + careful bookkeeping, and that's plenty.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | Main audio input for speech-to-text processing. Should contain clear vocal content for optimal transcription. | |
| choose_model | COMBO | base | Select Whisper model size: tiny: Fastest, lowest accuracy base: Good balance of speed/accuracy small: Better accuracy, slower medium: High accuracy, slower large/large-v2: Best accuracy, slowest *.en models: Optimized for English |
| source_language | COMBO | auto | Select the source language of the audio: auto: Automatically detect language en: English pl: Polish de: German etc. |
| target_language | COMBO | source | Select the target language for transcription: source: Keep detected/specified source language en: English pl: Polish de: German etc. |
| continuation_text | STRING | <LOGICAL CONTINUATION OF PREVIOUS VIDEO SHOOT> | Text to be used for logical continuation of scenes. This text will be inserted when a scene is split into multiple parts. |
| fps | FLOAT | 25.00.1–120 | Frames per second for video output. Common values: 24fps: Film 25fps: PAL 29.97fps: NTSC 30fps: Digital 60fps: High frame rate |
| words_per_line | INT | 31–20 | Number of words to group per subtitle line. Lower values create shorter, more readable lines but more frequent cuts. |
| prev_context_words | INT | 00–20 | Number of previous words to add as context before the main text line. Helps with context understanding and prompt generation. |
| next_context_words | INT | 00–20 | Number of next words to add as context after the main text line. Helps with context understanding and prompt generation. |
| context_brackets | BOOLEAN | true | If enabled, adds [PREV: ...] and [NEXT: ...] brackets around context words. If disabled, adds context words without brackets. |
| max_shot_length_frames | INT | 125 | Maximum length of a single shot in frames. Longer shots will be split. At 25fps, 125 frames = 5 seconds. |
| min_shot_length_frames | INT | 251–100 | Minimum length of a single shot in frames. Prevents too rapid cuts. At 25fps, 25 frames = 1 second. |
| filename_prefix | STRING | sc | Prefix for output files. Will be used for both EDL and SRT files. Example: 'sc' will create 'sc_00001.mp4', 'sc.edl', etc. |
| files_in_edl | STRING | mp4 | File extension for video files referenced in EDL. Common formats: mp4, mov, avi, mxf. Must match your video workflow. |
| beat_detection | BOOLEAN | false | Enable automatic beat detection for music-synchronized cuts. Uses advanced audio analysis to find rhythmic patterns. |
| beat_sensitivity | FLOAT | 0.50.1–1 | Sensitivity of beat detection: 0.1: Only strongest beats 0.5: Balanced detection 1.0: Detect subtle beats Higher values may create false positives |
| beat_brutality | FLOAT | 0.500–1 | How strictly to align cuts to beats: 0.0: Subtle alignment 0.5: Balanced 1.0: Exact beat alignment Higher values may create jarring cuts |
| save_edl | COMBO | overwrite | EDL save mode: overwrite: Replace existing file no: Don't save EDL iterate: Create numbered versions (sc_001.edl, sc_002.edl, etc.) |
| save_srt | COMBO | overwrite | SRT subtitle save mode: no: Don't save SRT overwrite: Replace existing file iterate: Create numbered versions |
| srt_mode | COMBO | raw | Subtitle format mode: raw: Include all system messages clean: Only text content word: Word-by-word timing (karaoke style) original: Raw Whisper output all: Save all formats (raw, clean, word, and original) |
| frame_gap | FLOAT | 1.00.5–5 | Gap between words in frames when using word mode. Affects readability and timing precision. |
| buy_me_a_coffee | BOOLEAN | false | Support the development! ☕ By enabling this option, you'll be directed to a page where you can show your appreciation for this tool. Your support helps maintain and improve these nodes! |
| usage_counter | STRING | Usage count: 0 | Tracks the total number of times this node has been used. This helps us understand how the tool is being utilized and guides future development. The counter updates automatically with each use. |
| beats_audioopt | AUDIO | Optional separate audio input for beat detection. Useful when vocal track and music track are separate. If not provided, main audio will be used for beat detection. |
Outputs (11)
| Name | Type | Description |
|---|---|---|
| Lyrics | STRING | — |
| frame_based_text | STRING | — |
| Frame_long | INT | — |
| frame_numbers | STRING | — |
| text_lines | STRING | — |
| start_frame_numbers | STRING | — |
| end_frame_numbers | STRING | — |
| num_of_elements | INT | — |
| durations | STRING | — |
| Start_ms | STRING | — |
| Duration_ms | STRING | — |