Fish Audio Load Audio (Ace Data Cloud)
Fish Audio Load Audio is the boring adapter that makes cloud TTS usable in a local graph
- audio
The one-line job
Every other node in this pack hands you a URL. This one turns a URL into a ComfyUI AUDIO you can actually wire to something. It takes media_url, downloads the file, decodes it, and emits a single AUDIO output named audio - waveform plus sample rate, the same structure SaveAudio and every local audio node expects.
That's it. But it's the node that decides whether the rest of the pack is useful, because a URL isn't audio. Without this step your generated speech floats outside the graph, and you're back to downloading MP3s by hand and dragging them in through a loader - which is exactly the seam that makes cloud audio annoying to graft onto a local pipeline.
What it will and won't accept
It is deliberately strict about the URL, and the strictness is the whole security story of the pack:
- HTTPS only. Plain
httpis rejected. - Ace CDN hosts only. The allowlist is
cdn.acedata.cloud,cdn.acedata2.cloud,platform.cdn.acedata.cloudandplatform2.cdn.acedata.cloud. A link to your own file server, a Drive share, or any other host fails with "Media URL must be an Ace Data Cloud HTTPS CDN link." - Redirects are not followed, and URLs with embedded credentials are refused.
- 128 MiB cap. Anything larger is rejected before it lands on disk - "Media exceeds the 128 MiB limit."
Downloads are retried up to three times with a short backoff, and the response is streamed, so a flaky CDN hop usually resolves itself.
Decoding uses PyAV (av.open), which ComfyUI already ships - you don't install it yourself, and the pack's own requirements.txt lists only requests and jsonschema. Failures are reported generically: "The media link does not contain valid audio." or "The media link contains no audio stream." You won't get a codec dump in the graph output, which is fine for MP3/WAV and occasionally annoying when an exotic container shows up.
Wiring it
You give it one input - media_url - and it gives you one output - audio (type AUDIO). The natural connection is from the first_media_url output of Fish Generate Audio:
Fish Generate Audio → first_media_url → media_url [Load Audio] → audio → SaveAudio
The catch is timing, and it's the only thing that reliably confuses people. Submissions are asynchronous, so first_media_url is an empty string until the task finishes. If you wire it in directly, the node raises "Task is pending; retrieve the same task ID again." - which reads like a failure and isn't one.
Do it in two passes instead. Run the generation, then point a Fish Audio Retrieve Task node at the saved task ID, set wait_seconds to something generous (it accepts 0–240 and polls internally), and feed that node's first_media_url into Load Audio. Now the URL is populated by the time the loader runs, and nothing changes after that.
Once audio exists, the rest of the graph doesn't know or care that the sound came from a cloud service. Send it to SaveAudio, or hand it to a lip-sync/avatar node such as InfiniteTalk or Wan S2V so a rendered face moves to the line. This is the standard shape of an audio-driven video workflow: a TTS stage produces the voice, a separate model makes the mouth move, and neither is a video base model.
Install
Same install as the rest of the pack - Manager, search Fish Audio, publisher acedatacloud, package Fish Audio by Ace Data Cloud (registry ID fish-audio), then restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/AceDataCloud/FishAudioComfyUI
cd FishAudioComfyUI && python -m pip install -r requirements.txt
You still need ACEDATACLOUD_API_KEY set in the ComfyUI process environment, even for this node - the pack reads the token at import/run time and the loader is part of that package. The other half of the install is version: the pack's native media decoders want ComfyUI 0.39.0 or newer. On an older build, the image and video loaders fail on a missing comfy_api import; the audio path is the most forgiving of the three, but upgrade anyway rather than debugging it.
Things that bite
- Wrong-host URLs. If you hosted a reference clip somewhere convenient and tried to load it here, it won't work - the host allowlist is narrow. Local files go through ComfyUI's own
LoadAudionode instead; this node is for Ace CDN links only. - Empty in, error out. An empty
media_urlis not a no-op. It raises. If you're building a reusable workflow, either keep the loader downstream of the retrieve node or gate the branch. - You're downloading, not streaming. The whole file lands on your machine before it decodes. For normal speech clips that's nothing; for hour-long output it's the 128 MiB limit doing its job.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| media_url | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |