Magic Hour: AI Voice Generator
1,266 Voices in a Dropdown, and a Billing Meter Behind It
- audio
- audio_path
- credits_charged
This is the node you want when the video is done and silent. Type the line, pick a voice from a list, get an AUDIO back that you can drop into Lip Sync or Talking Photo - or just save as narration. No reference clip needed, no cloning, no local TTS install. It's the least dramatic node in the pack and probably the one you'll use most.
How it works
Same pattern as the rest: the text and the chosen voice name go to Magic Hour's ai_voice_generator endpoint inside an HTTP call. Their servers synthesize, the node waits out the job, downloads the result into ComfyUI/output/magic_hour/, decodes it and hands you a ComfyUI AUDIO - a waveform tensor plus sample rate.
No weights load, no VRAM is touched. That's the deal with every node in this pack, and the KB's API-wrapper nodes essay lays out the trade honestly: per-call cost and your text leaving the machine, in exchange for a capability you don't have to install. For TTS the local alternative is genuinely good now - Kokoro, Piper, Chatterbox, F5-TTS - and the audio generation essay walks that decision tree properly. Reach for this node when you want zero setup and a huge voice roster; reach for Chatterbox when you want it offline, free, and private. This one is the convenience purchase, and it's a first-party pack (Apache-2.0, Magic Hour's own repo), not a random key-harvesting wrapper.
The inputs
Two fields. That's the whole node.
prompt is the text to be spoken. Everything in the box gets read. There's no SSML field, no per-word emphasis, no pause control - if you need a beat, write punctuation and hope, or generate the line in pieces and cut them together.
voice_name is a dropdown with 1,266 entries, and it's the reason this node gets screenshotted. The list is celebrity and character names - A$AP Rocky, Abraham Lincoln, Ada Wong, Adele, and so on. It's read live from the installed SDK's typed params at import time, which is why it's that long and why it changes when the SDK does. Default is whatever sorts first, currently 21 Savage; change it before you run anything.
Treat that roster as a legal question, not a feature list. The names are the vendor's; the rights to a real person's voice aren't. For character work, a cloned voice you actually have permission to use (the Voice Cloner node) is the safer route.
Outputs
audio - the synthesized speech as a ComfyUI AUDIO, ready to wire into Magic Hour: Lip Sync, Magic Hour: Talking Photo, Magic Hour: Audio to Video, or a save/preview audio node. audio_path - the downloaded file path as a string, and your fallback if in-app decoding misbehaves. credits_charged - an INT with the run's actual cost, which makes a narration batch auditable.
Install
ComfyUI Manager → search "Magic Hour", or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/magichourhq/comfyui-magic-hour
pip install -r comfyui-magic-hour/requirements.txt
The only dependency is the magic-hour SDK, on Python 3.10+, plus a ComfyUI with the VIDEO type. Restart, then set the key before launch:
export MAGIC_HOUR_API_KEY=...
# or: echo 'YOUR_KEY' > ComfyUI/custom_nodes/comfyui-magic-hour/api_key.txt
Deliberately not a node field - widget values are serialized into workflow JSON, so a key typed into a node travels with every workflow you share.
Where people get burned
The node is missing from the menu. Voice nodes are hidden entirely when MAGIC_HOUR_DISABLE_VOICE_NODES=1 is set in the environment ComfyUI started with. If you inherited that env var, both voice nodes are gone and no amount of reinstalling brings them back.
A saved workflow whose voice disappeared. Because voice_name is populated from the installed SDK, updating (or downgrading) magic-hour can change the list under an existing graph. If a workflow throws on an unknown value, re-pick the voice:
pip install -U 'magic-hour>=0.87.1'
402 mid-batch. Voice generation is cheap compared to video, but a fifty-line narration run is fifty calls. The pack surfaces the API message: 402 means credits or plan limits, 401 means the key is bad. Watch credits_charged on the first run and multiply before you queue the rest.
Audio arrives but won't preview. The pack decodes with PyAV, which comes with ComfyUI rather than this pack - a mangled install can fail to decode a job that already succeeded and was already billed. audio_path still points at the file.
You still need a "who said this" answer. Generating a voice that sounds like a specific famous person and publishing it is the part no node can help with. Check Magic Hour's terms and the law where you live before you post it anywhere.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| voice_name | COMBO | 21 Savage | 1266 options: 21 Savage, 50 Cent, A$AP Rocky, A.R. Rahman, Aamir Khan, Aang (Avatar), +1260 |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| audio_path | STRING | — |
| credits_charged | INT | — |