Refactor io to IO in nodes_ace.py (#13485)

pull/13371/head^2
comfyanonymous 2026-04-20 18:59:26 -07:00 committed by GitHub
parent 543e9fba64
commit c514890325
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 52 additions and 52 deletions

View File

@ -3,136 +3,136 @@ from typing_extensions import override
import comfy.model_management import comfy.model_management
import node_helpers import node_helpers
from comfy_api.latest import ComfyExtension, io from comfy_api.latest import ComfyExtension, IO
class TextEncodeAceStepAudio(io.ComfyNode): class TextEncodeAceStepAudio(IO.ComfyNode):
@classmethod @classmethod
def define_schema(cls): def define_schema(cls):
return io.Schema( return IO.Schema(
node_id="TextEncodeAceStepAudio", node_id="TextEncodeAceStepAudio",
category="conditioning", category="conditioning",
inputs=[ inputs=[
io.Clip.Input("clip"), IO.Clip.Input("clip"),
io.String.Input("tags", multiline=True, dynamic_prompts=True), IO.String.Input("tags", multiline=True, dynamic_prompts=True),
io.String.Input("lyrics", multiline=True, dynamic_prompts=True), IO.String.Input("lyrics", multiline=True, dynamic_prompts=True),
io.Float.Input("lyrics_strength", default=1.0, min=0.0, max=10.0, step=0.01), IO.Float.Input("lyrics_strength", default=1.0, min=0.0, max=10.0, step=0.01),
], ],
outputs=[io.Conditioning.Output()], outputs=[IO.Conditioning.Output()],
) )
@classmethod @classmethod
def execute(cls, clip, tags, lyrics, lyrics_strength) -> io.NodeOutput: def execute(cls, clip, tags, lyrics, lyrics_strength) -> IO.NodeOutput:
tokens = clip.tokenize(tags, lyrics=lyrics) tokens = clip.tokenize(tags, lyrics=lyrics)
conditioning = clip.encode_from_tokens_scheduled(tokens) conditioning = clip.encode_from_tokens_scheduled(tokens)
conditioning = node_helpers.conditioning_set_values(conditioning, {"lyrics_strength": lyrics_strength}) conditioning = node_helpers.conditioning_set_values(conditioning, {"lyrics_strength": lyrics_strength})
return io.NodeOutput(conditioning) return IO.NodeOutput(conditioning)
class TextEncodeAceStepAudio15(io.ComfyNode): class TextEncodeAceStepAudio15(IO.ComfyNode):
@classmethod @classmethod
def define_schema(cls): def define_schema(cls):
return io.Schema( return IO.Schema(
node_id="TextEncodeAceStepAudio1.5", node_id="TextEncodeAceStepAudio1.5",
category="conditioning", category="conditioning",
inputs=[ inputs=[
io.Clip.Input("clip"), IO.Clip.Input("clip"),
io.String.Input("tags", multiline=True, dynamic_prompts=True), IO.String.Input("tags", multiline=True, dynamic_prompts=True),
io.String.Input("lyrics", multiline=True, dynamic_prompts=True), IO.String.Input("lyrics", multiline=True, dynamic_prompts=True),
io.Int.Input("seed", default=0, min=0, max=0xffffffffffffffff, control_after_generate=True), IO.Int.Input("seed", default=0, min=0, max=0xffffffffffffffff, control_after_generate=True),
io.Int.Input("bpm", default=120, min=10, max=300), IO.Int.Input("bpm", default=120, min=10, max=300),
io.Float.Input("duration", default=120.0, min=0.0, max=2000.0, step=0.1), IO.Float.Input("duration", default=120.0, min=0.0, max=2000.0, step=0.1),
io.Combo.Input("timesignature", options=['2', '3', '4', '6']), IO.Combo.Input("timesignature", options=['2', '3', '4', '6']),
io.Combo.Input("language", options=["en", "ja", "zh", "es", "de", "fr", "pt", "ru", "it", "nl", "pl", "tr", "vi", "cs", "fa", "id", "ko", "uk", "hu", "ar", "sv", "ro", "el"]), IO.Combo.Input("language", options=["en", "ja", "zh", "es", "de", "fr", "pt", "ru", "it", "nl", "pl", "tr", "vi", "cs", "fa", "id", "ko", "uk", "hu", "ar", "sv", "ro", "el"]),
io.Combo.Input("keyscale", options=[f"{root} {quality}" for quality in ["major", "minor"] for root in ["C", "C#", "Db", "D", "D#", "Eb", "E", "F", "F#", "Gb", "G", "G#", "Ab", "A", "A#", "Bb", "B"]]), IO.Combo.Input("keyscale", options=[f"{root} {quality}" for quality in ["major", "minor"] for root in ["C", "C#", "Db", "D", "D#", "Eb", "E", "F", "F#", "Gb", "G", "G#", "Ab", "A", "A#", "Bb", "B"]]),
io.Boolean.Input("generate_audio_codes", default=True, tooltip="Enable the LLM that generates audio codes. This can be slow but will increase the quality of the generated audio. Turn this off if you are giving the model an audio reference.", advanced=True), IO.Boolean.Input("generate_audio_codes", default=True, tooltip="Enable the LLM that generates audio codes. This can be slow but will increase the quality of the generated audio. Turn this off if you are giving the model an audio reference.", advanced=True),
io.Float.Input("cfg_scale", default=2.0, min=0.0, max=100.0, step=0.1, advanced=True), IO.Float.Input("cfg_scale", default=2.0, min=0.0, max=100.0, step=0.1, advanced=True),
io.Float.Input("temperature", default=0.85, min=0.0, max=2.0, step=0.01, advanced=True), IO.Float.Input("temperature", default=0.85, min=0.0, max=2.0, step=0.01, advanced=True),
io.Float.Input("top_p", default=0.9, min=0.0, max=2000.0, step=0.01, advanced=True), IO.Float.Input("top_p", default=0.9, min=0.0, max=2000.0, step=0.01, advanced=True),
io.Int.Input("top_k", default=0, min=0, max=100, advanced=True), IO.Int.Input("top_k", default=0, min=0, max=100, advanced=True),
io.Float.Input("min_p", default=0.000, min=0.0, max=1.0, step=0.001, advanced=True), IO.Float.Input("min_p", default=0.000, min=0.0, max=1.0, step=0.001, advanced=True),
], ],
outputs=[io.Conditioning.Output()], outputs=[IO.Conditioning.Output()],
) )
@classmethod @classmethod
def execute(cls, clip, tags, lyrics, seed, bpm, duration, timesignature, language, keyscale, generate_audio_codes, cfg_scale, temperature, top_p, top_k, min_p) -> io.NodeOutput: def execute(cls, clip, tags, lyrics, seed, bpm, duration, timesignature, language, keyscale, generate_audio_codes, cfg_scale, temperature, top_p, top_k, min_p) -> IO.NodeOutput:
tokens = clip.tokenize(tags, lyrics=lyrics, bpm=bpm, duration=duration, timesignature=int(timesignature), language=language, keyscale=keyscale, seed=seed, generate_audio_codes=generate_audio_codes, cfg_scale=cfg_scale, temperature=temperature, top_p=top_p, top_k=top_k, min_p=min_p) tokens = clip.tokenize(tags, lyrics=lyrics, bpm=bpm, duration=duration, timesignature=int(timesignature), language=language, keyscale=keyscale, seed=seed, generate_audio_codes=generate_audio_codes, cfg_scale=cfg_scale, temperature=temperature, top_p=top_p, top_k=top_k, min_p=min_p)
conditioning = clip.encode_from_tokens_scheduled(tokens) conditioning = clip.encode_from_tokens_scheduled(tokens)
return io.NodeOutput(conditioning) return IO.NodeOutput(conditioning)
class EmptyAceStepLatentAudio(io.ComfyNode): class EmptyAceStepLatentAudio(IO.ComfyNode):
@classmethod @classmethod
def define_schema(cls): def define_schema(cls):
return io.Schema( return IO.Schema(
node_id="EmptyAceStepLatentAudio", node_id="EmptyAceStepLatentAudio",
display_name="Empty Ace Step 1.0 Latent Audio", display_name="Empty Ace Step 1.0 Latent Audio",
category="latent/audio", category="latent/audio",
inputs=[ inputs=[
io.Float.Input("seconds", default=120.0, min=1.0, max=1000.0, step=0.1), IO.Float.Input("seconds", default=120.0, min=1.0, max=1000.0, step=0.1),
io.Int.Input( IO.Int.Input(
"batch_size", default=1, min=1, max=4096, tooltip="The number of latent images in the batch." "batch_size", default=1, min=1, max=4096, tooltip="The number of latent images in the batch."
), ),
], ],
outputs=[io.Latent.Output()], outputs=[IO.Latent.Output()],
) )
@classmethod @classmethod
def execute(cls, seconds, batch_size) -> io.NodeOutput: def execute(cls, seconds, batch_size) -> IO.NodeOutput:
length = int(seconds * 44100 / 512 / 8) length = int(seconds * 44100 / 512 / 8)
latent = torch.zeros([batch_size, 8, 16, length], device=comfy.model_management.intermediate_device(), dtype=comfy.model_management.intermediate_dtype()) latent = torch.zeros([batch_size, 8, 16, length], device=comfy.model_management.intermediate_device(), dtype=comfy.model_management.intermediate_dtype())
return io.NodeOutput({"samples": latent, "type": "audio"}) return IO.NodeOutput({"samples": latent, "type": "audio"})
class EmptyAceStep15LatentAudio(io.ComfyNode): class EmptyAceStep15LatentAudio(IO.ComfyNode):
@classmethod @classmethod
def define_schema(cls): def define_schema(cls):
return io.Schema( return IO.Schema(
node_id="EmptyAceStep1.5LatentAudio", node_id="EmptyAceStep1.5LatentAudio",
display_name="Empty Ace Step 1.5 Latent Audio", display_name="Empty Ace Step 1.5 Latent Audio",
category="latent/audio", category="latent/audio",
inputs=[ inputs=[
io.Float.Input("seconds", default=120.0, min=1.0, max=1000.0, step=0.01), IO.Float.Input("seconds", default=120.0, min=1.0, max=1000.0, step=0.01),
io.Int.Input( IO.Int.Input(
"batch_size", default=1, min=1, max=4096, tooltip="The number of latent images in the batch." "batch_size", default=1, min=1, max=4096, tooltip="The number of latent images in the batch."
), ),
], ],
outputs=[io.Latent.Output()], outputs=[IO.Latent.Output()],
) )
@classmethod @classmethod
def execute(cls, seconds, batch_size) -> io.NodeOutput: def execute(cls, seconds, batch_size) -> IO.NodeOutput:
length = round((seconds * 48000 / 1920)) length = round((seconds * 48000 / 1920))
latent = torch.zeros([batch_size, 64, length], device=comfy.model_management.intermediate_device(), dtype=comfy.model_management.intermediate_dtype()) latent = torch.zeros([batch_size, 64, length], device=comfy.model_management.intermediate_device(), dtype=comfy.model_management.intermediate_dtype())
return io.NodeOutput({"samples": latent, "type": "audio"}) return IO.NodeOutput({"samples": latent, "type": "audio"})
class ReferenceAudio(io.ComfyNode): class ReferenceAudio(IO.ComfyNode):
@classmethod @classmethod
def define_schema(cls): def define_schema(cls):
return io.Schema( return IO.Schema(
node_id="ReferenceTimbreAudio", node_id="ReferenceTimbreAudio",
display_name="Reference Audio", display_name="Reference Audio",
category="advanced/conditioning/audio", category="advanced/conditioning/audio",
is_experimental=True, is_experimental=True,
description="This node sets the reference audio for ace step 1.5", description="This node sets the reference audio for ace step 1.5",
inputs=[ inputs=[
io.Conditioning.Input("conditioning"), IO.Conditioning.Input("conditioning"),
io.Latent.Input("latent", optional=True), IO.Latent.Input("latent", optional=True),
], ],
outputs=[ outputs=[
io.Conditioning.Output(), IO.Conditioning.Output(),
] ]
) )
@classmethod @classmethod
def execute(cls, conditioning, latent=None) -> io.NodeOutput: def execute(cls, conditioning, latent=None) -> IO.NodeOutput:
if latent is not None: if latent is not None:
conditioning = node_helpers.conditioning_set_values(conditioning, {"reference_audio_timbre_latents": [latent["samples"]]}, append=True) conditioning = node_helpers.conditioning_set_values(conditioning, {"reference_audio_timbre_latents": [latent["samples"]]}, append=True)
return io.NodeOutput(conditioning) return IO.NodeOutput(conditioning)
class AceExtension(ComfyExtension): class AceExtension(ComfyExtension):
@override @override
async def get_node_list(self) -> list[type[io.ComfyNode]]: async def get_node_list(self) -> list[type[IO.ComfyNode]]:
return [ return [
TextEncodeAceStepAudio, TextEncodeAceStepAudio,
EmptyAceStepLatentAudio, EmptyAceStepLatentAudio,