Nodes/ComfyUI TS CosyVoice RU Edition/TS CosyVoice Voice To Voice
ComfyUI Node

TS CosyVoice Voice To Voice

Take a recording, hand it a different voice, keep the performance

By AlexYez·Created 5 months ago·Updated about a month ago· 3
TS CosyVoice Voice To Voice
  • model
  • source_audio
  • target_audio
  • audio
speed1.00
pitch_shift_semitones0
seed42
diffusion_steps10
guidance_strength0.70
normalize_outputfalse
target_rms_dbfs-20.0

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_dbfs defaults 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_strength down toward 0.7 and check diffusion_steps before 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 pyworld isn'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.

CategoryTS CosyVoice3/Synthesis

Inputs (10)

NameTypeDefaultDescription
modelCOSYVOICE_MODELЗагруженная модель CosyVoice из ноды загрузчика.
source_audioAUDIOИсходное аудио, которое нужно преобразовать в другой тембр.
target_audioAUDIOРеференс целевого голоса; будет обрезан до 30 секунд и приведен к оптимальному формату.
speedFLOAT1.000.5–2Множитель скорости итоговой речи.
pitch_shift_semitonesINT0-12–12Сдвиг высоты тона исходного аудио в полутонах перед voice conversion.
seedoptINT42-1–2147483647Зерно случайности; значение -1 использует случайный seed.
diffusion_stepsoptINT104–60Число шагов флоу-декодера. 10 — значение модели по умолчанию (быстро); 25–40 даёт больше деталей и пропорционально дольше считает.
guidance_strengthoptFLOAT0.700–1.5Сила classifier-free guidance. 0.7 — значение из конфигурации модели; выше — ближе к референсу, но растёт риск артефактов.
normalize_outputoptBOOLEANfalseПриводит громкость результата к целевому уровню RMS, чтобы разные референсы давали сопоставимую громкость.
target_rms_dbfsoptFLOAT-20.0-40–-6Целевой уровень RMS в dBFS при включённой нормализации. Это RMS, а не LUFS: пики ограничиваются -1 dBFS.

Outputs (1)

NameTypeDescription
audioAUDIO