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

Fish Audio Get Voice (Ace Data Cloud)

One ID in, everything about that voice out

By AceDataCloud·Created 3 days ago·Updated 2 days ago· 0
Fish Audio Get Voice (Ace Data Cloud)
    • status
    • task_id
    • media_urls_json
    • first_media_url
    • result_json
    • trace_id
    ◄parameters_json{}►
    ◄id►

    The simplest node in the pack

    You have a voice ID - from a search, from a friend's workflow, from the result_json of Create Voice - and you want to know what it is. This node takes that ID and returns the service's full record for it: the title, the description, tags, the author, the sample URLs, whatever the Fish Audio model catalogue exposes.

    That's the whole job, and it's a genuinely useful job, because the ID is the only thing that travels between workflows in this pack. Everything else - which voice this is, whether it's yours or someone else's, whether a sample sounds like what you hoped - has to be asked for separately. This is the node you add when you're staring at "reference_id": "8f2c..." and can't remember where it came from.

    It's read-only. No credits, no new job, no risk. Just be aware the same key requirement applies as everywhere else in this pack.

    How it works

    The node takes id and issues a GET against /fish/model/{id}, with the identifier URL-encoded into the path and your bearer token in the Authorization header. Because it's a GET, the pack classifies it as read-only and gives it the retry treatment: up to three attempts with a short backoff on a network hiccup, a 10-second connect timeout, a 60-second read timeout, and no redirects followed. That's the same policy applied to Search Voices and task retrieval, and it's the opposite of how the paid writes behave - they get one shot and no second chance.

    The response is parsed, normalised, and flattened into the pack's standard six-string output shape. If the service reports an error for the ID - one that doesn't exist, one that's been deleted, one you don't have access to - the node raises "The service reported an error. Inspect the request using its task or trace ID." rather than returning an empty result, so "no such voice" and "the request broke" don't get confused.

    Inputs and outputs

    Two inputs:

    • id - required, and it's the only field the contract lists for this endpoint. It's a path parameter, so it goes into the URL rather than into a body. Case and punctuation matter here; copy the ID rather than retyping it.
    • parameters_json - the pack's standard advanced field, {} by default. There's nothing extra this endpoint accepts, so in practice you leave it alone.

    Outputs are status, task_id, media_urls_json, first_media_url, result_json and trace_id.

    For a lookup like this the interesting ones are result_json - the whole normalised record, which you'll want to open in a text node to read properly - and first_media_url, which will point at a preview clip if the voice has one. Wire that into Fish Audio Load Audio and you can audition a voice inside the graph, which is a much better way to choose one than reading a description. status will read succeeded on a clean lookup; task_id and trace_id are usually empty for a synchronous GET, and anything you do get is worth keeping for support.

    When to actually use it

    Two workflows, both common:

    Before a long generation run. Audition the voices you're considering, pick one, then commit it to reference_id on Generate Audio. Getting this wrong costs you a re-render.

    When a workflow lands in your lap. Someone shares a graph with a reference_id baked in, or you're cleaning up old projects and find a wall of IDs. Look them up, and either keep them or replace them with something you can identify. Since the ID is the only thing that survives a workflow export, this node is the documentation layer for that.

    If you don't have an ID yet, start with Fish Search Voices and get one - this node only looks at voices you can already name.

    Install

    Whole pack, same steps: ComfyUI Manager → search Fish Audio → publisher acedatacloud, package Fish Audio by Ace Data Cloud (registry ID fish-audio) → install → restart. Manually:

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

    requests and jsonschema, that's the dependency list. Nothing downloads and nothing needs a GPU, which is the honest pitch for this whole pack: audio tooling in ComfyUI usually means a dependency stack you'll fight later, and this one is a thin HTTP client wearing a node costume.

    Then put your credential where ComfyUI itself will see it - the process environment, not a workflow field:

    export ACEDATACLOUD_API_KEY=your_key_here
    

    Restart after setting it. The pack reads ACEDATACLOUD_API_KEY or ACEDATACLOUD_API_TOKEN at run time and fails with "Set ACEDATACLOUD_API_KEY in the ComfyUI process environment and restart." if neither is set - including here, on a call that costs nothing. The key lives on your side; nothing about the lookup itself is metered.

    Small gotchas

    • Empty id gets rejected before the request, so you'll see a validation error rather than a service error. Good - free failure.
    • An ID from a listing may not be publicly retrievable depending on how the voice was published. A private voice belonging to someone else won't resolve for you.
    • Don't read media_urls_json as a list of clips you can batch. For a single voice record there's normally one sample at most; first_media_url is the one that matters.
    • The record is metadata, not quality. A well-described voice can still sound bad, and a one-line description can hide a great one. Audition before you build a pipeline on it.
    CategoryAce Data Cloud/Fish Audio

    Inputs (2)

    NameTypeDefaultDescription
    parameters_jsonSTRING{}—
    idSTRING—

    Outputs (6)

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