Comfy-Org/ComfyUI · error · ValueError

Unknown voice: {voice}

Error message

Unknown voice: {voice}

What it means

Raised by the ElevenLabs voice-picker node when the selected voice label is not a key in ELEVENLABS_VOICE_MAP, so no voice id can be resolved. The node is a pure local lookup: it maps the display label shown in the combo to ElevenLabs' voice UUID.

Source

Thrown at comfy_api_nodes/nodes_elevenlabs.py:232

            description="Select a predefined ElevenLabs voice for text-to-speech generation.",
            inputs=[
                IO.Combo.Input(
                    "voice",
                    options=ELEVENLABS_VOICE_OPTIONS,
                    tooltip="Choose a voice from the predefined ElevenLabs voices.",
                ),
            ],
            outputs=[
                IO.Custom(ELEVENLABS_VOICE).Output(display_name="voice"),
            ],
            is_api_node=False,
        )

    @classmethod
    def execute(cls, voice: str) -> IO.NodeOutput:
        voice_id = ELEVENLABS_VOICE_MAP.get(voice)
        if not voice_id:
            raise ValueError(f"Unknown voice: {voice}")
        return IO.NodeOutput(voice_id)


class ElevenLabsTextToSpeech(IO.ComfyNode):
    @classmethod
    def define_schema(cls) -> IO.Schema:
        return IO.Schema(
            node_id="ElevenLabsTextToSpeech",
            display_name="ElevenLabs Text to Speech",
            category="partner/audio/ElevenLabs",
            description="Convert text to speech.",
            inputs=[
                IO.Custom(ELEVENLABS_VOICE).Input(
                    "voice",
                    tooltip="Voice to use for speech synthesis. Connect from Voice Selector or Instant Voice Clone.",
                ),
                IO.String.Input(
                    "text",

View on GitHub (pinned to 1c6d8d45b3)

Solutions

  1. Re-open the node and re-select a voice from the dropdown so a current label is stored.
  2. If calling via the HTTP API, use the exact voice label currently offered by the combo, not a UUID.
  3. Update the workflow JSON's voice field to one of the currently supported labels.
Defensive patterns

Strategy: type-guard

Type guard

def is_known_voice(voice_label: str, voice_map: dict[str, str]) -> bool:
    return voice_label in voice_map

Prevention

When it happens

Trigger: execute() receives a voice string absent from ELEVENLABS_VOICE_MAP — stale value from an old workflow JSON, a typed-in combo value, or a renamed voice label.

Common situations: Loading workflows saved when the voice list differed (voices added/removed by ElevenLabs); hand-editing workflow JSON; programmatic API prompts passing a raw voice UUID or free-text name instead of the exact label.

Related errors


AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14). Data as JSON: /api/errors/d0aff12f179bac6d. Report an issue: GitHub.