[PR #35] [MERGED] feat(commands): add /comfy-cloud:clone-voice #33

Closed
opened 2026-10-26 22:34:13 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/Comfy-Org/comfy-skills/pull/35
Author: @mattmillerai
Created: 9/16/2026
Status: ✅ Merged
Merged: 10/22/2026
Merged by: @mattmillerai

Base: main ← Head: feat/clone-voice-skill


📝 Commits (2)

  • 35330ac feat(commands): add /comfy-cloud:clone-voice
  • 56bc618 fix(clone-voice): resolve the template schema before overrides, wait for the batch before collecting

📊 Changes

2 files changed (+118 additions, -0 deletions)

View changed files

📝 README.md (+1 -0)
➕ claude-code/commands/clone-voice.md (+117 -0)

📄 Description

ELI5

Comfy Cloud can already copy a voice. You give it a short recording of someone talking, then type any sentence, and it says that sentence in their voice. There was no slash command for it, so this adds one.

It starts by asking who the voice belongs to. It only continues if it's your own voice, a voice you have permission to use, or a made-up one.

What this adds

/comfy-cloud:clone-voice — clone a voice from a reference recording and speak arbitrary text with it, using the Chatterbox zero-shot voice-cloning template on Comfy Cloud.

The flow is entirely MCP-native:

  1. upload_file the reference clip → returns a name
  2. Pick the Chatterbox template — audio-chatterbox_tts (one voice, English), audio-chatterbox_tts_multilingual (non-English target, adds a language input) or audio-chatterbox_tts_dialog (multi-speaker script, one LoadAudio per speaker) — and call get_template_schema on it
  3. run_template with input_overrides keyed by the node ids that schema returns: the LoadAudio node's audio gets the uploaded name, the Chatterbox TTS node's text (or dialog_text) gets the line. The ids differ per template, so they come from the schema, not memory; the single-voice template currently resolves to node 6 (LoadAudio) and node 4 (FL_ChatterboxTTS)
  4. Poll get_job_status, then get_output

Multi-line jobs go through one submit_batch, then wait_for_batch until every job is terminal, then get_batch_output — rather than N separate runs.

Why now

upload_file accepts .mp3/.wav/.flac/.ogg and hands back a name that drops straight into LoadAudio. That closes the gap that previously made this awkward — the reference no longer needs a separate API key or a publicly-hosted URL, and the upload and the generation stay in one session.

Voice cloning a real person is the sensitive part, so Step 0 is a consent check, not a footnote. The command proceeds only for the user's own voice, a voice they have explicit permission to clone, or a fictional/licensed one — and stops on anything that reads as impersonating someone to a third party or manufacturing a recording they never made.

Provenance

Verified:

  • End to end against audio-chatterbox_tts before opening: upload_file with a .wav returned an input name; run_template with node 6 audio + node 4 text overridden → job 4c65d7f4-5d2a-49ad-9f06-13a35d40330d completed, MP3 retrieved via get_output
  • The conversion_warning: Node 6 (LoadAudio): 1 extra widget values not mapped that comes back is the node's audioUI preview widget and is non-fatal — the command documents it so nobody cancels a working job over it
  • Current head: both CodeRabbit threads (schema-first overrides, wait_for_batch before get_batch_output) addressed in 56bc618 and resolved; CodeRabbit and Socket checks pass

Deviations:

  • The get_template_schema step and the wait_for_batch step were added after the end-to-end run (review follow-up); the multilingual and dialog templates were not run end to end
  • Docs-only change; no runtime code touched

🤖 Generated with Claude Code


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/Comfy-Org/comfy-skills/pull/35 **Author:** [@mattmillerai](https://github.com/mattmillerai) **Created:** 9/16/2026 **Status:** ✅ Merged **Merged:** 10/22/2026 **Merged by:** [@mattmillerai](https://github.com/mattmillerai) **Base:** `main` ← **Head:** `feat/clone-voice-skill` --- ### 📝 Commits (2) - [`35330ac`](https://github.com/Comfy-Org/comfy-skills/commit/35330ac47a9b95b58ddba1407ef9b91d3c55db7e) feat(commands): add /comfy-cloud:clone-voice - [`56bc618`](https://github.com/Comfy-Org/comfy-skills/commit/56bc618e6c4f1c0dba9df743e88e4bb61d6c068e) fix(clone-voice): resolve the template schema before overrides, wait for the batch before collecting ### 📊 Changes **2 files changed** (+118 additions, -0 deletions) <details> <summary>View changed files</summary> 📝 `README.md` (+1 -0) ➕ `claude-code/commands/clone-voice.md` (+117 -0) </details> ### 📄 Description ## ELI5 Comfy Cloud can already copy a voice. You give it a short recording of someone talking, then type any sentence, and it says that sentence in their voice. There was no slash command for it, so this adds one. It starts by asking who the voice belongs to. It only continues if it's your own voice, a voice you have permission to use, or a made-up one. ## What this adds `/comfy-cloud:clone-voice` — clone a voice from a reference recording and speak arbitrary text with it, using the Chatterbox zero-shot voice-cloning template on Comfy Cloud. The flow is entirely MCP-native: 1. `upload_file` the reference clip → returns a `name` 2. Pick the Chatterbox template — `audio-chatterbox_tts` (one voice, English), `audio-chatterbox_tts_multilingual` (non-English target, adds a `language` input) or `audio-chatterbox_tts_dialog` (multi-speaker script, one `LoadAudio` per speaker) — and call `get_template_schema` on it 3. `run_template` with `input_overrides` keyed by the node ids that schema returns: the `LoadAudio` node's `audio` gets the uploaded name, the Chatterbox TTS node's `text` (or `dialog_text`) gets the line. The ids differ per template, so they come from the schema, not memory; the single-voice template currently resolves to node 6 (`LoadAudio`) and node 4 (`FL_ChatterboxTTS`) 4. Poll `get_job_status`, then `get_output` Multi-line jobs go through one `submit_batch`, then `wait_for_batch` until every job is terminal, then `get_batch_output` — rather than N separate runs. ## Why now `upload_file` accepts `.mp3/.wav/.flac/.ogg` and hands back a name that drops straight into `LoadAudio`. That closes the gap that previously made this awkward — the reference no longer needs a separate API key or a publicly-hosted URL, and the upload and the generation stay in one session. ## Consent gate Voice cloning a real person is the sensitive part, so Step 0 is a consent check, not a footnote. The command proceeds only for the user's own voice, a voice they have explicit permission to clone, or a fictional/licensed one — and stops on anything that reads as impersonating someone to a third party or manufacturing a recording they never made. ## Provenance **Verified:** - End to end against `audio-chatterbox_tts` before opening: `upload_file` with a `.wav` returned an input `name`; `run_template` with node 6 `audio` + node 4 `text` overridden → job `4c65d7f4-5d2a-49ad-9f06-13a35d40330d` `completed`, MP3 retrieved via `get_output` - The `conversion_warning: Node 6 (LoadAudio): 1 extra widget values not mapped` that comes back is the node's `audioUI` preview widget and is non-fatal — the command documents it so nobody cancels a working job over it - Current head: both CodeRabbit threads (schema-first overrides, `wait_for_batch` before `get_batch_output`) addressed in 56bc618 and resolved; CodeRabbit and Socket checks pass **Deviations:** - The `get_template_schema` step and the `wait_for_batch` step were added after the end-to-end run (review follow-up); the multilingual and dialog templates were not run end to end - Docs-only change; no runtime code touched 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-10-26 22:34:13 +00:00
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Comfy-Org/comfy-skills#33
No description provided.