{
  "config": {},
  "extra": {
    "VHS_KeepIntermediate": true,
    "VHS_MetadataImage": true,
    "VHS_latentpreview": false,
    "VHS_latentpreviewrate": 0,
    "ds": {
      "offset": [
        1631.6666666666665,
        427.7932098765431
      ],
      "scale": 0.5003861003861004
    },
    "frontendVersion": "1.52.5"
  },
  "groups": [
    {
      "bounding": [
        -640,
        390,
        740,
        330
      ],
      "color": "#3f789e",
      "flags": {},
      "id": 1,
      "title": "Option 2: Voice Clone (Select the node, then press Ctrl‑B to enable)"
    },
    {
      "bounding": [
        -640,
        110,
        740,
        250
      ],
      "color": "#3f789e",
      "flags": {},
      "id": 2,
      "title": "Option 1: Preset Audio"
    }
  ],
  "id": "1c3621ae-965c-43f9-ba79-dc0b92fcd468",
  "last_link_id": 9,
  "last_node_id": 11,
  "links": [
    [
      3,
      1,
      0,
      5,
      0,
      "AUDIO"
    ],
    [
      8,
      11,
      0,
      10,
      0,
      "AUDIO"
    ],
    [
      6,
      6,
      0,
      1,
      2,
      "FISHAUDIO_VOICE"
    ],
    [
      9,
      10,
      0,
      1,
      3,
      "FISHAUDIO_VOICE"
    ]
  ],
  "nodes": [
    {
      "bgcolor": "#653",
      "color": "#432",
      "flags": {},
      "id": 1,
      "inputs": [
        {
          "link": null,
          "localized_name": "text",
          "name": "text",
          "type": "STRING",
          "widget": {
            "name": "text"
          }
        },
        {
          "link": null,
          "localized_name": "model",
          "name": "model",
          "type": "COMFY_DYNAMICCOMBO_V3",
          "widget": {
            "name": "model"
          }
        },
        {
          "link": 6,
          "localized_name": "voice0",
          "name": "model.voices.voice0",
          "shape": 7,
          "type": "FISHAUDIO_VOICE"
        },
        {
          "link": 9,
          "localized_name": "voice1",
          "name": "model.voices.voice1",
          "shape": 7,
          "type": "FISHAUDIO_VOICE"
        },
        {
          "link": null,
          "localized_name": "voice2",
          "name": "model.voices.voice2",
          "shape": 7,
          "type": "FISHAUDIO_VOICE"
        },
        {
          "link": null,
          "localized_name": "temperature",
          "name": "model.temperature",
          "type": "FLOAT",
          "widget": {
            "name": "model.temperature"
          }
        },
        {
          "link": null,
          "localized_name": "top_p",
          "name": "model.top_p",
          "type": "FLOAT",
          "widget": {
            "name": "model.top_p"
          }
        },
        {
          "link": null,
          "localized_name": "speed",
          "name": "model.speed",
          "type": "FLOAT",
          "widget": {
            "name": "model.speed"
          }
        },
        {
          "link": null,
          "localized_name": "volume",
          "name": "model.volume",
          "type": "FLOAT",
          "widget": {
            "name": "model.volume"
          }
        },
        {
          "link": null,
          "localized_name": "normalize",
          "name": "model.normalize",
          "type": "BOOLEAN",
          "widget": {
            "name": "model.normalize"
          }
        },
        {
          "link": null,
          "localized_name": "seed",
          "name": "seed",
          "type": "INT",
          "widget": {
            "name": "seed"
          }
        }
      ],
      "mode": 0,
      "order": 4,
      "outputs": [
        {
          "links": [
            3
          ],
          "localized_name": "AUDIO",
          "name": "AUDIO",
          "type": "AUDIO"
        }
      ],
      "pos": [
        160,
        220
      ],
      "properties": {
        "Node name for S&R": "FishAudioTextToSpeech"
      },
      "size": [
        440,
        362
      ],
      "type": "FishAudioTextToSpeech",
      "widgets_values": [
        "[sigh] Yes, this voice is AI generated. \n[excited] Now in ComfyUI. Type text, add tags like this, and boom. Instant voice.",
        "s2.1-pro",
        0.7,
        0.7,
        1,
        0,
        true,
        1481145631,
        "randomize"
      ],
      "widgets_values_named": {
        "control_after_generate": "randomize",
        "model": "s2.1-pro",
        "model.normalize": true,
        "model.speed": 1,
        "model.temperature": 0.7,
        "model.top_p": 0.7,
        "model.volume": 0,
        "seed": 1481145631,
        "text": "[sigh] Yes, this voice is AI generated. \n[excited] Now in ComfyUI. Type text, add tags like this, and boom. Instant voice."
      }
    },
    {
      "flags": {},
      "id": 5,
      "inputs": [
        {
          "link": 3,
          "localized_name": "audio",
          "name": "audio",
          "type": "AUDIO"
        },
        {
          "link": null,
          "localized_name": "filename_prefix",
          "name": "filename_prefix",
          "type": "STRING",
          "widget": {
            "name": "filename_prefix"
          }
        },
        {
          "link": null,
          "localized_name": "format",
          "name": "format",
          "type": "COMFY_DYNAMICCOMBO_V3",
          "widget": {
            "name": "format"
          }
        },
        {
          "link": null,
          "localized_name": "quality",
          "name": "format.quality",
          "type": "COMBO",
          "widget": {
            "name": "format.quality"
          }
        },
        {
          "link": null,
          "localized_name": "audioUI",
          "name": "audioUI",
          "type": "AUDIO_UI",
          "widget": {
            "name": "audioUI"
          }
        }
      ],
      "mode": 0,
      "order": 5,
      "outputs": [
        {
          "links": null,
          "localized_name": "audio",
          "name": "audio",
          "type": "AUDIO"
        }
      ],
      "pos": [
        650,
        220
      ],
      "properties": {},
      "size": [
        730,
        218
      ],
      "type": "SaveAudioAdvanced",
      "widgets_values": [
        "audio/Fish_audio_t2s",
        "mp3",
        "V0"
      ],
      "widgets_values_named": {
        "filename_prefix": "audio/Fish_audio_t2s",
        "format": "mp3",
        "format.quality": "V0"
      }
    },
    {
      "flags": {},
      "id": 6,
      "inputs": [
        {
          "link": null,
          "localized_name": "voice",
          "name": "voice",
          "type": "COMFY_DYNAMICCOMBO_V3",
          "widget": {
            "name": "voice"
          }
        }
      ],
      "mode": 0,
      "order": 0,
      "outputs": [
        {
          "links": [
            6
          ],
          "localized_name": "voice",
          "name": "voice",
          "type": "FISHAUDIO_VOICE"
        }
      ],
      "pos": [
        -420,
        220
      ],
      "properties": {
        "Node name for S&R": "FishAudioVoiceSelector"
      },
      "size": [
        280,
        86
      ],
      "type": "FishAudioVoiceSelector",
      "widgets_values": [
        "Energetic Male (en)"
      ],
      "widgets_values_named": {
        "voice": "Energetic Male (en)"
      }
    },
    {
      "bgcolor": "#000",
      "color": "#222",
      "flags": {},
      "id": 9,
      "inputs": [],
      "mode": 0,
      "order": 1,
      "outputs": [],
      "pos": [
        -1190,
        140
      ],
      "properties": {},
      "size": [
        500,
        886.875
      ],
      "title": "Note: Guide",
      "type": "MarkdownNote",
      "widgets_values": [
        "## Fish Audio Text to Speech\n\nGenerate speech from text with a preset Fish Audio voice.\n\n### How to use\n\n1. Sign in with your ComfyUI account. API nodes are pay per use.\n2. Type your script in the `text` field of the Fish Audio Text to Speech node.\n3. A preset voice is already connected. To change it, pick another voice in the Voice Selector, or switch to `custom` and paste a voice model ID from fish.audio.\n4. Keep parameters at their defaults unless needed.\n5. Queue the prompt, then preview or save the audio.\n\n### Inline tags\n\nWrite tags directly in the text. A tag applies from where it appears to the end of the sentence, or until the next tag.\n\n**Emotion** (start of sentence, one per sentence):\n\n- [happy] [sad] [angry] [excited] [calm]\n- [nervous] [confident] [surprised] [scared] [worried]\n- [frustrated] [empathetic] [proud] [relaxed] [curious]\n- ...and more: [sarcastic] [nostalgic] [determined] [hopeful] [bored] ...\n\n**Tone** (control volume and intensity):\n\n- [whispering] [shouting] [screaming]\n- [soft tone] [in a hurry tone] [emphasis]\n\n**Sound effects** (add matching text after, e.g. \"Ha, ha\" after [laughing]):\n\n- [laughing] [chuckling] [sobbing] [crying loudly]\n- [sighing] [groaning] [panting] [gasping]\n- [yawning] [snoring] [clear throat]\n\n**Pause and background:**\n\n- [break] [short pause] [long pause] [long-break]\n- [audience laughing] [background laughter] [crowd laughing]\n\n### Tag rules\n\n- One main emotion per sentence, max 3 tags combined\n- Pair physical tags with emotions: [whispering][scared], [panting][tired], [shouting][angry]\n- Intensity modifiers: [slightly sad], [very excited], [extremely angry]\n- Free-form descriptions work: [tired, end of a long shift]\n\n### Example\n\n[excited] Welcome back!\n[chuckling] You missed a lot.\n[calm] Let's get started.\n\n### Multi-speaker\n\nWith two or more voices connected, mark speaker changes:\n\n@Voice1 [nervous] Who's there?\n@Voice2 [calm] Just me. Relax.\n"
      ],
      "widgets_values_named": {
        "text": "## Fish Audio Text to Speech\n\nGenerate speech from text with a preset Fish Audio voice.\n\n### How to use\n\n1. Sign in with your ComfyUI account. API nodes are pay per use.\n2. Type your script in the `text` field of the Fish Audio Text to Speech node.\n3. A preset voice is already connected. To change it, pick another voice in the Voice Selector, or switch to `custom` and paste a voice model ID from fish.audio.\n4. Keep parameters at their defaults unless needed.\n5. Queue the prompt, then preview or save the audio.\n\n### Inline tags\n\nWrite tags directly in the text. A tag applies from where it appears to the end of the sentence, or until the next tag.\n\n**Emotion** (start of sentence, one per sentence):\n\n- [happy] [sad] [angry] [excited] [calm]\n- [nervous] [confident] [surprised] [scared] [worried]\n- [frustrated] [empathetic] [proud] [relaxed] [curious]\n- ...and more: [sarcastic] [nostalgic] [determined] [hopeful] [bored] ...\n\n**Tone** (control volume and intensity):\n\n- [whispering] [shouting] [screaming]\n- [soft tone] [in a hurry tone] [emphasis]\n\n**Sound effects** (add matching text after, e.g. \"Ha, ha\" after [laughing]):\n\n- [laughing] [chuckling] [sobbing] [crying loudly]\n- [sighing] [groaning] [panting] [gasping]\n- [yawning] [snoring] [clear throat]\n\n**Pause and background:**\n\n- [break] [short pause] [long pause] [long-break]\n- [audience laughing] [background laughter] [crowd laughing]\n\n### Tag rules\n\n- One main emotion per sentence, max 3 tags combined\n- Pair physical tags with emotions: [whispering][scared], [panting][tired], [shouting][angry]\n- Intensity modifiers: [slightly sad], [very excited], [extremely angry]\n- Free-form descriptions work: [tired, end of a long shift]\n\n### Example\n\n[excited] Welcome back!\n[chuckling] You missed a lot.\n[calm] Let's get started.\n\n### Multi-speaker\n\nWith two or more voices connected, mark speaker changes:\n\n@Voice1 [nervous] Who's there?\n@Voice2 [calm] Just me. Relax.\n"
      }
    },
    {
      "bgcolor": "#653",
      "color": "#432",
      "flags": {},
      "id": 10,
      "inputs": [
        {
          "link": 8,
          "localized_name": "audio0",
          "name": "files.audio0",
          "type": "AUDIO"
        },
        {
          "link": null,
          "localized_name": "audio1",
          "name": "files.audio1",
          "shape": 7,
          "type": "AUDIO"
        },
        {
          "link": null,
          "localized_name": "enhance_audio_quality",
          "name": "enhance_audio_quality",
          "type": "BOOLEAN",
          "widget": {
            "name": "enhance_audio_quality"
          }
        }
      ],
      "mode": 4,
      "order": 3,
      "outputs": [
        {
          "links": [
            9
          ],
          "localized_name": "voice",
          "name": "voice",
          "type": "FISHAUDIO_VOICE"
        }
      ],
      "pos": [
        -270,
        470
      ],
      "properties": {
        "Node name for S&R": "FishAudioInstantVoiceClone"
      },
      "size": [
        350,
        110
      ],
      "type": "FishAudioInstantVoiceClone",
      "widgets_values": [
        true
      ],
      "widgets_values_named": {
        "enhance_audio_quality": true
      }
    },
    {
      "flags": {},
      "id": 11,
      "inputs": [
        {
          "link": null,
          "localized_name": "audio",
          "name": "audio",
          "type": "COMBO",
          "widget": {
            "name": "audio"
          }
        },
        {
          "link": null,
          "localized_name": "audioUI",
          "name": "audioUI",
          "type": "AUDIO_UI",
          "widget": {
            "name": "audioUI"
          }
        },
        {
          "link": null,
          "localized_name": "choose file to upload",
          "name": "upload",
          "type": "AUDIOUPLOAD",
          "widget": {
            "name": "upload"
          }
        }
      ],
      "mode": 4,
      "order": 2,
      "outputs": [
        {
          "links": [
            8
          ],
          "localized_name": "AUDIO",
          "name": "AUDIO",
          "type": "AUDIO"
        }
      ],
      "pos": [
        -630,
        470
      ],
      "properties": {
        "Node name for S&R": "LoadAudio"
      },
      "size": [
        330,
        170
      ],
      "type": "LoadAudio",
      "widgets_values": [
        "fish_audio_example.mp3",
        null
      ],
      "widgets_values_named": {
        "audio": "fish_audio_example.mp3",
        "upload": null
      }
    }
  ],
  "revision": 0,
  "version": 0.4
}