๐ง F5-TTS Edit Options
The seam-hiding knobs for F5 speech editing
- edit_options
F5-TTS has a genuinely cool trick: speech editing. Instead of regenerating a whole take because you flubbed one word, you can regenerate just that word and splice it back into the original audio. The hard part isn't the regeneration - it's making the splice invisible, so the fixed word doesn't sit at a different volume, a different tone, with an audible click where it joins. That's what this node is for. It's a bundle of audio-stitching options you connect to an F5-TTS edit workflow, and its whole job is making edits sound seamless.
This is an options node, not an engine. It doesn't generate anything on its own. It outputs an F5TTS_EDIT_OPTIONS object that plugs into the F5-TTS speech-editing node to tune how boundaries between original and regenerated audio are handled. Every one of its fields is optional, and the defaults are already tuned for good results - you reach for this node only when a specific edit sounds off.
How it works
When you splice regenerated audio into an existing clip, several things can betray the edit: a level jump at the boundary, a tonal mismatch, a hard transition. This node exposes controls for each. There's crossfading at the join (crossfade_duration_ms, crossfade_curve, adaptive_crossfade), level and tone matching across the seam (boundary_volume_matching, full_segment_normalization, post_rms_normalization, dynamic_range_compression), and heavier optional matching for tricky cases (spectral_matching, noise_floor_matching). There's also a small cache (enable_cache, cache_size_limit, force_cache_clear) so repeated edits don't reprocess.
The inputs and outputs that matter
You rarely touch more than two or three:
crossfade_duration_ms(default 100) - how long the blend at the edit boundary lasts. Hear a click or abrupt cut at the join? Lengthen it. Hear the edit smearing into neighboring words? Shorten it.crossfade_curve-linear,cosine(default), orexponential. Cosine is the natural-sounding default; the others are there for edge cases.boundary_volume_matching(on) andpost_rms_normalization(0.1) - keep the regenerated word at the same loudness as its neighbors. If the fixed word is noticeably louder or quieter, these are your levers.spectral_matchingandnoise_floor_matching(both off) - heavier tone/noise matching. Turn them on only when a splice sounds tonally wrong or the background hiss doesn't match; they cost more and aren't needed for clean edits.
Output: edit_options (F5TTS_EDIT_OPTIONS) โ into the F5-TTS edit node.
Installing it
Comes with the pack (F5-TTS is one of the bundled engines). ComfyUI Manager โ search "TTS Audio Suite" โ install โ restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/diodiogod/TTS-Audio-Suite.git
cd TTS-Audio-Suite
python install.py
No separate download for this node - it's pure logic. The F5-TTS model itself auto-downloads when you actually run an edit.
Common issues & troubleshooting
Audible click or seam at the edit. Raise crossfade_duration_ms so the transition blends over a longer window, and make sure boundary_volume_matching is on. A hard join is almost always too-short a crossfade.
The fixed word is louder/quieter than the rest. That's a level mismatch - boundary_volume_matching and post_rms_normalization exist for exactly this. If it persists, full_segment_normalization evens the whole segment.
The edit sounds like a different room. Now you're in tonal/noise-floor territory. Turn on spectral_matching and noise_floor_matching - the heavier options that match the character of the surrounding audio, not just its volume.
You're overthinking it. The defaults are tuned to work. If an edit already sounds clean, don't touch this node - every field is optional for a reason.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| crossfade_duration_msopt | INT | 1000โ500 | Crossfade duration in milliseconds for smooth transitions between segments |
| crossfade_curveopt | COMBO | cosine | Crossfade curve type: linear (constant), cosine (smooth), exponential (sharp) |
| adaptive_crossfadeopt | BOOLEAN | false | Automatically adjust crossfade duration based on segment size |
| enable_cacheopt | BOOLEAN | true | Cache F5-TTS generation to speed up subsequent runs with identical parameters |
| cache_size_limitopt | INT | 10010โ1000 | Maximum number of cached audio segments to store in memory |
| boundary_volume_matchingopt | BOOLEAN | true | EXPERIMENTAL: Automatically match volume levels at segment boundaries to reduce clicks/pops |
| full_segment_normalizationopt | BOOLEAN | true | EXPERIMENTAL: Normalize entire generated segments to match surrounding original audio RMS levels |
| spectral_matchingopt | BOOLEAN | false | EXPERIMENTAL: Apply EQ to match spectral characteristics of original audio |
| noise_floor_matchingopt | BOOLEAN | false | EXPERIMENTAL: Add subtle noise to match the background noise level of original audio |
| dynamic_range_compressionopt | BOOLEAN | true | EXPERIMENTAL: Apply gentle compression to reduce volume spikes and make transitions smoother |
| post_rms_normalizationopt | FLOAT | 0.100.01โ1 | Post-processing RMS normalization level. Applied after F5-TTS generation to normalize generated segments volume (does not affect original segments). |
| force_cache_clearopt | BOOLEAN | false | Force clear cache for debugging (will regenerate F5-TTS audio) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| edit_options | F5TTS_EDIT_OPTIONS | โ |