Fix perth import fallback - make it optional
- Add try-except with PERTH_AVAILABLE flag for all perth imports
- Prevents ModuleNotFoundError crash when perth is not installed
- Watermarking is disabled by default, perth is truly optional
- Matches pattern already used in vc.py files
- Remove unused perth import from stateless wrappers
- Signals to users they have related audio restoration functions
- Updated node name, docstring, tooltips, and display mappings
- Both nodes now use 🤐 emoji for visual consistency
- Better UX: users see them as part of the same family
- Bundle VoiceFixer locally to avoid cache downloads
- Create voice_fixer_downloader for TTS/voicefixer/ model management
- Implement Voice Fixer node with 3 restoration modes (original, high-freq removal, train mode)
- Register node in nodes.py with proper error handling
- Patch bundled VoiceFixer hardcoded paths to use TTS/voicefixer/ directory
- Disable auto-download in restorer/__init__.py, handled by node instead
- Support lazy loading and CUDA acceleration
- All models download to organized TTS/ folder, never to cache
Fix Higgs Audio SRT seed behavior to use fixed seed
Implementation:
- Change Higgs Audio from seed+i pattern to consistent fixed seed
- Aligns with other engines (F5-TTS, VibeVoice, ChatterBox) which already use fixed seed
- User can control per-segment seed via segment parameters: [seed:42]
- Improves predictability and cache stability when editing SRT files
Add per-segment parameter switching across all TTS engines
Implementation details:
- Unified parameter switching for ChatterBox, F5-TTS, Higgs Audio 2, VibeVoice, IndexTTS-2
- Per-segment control with inline tag syntax [character|seed:42|temp:0.5]
- Engine-specific parameter filtering with smart fallback handling
- SRT subtitle line parameter support
- Order-independent and case-insensitive parameter syntax
- Full integration with character and language switching
- Comprehensive parameter validation and range clamping
Add interrupt handling to all TTS processors
Comprehensive implementation of cancellation support:
- Higgs Audio: Interrupt checks in SRT and TTS processors
- VibeVoice: Interrupt checks in SRT and text processors
- ChatterBox Official 23-Lang: Interrupt checks in SRT processor
- IndexTTS-2: Interrupt checks in SRT processor
- Added Step 9.5 to implementation guide for future engines
This allows users to stop long-running operations gracefully.
Fix Clear VRAM button for all TTS engines
Technical details:
- Add .to() methods to ChatterBox Classic, ChatterBox 23-Lang, F5-TTS, Higgs Audio, VibeVoice, RVC, and Index-TTS engines
- Implement device checking before generation to detect CPU offloading
- Add wrapper search and re-registration logic to maintain ComfyUI tracking
- Fix VRAM spike issues during RVC and VibeVoice reload by moving models to correct device before generation
- Optimize to reuse existing wrappers instead of creating duplicates
- Register RVC models with ComfyUI model management for proper VRAM tracking
- Fix target device calculation to always use CUDA when available across all engines
Fix ChatterBox Official 23-Lang device placement bug
Technical implementation:
- Add .to() method to ChatterBoxOfficial23LangTTS class for device migration
- Add .to() method to ChatterboxVC class for voice conversion device handling
- Improve wrapper's _move_all_components_to_device() with better recursion depth
- Fix unified_model_interface device resolution for 'auto' mode
- Add ComfyUI model management re-registration after wrapper.model_load()
- Fix model_finalizer setup when re-registering with ComfyUI
- Add device check in processor to call wrapper.model_load() instead of direct .to()
Fixes device mismatch errors:
- Fix 'Expected all tensors to be on the same device' error on second run
- Fix 'Inference tensors do not track version counter' after CPU detachment
- Fix 'Clear VRAM' button not working after model reload
Fix PyTorch installation syntax error
Invalid pip requirement syntax with local version labels in version specifiers.
The +cu121 suffix is only valid with == or != operators, not with >= operators.
Now correctly passes CUDA version via --index-url instead.
Also add graceful error handling for RVC monotonic-alignment-search installation
on systems without C++ build tools.
Add TTS Audio Suite prefix to post-load diagnostic messages
User-facing improvements:
- Prefix character voice discovery messages with [TTS Audio Suite] for clarity
- Helps users identify which extension is responsible for each message
- Distinguishes TTS Suite messages from other custom nodes during startup
Fix ComfyUI JSON serialization type corruption in unified nodes
- Add modular ConfigSanitizer utility for parameter type validation
- Fix repetition_penalty and other float parameters becoming integers
- Fix device parameter corruption when using Any Switch node
- Skip verbose download messages for already-downloaded models
Fix device mismatch in TTS model reuse after CPU offloading
Root cause: When models are detached to CPU and then reloaded to GPU, conditioning tokens (cond_prompt_speech_tokens) remain on CPU. The prepare_conditioning() method in T3 model tries to embed these CPU tokens using GPU embedding layers, causing device mismatch.
Solution: Explicitly move conditioning tokens to model device before calling embedding layers in both ChatterBox and ChatterBox Official 23-Lang T3 models.
Fix Higgs Audio DynamicCache AttributeError and cache recreation on device transitions
Technical details:
- Fix ambiguous cache type checking using hasattr() instead of isinstance()
- Replace cache reset logic with explicit StaticCache vs DynamicCache handling
- Add exception handling for cache reset operations
- Set force_cache_recreation flag when clearing caches during CPU unload
- Improve DynamicCache manual construction with better error handling
Skip WeTextProcessing on Windows to avoid confusing install errors
Windows users see failed WeTextProcessing installation due to missing build
tools, even though code has graceful fallback. This confuses users.
Changes:
- Detect Windows platform and skip WeTextProcessing installation
- Use fallback text processing instead (works fine, slightly slower for Chinese)
- Add explanatory message in install summary for Windows users
- No functional impact - all TTS generation works normally
Fix IndexTTS-2 CampPlus model auto-download
CampPlus was using direct hf_hub_download() instead of unified downloader,
causing FileNotFoundError when loading from cache. Now uses unified system.
Changes:
- Add CampPlus to index_tts_downloader MODELS registry
- Replace hf_hub_download() with unified downloader in infer_v2.py
- Ensures CampPlus downloads to models/TTS/IndexTTS/campplus/
- Follows consistent TTS folder policy with other dependencies
Fix ChatterBox Official 23-Lang device mismatch on cached model reuse
Root cause: When models are moved from CPU back to VRAM after being detached,
the model components are properly moved but conditioning data remained on CPU.
This caused embedding layers to fail (input tensors on CPU, weights on CUDA).
Changes:
- TTS engine: Sync self.conds to device in generate() and generate_batch()
- VC engine: Sync self.ref_dict to device in generate()
- Ensures all tensors are on correct device before inference
Fix VibeVoice standalone model detection
Technical details:
- Add support for .safetensor extension (singular)
- Fix _find_standalone_model() to search extra_model_paths.yaml directories
- Add case-insensitive folder name support (vibevoice/VibeVoice)
Fix F5-TTS trainer wandb import for protobuf compatibility
- Make wandb import optional in trainer.py to prevent crashes
- Add WANDB_AVAILABLE flag with graceful degradation
- Fixes issue with ComfyUI portable protobuf version mismatch
Fix IndexTTS-2 dependency download violations
Technical fixes:
- Fix w2v-bert-2.0 downloading to .cache instead of TTS folder
- Fix MaskGCT semantic codec downloading to .cache instead of TTS folder
- Fix BigVGAN vocoder downloading to .cache instead of TTS folder
- Update download configurations to include only necessary files
- All IndexTTS-2 dependencies now use unified downloader
Fix Higgs Audio model discovery with extra_model_paths.yaml support
Technical details:
- Add proper extra_model_paths.yaml integration like other TTS engines
- Support HiggsAudio/, higgs_audio/, and higgsaudio/ parent folder variations
- Add flexible subfolder scanning with Higgs Audio-specific file detection
- Use get_all_tts_model_paths() instead of hardcoded directory paths
- Update download_model and download_tokenizer for local: prefix support
Fix VibeVoice model discovery with extra_model_paths.yaml support
Technical details:
- Add proper extra_model_paths.yaml integration like ChatterBox
- Support both vibevoice/ and VibeVoice/ parent folder case variations
- Add flexible subfolder scanning with VibeVoice-specific file detection
- Use get_all_tts_model_paths() instead of hardcoded directory paths
Fix ChatterBox v2 special token conversion and update documentation
Technical fixes:
- Fix v2 tag conversion not being applied in main code path
- Move conversion to top of _generate_tts_with_pause_tags
- Fix incorrect token names in CHANGELOG (laugh→laughter)
- Add experimental warning to documentation about limited token effectiveness
Add ChatterBox Official 23-Lang v2 with emotion/sound tokens
Implementation details:
- Add model version selection (v1/v2) to engine configuration
- Implement version-specific model loading with auto-download
- Add special token conversion system for emotions/sounds/effects
- Update bundled code to v2 specification (2454 vocab tokens)
- Fix v1/v2 cache isolation and engine instance separation
- Fix v2 model download path normalization and file detection
- Fix v1 compatibility with correct vocab size and tokenizer
Fix VibeVoice local model prefix handling
Technical details:
- Strip local: prefix for model lookups in vibevoice_downloader
- Fix model path resolution when using local: prefix
- Add chunk_combination_method parameter to unified node
- Implement native multi-speaker chunking support
- Use existing ImprovedChatterBoxChunker for intelligent text splitting
Fix VibeVoiceDownloader missing download_huggingface_model method
Technical details:
- Add missing download_huggingface_model method to VibeVoiceDownloader class
- Fix method delegation to unified_downloader in both real and dummy classes
- Resolve AttributeError when VibeVoice tokenizer download fails to cache
Fix VibeVoice auto device detection and model loading issues
Technical details:
- Fix model being moved to CPU after every generation
- Prevent redundant model loading through unified interface
- Add model already-loaded check in VibeVoice adapter
- Fix auto device detection logic running after cache checks
- Resolve aggressive memory management triggering unnecessarily
Add VibeVoice wildminder format compatibility
Technical changes:
- Implement [1] [2] [3] [4] numeric character tag support for native multi-speaker
- Replace synthetic voice samples with None for true zero-shot generation
- Increase CFG scale limit from 5.0 to 10.0
- Add direct Speaker mapping for numeric character tags
- Maintain full backward compatibility with existing character systems
Fix voice discovery extra_model_paths.yaml integration
Technical details:
- Fix path comparison logic in voice discovery system preventing extra_model_paths voice directories from being scanned
- Add proper path normalization using os.path.normpath() for accurate duplicate detection
- Apply fix to all voice discovery functions: main scanning, character discovery, and alias loading
- Maintain backward compatibility with existing voice directory structure