ComfyPilotComfyPilot
工作流 / 音频 / Fish Audio Drama 3:双人对话
Fish Audio Drama 3:双人对话

Fish Audio Drama 3:双人对话

Fish Audio Drama 3: Two-Speaker Dialogue

使用 Fish Audio Drama 3 一次生成多说话人场景:为每位说话人连接一个 Voice Selector,用 @Voice1 / @Voice2 标记说话人切换,并通过通俗语言的 [directions] 和 <whisper> 词标签来指导演绎。

音频 7 个节点 1 个输入 16 次使用 ComfyUI ≥ 0.40.0 ComfyUI 15 KB

下载工作流 JSON 查看官方来源

下载后把文件拖进 ComfyUI 窗口即可打开。

节点构成

FishAudioVoiceSelector × 2
MarkdownNote × 1
FishAudioTextToSpeech × 1
SaveAudioAdvanced × 1
LoadAudio × 1
FishAudioInstantVoiceClone × 1

官方标注的模型

Fish Audio

工作流 JSON

和上面「下载工作流 JSON」是同一份文件。

1{
2 "id": "5b1c7d20-9f43-4a1e-8c62-2e0d47a913bb",
3 "revision": 0,
4 "last_node_id": 15,
5 "last_link_id": 13,
6 "nodes": [
7 {
8 "id": 9,
9 "type": "MarkdownNote",
10 "pos": [
11 -1190,
12 140
13 ],
14 "size": [
15 500,
16 900
17 ],
18 "flags": [],
19 "order": 0,
20 "mode": 0,
21 "inputs": [],
22 "outputs": [],
23 "title": "Note: Guide",
24 "properties": [],
25 "widgets_values": [
26 "## Fish Audio Drama 3 — Two-Speaker Dialogue\n\nGenerate a whole multi-speaker scene in one pass: every speaker keeps its own voice.\n\n### How to use\n\n1. Sign in with your ComfyUI account. API nodes are pay per use.\n2. Write the scene in the `text` field of the Fish Audio Text to Speech node.\n3. Mark every speaker change with `@Voice1`, `@Voice2`, and so on: the tags are replaced in order by the voices you connect (up to 5).\n4. Connect one Fish Audio Voice Selector per speaker. This template ships with two of the new voices, Delia and Sheila — pick any preset, or set the selector to `custom` and paste a voice ID from fish.audio.\n5. Direct the performance with plain-language tags in square brackets, in any language, and change them mid-line.\n6. Wrap words that need a different delivery: `<whisper>do not open that door.</whisper>`. Inline sounds such as `[laugh]`, `[sigh]` and `[pause]` work too.\n7. Keep the other parameters at their defaults, then queue the prompt and preview the audio.\n\n### Model\n\n- `drama-3` (this template): multi-speaker scenes, `[plain-language directions]` and word tags, 80+ languages.\n- `s2.1-pro`: the previous generation, same voice list, emotion cues such as `[happy]` or `[whispering]` at the start of a sentence.\n- `s1`: a single voice; emotion cues in parentheses, such as `(happy)`.\n\nText length and model both change the price: the badge on the node shows the estimate for the current text.\n\n### Cloning your own voice\n\nTo use your own voice instead of a preset, select the two nodes in the `Option 2` group and press **Ctrl‑B** to enable them, then point `Load Audio` at a 10–30 second, clean recording of one speaker. The clone becomes the next voice in the list, so add `@Voice3` where it should speak (a two-voice clone setup uses `@Voice1`/`@Voice2`).\n"
27 ],
28 "widgets_values_named": {
29 "text": "## Fish Audio Drama 3 — Two-Speaker Dialogue\n\nGenerate a whole multi-speaker scene in one pass: every speaker keeps its own voice.\n\n### How to use\n\n1. Sign in with your ComfyUI account. API nodes are pay per use.\n2. Write the scene in the `text` field of the Fish Audio Text to Speech node.\n3. Mark every speaker change with `@Voice1`, `@Voice2`, and so on: the tags are replaced in order by the voices you connect (up to 5).\n4. Connect one Fish Audio Voice Selector per speaker. This template ships with two of the new voices, Delia and Sheila — pick any preset, or set the selector to `custom` and paste a voice ID from fish.audio.\n5. Direct the performance with plain-language tags in square brackets, in any language, and change them mid-line.\n6. Wrap words that need a different delivery: `<whisper>do not open that door.</whisper>`. Inline sounds such as `[laugh]`, `[sigh]` and `[pause]` work too.\n7. Keep the other parameters at their defaults, then queue the prompt and preview the audio.\n\n### Model\n\n- `drama-3` (this template): multi-speaker scenes, `[plain-language directions]` and word tags, 80+ languages.\n- `s2.1-pro`: the previous generation, same voice list, emotion cues such as `[happy]` or `[whispering]` at the start of a sentence.\n- `s1`: a single voice; emotion cues in parentheses, such as `(happy)`.\n\nText length and model both change the price: the badge on the node shows the estimate for the current text.\n\n### Cloning your own voice\n\nTo use your own voice instead of a preset, select the two nodes in the `Option 2` group and press **Ctrl‑B** to enable them, then point `Load Audio` at a 10–30 second, clean recording of one speaker. The clone becomes the next voice in the list, so add `@Voice3` where it should speak (a two-voice clone setup uses `@Voice1`/`@Voice2`).\n"
30 },
31 "color": "#000",
32 "bgcolor": "#000"
33 },
34 {
35 "id": 1,
36 "type": "FishAudioTextToSpeech",
37 "pos": [
38 160,
39 220
40 ],
41 "size": [
42 440,
43 340
44 ],
45 "flags": [],
46 "order": 5,
47 "mode": 0,
48 "inputs": [
49 {
50 "localized_name": "text",
51 "name": "text",
52 "type": "STRING",
53 "widget": {
54 "name": "text"
55 },
56 "link": null
57 },
58 {
59 "localized_name": "model",
60 "name": "model",
61 "type": "COMFY_DYNAMICCOMBO_V3",
62 "widget": {
63 "name": "model"
64 },
65 "link": null
66 },
67 {
68 "localized_name": "voice0",
69 "name": "model.voices.voice0",
70 "shape": 7,
71 "type": "FISHAUDIO_VOICE",
72 "link": 12
73 },
74 {
75 "localized_name": "voice1",
76 "name": "model.voices.voice1",
77 "shape": 7,
78 "type": "FISHAUDIO_VOICE",
79 "link": 13
80 },
81 {
82 "localized_name": "voice2",
83 "name": "model.voices.voice2",
84 "shape": 7,
85 "type": "FISHAUDIO_VOICE",
86 "link": null
87 },
88 {
89 "localized_name": "temperature",
90 "name": "model.temperature",
91 "type": "FLOAT",
92 "widget": {
93 "name": "model.temperature"
94 },
95 "link": null
96 },
97 {
98 "localized_name": "top_p",
99 "name": "model.top_p",
100 "type": "FLOAT",
101 "widget": {
102 "name": "model.top_p"
103 },
104 "link": null
105 },
106 {
107 "localized_name": "speed",
108 "name": "model.speed",
109 "type": "FLOAT",
110 "widget": {
111 "name": "model.speed"
112 },
113 "link": null
114 },
115 {
116 "localized_name": "volume",
117 "name": "model.volume",
118 "type": "FLOAT",
119 "widget": {
120 "name": "model.volume"
121 },
122 "link": null
123 },
124 {
125 "localized_name": "normalize",
126 "name": "model.normalize",
127 "type": "BOOLEAN",
128 "widget": {
129 "name": "model.normalize"
130 },
131 "link": null
132 },
133 {
134 "localized_name": "seed",
135 "name": "seed",
136 "type": "INT",
137 "widget": {
138 "name": "seed"
139 },
140 "link": null
141 }
142 ],
143 "outputs": [
144 {
145 "localized_name": "AUDIO",
146 "name": "AUDIO",
147 "type": "AUDIO",
148 "links": [
149 9
150 ]
151 }
152 ],
153 "properties": {
154 "Node name for S&R": "FishAudioTextToSpeech"
155 },
156 "widgets_values": [
157 "[deep, cinematic narrator] @Voice1 Every night, the city tells a story.\n[soft, close, like a secret] @Voice2 But only one voice ever finishes it.\n[drops to a <whisper>whisper</whisper>, then brightens] @Voice1 Fish Audio Drama 3, now in ComfyUI.",
158 "drama-3",
159 0.7,
160 0.7,
161 1,
162 0,
163 true,
164 1481145631,
165 "randomize"
166 ],
167 "widgets_values_named": {
168 "text": "[deep, cinematic narrator] @Voice1 Every night, the city tells a story.\n[soft, close, like a secret] @Voice2 But only one voice ever finishes it.\n[drops to a <whisper>whisper</whisper>, then brightens] @Voice1 Fish Audio Drama 3, now in ComfyUI.",
169 "model": "drama-3",
170 "model.temperature": 0.7,
171 "model.top_p": 0.7,
172 "model.speed": 1,
173 "model.volume": 0,
174 "model.normalize": true,
175 "seed": 1481145631,
176 "control_after_generate": "randomize"
177 },
178 "color": "#432",
179 "bgcolor": "#653"
180 },
181 {
182 "id": 5,
183 "type": "SaveAudioAdvanced",
184 "pos": [
185 650,
186 220
187 ],
188 "size": [
189 730,
190 220
191 ],
192 "flags": [],
193 "order": 6,
194 "mode": 0,
195 "inputs": [
196 {
197 "localized_name": "audio",
198 "name": "audio",
199 "type": "AUDIO",
200 "link": 9
201 },
202 {
203 "localized_name": "filename_prefix",
204 "name": "filename_prefix",
205 "type": "STRING",
206 "widget": {
207 "name": "filename_prefix"
208 },
209 "link": null
210 },
211 {
212 "localized_name": "format",
213 "name": "format",
214 "type": "COMFY_DYNAMICCOMBO_V3",
215 "widget": {
216 "name": "format"
217 },
218 "link": null
219 },
220 {
221 "localized_name": "quality",
222 "name": "format.quality",
223 "type": "COMBO",
224 "widget": {
225 "name": "format.quality"
226 },
227 "link": null
228 },
229 {
230 "localized_name": "audioUI",
231 "name": "audioUI",
232 "type": "AUDIO_UI",
233 "widget": {
234 "name": "audioUI"
235 },
236 "link": null
237 }
238 ],
239 "outputs": [
240 {
241 "localized_name": "audio",
242 "name": "audio",
243 "type": "AUDIO",
244 "links": null
245 }
246 ],
247 "properties": [],
248 "widgets_values": [
249 "audio/Fish_audio_drama3_dialogue",
250 "mp3",
251 "V0"
252 ],
253 "widgets_values_named": {
254 "filename_prefix": "audio/Fish_audio_drama3_dialogue",
255 "format": "mp3",
256 "format.quality": "V0"
257 }
258 },
259 {
260 "id": 11,
261 "type": "LoadAudio",
262 "pos": [
263 -620,
264 640
265 ],
266 "size": [
267 330,
268 170
269 ],
270 "flags": [],
271 "order": 1,
272 "mode": 4,
273 "inputs": [
274 {
275 "localized_name": "audio",
276 "name": "audio",
277 "type": "COMBO",
278 "widget": {
279 "name": "audio"
280 },
281 "link": null
282 },
283 {
284 "localized_name": "audioUI",
285 "name": "audioUI",
286 "type": "AUDIO_UI",
287 "widget": {
288 "name": "audioUI"
289 },
290 "link": null
291 },
292 {
293 "localized_name": "choose file to upload",
294 "name": "upload",
295 "type": "AUDIOUPLOAD",
296 "widget": {
297 "name": "upload"
298 },
299 "link": null
300 }
301 ],
302 "outputs": [
303 {
304 "localized_name": "AUDIO",
305 "name": "AUDIO",
306 "type": "AUDIO",
307 "links": [
308 11
309 ]
310 }
311 ],
312 "properties": {
313 "Node name for S&R": "LoadAudio"
314 },
315 "widgets_values": [
316 "fish_audio_example.mp3",
317 null
318 ],
319 "widgets_values_named": {
320 "audio": "fish_audio_example.mp3",
321 "upload": null
322 }
323 },
324 {
325 "id": 13,
326 "type": "FishAudioInstantVoiceClone",
327 "pos": [
328 -260,
329 640
330 ],
331 "size": [
332 310,
333 100
334 ],
335 "flags": [],
336 "order": 4,
337 "mode": 4,
338 "inputs": [
339 {
340 "localized_name": "audio0",
341 "name": "files.audio0",
342 "type": "AUDIO",
343 "link": 11
344 },
345 {
346 "localized_name": "audio1",
347 "name": "files.audio1",
348 "shape": 7,
349 "type": "AUDIO",
350 "link": null
351 },
352 {
353 "localized_name": "enhance_audio_quality",
354 "name": "enhance_audio_quality",
355 "type": "BOOLEAN",
356 "widget": {
357 "name": "enhance_audio_quality"
358 },
359 "link": null
360 }
361 ],
362 "outputs": [
363 {
364 "localized_name": "voice",
365 "name": "voice",
366 "type": "FISHAUDIO_VOICE",
367 "links": null
368 }
369 ],
370 "properties": {
371 "Node name for S&R": "FishAudioInstantVoiceClone"
372 },
373 "widgets_values": [
374 true
375 ],
376 "widgets_values_named": {
377 "enhance_audio_quality": true
378 },
379 "color": "#432",
380 "bgcolor": "#653"
381 },
382 {
383 "id": 14,
384 "type": "FishAudioVoiceSelector",
385 "pos": [
386 -420,
387 280
388 ],
389 "size": [
390 270,
391 60
392 ],
393 "flags": [],
394 "order": 2,
395 "mode": 0,
396 "inputs": [
397 {
398 "localized_name": "voice",
399 "name": "voice",
400 "type": "COMFY_DYNAMICCOMBO_V3",
401 "widget": {
402 "name": "voice"
403 },
404 "link": null
405 }
406 ],
407 "outputs": [
408 {
409 "localized_name": "voice",
410 "name": "voice",
411 "type": "FISHAUDIO_VOICE",
412 "links": [
413 12
414 ]
415 }
416 ],
417 "properties": {
418 "Node name for S&R": "FishAudioVoiceSelector"
419 },
420 "widgets_values": [
421 "Delia (en)"
422 ],
423 "widgets_values_named": {
424 "voice": "Delia (en)"
425 }
426 },
427 {
428 "id": 15,
429 "type": "FishAudioVoiceSelector",
430 "pos": [
431 -420,
432 420
433 ],
434 "size": [
435 270,
436 60
437 ],
438 "flags": [],
439 "order": 3,
440 "mode": 0,
441 "inputs": [
442 {
443 "localized_name": "voice",
444 "name": "voice",
445 "type": "COMFY_DYNAMICCOMBO_V3",
446 "widget": {
447 "name": "voice"
448 },
449 "link": null
450 }
451 ],
452 "outputs": [
453 {
454 "localized_name": "voice",
455 "name": "voice",
456 "type": "FISHAUDIO_VOICE",
457 "links": [
458 13
459 ]
460 }
461 ],
462 "properties": {
463 "Node name for S&R": "FishAudioVoiceSelector"
464 },
465 "widgets_values": [
466 "Sheila (en)"
467 ],
468 "widgets_values_named": {
469 "voice": "Sheila (en)"
470 }
471 }
472 ],
473 "links": [
474 [
475 9,
476 1,
477 0,
478 5,
479 0,
480 "AUDIO"
481 ],
482 [
483 11,
484 11,
485 0,
486 13,
487 0,
488 "AUDIO"
489 ],
490 [
491 12,
492 14,
493 0,
494 1,
495 2,
496 "FISHAUDIO_VOICE"
497 ],
498 [
499 13,
500 15,
501 0,
502 1,
503 3,
504 "FISHAUDIO_VOICE"
505 ]
506 ],
507 "groups": [
508 {
509 "id": 1,
510 "title": "Option 1: Two preset voices",
511 "bounding": [
512 -640,
513 180,
514 740,
515 360
516 ],
517 "color": "#3f789e",
518 "flags": []
519 },
520 {
521 "id": 2,
522 "title": "Option 2: Voice Clone (select both nodes, then press Ctrl+B to enable)",
523 "bounding": [
524 -640,
525 560,
526 740,
527 380
528 ],
529 "color": "#3f789e",
530 "flags": []
531 }
532 ],
533 "config": [],
534 "extra": {
535 "ds": {
536 "scale": 0.5234475436134131,
537 "offset": [
538 1748.3749656430628,
539 402.6760146504402
540 ]
541 },
542 "frontendVersion": "1.57.0"
543 },
544 "version": 0.4
545}