diff --git a/__init__.py b/__init__.py index 9d0c733..a62c00e 100644 --- a/__init__.py +++ b/__init__.py @@ -34,10 +34,12 @@ from .modules.providerSettings.bytedanceImageProviderSettings import RunwareByte from .modules.providerSettings.briaImageProviderSettings import RunwareBriaProviderSettings from .modules.providerSettings.briaProviderMask import RunwareBriaProviderMask from .modules.audioInference import RunwareAudioInference +from .modules.audioInferenceSpeech import RunwareAudioInferenceSpeech from .modules.audioModelSearch import RunwareAudioModelSearch from .modules.audioSections import RunwareAudioSections from .modules.audioInferenceInputs import audioInferenceInputs from .modules.audioSettings import RunwareAudioSettings +from .modules.audioSettingsVoiceModify import RunwareAudioSettingsVoiceModify from .modules.providerSettings.elevenlabsProviderSettings import RunwareElevenLabsProviderSettings from .modules.providerSettings.elevenlabsProviderSettingsSections import RunwareElevenLabsProviderSettingsSections from .modules.acceleratorOptions import acceleratorOptions @@ -138,10 +140,12 @@ NODE_CLASS_MAPPINGS = { "Runware Bria Provider Settings": RunwareBriaProviderSettings, "Runware Bria Provider Mask": RunwareBriaProviderMask, "Runware Audio Inference": RunwareAudioInference, + "Runware Audio Inference Speech": RunwareAudioInferenceSpeech, "Runware Audio Model Search": RunwareAudioModelSearch, "Runware Audio Sections": RunwareAudioSections, "Runware Audio Inference Inputs": audioInferenceInputs, - "Runware Audio Settings": RunwareAudioSettings, + "Runware Audio Inference Settings": RunwareAudioSettings, + "Runware Audio Inference Settings Voice Modify": RunwareAudioSettingsVoiceModify, "Runware ElevenLabs Provider Settings": RunwareElevenLabsProviderSettings, "Runware ElevenLabs Provider Settings Sections": RunwareElevenLabsProviderSettingsSections, "Runware Accelerator Options": acceleratorOptions, diff --git a/clientlibs/main.js b/clientlibs/main.js index 25f43dc..44cc6f3 100644 --- a/clientlibs/main.js +++ b/clientlibs/main.js @@ -1,6 +1,6 @@ import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js"; -import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler } from "./utils.js"; +import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler } from "./utils.js"; import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; const nodeInitList = []; @@ -78,6 +78,10 @@ app.registerExtension({ videoUpscalerToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCE) { audioInferenceToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECH) { + audioInferenceSpeechToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOSETTINGS) { + audioSettingsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.ACCELERATOROPTIONS) { acceleratorOptionsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.BYTEDANCEPROVIDERSETTINGS) { diff --git a/clientlibs/types.js b/clientlibs/types.js index 58dd1d9..f33d7b0 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -79,10 +79,12 @@ const RUNWARE_NODE_TYPES = { VIDEOMODELSEARCH: "Runware Video Model Search", FRAMEIMAGES: "Runware Frame Images", AUDIOINFERENCE: "Runware Audio Inference", + AUDIOINFERENCESPEECH: "Runware Audio Inference Speech", AUDIOMODELSEARCH: "Runware Audio Model Search", AUDIOSECTIONS: "Runware Audio Sections", AUDIOINFERENCEINPUTS: "Runware Audio Inference Inputs", - AUDIOSETTINGS: "Runware Audio Settings", + AUDIOSETTINGS: "Runware Audio Inference Settings", + AUDIOSETTINGSVOICEMODIFY: "Runware Audio Inference Settings Voice Modify", PIXVERSEPROVIDERSETTINGS: "Runware Pixverse Provider Settings", OPENAIPROVIDERSETTINGS: "Runware OpenAI Provider Settings", BYTEDANCEPROVIDERSETTINGS: "Runware Bytedance Provider Settings", @@ -270,6 +272,9 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, promptEnhancer: true, }, + [RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECH]: { + bgColor: DEFAULT_BGCOLOR, + }, [RUNWARE_NODE_TYPES.AUDIOMODELSEARCH]: { bgColor: DEFAULT_BGCOLOR, liveSearch: true, @@ -444,6 +449,9 @@ const RUNWARE_NODE_PROPS = { [RUNWARE_NODE_TYPES.AUDIOSETTINGS]: { bgColor: DEFAULT_BGCOLOR, }, + [RUNWARE_NODE_TYPES.AUDIOSETTINGSVOICEMODIFY]: { + bgColor: DEFAULT_BGCOLOR, + }, [RUNWARE_NODE_TYPES.ACCELERATOROPTIONS]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 1f5d70f..c2266b7 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -1046,6 +1046,8 @@ function audioInferenceToggleHandler(audioInferenceNode) { const strengthWidget = audioInferenceNode.widgets.find(w => w.name === "strength"); const useCFGScaleWidget = audioInferenceNode.widgets.find(w => w.name === "useCFGScale"); const CFGScaleWidget = audioInferenceNode.widgets.find(w => w.name === "CFGScale"); + const useChannelsWidget = audioInferenceNode.widgets.find(w => w.name === "useChannels"); + const channelsWidget = audioInferenceNode.widgets.find(w => w.name === "channels"); // Helper function to toggle widget enabled state (exact same pattern) function toggleWidgetState(useWidget, paramWidget, paramName) { @@ -1120,6 +1122,81 @@ function audioInferenceToggleHandler(audioInferenceNode) { if (useCFGScaleWidget && CFGScaleWidget) { toggleWidgetState(useCFGScaleWidget, CFGScaleWidget, "CFGScale"); } + + if (useChannelsWidget && channelsWidget) { + toggleWidgetState(useChannelsWidget, channelsWidget, "channels"); + } +} + +function audioSettingsToggleHandler(settingsNode) { + if (!settingsNode?.widgets) return; + + const useLyricsWidget = settingsNode.widgets.find(w => w && w.name === "useLyrics"); + const lyricsWidget = settingsNode.widgets.find(w => w && w.name === "lyrics"); + const useGuidanceTypeWidget = settingsNode.widgets.find(w => w && w.name === "useGuidanceType"); + const guidanceTypeWidget = settingsNode.widgets.find(w => w && w.name === "guidanceType"); + const useLanguageBoostWidget = settingsNode.widgets.find(w => w && w.name === "useLanguageBoost"); + const languageBoostWidget = settingsNode.widgets.find(w => w && w.name === "languageBoost"); + const useTurboWidget = settingsNode.widgets.find(w => w && w.name === "useTurbo"); + const turboWidget = settingsNode.widgets.find(w => w && w.name === "turbo"); + + function toggleWidgetState(useWidget, paramWidget, paramName) { + if (!useWidget || !paramWidget) return; + function applyState() { + const enabled = useWidget.value === true; + toggleWidgetEnabled(paramWidget, enabled, settingsNode); + if (paramWidget.options && paramWidget.options.element) { + paramWidget.options.element.disabled = !enabled; + paramWidget.options.element.style.opacity = enabled ? "1" : "0.5"; + paramWidget.options.element.style.pointerEvents = enabled ? "auto" : "none"; + } + settingsNode.setDirtyCanvas(true); + } + setTimeout(applyState, 100); + appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); + } + + if (useLyricsWidget && lyricsWidget) toggleWidgetState(useLyricsWidget, lyricsWidget, "lyrics"); + if (useGuidanceTypeWidget && guidanceTypeWidget) toggleWidgetState(useGuidanceTypeWidget, guidanceTypeWidget, "guidanceType"); + if (useLanguageBoostWidget && languageBoostWidget) toggleWidgetState(useLanguageBoostWidget, languageBoostWidget, "languageBoost"); + if (useTurboWidget && turboWidget) toggleWidgetState(useTurboWidget, turboWidget, "turbo"); +} + +function audioInferenceSpeechToggleHandler(speechNode) { + if (!speechNode?.widgets) return; + + const useSpeedWidget = speechNode.widgets.find(w => w && w.name === "useSpeed"); + const speedWidget = speechNode.widgets.find(w => w && w.name === "speed"); + const useVolumeWidget = speechNode.widgets.find(w => w && w.name === "useVolume"); + const volumeWidget = speechNode.widgets.find(w => w && w.name === "volume"); + const usePitchWidget = speechNode.widgets.find(w => w && w.name === "usePitch"); + const pitchWidget = speechNode.widgets.find(w => w && w.name === "pitch"); + const useEmotionWidget = speechNode.widgets.find(w => w && w.name === "useEmotion"); + const emotionWidget = speechNode.widgets.find(w => w && w.name === "emotion"); + const useToneWidget = speechNode.widgets.find(w => w && w.name === "useTone"); + const toneWidget = speechNode.widgets.find(w => w && w.name === "tone"); + + function toggleWidgetState(useWidget, paramWidget, paramName) { + if (!useWidget || !paramWidget) return; + function applyState() { + const enabled = useWidget.value === true; + toggleWidgetEnabled(paramWidget, enabled, speechNode); + if (paramWidget.options && paramWidget.options.element) { + paramWidget.options.element.disabled = !enabled; + paramWidget.options.element.style.opacity = enabled ? "1" : "0.5"; + paramWidget.options.element.style.pointerEvents = enabled ? "auto" : "none"; + } + speechNode.setDirtyCanvas(true); + } + setTimeout(applyState, 100); + appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); + } + + if (useSpeedWidget && speedWidget) toggleWidgetState(useSpeedWidget, speedWidget, "speed"); + if (useVolumeWidget && volumeWidget) toggleWidgetState(useVolumeWidget, volumeWidget, "volume"); + if (usePitchWidget && pitchWidget) toggleWidgetState(usePitchWidget, pitchWidget, "pitch"); + if (useEmotionWidget && emotionWidget) toggleWidgetState(useEmotionWidget, emotionWidget, "emotion"); + if (useToneWidget && toneWidget) toggleWidgetState(useToneWidget, toneWidget, "tone"); } function acceleratorOptionsToggleHandler(acceleratorNode) { @@ -2608,6 +2685,9 @@ function audioModelSearchFilterHandler(audioModelSearchNode) { "Ace": [ "runware:ace-step@0 (ACE Step v1 3.5B)", ], + "MiniMax": [ + "minimax:speech@2.8 (MiniMax Speech 2.8)", + ], }; function filterModelList() { @@ -3045,6 +3125,16 @@ function briaProviderSettingsToggleHandler(briaNode) { const autoTrimWidget = briaNode.widgets.find(w => w.name === "autoTrim"); const usePreserveAudioWidget = briaNode.widgets.find(w => w.name === "usePreserveAudio"); const preserveAudioWidget = briaNode.widgets.find(w => w.name === "preserveAudio"); + const useSeasonWidget = briaNode.widgets.find(w => w.name === "useSeason"); + const seasonWidget = briaNode.widgets.find(w => w.name === "season"); + const useEditWidget = briaNode.widgets.find(w => w.name === "useEdit"); + const editWidget = briaNode.widgets.find(w => w.name === "edit"); + const useColorWidget = briaNode.widgets.find(w => w.name === "useColor"); + const colorWidget = briaNode.widgets.find(w => w.name === "color"); + const useLightDirectionWidget = briaNode.widgets.find(w => w.name === "useLightDirection"); + const lightDirectionWidget = briaNode.widgets.find(w => w.name === "lightDirection"); + const useLightTypeWidget = briaNode.widgets.find(w => w.name === "useLightType"); + const lightTypeWidget = briaNode.widgets.find(w => w.name === "lightType"); // Helper function to toggle widget enabled state (exact same pattern) function toggleWidgetState(useWidget, paramWidget, paramName) { @@ -3156,6 +3246,26 @@ function briaProviderSettingsToggleHandler(briaNode) { if (usePreserveAudioWidget && preserveAudioWidget) { toggleWidgetState(usePreserveAudioWidget, preserveAudioWidget, "preserveAudio"); } + + if (useSeasonWidget && seasonWidget) { + toggleWidgetState(useSeasonWidget, seasonWidget, "season"); + } + + if (useEditWidget && editWidget) { + toggleWidgetState(useEditWidget, editWidget, "edit"); + } + + if (useColorWidget && colorWidget) { + toggleWidgetState(useColorWidget, colorWidget, "color"); + } + + if (useLightDirectionWidget && lightDirectionWidget) { + toggleWidgetState(useLightDirectionWidget, lightDirectionWidget, "lightDirection"); + } + + if (useLightTypeWidget && lightTypeWidget) { + toggleWidgetState(useLightTypeWidget, lightTypeWidget, "lightType"); + } } function audioInputToggleHandler(audioInputNode) { @@ -3677,6 +3787,8 @@ export { upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, + audioInferenceSpeechToggleHandler, + audioSettingsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, diff --git a/modules/audioInference.py b/modules/audioInference.py index 7fc08f3..88bd419 100644 --- a/modules/audioInference.py +++ b/modules/audioInference.py @@ -52,22 +52,33 @@ class RunwareAudioInference: "tooltip": "Enable/disable sampleRate parameter in API request" }), "sampleRate": ("INT", { - "default": 22050, + "default": 32000, "min": 8000, - "max": 48000, + "max": 44100, "step": 1, - "tooltip": "Sample rate of the generated audio in Hz (8000-48000)" + "tooltip": "Audio sample rate in Hz. Supported: 8000, 16000, 22050, 24000, 32000, 44100." }), "useBitrate": ("BOOLEAN", { "default": False, - "tooltip": "Enable/disable bitrate parameter in API request" + "tooltip": "Enable/disable bitrate parameter in API request (MP3 only)" }), "bitrate": ("INT", { - "default": 32, - "min": 32, - "max": 320, - "step": 32, - "tooltip": "Bitrate of the generated audio in kbps (32-320)" + "default": 128000, + "min": 32000, + "max": 256000, + "step": 1, + "tooltip": "Audio bitrate in bps. Supported: 32000, 64000, 128000, 256000. Only applies to MP3 format." + }), + "useChannels": ("BOOLEAN", { + "default": False, + "tooltip": "Enable/disable channels parameter in API request" + }), + "channels": ("INT", { + "default": 2, + "min": 1, + "max": 2, + "step": 1, + "tooltip": "Number of audio channels (1=mono, 2=stereo)" }), "outputType": (["URL", "dataURI", "base64Data"], { "default": "URL", @@ -131,7 +142,13 @@ class RunwareAudioInference: "tooltip": "Custom inputs for audio generation (e.g., video URL for audio extraction)" }), "settings": ("RUNWAREAUDIOSETTINGS", { - "tooltip": "Connect Runware Audio Settings for lyrics, guidanceType, etc." + "tooltip": "Connect Runware Audio Inference Settings for lyrics, guidanceType, etc." + }), + "speech": ("RUNWARESPEECH", { + "tooltip": "Connect Runware Audio Inference Speech for speech synthesis (e.g. Minimax)" + }), + "voiceModify": ("RUNWAREVOICEMODIFY", { + "tooltip": "Connect Runware Audio Inference Settings Voice Modify for pitch, intensity, timbre, sound effects" }), "providerSettings": ("RUNWAREPROVIDERSETTINGS", { "tooltip": "Provider-specific configuration settings" @@ -253,10 +270,12 @@ class RunwareAudioInference: "model": kwargs.get("model", ""), "duration": kwargs.get("duration", 30), "useDuration": kwargs.get("useDuration", True), - "sampleRate": kwargs.get("sampleRate", 22050), + "sampleRate": kwargs.get("sampleRate", 32000), "useSampleRate": kwargs.get("useSampleRate", False), - "bitrate": kwargs.get("bitrate", 32), + "bitrate": kwargs.get("bitrate", 128000), "useBitrate": kwargs.get("useBitrate", False), + "channels": kwargs.get("channels", 2), + "useChannels": kwargs.get("useChannels", False), "outputType": kwargs.get("outputType", "URL"), "outputFormat": kwargs.get("outputFormat", "MP3"), "negativePrompt": kwargs.get("negativePrompt", ""), @@ -271,6 +290,8 @@ class RunwareAudioInference: "useCFGScale": kwargs.get("useCFGScale", False), "inputs": kwargs.get("inputs", None), "settings": kwargs.get("settings", None), + "speech": kwargs.get("speech", None), + "voiceModify": kwargs.get("voiceModify", None), "providerSettings": kwargs.get("providerSettings", None), } @@ -308,6 +329,8 @@ class RunwareAudioInference: audioSettings["sampleRate"] = params["sampleRate"] if params["useBitrate"]: audioSettings["bitrate"] = params["bitrate"] + if params["useChannels"]: + audioSettings["channels"] = params["channels"] # Only add audioSettings if at least one setting is enabled if audioSettings: @@ -356,6 +379,21 @@ class RunwareAudioInference: if params["settings"] is not None and isinstance(params["settings"], dict) and len(params["settings"]) > 0: genConfig[0]["settings"] = params["settings"] print(f"[DEBUG] Audio settings merged: {rwUtils.sanitize_for_logging(params['settings'])}") + + # Handle speech (from Runware Audio Inference Speech node) + if params["speech"] is not None and isinstance(params["speech"], dict) and len(params["speech"]) > 0: + genConfig[0]["speech"] = params["speech"] + print(f"[DEBUG] Speech merged: {rwUtils.sanitize_for_logging(params['speech'])}") + + # Handle voiceModify (from Runware Audio Inference Settings Voice Modify node) -> settings.voiceModify + if params["voiceModify"] is not None and isinstance(params["voiceModify"], dict) and len(params["voiceModify"]) > 0: + if "settings" not in genConfig[0]: + genConfig[0]["settings"] = {} + vm = dict(params["voiceModify"]) + if "soundEffects" in vm: + vm["sound_effects"] = vm.pop("soundEffects") + genConfig[0]["settings"]["voiceModify"] = vm + print(f"[DEBUG] Voice modify merged: {rwUtils.sanitize_for_logging(vm)}") # Handle inputs - merge custom inputs from Audio Inference Inputs node if params["inputs"] is not None: diff --git a/modules/audioInferenceSpeech.py b/modules/audioInferenceSpeech.py new file mode 100644 index 0000000..692c9ea --- /dev/null +++ b/modules/audioInferenceSpeech.py @@ -0,0 +1,115 @@ +""" +Runware Audio Inference Speech node: builds the speech payload for Runware Audio Inference. +Connect its output to the "speech" input of Runware Audio Inference for speech synthesis (e.g. Minimax). +""" + +from typing import Dict, Any + + +class RunwareAudioInferenceSpeech: + """Builds speech payload (text, voice, speed, volume, pitch?, emotion?, tone?) for Runware Audio Inference.""" + + EMOTIONS = [ + "happy", "sad", "angry", "fearful", "disgusted", "surprised", + "calm", "fluent", "whisper", + ] + + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", { + "multiline": True, + "default": "Hello, this is a test of the speech synthesis model.", + "tooltip": "Text to synthesize as speech (speech.text)", + }), + "voice": ("STRING", { + "default": "English_Whispering_girl", + "tooltip": "Voice identifier - see System Voice ID List (speech.voice)", + }), + }, + "optional": { + "useSpeed": ("BOOLEAN", {"default": True, "tooltip": "Include speed (speech.speed)"}), + "speed": ("FLOAT", { + "default": 1.0, + "min": 0.5, + "max": 2.0, + "step": 0.01, + "tooltip": "Speech rate multiplier (speech.speed)", + }), + "useVolume": ("BOOLEAN", {"default": True, "tooltip": "Include volume (speech.volume)"}), + "volume": ("FLOAT", { + "default": 1.0, + "min": 1.0, + "max": 10.0, + "step": 0.1, + "tooltip": "Volume level 1-10 (speech.volume)", + }), + "usePitch": ("BOOLEAN", {"default": False, "tooltip": "Include pitch (speech.pitch)"}), + "pitch": ("FLOAT", { + "default": 0.0, + "min": -12.0, + "max": 12.0, + "step": 0.1, + "tooltip": "Pitch multiplier -12 to 12 (speech.pitch)", + }), + "useEmotion": ("BOOLEAN", {"default": False, "tooltip": "Include emotion (not available for speech.turbo)"}), + "emotion": (cls.EMOTIONS, {"default": "calm", "tooltip": "Emotion for speech (speech.emotion)"}), + "useTone": ("BOOLEAN", {"default": False, "tooltip": "Include pronunciation dictionary (speech.tone)"}), + "tone": ("STRING", { + "multiline": True, + "default": "", + "placeholder": "omg/oh my god\nother/other expansion", + "tooltip": "Pronunciation dictionary, one mapping per line (e.g. omg/oh my god)", + }), + } + } + + RETURN_TYPES = ("RUNWARESPEECH",) + RETURN_NAMES = ("speech",) + FUNCTION = "createSpeech" + CATEGORY = "Runware/Audio" + DESCRIPTION = "Build speech parameters for Runware Audio Inference. Connect output to the 'speech' input of Runware Audio Inference." + + def createSpeech(self, **kwargs) -> tuple: + """Build the speech object for the API (connect to Runware Audio Inference 'speech' input).""" + text = (kwargs.get("text") or "").strip() + voice = (kwargs.get("voice") or "").strip() + use_speed = kwargs.get("useSpeed", True) + speed = float(kwargs.get("speed", 1.0)) + use_volume = kwargs.get("useVolume", True) + volume = float(kwargs.get("volume", 1.0)) + use_pitch = kwargs.get("usePitch", False) + pitch = float(kwargs.get("pitch", 0.0)) + use_emotion = kwargs.get("useEmotion", False) + emotion = kwargs.get("emotion", "calm") + use_tone = kwargs.get("useTone", False) + tone_str = kwargs.get("tone", "") or "" + + speech: Dict[str, Any] = {"text": text, "voice": voice} + if use_speed: + speech["speed"] = speed + if use_volume: + speech["volume"] = volume + if use_pitch: + speech["pitch"] = pitch + if use_emotion: + speech["emotion"] = emotion + if use_tone and tone_str.strip(): + tone_lines = [s.strip() for s in tone_str.replace(",", "\n").split("\n") if s.strip()] + if tone_lines: + speech["tone"] = tone_lines + + return (speech,) + + +NODE_CLASS_MAPPINGS = { + "RunwareAudioInferenceSpeech": RunwareAudioInferenceSpeech, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareAudioInferenceSpeech": "Runware Audio Inference Speech", +} diff --git a/modules/audioModelSearch.py b/modules/audioModelSearch.py index 8e13b21..da47ee7 100644 --- a/modules/audioModelSearch.py +++ b/modules/audioModelSearch.py @@ -17,6 +17,9 @@ class RunwareAudioModelSearch: "Ace": [ "runware:ace-step@0 (ACE Step v1 3.5B)", ], + "MiniMax": [ + "minimax:speech@2.8 (MiniMax Speech 2.8)", + ], } MODEL_PROVIDERS = [ @@ -25,6 +28,7 @@ class RunwareAudioModelSearch: "KlingAI", "Mirelo", "Ace", + "MiniMax", ] @classmethod diff --git a/modules/audioSettings.py b/modules/audioSettings.py index f43f228..623536f 100644 --- a/modules/audioSettings.py +++ b/modules/audioSettings.py @@ -1,68 +1,103 @@ -""" -Runware Audio Settings Node -Provides lyrics and guidanceType settings for Runware Audio Inference -""" - -from typing import Dict, Any - - -class RunwareAudioSettings: - """Runware Audio Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useLyrics": ("BOOLEAN", { - "tooltip": "Enable to include lyrics in audio generation settings", - "default": False, - }), - "lyrics": ("STRING", { - "multiline": True, - "default": "", - "placeholder": "[verse] ... [chorus] ... (format like genius.com)", - "tooltip": "Lyrics for the audio generation. Format like lyrics from genius.com with [verse], [chorus], [refrain], etc.", - }), - "useGuidanceType": ("BOOLEAN", { - "tooltip": "Enable to include guidanceType (controls how guidance value is used)", - "default": False, - }), - "guidanceType": (["apg", "cfg"], { - "tooltip": "Controls how the guidance value is used. apg = Adversarial Perceptual Guidance, cfg = Classifier-Free Guidance", - "default": "apg", - }), - } - } - - RETURN_TYPES = ("RUNWAREAUDIOSETTINGS",) - RETURN_NAMES = ("settings",) - FUNCTION = "createSettings" - CATEGORY = "Runware/Audio" - DESCRIPTION = "Configure audio generation settings (lyrics, guidanceType) for Runware Audio Inference. Connect to Runware Audio Inference node." - - def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create audio settings dict for API""" - use_lyrics = kwargs.get("useLyrics", False) - lyrics = kwargs.get("lyrics", "") - use_guidance_type = kwargs.get("useGuidanceType", False) - guidance_type = kwargs.get("guidanceType", "apg") - - settings: Dict[str, Any] = {} - - if use_lyrics and lyrics and lyrics.strip(): - settings["lyrics"] = lyrics.strip() - - if use_guidance_type: - settings["guidanceType"] = guidance_type - - return (settings,) - - -NODE_CLASS_MAPPINGS = { - "RunwareAudioSettings": RunwareAudioSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAudioSettings": "Runware Audio Settings", -} +""" +Runware Audio Inference Settings Node +Provides lyrics and guidanceType settings for Runware Audio Inference +""" + +from typing import Dict, Any + + +class RunwareAudioSettings: + """Runware Audio Inference Settings Node""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "useLyrics": ("BOOLEAN", { + "tooltip": "Enable to include lyrics in audio generation settings", + "default": False, + }), + "lyrics": ("STRING", { + "multiline": True, + "default": "", + "placeholder": "[verse] ... [chorus] ... (format like genius.com)", + "tooltip": "Lyrics for the audio generation. Format like lyrics from genius.com with [verse], [chorus], [refrain], etc.", + }), + "useGuidanceType": ("BOOLEAN", { + "tooltip": "Enable to include guidanceType (controls how guidance value is used)", + "default": False, + }), + "guidanceType": (["apg", "cfg"], { + "tooltip": "Controls how the guidance value is used. apg = Adversarial Perceptual Guidance, cfg = Classifier-Free Guidance", + "default": "apg", + }), + "useLanguageBoost": ("BOOLEAN", { + "tooltip": "Enable to include languageBoost (language detection setting) in audio generation settings", + "default": False, + }), + "languageBoost": ([ + "auto", "Chinese", "Chinese,Yue", "English", "Arabic", "Russian", "Spanish", "French", + "Portuguese", "German", "Turkish", "Dutch", "Ukrainian", "Vietnamese", "Indonesian", + "Japanese", "Italian", "Korean", "Thai", "Polish", "Romanian", "Greek", "Czech", + "Finnish", "Hindi", "Bulgarian", "Danish", "Hebrew", "Malay", "Persian", "Slovak", + "Swedish", "Croatian", "Filipino", "Hungarian", "Norwegian", "Slovenian", "Catalan", + "Nynorsk", "Tamil", "Afrikaans", + ], { + "tooltip": "Language detection setting for audio generation.", + "default": "auto", + }), + "useTurbo": ("BOOLEAN", { + "tooltip": "Enable to include turbo (select turbo model or not) in audio generation settings", + "default": False, + }), + "turbo": ("BOOLEAN", { + "tooltip": "When enabled, use turbo model. Only used when 'Use Turbo' is enabled.", + "default": False, + "label_on": "true", + "label_off": "false", + }), + } + } + + RETURN_TYPES = ("RUNWAREAUDIOSETTINGS",) + RETURN_NAMES = ("settings",) + FUNCTION = "createSettings" + CATEGORY = "Runware/Audio" + DESCRIPTION = "Configure audio generation settings (lyrics, guidanceType, languageBoost, turbo) for Runware Audio Inference. Connect to Runware Audio Inference node." + + def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]: + """Create audio settings dict for API""" + use_lyrics = kwargs.get("useLyrics", False) + lyrics = kwargs.get("lyrics", "") + use_guidance_type = kwargs.get("useGuidanceType", False) + guidance_type = kwargs.get("guidanceType", "apg") + use_language_boost = kwargs.get("useLanguageBoost", False) + language_boost = kwargs.get("languageBoost", "auto") + use_turbo = kwargs.get("useTurbo", False) + turbo = kwargs.get("turbo", False) + + settings: Dict[str, Any] = {} + + if use_lyrics and lyrics and lyrics.strip(): + settings["lyrics"] = lyrics.strip() + + if use_guidance_type: + settings["guidanceType"] = guidance_type + + if use_language_boost: + settings["languageBoost"] = language_boost + + if use_turbo: + settings["turbo"] = bool(turbo) # API requires true/false + + return (settings,) + + +NODE_CLASS_MAPPINGS = { + "RunwareAudioSettings": RunwareAudioSettings, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareAudioSettings": "Runware Audio Inference Settings", +} diff --git a/modules/audioSettingsVoiceModify.py b/modules/audioSettingsVoiceModify.py new file mode 100644 index 0000000..8ac047f --- /dev/null +++ b/modules/audioSettingsVoiceModify.py @@ -0,0 +1,98 @@ +""" +Runware Audio Inference Settings Voice Modify node. +Outputs settings.voiceModify (pitch, intensity, timbre, soundEffects) for Runware Audio Inference. +""" + +from typing import Dict, Any + +SOUND_EFFECTS = ["", "spacious_echo", "auditorium_echo", "lofi_telephone", "robotic"] + + +class RunwareAudioSettingsVoiceModify: + """Runware Audio Inference Settings Voice Modify – pitch, intensity, timbre, sound effects.""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "usePitch": ("BOOLEAN", { + "default": False, + "tooltip": "Include pitch in voice modification", + }), + "pitch": ("INT", { + "default": 0, + "min": -100, + "max": 100, + "step": 1, + "tooltip": "Voice pitch modification (settings.voiceModify.pitch)", + }), + "useIntensity": ("BOOLEAN", { + "default": False, + "tooltip": "Include intensity in voice modification", + }), + "intensity": ("INT", { + "default": 0, + "min": -100, + "max": 100, + "step": 1, + "tooltip": "Voice intensity modification (settings.voiceModify.intensity)", + }), + "useTimbre": ("BOOLEAN", { + "default": False, + "tooltip": "Include timbre in voice modification", + }), + "timbre": ("INT", { + "default": 0, + "min": -100, + "max": 100, + "step": 1, + "tooltip": "Voice timbre modification (settings.voiceModify.timbre)", + }), + "useSoundEffects": ("BOOLEAN", { + "default": False, + "tooltip": "Include sound effect in voice modification", + }), + "soundEffects": (SOUND_EFFECTS, { + "default": "", + "tooltip": "Sound effect: spacious_echo, auditorium_echo, lofi_telephone, robotic", + }), + } + } + + RETURN_TYPES = ("RUNWAREVOICEMODIFY",) + RETURN_NAMES = ("voiceModify",) + FUNCTION = "createVoiceModify" + CATEGORY = "Runware/Audio" + DESCRIPTION = "Voice modification settings (pitch, intensity, timbre, sound effects). Connect to Runware Audio Inference voiceModify input." + + def createVoiceModify(self, **kwargs) -> tuple: + """Build voiceModify dict for settings.voiceModify. Only includes keys when the corresponding use toggle is on.""" + use_pitch = kwargs.get("usePitch", False) + pitch = kwargs.get("pitch", 0) + use_intensity = kwargs.get("useIntensity", False) + intensity = kwargs.get("intensity", 0) + use_timbre = kwargs.get("useTimbre", False) + timbre = kwargs.get("timbre", 0) + use_sound_effects = kwargs.get("useSoundEffects", False) + sound_effects = (kwargs.get("soundEffects") or "").strip() + + voice_modify: Dict[str, Any] = {} + if use_pitch: + voice_modify["pitch"] = pitch + if use_intensity: + voice_modify["intensity"] = intensity + if use_timbre: + voice_modify["timbre"] = timbre + if use_sound_effects and sound_effects: + voice_modify["soundEffects"] = sound_effects + return (voice_modify,) + + +NODE_CLASS_MAPPINGS = { + "RunwareAudioSettingsVoiceModify": RunwareAudioSettingsVoiceModify, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareAudioSettingsVoiceModify": "Runware Audio Inference Settings Voice Modify", +} diff --git a/modules/providerSettings/briaImageProviderSettings.py b/modules/providerSettings/briaImageProviderSettings.py index a90ea01..6f2b5a0 100644 --- a/modules/providerSettings/briaImageProviderSettings.py +++ b/modules/providerSettings/briaImageProviderSettings.py @@ -150,6 +150,52 @@ class RunwareBriaProviderSettings: "label_on": "Enabled", "label_off": "Disabled", }), + "useSeason": ("BOOLEAN", { + "tooltip": "Enable to include season parameter (maps to /reseason).", + "default": False, + }), + "season": (["spring", "summer", "autumn", "winter"], { + "tooltip": "Desired season. Maps to /reseason.", + "default": "spring", + }), + "useEdit": ("BOOLEAN", { + "tooltip": "Enable to include edit parameter.", + "default": False, + }), + "edit": (["colorize", "relight", "restore", "blend", "reseason", "sketch_to_image"], { + "tooltip": "Edit mode: colorize, relight, restore, blend, reseason, sketch_to_image.", + "default": "restore", + }), + "useColor": ("BOOLEAN", { + "tooltip": "Enable to include color parameter (maps to /colorize).", + "default": False, + }), + "color": (["contemporary color", "vivid color", "black and white colors", "sepia vintage"], { + "tooltip": "Restoration/color style. Maps to /colorize.", + "default": "contemporary color", + }), + "useLightDirection": ("BOOLEAN", { + "tooltip": "Enable to include lightDirection parameter (maps to /relight).", + "default": False, + }), + "lightDirection": (["front", "side", "bottom", "top-down"], { + "tooltip": "Direction of light. Maps to /relight.", + "default": "front", + }), + "useLightType": ("BOOLEAN", { + "tooltip": "Enable to include lightType parameter (maps to /relight).", + "default": False, + }), + "lightType": ([ + "midday", "blue hour light", "low-angle sunlight", "sunrise light", + "spotlight on subject, keep background settings", "overcast light", + "soft overcast daylight lighting", "cloud-filtered lighting", "fog-diffused lighting", + "moonlight lighting", "starlight lighting nighttime", "soft bokeh lighting", + "harsh studio lighting keep background setting", + ], { + "tooltip": "Type of lighting. Maps to /relight.", + "default": "midday", + }), "Bria Provider Setting Mask": ("RUNWAREBRIAPROVIDERMASK", { "tooltip": "Connect Runware Bria Provider Mask node to provide mask configuration for video eraser operations.", }), @@ -180,6 +226,11 @@ class RunwareBriaProviderSettings: useForceBackgroundDetection = kwargs.get("useForceBackgroundDetection", False) usePreserveAudio = kwargs.get("usePreserveAudio", False) useAutoTrim = kwargs.get("useAutoTrim", False) + useSeason = kwargs.get("useSeason", False) + useEdit = kwargs.get("useEdit", False) + useColor = kwargs.get("useColor", False) + useLightDirection = kwargs.get("useLightDirection", False) + useLightType = kwargs.get("useLightType", False) # Get actual parameters medium = kwargs.get("medium", "photography") @@ -196,6 +247,11 @@ class RunwareBriaProviderSettings: forceBackgroundDetection = kwargs.get("forceBackgroundDetection", False) preserveAudio = kwargs.get("preserveAudio", True) autoTrim = kwargs.get("autoTrim", False) + season = kwargs.get("season", "spring") + edit = kwargs.get("edit", "restore") + color = kwargs.get("color", "contemporary color") + lightDirection = kwargs.get("lightDirection", "front") + lightType = kwargs.get("lightType", "midday") mask = kwargs.get("Bria Provider Setting Mask", None) # Build settings dictionary @@ -257,6 +313,26 @@ class RunwareBriaProviderSettings: if useAutoTrim: settings["autoTrim"] = autoTrim + # Add season only if useSeason is enabled (maps to /reseason) + if useSeason: + settings["season"] = season + + # Add edit only if useEdit is enabled + if useEdit: + settings["edit"] = edit + + # Add color only if useColor is enabled (maps to /colorize) + if useColor: + settings["color"] = color + + # Add lightDirection only if useLightDirection is enabled (maps to /relight; API may expect light_direction) + if useLightDirection: + settings["lightDirection"] = lightDirection + + # Add lightType only if useLightType is enabled (maps to /relight; API may expect light_type) + if useLightType: + settings["lightType"] = lightType + # Add mask if provided from Mask node if mask is not None and isinstance(mask, dict) and len(mask) > 0: settings["mask"] = mask diff --git a/modules/utils/runwareUtils.py b/modules/utils/runwareUtils.py index 97000e7..07f5983 100644 --- a/modules/utils/runwareUtils.py +++ b/modules/utils/runwareUtils.py @@ -158,7 +158,7 @@ def getCustomEndpoint(): custom_endpoint = os.getenv("RUNWARE_CUSTOM_ENDPOINT") if custom_endpoint and isinstance(custom_endpoint, str): return custom_endpoint - return "https://api.runware.ai/v1" + return "https://api.runware.dev/v1" SESSION_TIMEOUT = getTimeout() RUNWARE_API_KEY = getAPIKey() diff --git a/workflows/Runware_Audio_Inference_ACE.json b/workflows/Runware_Audio_Inference_ACE.json index 801dc58..a2f7175 100644 --- a/workflows/Runware_Audio_Inference_ACE.json +++ b/workflows/Runware_Audio_Inference_ACE.json @@ -1 +1 @@ -{"id":"8ff9778f-e410-42b2-961f-c8cb8f60d4ce","revision":0,"last_node_id":4,"last_link_id":3,"nodes":[{"id":2,"type":"Runware Audio Settings","pos":[264.5525817871094,842.3980712890625],"size":[400,200],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useLyrics","name":"useLyrics","shape":7,"type":"BOOLEAN","widget":{"name":"useLyrics"},"link":null},{"localized_name":"lyrics","name":"lyrics","shape":7,"type":"STRING","widget":{"name":"lyrics"},"link":null},{"localized_name":"useGuidanceType","name":"useGuidanceType","shape":7,"type":"BOOLEAN","widget":{"name":"useGuidanceType"},"link":null},{"localized_name":"guidanceType","name":"guidanceType","shape":7,"type":"COMBO","widget":{"name":"guidanceType"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREAUDIOSETTINGS","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a854323c086aa373a07f76cdf204e4d3f6ab345c","Node name for S&R":"Runware Audio Settings"},"widgets_values":[true,"[verse] It feels so wrong stuck down in the web we weave Tear apart the way we are and do it so well Our peace of mind left in pieces Holding your head in hands and the world's watching today [refrain] Feeling like an empty room Nothing ever fits, but I will find my way Resume Who am I staring at? All I've wanted and more, living beyond the door Right behind the front door [chorus] Painting the patterns I've become within my eyes Murals fade, but lessons they sow And as the paths we wandеr have shown, our hearts will grow Beauty wadеs within the sound soul [verse] I've said so long to sanity Picked apart the way I am, but living to tell The surgery of mending pieces is hanging over me and the world's watching today [pre-chorus] Yeah, this is still life Make it mine I used to do it all the time Dust off your shoulders through it Yeah, this is still life Make it mine I used to do it all the time Sick of living low I've gotta let the feeling go [chorus] Painting the patterns I've become within my eyes Murals fade, but lessons they sow And as the paths we wander have shown, our hearts will grow Beauty wades within the sound soul [post-chorus] Yeah, this is still life Make it mine I used to do it all the time Dust off your shoulders through it Yeah, this is still life Make it mine I used to do it all the time Sick of living low I've gotta pick me off the floor",false,"apg"],"bgcolor":"#5345bf"},{"id":3,"type":"Runware Audio Model Search","pos":[249.71864318847656,482.31390380859375],"size":[270,130],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"AudioList","name":"AudioList","type":"COMBO","widget":{"name":"AudioList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a854323c086aa373a07f76cdf204e4d3f6ab345c","Node name for S&R":"Runware Audio Model Search"},"widgets_values":["","Ace","runware:ace-step@0 (ACE Step v1 3.5B)",false],"bgcolor":"#5345bf"},{"id":4,"type":"SaveAudioMP3","pos":[1275.9183349609375,442.26556396484375],"size":[270,136],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":3},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"quality","name":"quality","type":"COMBO","widget":{"name":"quality"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveAudioMP3"},"widgets_values":["audio/ComfyUI","V0"]},{"id":1,"type":"Runware Audio Inference","pos":[705.0624389648438,394.2606201171875],"size":[400,658],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","link":2},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREAUDIOINFERENCEINPUTS","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWAREAUDIOSETTINGS","link":1},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"usePositivePrompt","name":"usePositivePrompt","type":"BOOLEAN","widget":{"name":"usePositivePrompt"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"useDuration","name":"useDuration","type":"BOOLEAN","widget":{"name":"useDuration"},"link":null},{"localized_name":"duration","name":"duration","type":"INT","widget":{"name":"duration"},"link":null},{"localized_name":"useSampleRate","name":"useSampleRate","type":"BOOLEAN","widget":{"name":"useSampleRate"},"link":null},{"localized_name":"sampleRate","name":"sampleRate","type":"INT","widget":{"name":"sampleRate"},"link":null},{"localized_name":"useBitrate","name":"useBitrate","type":"BOOLEAN","widget":{"name":"useBitrate"},"link":null},{"localized_name":"bitrate","name":"bitrate","type":"INT","widget":{"name":"bitrate"},"link":null},{"localized_name":"outputType","name":"outputType","type":"COMBO","widget":{"name":"outputType"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"numberResults","name":"numberResults","type":"INT","widget":{"name":"numberResults"},"link":null},{"localized_name":"useSeed","name":"useSeed","type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useSteps","name":"useSteps","type":"BOOLEAN","widget":{"name":"useSteps"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"useStrength","name":"useStrength","type":"BOOLEAN","widget":{"name":"useStrength"},"link":null},{"localized_name":"strength","name":"strength","type":"FLOAT","widget":{"name":"strength"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"CFGScale","name":"CFGScale","type":"FLOAT","widget":{"name":"CFGScale"},"link":null}],"outputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","links":[3]},{"localized_name":"video","name":"video","type":"VIDEO","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a854323c086aa373a07f76cdf204e4d3f6ab345c","Node name for S&R":"Runware Audio Inference"},"widgets_values":[true,"classical piano piece, gentle and melodic","",true,30,false,22050,false,32,"URL","MP3",1,false,2120484338,"randomize",true,100,false,0.8,false,12],"bgcolor":"#5345bf"}],"links":[[1,2,0,1,2,"RUNWAREAUDIOSETTINGS"],[2,3,0,1,0,"RUNWAREAUDIOMODEL"],[3,1,0,4,0,"AUDIO"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6830134553650705,"offset":[363.8807921199257,-36.26381474947803]}},"version":0.4} \ No newline at end of file +{"id":"8ff9778f-e410-42b2-961f-c8cb8f60d4ce","revision":0,"last_node_id":4,"last_link_id":3,"nodes":[{"id":2,"type":"Runware Audio Inference Settings","pos":[264.5525817871094,842.3980712890625],"size":[400,200],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useLyrics","name":"useLyrics","shape":7,"type":"BOOLEAN","widget":{"name":"useLyrics"},"link":null},{"localized_name":"lyrics","name":"lyrics","shape":7,"type":"STRING","widget":{"name":"lyrics"},"link":null},{"localized_name":"useGuidanceType","name":"useGuidanceType","shape":7,"type":"BOOLEAN","widget":{"name":"useGuidanceType"},"link":null},{"localized_name":"guidanceType","name":"guidanceType","shape":7,"type":"COMBO","widget":{"name":"guidanceType"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREAUDIOSETTINGS","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a854323c086aa373a07f76cdf204e4d3f6ab345c","Node name for S&R":"Runware Audio Inference Settings"},"widgets_values":[true,"[verse] It feels so wrong stuck down in the web we weave Tear apart the way we are and do it so well Our peace of mind left in pieces Holding your head in hands and the world's watching today [refrain] Feeling like an empty room Nothing ever fits, but I will find my way Resume Who am I staring at? All I've wanted and more, living beyond the door Right behind the front door [chorus] Painting the patterns I've become within my eyes Murals fade, but lessons they sow And as the paths we wandеr have shown, our hearts will grow Beauty wadеs within the sound soul [verse] I've said so long to sanity Picked apart the way I am, but living to tell The surgery of mending pieces is hanging over me and the world's watching today [pre-chorus] Yeah, this is still life Make it mine I used to do it all the time Dust off your shoulders through it Yeah, this is still life Make it mine I used to do it all the time Sick of living low I've gotta let the feeling go [chorus] Painting the patterns I've become within my eyes Murals fade, but lessons they sow And as the paths we wander have shown, our hearts will grow Beauty wades within the sound soul [post-chorus] Yeah, this is still life Make it mine I used to do it all the time Dust off your shoulders through it Yeah, this is still life Make it mine I used to do it all the time Sick of living low I've gotta pick me off the floor",false,"apg"],"bgcolor":"#5345bf"},{"id":3,"type":"Runware Audio Model Search","pos":[249.71864318847656,482.31390380859375],"size":[270,130],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"AudioList","name":"AudioList","type":"COMBO","widget":{"name":"AudioList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a854323c086aa373a07f76cdf204e4d3f6ab345c","Node name for S&R":"Runware Audio Model Search"},"widgets_values":["","Ace","runware:ace-step@0 (ACE Step v1 3.5B)",false],"bgcolor":"#5345bf"},{"id":4,"type":"SaveAudioMP3","pos":[1275.9183349609375,442.26556396484375],"size":[270,136],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":3},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"quality","name":"quality","type":"COMBO","widget":{"name":"quality"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveAudioMP3"},"widgets_values":["audio/ComfyUI","V0"]},{"id":1,"type":"Runware Audio Inference","pos":[705.0624389648438,394.2606201171875],"size":[400,658],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","link":2},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREAUDIOINFERENCEINPUTS","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWAREAUDIOSETTINGS","link":1},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"usePositivePrompt","name":"usePositivePrompt","type":"BOOLEAN","widget":{"name":"usePositivePrompt"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"useDuration","name":"useDuration","type":"BOOLEAN","widget":{"name":"useDuration"},"link":null},{"localized_name":"duration","name":"duration","type":"INT","widget":{"name":"duration"},"link":null},{"localized_name":"useSampleRate","name":"useSampleRate","type":"BOOLEAN","widget":{"name":"useSampleRate"},"link":null},{"localized_name":"sampleRate","name":"sampleRate","type":"INT","widget":{"name":"sampleRate"},"link":null},{"localized_name":"useBitrate","name":"useBitrate","type":"BOOLEAN","widget":{"name":"useBitrate"},"link":null},{"localized_name":"bitrate","name":"bitrate","type":"INT","widget":{"name":"bitrate"},"link":null},{"localized_name":"outputType","name":"outputType","type":"COMBO","widget":{"name":"outputType"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"numberResults","name":"numberResults","type":"INT","widget":{"name":"numberResults"},"link":null},{"localized_name":"useSeed","name":"useSeed","type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useSteps","name":"useSteps","type":"BOOLEAN","widget":{"name":"useSteps"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"useStrength","name":"useStrength","type":"BOOLEAN","widget":{"name":"useStrength"},"link":null},{"localized_name":"strength","name":"strength","type":"FLOAT","widget":{"name":"strength"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"CFGScale","name":"CFGScale","type":"FLOAT","widget":{"name":"CFGScale"},"link":null}],"outputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","links":[3]},{"localized_name":"video","name":"video","type":"VIDEO","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a854323c086aa373a07f76cdf204e4d3f6ab345c","Node name for S&R":"Runware Audio Inference"},"widgets_values":[true,"classical piano piece, gentle and melodic","",true,30,false,22050,false,32,"URL","MP3",1,false,2120484338,"randomize",true,100,false,0.8,false,12],"bgcolor":"#5345bf"}],"links":[[1,2,0,1,2,"RUNWAREAUDIOSETTINGS"],[2,3,0,1,0,"RUNWAREAUDIOMODEL"],[3,1,0,4,0,"AUDIO"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6830134553650705,"offset":[363.8807921199257,-36.26381474947803]}},"version":0.4} \ No newline at end of file diff --git a/workflows/Runware_Audio_Inference_Minimax_Speech.json b/workflows/Runware_Audio_Inference_Minimax_Speech.json new file mode 100644 index 0000000..879ad85 --- /dev/null +++ b/workflows/Runware_Audio_Inference_Minimax_Speech.json @@ -0,0 +1 @@ +{"id":"704bdcd0-62e7-4fae-b04b-91acaf1fa280","revision":0,"last_node_id":9,"last_link_id":5,"nodes":[{"id":4,"type":"SaveAudioMP3","pos":[840.6617431640625,432.63543701171875],"size":[270,136],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":3},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"quality","name":"quality","type":"COMBO","widget":{"name":"quality"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveAudioMP3"},"widgets_values":["audio/ComfyUI","V0"]},{"id":3,"type":"Runware Audio Model Search","pos":[-424.3514404296875,415.7318115234375],"size":[270,130],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"AudioList","name":"AudioList","type":"COMBO","widget":{"name":"AudioList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Audio Model Search"},"widgets_values":["","MiniMax","minimax:speech@2.8 (MiniMax Speech 2.8)",false],"bgcolor":"#5345bf"},{"id":7,"type":"Runware Audio Inference","pos":[2.69230580329895,405.2198486328125],"size":[400,746],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","link":2},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREAUDIOINFERENCEINPUTS","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWAREAUDIOSETTINGS","link":1},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWARESPEECH","link":5},{"localized_name":"voiceModify","name":"voiceModify","shape":7,"type":"RUNWAREVOICEMODIFY","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"usePositivePrompt","name":"usePositivePrompt","type":"BOOLEAN","widget":{"name":"usePositivePrompt"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"useDuration","name":"useDuration","type":"BOOLEAN","widget":{"name":"useDuration"},"link":null},{"localized_name":"duration","name":"duration","type":"INT","widget":{"name":"duration"},"link":null},{"localized_name":"useSampleRate","name":"useSampleRate","type":"BOOLEAN","widget":{"name":"useSampleRate"},"link":null},{"localized_name":"sampleRate","name":"sampleRate","type":"INT","widget":{"name":"sampleRate"},"link":null},{"localized_name":"useBitrate","name":"useBitrate","type":"BOOLEAN","widget":{"name":"useBitrate"},"link":null},{"localized_name":"bitrate","name":"bitrate","type":"INT","widget":{"name":"bitrate"},"link":null},{"localized_name":"useChannels","name":"useChannels","type":"BOOLEAN","widget":{"name":"useChannels"},"link":null},{"localized_name":"channels","name":"channels","type":"INT","widget":{"name":"channels"},"link":null},{"localized_name":"outputType","name":"outputType","type":"COMBO","widget":{"name":"outputType"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"numberResults","name":"numberResults","type":"INT","widget":{"name":"numberResults"},"link":null},{"localized_name":"useSeed","name":"useSeed","type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useSteps","name":"useSteps","type":"BOOLEAN","widget":{"name":"useSteps"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"useStrength","name":"useStrength","type":"BOOLEAN","widget":{"name":"useStrength"},"link":null},{"localized_name":"strength","name":"strength","type":"FLOAT","widget":{"name":"strength"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"CFGScale","name":"CFGScale","type":"FLOAT","widget":{"name":"CFGScale"},"link":null}],"outputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","links":[3]},{"localized_name":"video","name":"video","type":"VIDEO","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Audio Inference"},"widgets_values":[true,"classical piano piece, gentle and melodic","",true,10,true,32000,true,128000,false,2,"URL","MP3",1,false,797143023,"randomize",false,20,false,0.8,false,12],"bgcolor":"#5345bf"},{"id":6,"type":"Runware Audio Inference Settings","pos":[-471.38275146484375,633.5619506835938],"size":[400,256],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"useLyrics","name":"useLyrics","shape":7,"type":"BOOLEAN","widget":{"name":"useLyrics"},"link":null},{"localized_name":"lyrics","name":"lyrics","shape":7,"type":"STRING","widget":{"name":"lyrics"},"link":null},{"localized_name":"useGuidanceType","name":"useGuidanceType","shape":7,"type":"BOOLEAN","widget":{"name":"useGuidanceType"},"link":null},{"localized_name":"guidanceType","name":"guidanceType","shape":7,"type":"COMBO","widget":{"name":"guidanceType"},"link":null},{"localized_name":"useLanguageBoost","name":"useLanguageBoost","shape":7,"type":"BOOLEAN","widget":{"name":"useLanguageBoost"},"link":null},{"localized_name":"languageBoost","name":"languageBoost","shape":7,"type":"COMBO","widget":{"name":"languageBoost"},"link":null},{"localized_name":"useTurbo","name":"useTurbo","shape":7,"type":"BOOLEAN","widget":{"name":"useTurbo"},"link":null},{"localized_name":"turbo","name":"turbo","shape":7,"type":"BOOLEAN","widget":{"name":"turbo"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREAUDIOSETTINGS","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Audio Inference Settings"},"widgets_values":[false,"",false,"apg",true,"auto",true,true],"bgcolor":"#5345bf"},{"id":9,"type":"Runware Audio Inference Speech","pos":[528.12353515625,715.8241577148438],"size":[400,382],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null},{"localized_name":"voice","name":"voice","type":"STRING","widget":{"name":"voice"},"link":null},{"localized_name":"useSpeed","name":"useSpeed","shape":7,"type":"BOOLEAN","widget":{"name":"useSpeed"},"link":null},{"localized_name":"speed","name":"speed","shape":7,"type":"FLOAT","widget":{"name":"speed"},"link":null},{"localized_name":"useVolume","name":"useVolume","shape":7,"type":"BOOLEAN","widget":{"name":"useVolume"},"link":null},{"localized_name":"volume","name":"volume","shape":7,"type":"FLOAT","widget":{"name":"volume"},"link":null},{"localized_name":"usePitch","name":"usePitch","shape":7,"type":"BOOLEAN","widget":{"name":"usePitch"},"link":null},{"localized_name":"pitch","name":"pitch","shape":7,"type":"FLOAT","widget":{"name":"pitch"},"link":null},{"localized_name":"useEmotion","name":"useEmotion","shape":7,"type":"BOOLEAN","widget":{"name":"useEmotion"},"link":null},{"localized_name":"emotion","name":"emotion","shape":7,"type":"COMBO","widget":{"name":"emotion"},"link":null},{"localized_name":"useTone","name":"useTone","shape":7,"type":"BOOLEAN","widget":{"name":"useTone"},"link":null},{"localized_name":"tone","name":"tone","shape":7,"type":"STRING","widget":{"name":"tone"},"link":null}],"outputs":[{"localized_name":"speech","name":"speech","type":"RUNWARESPEECH","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Audio Inference Speech"},"widgets_values":["Hello, this is a test of the speech synthesis model.","English_Whispering_girl",true,1,true,1,false,0,false,"calm",false,""],"bgcolor":"#5345bf"}],"links":[[1,6,0,7,2,"RUNWAREAUDIOSETTINGS"],[2,3,0,7,0,"RUNWAREAUDIOMODEL"],[3,7,0,4,0,"AUDIO"],[5,9,0,7,3,"RUNWARESPEECH"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6210486460373088,"offset":[1013.4428096139707,-101.80159042587373]}},"version":0.4} \ No newline at end of file diff --git a/workflows/Runware_Image_Inference_Bria_Fibo_Edit_2.json b/workflows/Runware_Image_Inference_Bria_Fibo_Edit_2.json new file mode 100644 index 0000000..79f33b1 --- /dev/null +++ b/workflows/Runware_Image_Inference_Bria_Fibo_Edit_2.json @@ -0,0 +1 @@ +{"id":"fe386aac-0df5-4854-a3d2-a78500e83b4a","revision":0,"last_node_id":7,"last_link_id":5,"nodes":[{"id":3,"type":"Runware Save Image","pos":[914.8811645507812,313.3735656738281],"size":[270,294],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"Images","name":"Images","type":"STRING","widget":{"name":"Images"},"link":1},{"localized_name":"filenamePrefix","name":"filenamePrefix","type":"STRING","widget":{"name":"filenamePrefix"},"link":null},{"localized_name":"saveImage","name":"saveImage","type":"BOOLEAN","widget":{"name":"saveImage"},"link":null}],"outputs":[],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Save Image"},"widgets_values":["","ComfyUI",true],"bgcolor":"#5345bf"},{"id":4,"type":"LoadImage","pos":[-760.2874755859375,853.3655395507812],"size":[274.080078125,314],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[3]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadImage"},"widgets_values":["0c5b1d6a-84ab-4276-80cc-65ccfb2b54a9.png","image"]},{"id":1,"type":"Runware Image Inference","pos":[20.987668991088867,264.9581604003906],"size":[400,1038],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"Model","name":"Model","type":"RUNWAREMODEL","link":4},{"localized_name":"Accelerator","name":"Accelerator","shape":7,"type":"RUNWAREACCELERATOR","link":null},{"localized_name":"Lora","name":"Lora","shape":7,"type":"RUNWARELORA","link":null},{"localized_name":"Outpainting","name":"Outpainting","shape":7,"type":"RUNWAREOUTPAINT","link":null},{"localized_name":"IPAdapters","name":"IPAdapters","shape":7,"type":"RUNWAREIPAdapter","link":null},{"localized_name":"ControlNet","name":"ControlNet","shape":7,"type":"RUNWARECONTROLNET","link":null},{"localized_name":"Refiner","name":"Refiner","shape":7,"type":"RUNWAREREFINER","link":null},{"localized_name":"seedImage","name":"seedImage","shape":7,"type":"IMAGE","link":null},{"localized_name":"maskImage","name":"maskImage","shape":7,"type":"MASK","link":null},{"localized_name":"Embeddings","name":"Embeddings","shape":7,"type":"RUNWAREEMBEDDING","link":null},{"localized_name":"VAE","name":"VAE","shape":7,"type":"RUNWAREVAE","link":null},{"localized_name":"referenceImages","name":"referenceImages","shape":7,"type":"RUNWAREREFERENCEIMAGES","link":null},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREIMAGEINFERENCEINPUTS","link":5},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":2},{"localized_name":"safetyInputs","name":"safetyInputs","shape":7,"type":"RUNWARESAFETYINPUTS","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWARESETTINGS","link":null},{"localized_name":"ultralytics","name":"ultralytics","shape":7,"type":"RUNWAREULTRALYTICSINPUTS","link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"Multi Inference Mode","name":"Multi Inference Mode","type":"BOOLEAN","widget":{"name":"Multi Inference Mode"},"link":null},{"localized_name":"Prompt Weighting","name":"Prompt Weighting","type":"COMBO","widget":{"name":"Prompt Weighting"},"link":null},{"localized_name":"dimensions","name":"dimensions","type":"COMBO","widget":{"name":"dimensions"},"link":null},{"localized_name":"width","name":"width","type":"INT","widget":{"name":"width"},"link":null},{"localized_name":"height","name":"height","type":"INT","widget":{"name":"height"},"link":null},{"localized_name":"useResolution","name":"useResolution","type":"BOOLEAN","widget":{"name":"useResolution"},"link":null},{"localized_name":"resolution","name":"resolution","type":"COMBO","widget":{"name":"resolution"},"link":null},{"localized_name":"useSteps","name":"useSteps","type":"BOOLEAN","widget":{"name":"useSteps"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"useScheduler","name":"useScheduler","type":"BOOLEAN","widget":{"name":"useScheduler"},"link":null},{"localized_name":"scheduler","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"cfgScale","name":"cfgScale","type":"FLOAT","widget":{"name":"cfgScale"},"link":null},{"localized_name":"useSeed","name":"useSeed","type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useClipSkip","name":"useClipSkip","type":"BOOLEAN","widget":{"name":"useClipSkip"},"link":null},{"localized_name":"clipSkip","name":"clipSkip","type":"INT","widget":{"name":"clipSkip"},"link":null},{"localized_name":"strength","name":"strength","type":"FLOAT","widget":{"name":"strength"},"link":null},{"localized_name":"Mask Margin","name":"Mask Margin","type":"BOOLEAN","widget":{"name":"Mask Margin"},"link":null},{"localized_name":"maskMargin","name":"maskMargin","type":"INT","widget":{"name":"maskMargin"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"batchSize","name":"batchSize","type":"INT","widget":{"name":"batchSize"},"link":null},{"localized_name":"acceleration","name":"acceleration","type":"COMBO","widget":{"name":"acceleration"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"STRING","links":[1]},{"localized_name":"RW-Task","name":"RW-Task","type":"RUNWARETASK","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Image Inference"},"widgets_values":["A couple","",false,"Disabled","Square (512x512)",512,512,false,"1k",true,4,true,"Default",true,6.5,true,502160801,"randomize",true,0,0.8,false,32,"WEBP",1,"none"],"bgcolor":"#5345bf"},{"id":2,"type":"Runware Bria Provider Settings","pos":[458.2757568359375,312.7917175292969],"size":[333.767578125,946],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Bria Provider Setting Mask","name":"Bria Provider Setting Mask","shape":7,"type":"RUNWAREBRIAPROVIDERMASK","link":null},{"localized_name":"useMedium","name":"useMedium","shape":7,"type":"BOOLEAN","widget":{"name":"useMedium"},"link":null},{"localized_name":"medium","name":"medium","shape":7,"type":"COMBO","widget":{"name":"medium"},"link":null},{"localized_name":"usePromptEnhancement","name":"usePromptEnhancement","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptEnhancement"},"link":null},{"localized_name":"promptEnhancement","name":"promptEnhancement","shape":7,"type":"BOOLEAN","widget":{"name":"promptEnhancement"},"link":null},{"localized_name":"useEnhanceImage","name":"useEnhanceImage","shape":7,"type":"BOOLEAN","widget":{"name":"useEnhanceImage"},"link":null},{"localized_name":"enhanceImage","name":"enhanceImage","shape":7,"type":"BOOLEAN","widget":{"name":"enhanceImage"},"link":null},{"localized_name":"usePromptContentModeration","name":"usePromptContentModeration","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptContentModeration"},"link":null},{"localized_name":"promptContentModeration","name":"promptContentModeration","shape":7,"type":"BOOLEAN","widget":{"name":"promptContentModeration"},"link":null},{"localized_name":"useContentModeration","name":"useContentModeration","shape":7,"type":"BOOLEAN","widget":{"name":"useContentModeration"},"link":null},{"localized_name":"contentModeration","name":"contentModeration","shape":7,"type":"BOOLEAN","widget":{"name":"contentModeration"},"link":null},{"localized_name":"useIpSignal","name":"useIpSignal","shape":7,"type":"BOOLEAN","widget":{"name":"useIpSignal"},"link":null},{"localized_name":"ipSignal","name":"ipSignal","shape":7,"type":"BOOLEAN","widget":{"name":"ipSignal"},"link":null},{"localized_name":"usePreserveAlpha","name":"usePreserveAlpha","shape":7,"type":"BOOLEAN","widget":{"name":"usePreserveAlpha"},"link":null},{"localized_name":"preserveAlpha","name":"preserveAlpha","shape":7,"type":"BOOLEAN","widget":{"name":"preserveAlpha"},"link":null},{"localized_name":"useMode","name":"useMode","shape":7,"type":"BOOLEAN","widget":{"name":"useMode"},"link":null},{"localized_name":"mode","name":"mode","shape":7,"type":"COMBO","widget":{"name":"mode"},"link":null},{"localized_name":"useEnhanceReferenceImages","name":"useEnhanceReferenceImages","shape":7,"type":"BOOLEAN","widget":{"name":"useEnhanceReferenceImages"},"link":null},{"localized_name":"enhanceReferenceImages","name":"enhanceReferenceImages","shape":7,"type":"BOOLEAN","widget":{"name":"enhanceReferenceImages"},"link":null},{"localized_name":"useRefinePrompt","name":"useRefinePrompt","shape":7,"type":"BOOLEAN","widget":{"name":"useRefinePrompt"},"link":null},{"localized_name":"refinePrompt","name":"refinePrompt","shape":7,"type":"BOOLEAN","widget":{"name":"refinePrompt"},"link":null},{"localized_name":"useOriginalQuality","name":"useOriginalQuality","shape":7,"type":"BOOLEAN","widget":{"name":"useOriginalQuality"},"link":null},{"localized_name":"originalQuality","name":"originalQuality","shape":7,"type":"BOOLEAN","widget":{"name":"originalQuality"},"link":null},{"localized_name":"useForceBackgroundDetection","name":"useForceBackgroundDetection","shape":7,"type":"BOOLEAN","widget":{"name":"useForceBackgroundDetection"},"link":null},{"localized_name":"forceBackgroundDetection","name":"forceBackgroundDetection","shape":7,"type":"BOOLEAN","widget":{"name":"forceBackgroundDetection"},"link":null},{"localized_name":"usePreserveAudio","name":"usePreserveAudio","shape":7,"type":"BOOLEAN","widget":{"name":"usePreserveAudio"},"link":null},{"localized_name":"preserveAudio","name":"preserveAudio","shape":7,"type":"BOOLEAN","widget":{"name":"preserveAudio"},"link":null},{"localized_name":"useAutoTrim","name":"useAutoTrim","shape":7,"type":"BOOLEAN","widget":{"name":"useAutoTrim"},"link":null},{"localized_name":"autoTrim","name":"autoTrim","shape":7,"type":"BOOLEAN","widget":{"name":"autoTrim"},"link":null},{"localized_name":"useSeason","name":"useSeason","shape":7,"type":"BOOLEAN","widget":{"name":"useSeason"},"link":null},{"localized_name":"season","name":"season","shape":7,"type":"COMBO","widget":{"name":"season"},"link":null},{"localized_name":"useEdit","name":"useEdit","shape":7,"type":"BOOLEAN","widget":{"name":"useEdit"},"link":null},{"localized_name":"edit","name":"edit","shape":7,"type":"COMBO","widget":{"name":"edit"},"link":null},{"localized_name":"useColor","name":"useColor","shape":7,"type":"BOOLEAN","widget":{"name":"useColor"},"link":null},{"localized_name":"color","name":"color","shape":7,"type":"COMBO","widget":{"name":"color"},"link":null},{"localized_name":"useLightDirection","name":"useLightDirection","shape":7,"type":"BOOLEAN","widget":{"name":"useLightDirection"},"link":null},{"localized_name":"lightDirection","name":"lightDirection","shape":7,"type":"COMBO","widget":{"name":"lightDirection"},"link":null},{"localized_name":"useLightType","name":"useLightType","shape":7,"type":"BOOLEAN","widget":{"name":"useLightType"},"link":null},{"localized_name":"lightType","name":"lightType","shape":7,"type":"COMBO","widget":{"name":"lightType"},"link":null}],"outputs":[{"localized_name":"providerSettings","name":"providerSettings","type":"RUNWAREPROVIDERSETTINGS","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Bria Provider Settings"},"widgets_values":[false,"photography",false,false,false,false,false,true,false,true,false,false,false,false,false,"base",false,true,false,true,false,true,false,false,false,true,false,false,true,"winter",true,"reseason",false,"contemporary color",false,"front",false,"midday"],"bgcolor":"#5345bf"},{"id":6,"type":"Runware Model Search","pos":[-289.86041259765625,304.8194885253906],"size":[270,154],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Architecture","name":"Model Architecture","type":"COMBO","widget":{"name":"Model Architecture"},"link":null},{"localized_name":"ModelType","name":"ModelType","type":"COMBO","widget":{"name":"ModelType"},"link":null},{"localized_name":"ModelList","name":"ModelList","type":"COMBO","widget":{"name":"ModelList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"Runware Model","name":"Runware Model","type":"RUNWAREMODEL","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Model Search"},"widgets_values":["bria:21@2","All","Base Model","bria:21@2 (Bria Fibo Edit Tools 1)",true],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Image Inference Inputs","pos":[-414.41351318359375,551.8421630859375],"size":[388.505859375,770],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":3},{"localized_name":"mask","name":"mask","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 1","name":"Reference Image 1","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 2","name":"Reference Image 2","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 3","name":"Reference Image 3","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 4","name":"Reference Image 4","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 5","name":"Reference Image 5","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 6","name":"Reference Image 6","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 7","name":"Reference Image 7","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 8","name":"Reference Image 8","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 9","name":"Reference Image 9","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 10","name":"Reference Image 10","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 11","name":"Reference Image 11","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 12","name":"Reference Image 12","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 13","name":"Reference Image 13","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Image 14","name":"Reference Image 14","shape":7,"type":"IMAGE","link":null},{"localized_name":"Super Resolution Reference Image 1","name":"Super Resolution Reference Image 1","shape":7,"type":"IMAGE","link":null},{"localized_name":"Super Resolution Reference Image 2","name":"Super Resolution Reference Image 2","shape":7,"type":"IMAGE","link":null},{"localized_name":"Super Resolution Reference Image 3","name":"Super Resolution Reference Image 3","shape":7,"type":"IMAGE","link":null},{"localized_name":"Super Resolution Reference Image 4","name":"Super Resolution Reference Image 4","shape":7,"type":"IMAGE","link":null},{"localized_name":"Super Resolution Reference Image 5","name":"Super Resolution Reference Image 5","shape":7,"type":"IMAGE","link":null},{"localized_name":"Reference Tag 1","name":"Reference Tag 1","shape":7,"type":"STRING","widget":{"name":"Reference Tag 1"},"link":null},{"localized_name":"Reference Tag 2","name":"Reference Tag 2","shape":7,"type":"STRING","widget":{"name":"Reference Tag 2"},"link":null},{"localized_name":"Reference Tag 3","name":"Reference Tag 3","shape":7,"type":"STRING","widget":{"name":"Reference Tag 3"},"link":null},{"localized_name":"Reference Tag 4","name":"Reference Tag 4","shape":7,"type":"STRING","widget":{"name":"Reference Tag 4"},"link":null},{"localized_name":"Reference Tag 5","name":"Reference Tag 5","shape":7,"type":"STRING","widget":{"name":"Reference Tag 5"},"link":null},{"localized_name":"Reference Tag 6","name":"Reference Tag 6","shape":7,"type":"STRING","widget":{"name":"Reference Tag 6"},"link":null},{"localized_name":"Reference Tag 7","name":"Reference Tag 7","shape":7,"type":"STRING","widget":{"name":"Reference Tag 7"},"link":null},{"localized_name":"Reference Tag 8","name":"Reference Tag 8","shape":7,"type":"STRING","widget":{"name":"Reference Tag 8"},"link":null},{"localized_name":"Reference Tag 9","name":"Reference Tag 9","shape":7,"type":"STRING","widget":{"name":"Reference Tag 9"},"link":null},{"localized_name":"Reference Tag 10","name":"Reference Tag 10","shape":7,"type":"STRING","widget":{"name":"Reference Tag 10"},"link":null},{"localized_name":"Reference Tag 11","name":"Reference Tag 11","shape":7,"type":"STRING","widget":{"name":"Reference Tag 11"},"link":null},{"localized_name":"Reference Tag 12","name":"Reference Tag 12","shape":7,"type":"STRING","widget":{"name":"Reference Tag 12"},"link":null},{"localized_name":"Reference Tag 13","name":"Reference Tag 13","shape":7,"type":"STRING","widget":{"name":"Reference Tag 13"},"link":null},{"localized_name":"Reference Tag 14","name":"Reference Tag 14","shape":7,"type":"STRING","widget":{"name":"Reference Tag 14"},"link":null}],"outputs":[{"localized_name":"Inference Inputs","name":"Inference Inputs","type":"RUNWAREIMAGEINFERENCEINPUTS","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b3cf0bda47c4e645c546b05aaaa56eab7b8b9063","Node name for S&R":"Runware Image Inference Inputs"},"widgets_values":["","","","","","","","","","","","","",""],"bgcolor":"#5345bf"}],"links":[[1,1,0,3,0,"STRING"],[2,2,0,1,13,"RUNWAREPROVIDERSETTINGS"],[3,4,0,5,0,"IMAGE"],[4,6,0,1,0,"RUNWAREMODEL"],[5,5,0,1,12,"RUNWAREIMAGEINFERENCEINPUTS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6210486460373088,"offset":[1012.9396284187551,-101.80159042587373]}},"version":0.4} \ No newline at end of file