Nodes/FishAudioComfyUI/Fish Audio Create Voice (Ace Data Cloud)
ComfyUI Node

Fish Audio Create Voice (Ace Data Cloud)

Fish Audio Create Voice clones a voice from one URL — no training run, no dataset

By AceDataCloud·Created 3 days ago·Updated 2 days ago· 0
Fish Audio Create Voice (Ace Data Cloud)
    • status
    • task_id
    • media_urls_json
    • first_media_url
    • result_json
    • trace_id
    ◄parameters_json{}►
    ◄voice_url►
    ◄title►
    ◄description►
    ◄image_url►
    ◄callback_url►

    What you're buying here

    This node turns a clip of someone talking into a reusable voice on your account. You point it at an audio URL, it hands the service a job, and a few seconds later you have a voice ID you can paste into Generate Audio's reference_id forever after. No dataset, no GPU hours, no LoRA, no fine-tune - that's the entire appeal, and it's the reason cloud cloning still gets used.

    It's worth being honest about the tradeoff against local options. In 2025, zero-shot cloning landed locally: Chatterbox clones from about five seconds of reference audio at quality the community genuinely stopped treating a paid API as mandatory for. There is a real argument that if the voice never leaves your machine, you should just do it locally. What the hosted services still win is consistency across languages and the kind of delivery control that's hard to reach with a general-purpose open model - so this node is for when you want the voice as a service, stored and addressable, rather than as a model file on your disk.

    Two things to say out loud before you use it. Your reference audio is uploaded to a third party, so don't clone a voice you don't have the right to clone - that's a consent problem, not just a policy one. And it costs credits, like every other write action in this pack.

    How it works

    The node builds a body, validates it against the pack's vendored copy of Fish Audio's published contract using jsonschema, and only then sends POST /fish/voices with your bearer token. Validation runs first, which means a malformed field errors out locally instead of becoming a paid request.

    Because the endpoint accepts asynchronous work, the client submits with async: true - so the node returns almost immediately with status = pending and a task_id. That's expected. Grab that task_id. It's your only handle on a job the service may already have accepted, and the pack never retries a paid submission: read-only lookups get three attempts with backoff, writes get exactly one. If the connection drops, don't press Queue again - retrieve the task and see what happened.

    The fields

    Only one input is required:

    • voice_url - a URL to an audio sample of the voice. This is a URL, not a filename: point it at something the service can fetch. Per the contract it must be a plain string (no length or scheme hint beyond that), and it is the one field the API refuses to run without.
    • title - a human name for the voice. You will want this the moment you have more than three of them.
    • description - a free-text note, useful for "male, newsreader, slightly nasal, English + Spanish" so future-you can pick the right ID.
    • image_url - an avatar for the voice. Cosmetic, but it shows up in listings, which makes Search Voices much easier to scan.
    • callback_url - where the service posts when the job finishes, if you don't want to poll.
    • parameters_json - the pack-wide advanced field, {} by default. The contract for this endpoint also has an async boolean; a non-empty named widget always overrides the matching key in the JSON.

    Values are strings in the UI and get coerced to the types the contract declares, so true/false and numeric strings behave as you'd hope.

    Outputs, and the awkward part

    Six strings out: status, task_id, media_urls_json, first_media_url, result_json and trace_id.

    For a voice-clone job, media_urls_json and first_media_url are usually empty - you didn't ask for audio, you asked for a stored voice, and the thing you want is an ID inside result_json. Open that JSON, find the new voice's identifier, and paste it into the reference_id field on Fish Generate Audio. That two-step - create, then read the ID out of a JSON blob by hand - is the clumsiest part of the whole pack. If the service returns a preview sample with the response, first_media_url will point at it; wire that into Fish Audio Load Audio to hear what you just made before you build a workflow around it.

    If the task is still pending, run Fish Audio Retrieve Task with the task_id and a wait_seconds of 30–60. Querying the same ID repeatedly is free; re-running this node is not.

    Install

    Manager is the easy path: search Fish Audio, check that the publisher says acedatacloud and the package is Fish Audio by Ace Data Cloud (registry ID fish-audio), install, restart. By hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/AceDataCloud/FishAudioComfyUI
    cd FishAudioComfyUI && python -m pip install -r requirements.txt
    

    Two dependencies, no model downloads, no VRAM. Set your credential in the environment ComfyUI was launched from and restart:

    export ACEDATACLOUD_API_KEY=your_key_here
    

    The pack reads ACEDATACLOUD_API_KEY or ACEDATACLOUD_API_TOKEN from the process environment only - a key typed into a workflow node does nothing, and sharing a workflow can't leak it. Miss it entirely and you get "Set ACEDATACLOUD_API_KEY in the ComfyUI process environment and restart."

    Where people get burned

    • A voice_url nobody can fetch. If the service can't download the sample, the job fails and you get "Task failed. Use its task or trace ID to inspect the service request." - the graph won't say which field was at fault. Test the URL in a browser; a local file path will never work.
    • Expecting audio back. The product here is an ID, not a clip. Wire first_media_url into Load Audio while the task is pending and you get "Task is pending; retrieve the same task ID again."
    • Bad reference audio → a bad voice, permanently. Ten seconds of someone talking in a quiet room beats two minutes of noisy interview; the model learns the room too.
    • Cloning without permission. Beyond being the decent thing to care about, hosted providers run their own verification on voice cloning. The node can't bypass that, and neither can you.
    CategoryAce Data Cloud/Fish Audio

    Inputs (6)

    NameTypeDefaultDescription
    parameters_jsonSTRING{}—
    voice_urlSTRING—
    titleSTRING—
    descriptionSTRING—
    image_urlSTRING—
    callback_urlSTRING—

    Outputs (6)

    NameTypeDescription
    statusSTRING—
    task_idSTRING—
    media_urls_jsonSTRING—
    first_media_urlSTRING—
    result_jsonSTRING—
    trace_idSTRING—