๐ฃ๏ธ Silent Speech Analyzer
Turn a silent video into subtitle timing
- video
- viseme_options
- video
- srt_output
- timing_data
- movement_frames
- confidence_scores
This is the odd one out in the pack, and kind of a clever idea. ๐ฃ๏ธ Silent Speech Analyzer watches a video of someone talking - with no audio, or where you're ignoring the audio - detects when the mouth is moving, and produces subtitle timing from that. The point isn't transcription; it's timing. You get an SRT scaffold with accurate start/end times for each speech burst, which you then fill in with real text and hand to the suite's TTS SRT nodes to generate perfectly-timed dubbed audio. For dubbing, animation reference, and lip-sync work, it solves the tedious first step: figuring out when speech happens.
Be clear-eyed about it, though - the README calls the viseme/word-guessing "experimental approximations," and it means it. Treat this as a timing tool, not a lip reader.
How it works
It runs face and mouth-landmark detection frame by frame (via Google's MediaPipe, the stable path), measures mouth openness/movement over time, and groups the moving stretches into speech segments with start and end times. On top of that timing it can guess placeholder text - approximate visemes (vowel/consonant shapes) mapped through the CMU pronouncing dictionary - but those are phonetic filler, not real words. The three-level pipeline (frame movement โ syllable grouping โ word prediction) is really there to give you a scaffold you then edit by hand.
The inputs and outputs that matter
- video - the clip to analyze (VIDEO input).
- provider (
MediaPipe,OpenSeeFace,dlib, default MediaPipe) - the face-detection backend. MediaPipe is the one to use; the README flags OpenSeeFace as experimental and not for production (it's the fallback for Python 3.13, where MediaPipe won't install). Only switch if MediaPipe isn't available. - sensitivity (0.05โ1, default 1) - how readily it counts mouth motion as speech. Lower it if it's catching every twitch; raise it if it's missing quiet talking.
- min_duration (default 0.05s) - the shortest segment it'll emit, filtering out micro-blips.
- output_format (
SRT,JSON,CSV,AUDIO_REGIONS, default SRT) - SRT for subtitle workflows; the others for data/analysis. - srt_placeholder_format (Words, Syllables, Characters, Underscores, Duration + Length) - what filler to drop into each cue, since you'll be replacing it anyway.
Outputs include srt_output (the timing scaffold), timing_data (a structured TIMING_DATA for downstream nodes), a preview video with detection overlaid, plus movement_frames and confidence_scores lists. merge_threshold and confidence_threshold (optional) tune how aggressively nearby segments merge and how confident a detection must be to count.
Installing it
Ships with TTS Audio Suite. Easiest: ComfyUI Manager โ search TTS Audio Suite โ install โ restart, which runs the pack's install.py - and this node is the reason that script matters: it handles the MediaPipe โ OpenSeeFace fallback on Python 3.13 automatically. Manual: cd ComfyUI/custom_nodes && git clone https://github.com/diodiogod/TTS-Audio-Suite.git, then python install.py from inside the folder with your ComfyUI venv active (run the script, not just a bare requirements install). Linux: portaudio19-dev libsamplerate0-dev first. MediaPipe pulls its own model assets on first run.
Common issues
- MediaPipe won't install (Python 3.13). Known incompatibility. The installer falls back to OpenSeeFace automatically, but OpenSeeFace is experimental - if you can, run this on Python 3.12 with MediaPipe for reliable results.
- The predicted words are gibberish. Working as intended. The text is a phonetic placeholder, not a transcript - you're meant to replace it. Use this for timing, then write the real lines yourself.
- Missing or spurious segments. Tune
sensitivity(down if it's over-triggering on non-speech motion, up if it's missing soft talking) andmin_durationto drop blips.confidence_thresholdhelps in busy footage. - Face not detected. MediaPipe needs a reasonably clear, front-ish face. Extreme angles, occlusion, or tiny faces in frame tank detection. Crop closer to the speaker if you can.
- Expecting finished subtitles. It gives you a base timing template. The content editing is manual, always.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | โ | |
| provider | COMBO | MediaPipe | Computer vision provider for mouth movement detection: โข MediaPipe: Google's ML framework (preferred, incompatible with Python 3.13) - Fast, accurate, works on most hardware - Best for general use and consistent results โข OpenSeeFace: Real-time face tracking (experimental, Python 3.13 compatible) - Alternative for newer Python versions - Results may be less accurate than MediaPipe โข dlib: Traditional computer vision (coming soon) - Lightweight, no ML dependencies |
| sensitivity | FLOAT | 1.000.05โ1 | Ultra-fine movement detection sensitivity (exponential scaling): โข 0.05-0.2: Only obvious mouth movements (conservative) โข 0.3-0.4: Clear speech detection (balanced) โข 0.5-0.6: Most speech including soft talking โข 0.7-0.8: Sensitive, catches subtle movements โข 0.9-1.0: Ultra-sensitive, includes whispers and micro-movements Exponential scaling provides fine control at higher values. Start with 0.5, then fine-tune in 0.01 increments. |
| min_duration | FLOAT | 0.050.01โ2 | Minimum duration for valid speech segments (in seconds): Lower values: Include quick sounds and short words, more segments Higher values: Only longer phrases, cleaner but may miss short words Recommended: 0.1s for balanced filtering, 0.05s for detailed analysis |
| output_format | COMBO | SRT | Output format for timing data: โข SRT: Standard subtitle format, best for TTS synchronization โข JSON: Detailed data with confidence scores for analysis โข CSV: Spreadsheet format for data processing โข AUDIO_REGIONS: start,end format compatible with Audio Analyzer Recommended: SRT for TTS workflows, AUDIO_REGIONS for audio analysis |
| srt_placeholder_format | COMBO | Words | SRT placeholder format - adapts to viseme detection: ๐ WITHOUT Viseme Options: โข Words: [word word word] - estimated word placeholders โข Syllables: [syl-la-ble syl-la-ble] - estimated syllable patterns โข Characters: [โขโขโขโขโขโขโขโขโขโขโขโขโขโขโขโขโขโขโขโข] - character count ๐ WITH Viseme Options connected: โข Words: [A EI OU] - vowels grouped as words โข Syllables: [AE-I-OU] - vowels grouped as syllables โข Characters: [AEIOU] - raw vowel sequence Format = presentation style, visemes = actual vowel content! |
| viseme_optionsopt | VISEME_OPTIONS | Connect Viseme Mouth Shape Options node for vowel detection (A, E, I, O, U): โข When connected: Enables precise vowel classification โข When not connected: Basic speech/no-speech detection only Viseme detection adds ~20% processing time but provides detailed mouth shape analysis for lip-sync. | |
| preview_modeopt | BOOLEAN | true | Generate annotated video preview with movement markers: Shows green/red overlays for detected/undetected movements with confidence scores and facial landmarks. Performance: Uses 540p resolution, increases processing time by ~40% Use for: Debugging detection accuracy and tuning parameters |
| clean_subtitle_outputopt | BOOLEAN | false | Remove all brackets, confidence scores, and metadata from output: โข OFF: [hello world] (confidence: 74.2%, 1.1s) โข ON: hello world Use when you want clean subtitles ready for direct use without technical information. |
| merge_thresholdopt | FLOAT | 0.200โ3 | Merge nearby speech segments separated by short gaps: Lower values: Keep more segments separate, preserve natural pauses Higher values: Merge more segments together, smoother but less detailed Recommended: 0.2s for natural flow, 1.0s+ for sentence-level segments |
| confidence_thresholdopt | FLOAT | 0.020โ1 | Minimum confidence score for including detected movements: โข 0.0-0.2: Include all detections (may include noise) โข 0.3-0.4: Balanced filtering (recommended start) โข 0.5-0.7: Conservative, only clear movements โข 0.8-1.0: Ultra-strict, only highest confidence Confidence based on landmark quality, face visibility, lighting. With new exponential sensitivity, lower values work better. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | โ |
| srt_output | STRING | โ |
| timing_data | TIMING_DATA | โ |
| movement_frames | LIST | โ |
| confidence_scores | LIST | โ |