TS CosyVoice Voice To Voice
Take a recording, hand it a different voice, keep the performance
- model
- source_audio
- target_audio
- audio
TS CosyVoice Voice To Voice is the one that swaps a voice inside an existing recording. You give it a source_audio - whatever was actually said - and a target_audio - the voice you want to hear instead. What comes out is the source's words and delivery, in the target's timbre. Same performance, different voice. It's voice conversion rather than synthesis, which makes it the right tool when you need to keep an existing take's pacing, emphasis, and emotional arc instead of re-generating from text.
The honest version of that pitch: this is also the fiddliest and slowest node in the pack. It's worth it, but you're paying in GPU minutes and parameters you'll actually have to touch.
How it works
The source decides what's said; the target decides how it sounds. target_audio is always trimmed to 30 seconds - it's just a timbre reference. source_audio has no length limit: long recordings are split on silences into chunks of at most 24 seconds, with a 1-second overlap, and each chunk is converted in isolation. That's where the engineering shows up. The seams are aligned on the overlap using a SOLA correlation search and crossfaded, so you don't get the clicks, dropouts, or mid-word timbre resets that naive chunk-and-stitch converters produce.
There's also an optional pitch_shift_semitones (‑12 to +12) applied to the source before conversion - formant-preserving via the WORLD vocoder when pyworld is installed, with a phase-vocoder fallback if it isn't. If you're trying to move a male take up to a female range, this is how.
The inputs that matter
source_audio/target_audio- the two inputs that define the whole operation.diffusion_steps(default 10) - the flow-matching decoder's steps. 10 is the model default and fast; 25–40 buys more detail at proportionally more time. This is the main quality/seconds knob.guidance_strength(default 0.7) - classifier-free guidance. Higher hugs the reference closer, but you start trading for artifacts past ~1.0. It's a known trap: crank it and voices get that warbly, over-fit sound.pitch_shift_semitones- usually 0; only touch it if the take and target sit in different ranges.normalize_output/target_rms_dbfs- optional loudness leveling.target_rms_dbfsdefaults to ‑20 dBFS; it's RMS, not LUFS, and peaks are limited at ‑1 dBFS. Handy if you're converting a whole corpus of clips and want consistent loudness.
Output
One audio output, straight to Save Audio. Pipeline: Model Loader → Voice To Voice → Save Audio.
Installing
Same pack - ComfyUI Manager (search TS CosyVoice) or:
cd ComfyUI/custom_nodes
git clone https://github.com/AlexYez/comfyui-ts-cosyvoice.git
cd comfyui-ts-cosyvoice
pip install -r requirements.txt
Plus one ONNX Runtime and CUDA torch before the pack's deps. For the formant-preserving pitch shift, pip install pyworld - it's optional (phase-vocoder fallback exists) but it's the better shift and the node logs which path it took.
Troubleshooting
- It's painfully slow on CPU. The README's warning is not rhetorical: a 10-minute recording on CPU can take hours. Run it on GPU. Text to Voice is tolerable on CPU; this node is a GPU job.
- Voices sound "over-fit" or warbly - back
guidance_strengthdown toward 0.7 and checkdiffusion_stepsbefore blaming the reference. - Clicks or dips at chunk boundaries - should be rare with the SOLA join, but a source with long unnatural silences gives the splitter less to work with. Clean the source.
- Pitch shift does nothing - check the log for whether it fell back to the phase vocoder because
pyworldisn't installed.
Reach for this node when you've already got a performance you like and just want it in another voice. Everything else in the pack synthesizes from text; this one respects what's already on tape.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COSYVOICE_MODEL | Загруженная модель CosyVoice из ноды загрузчика. | |
| source_audio | AUDIO | Исходное аудио, которое нужно преобразовать в другой тембр. | |
| target_audio | AUDIO | Референс целевого голоса; будет обрезан до 30 секунд и приведен к оптимальному формату. | |
| speed | FLOAT | 1.000.5–2 | Множитель скорости итоговой речи. |
| pitch_shift_semitones | INT | 0-12–12 | Сдвиг высоты тона исходного аудио в полутонах перед voice conversion. |
| seedopt | INT | 42-1–2147483647 | Зерно случайности; значение -1 использует случайный seed. |
| diffusion_stepsopt | INT | 104–60 | Число шагов флоу-декодера. 10 — значение модели по умолчанию (быстро); 25–40 даёт больше деталей и пропорционально дольше считает. |
| guidance_strengthopt | FLOAT | 0.700–1.5 | Сила classifier-free guidance. 0.7 — значение из конфигурации модели; выше — ближе к референсу, но растёт риск артефактов. |
| normalize_outputopt | BOOLEAN | false | Приводит громкость результата к целевому уровню RMS, чтобы разные референсы давали сопоставимую громкость. |
| target_rms_dbfsopt | FLOAT | -20.0-40–-6 | Целевой уровень RMS в dBFS при включённой нормализации. Это RMS, а не LUFS: пики ограничиваются -1 dBFS. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |