Nodes/TTS Audio Suite/๐Ÿ—ฃ๏ธ Silent Speech Analyzer
ComfyUI Node

๐Ÿ—ฃ๏ธ Silent Speech Analyzer

Turn a silent video into subtitle timing

By diodiogodยทCreated 12 months agoยทUpdated 18 days agoยท 1,098
๐Ÿ—ฃ๏ธ Silent Speech Analyzer
  • video
  • viseme_options
  • video
  • srt_output
  • timing_data
  • movement_frames
  • confidence_scores
โ—„providerMediaPipeโ–บ
โ—„sensitivity1.00โ–บ
โ—„min_duration0.05โ–บ
โ—„output_formatSRTโ–บ
โ—„srt_placeholder_formatWordsโ–บ
โ—„preview_modetrueโ–บ
โ—„clean_subtitle_outputfalseโ–บ
โ—„merge_threshold0.20โ–บ
โ—„confidence_threshold0.02โ–บ

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) and min_duration to drop blips. confidence_threshold helps 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.
CategoryTTS Audio Suite/๐ŸŽฌ Video Analysis

Inputs (11)

NameTypeDefaultDescription
videoVIDEOโ€”
providerCOMBOMediaPipeComputer 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
sensitivityFLOAT1.000.05โ€“1Ultra-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_durationFLOAT0.050.01โ€“2Minimum 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_formatCOMBOSRTOutput 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_formatCOMBOWordsSRT 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_optionsoptVISEME_OPTIONSConnect 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_modeoptBOOLEANtrueGenerate 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_outputoptBOOLEANfalseRemove 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_thresholdoptFLOAT0.200โ€“3Merge 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_thresholdoptFLOAT0.020โ€“1Minimum 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)

NameTypeDescription
videoVIDEOโ€”
srt_outputSTRINGโ€”
timing_dataTIMING_DATAโ€”
movement_framesLISTโ€”
confidence_scoresLISTโ€”