- Print the active ComfyUI Python executable with install.py
- Remove misleading requirements.txt and package-specific repair advice
- Add regression coverage for installation guidance
Fix Python 3.13 numba and librosa compatibility handling
Technical details:
- Stop forcing NUMBA_DISABLE_JIT at startup on Python 3.13
- Use safe audio loading and resampling in IndexTTS-2 and ChatterBox Official 23-Lang
- Update audio hashing and fallback paths for newer numba stacks
Address issue #271 Voice Capture startup and input device handling
Technical details:
- Defer sounddevice import and PortAudio probing until Voice Capture is actually used
- Restore the Voice Capture record button and replace the temporary raw device text field with a lazy dropdown
- Resolve system default input devices explicitly and use native sample rate for the default path
- Keep IndexTTS-2 unchanged because it reproduces successfully in our Python 3.13 environment
fix: catch numba JIT crash at startup and disable JIT automatically
- Silent except in numba compat check was swallowing the crash
- When librosa.resample test crashes at startup, JIT is now disabled
- Affected users: numba 0.64.0 + NumPy 2.x on specific hardware (RTX 5080 confirmed)
- verbose=True so users can see when JIT gets disabled and why
Fix: Restore Numba/librosa JIT compatibility test at startup for NumPy 2.x
- Restore full librosa JIT test at startup for NumPy 2.x environments
- PR 262 lazy-import optimization had deferred this test too late, after numba
was already loaded, making NUMBA_DISABLE_JIT ineffective
- NumPy 1.x users still skip the test entirely (zero cost)
- Python 3.13+ still handled by preemptive env var (zero cost)
- Addresses get_call_template AttributeError crash in librosa on affected hardware
Restrict Transformers to Qwen3-TTS-compatible range
Implementation details:
- Cap transformers<=4.57.3 in requirements and installer
- Add startup warning when Transformers 5.x is detected
- Add investigation report for Qwen3-TTS + Transformers 5.x
Add Qwen3-TTS torch.compile optimizations (based on dffdeeq/Qwen3-TTS-streaming)
Implementation:
- Integrate streaming optimizations from dffdeeq/Qwen3-TTS-streaming fork
- Add torch.compile support with mode selection (default/reduce-overhead/max-autotune)
- Add manual CUDA graph capture option for additional optimization
- Update to support PyTorch 2.10+ and triton-windows 3.6+
- Remove obsolete inductor patches (not needed for PyTorch 2.10+)
- Add comprehensive optimization documentation with benchmark results
- Enable TensorFloat32 for Ampere+ GPUs automatically
Credit: Streaming implementation based on work by dffdeeq
https://github.com/dffdeeq/Qwen3-TTS-streaming
Fix CosyVoice device mismatch in voice restoration
Technical implementation:
- Add CosyVoiceHandler.partially_load() for proper device reload
- Update base_wrapper.model_load() to use handler's partially_load()
- Move all CosyVoice components (llm, flow, hift, campplus) with nested modules
- Simplify CosyVoice engine wrapper device management (delegate to handler)
- Add CosyVoice variant setting for <restore> tags (RL/standard options)
- Update settings UI and API endpoint for variant selection
Fixes device tensor mismatch errors when TTS and VC restoration run sequentially
and prevents unnecessary model unload/reload when variants match.
Fix utils package import conflicts
Technical details:
- Replace all from utils... imports with direct file path loading in __init__.py
- Use importlib.util.spec_from_file_location for numba_compat, ffmpeg_utils, and API endpoints
- Prevent Python path pollution from other extensions with utils.py files
- Maintain silent success behavior for numba compatibility checks
Fixed CPU offloading for non-quantized (bfloat16/float16/float32) models:
- StepAudioTTS components (llm, cosy_model) don't have .to() method directly
- Handler now moves model.llm and model.cosy_model.cosy_impl individually
- Updates CosyVoice.device tracker when moving cosy_impl to CPU
- Properly handles both raw StepAudioTTS and wrapped models
Fixes unload behavior for non-quantized models to actually free VRAM
instead of silently failing with "no memory freed (model may already be on CPU)"
Fixes critical bug where transformers 4.54+ incorrectly ties lm_head weights
to embed_tokens, causing Step Audio EditX to generate text tokens instead of
audio tokens (silent/gibberish output).
Root cause:
- Transformers 4.54+ ties lm_head to embed_tokens even when checkpoint has different values
- Step-Audio-EditX has lm_head (norm=227) and embed_tokens (norm=255) as separate weights
- Tying overwrites correct lm_head, breaking audio generation
Changes:
- model_loader.py: Add workaround to restore correct lm_head weights after loading
- Detects incorrect weight tying by comparing data pointers
- Loads correct lm_head.weight from safetensors
- Works with transformers 4.54-4.57+
- Clean up debug code and console spam:
- Remove torch_complex warnings (funasr_detach files)
- Remove sox import and unused audio functions
- Silence FunASR registration tables
- Filter torchaudio deprecation warnings
Upstream fix:
- Submitted PR to transformers: https://github.com/huggingface/transformers/pull/42612
- Workaround will remain for backward compatibility with unfixed versions
Tested with transformers 4.57.3 - generates audio tokens correctly.
- Clarify that global patch solves TWO issues: TorchCodec DLL + int16 normalization
- Explain timing criticality: patch must apply before torchaudio import
- Remove redundant pytorch_patches call from apply_all_compatibility_patches()
- Update save_audio_safe docstring to explain defense-in-depth approach
- Add detailed docstring to pytorch_patches explaining both issues and fixes
Removed torchcodec from requirements.txt and install.py to eliminate the FFmpeg
system dependency that was causing Windows installation failures.
Implementation:
- Removed torchcodec>=0.2.0 from requirements.txt
- Removed torchcodec>=0.2.0 from install.py core_packages list
- Removed torchaudio 2.9+ migration warnings (no longer applicable)
- Added AudioProcessingUtils.safe_load_audio() utility for robust audio loading
- Updated all audio loading calls to use fallback-aware utility function
Audio Loading Changes:
- character_voices_node.py: Uses safe_load_audio() with fallback support
- tts_text_node.py: Uses safe_load_audio() for narrator and character voices (2x)
- tts_srt_node.py: Uses safe_load_audio() for narrator voice
- higgs_audio_tts_processor.py: Uses safe_load_audio() (2x)
- higgs_audio_srt_processor.py: Uses safe_load_audio() (2x)
- index_tts_processor.py: Uses safe_load_audio() (2x)
- f5tts_streaming_adapter.py: Uses safe_load_audio()
- higgs_audio_adapter.py: Uses safe_load_audio()
- subprocess.py: Uses safe_load_audio()
Compatibility:
- torchaudio.load() works fine with fallback backends (soundfile, scipy)
- No quality loss - only negligible audio loading speed difference (~milliseconds)
- All existing audio formats supported
- Better error handling with graceful fallbacks
Modified /api/tts-audio-suite/available-characters to return both
character filenames and their aliases from the character alias map.
This allows the tag editor dropdown to show friendly alias names like
'Alice' alongside actual voice files.
Changed /api/tts-audio-suite/available-languages endpoint to derive
languages from the authoritative LANGUAGE_ALIASES dictionary in
language_mapper.py instead of hardcoded list. This ensures the tag
editor always has all supported language codes.
- Added language-constants.js with API-driven language list (fallback to hardcoded)
- Added /api/tts-audio-suite/available-languages endpoint in __init__.py
- Updated widget-ui-builder.js to use getSupportedLanguages()
- Updated widget-event-handlers.js to use isLanguageCode() for detection
- Fixes issue where [seed:5|steps:3] now correctly becomes [de:|seed:5|steps:3]
instead of [de:5|steps:3] by properly detecting language codes vs parameters
- Create /api/tts-audio-suite/available-characters endpoint
- Make widget's populateCharacters() async and try to fetch from API
- Falls back to hardcoded defaults if API unavailable
- Endpoint returns sorted list of discovered character voices
Centralize numba compatibility system with smart testing
Technical implementation:
- Replace 15+ duplicate JIT workaround blocks with unified system
- Add utils/compatibility/numba_compat.py with startup testing
- Implement fallback for environments without compatibility module
- Test librosa.stft() at startup and apply workarounds only when needed
- Eliminate contradictory startup messages between init and nodes
- Maintain backward compatibility with legacy Python 3.13 fixes
- Enhanced geometric feature extraction for comprehensive mouth shape analysis
- Implemented vowel classification (A, E, I, O, U) based on lip geometry
- Added new SRT format option to display detected viseme sequences
- New toggle for enabling/disabling viseme detection
- Caching system supports viseme detection state
- Viseme sequences grouped for readability (A3-E2-I-O4)
Technical implementation:
- Extract 8 geometric features: lip width/height, mouth area, roundedness, curvature
- Rule-based vowel classification with confidence scoring
- Frame-by-frame viseme detection integrated with existing movement analysis
- ~20% performance impact when enabled, fully cached for repeated analysis
- Replace relative imports with absolute imports using importlib.util
- Fixes 'attempted relative import with no known parent package' error
- All unified nodes (TTS Text, TTS SRT, Voice Changer) now use consistent import pattern
- Preserves engine delegation functionality while fixing startup issues
Phase 1 Complete: F5-TTS Edit Improvements Plan
- Add 🔧 F5-TTS Edit Options node following Audio Analyzer pattern
- Implement smart caching system with LRU eviction for fast iteration
- Enhanced crossfade with configurable curves (linear, cosine, exponential)
- Adaptive crossfade adjusts duration based on segment size
- Cache system supports 10-1000 entries with MD5-based keys
- Backward compatibility: main node works without options node
- Restore F5-TTS Speech Editor (OLD) for comparison testing
Technical improvements:
- core/f5tts_edit_cache.py: Complete caching infrastructure
- core/audio_compositing.py: Enhanced with curve types and adaptive behavior
- core/f5tts_edit_engine.py: Integrated cache and options support
- nodes/f5tts_edit_options_node.py: New options node with all parameters
- nodes/f5tts_edit_node_old.py: Restored original version for comparison
Ready for testing problematic segments like "55" to "7 year"
- Renamed '🎵 Audio Analyzer' to '🌊 Audio Wave Analyzer' throughout project
- Updated all node display names, tooltips, documentation, and web interface
- Preserved class names and internal identifiers for ComfyUI compatibility
- Fixed nfe_step bug in F5-TTS nodes: limited max value to 71 to prevent ODE solver issues
- Added validation clamping and warning messages in F5-TTS Node and F5-TTS Edit Node
- Updated tooltips to warn about ODE solver issues above 71