From dbcb23e201a2a1577a3168392c47dc13f1e967ef Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Tue, 26 May 2026 14:54:50 +0530 Subject: [PATCH] Added support for Fish Audio S2.1 --- __init__.py | 2 + clientlibs/main.js | 4 +- clientlibs/types.js | 5 + clientlibs/utils.js | 71 ++++++++ modules/audioInferenceInputs.py | 14 +- modules/audioInferenceReferenceVoices.py | 74 ++++++++ modules/audioModelSearch.py | 4 + modules/audioSettings.py | 161 +++++++++++++++++- .../Runware_Audio_Inference_Fish_S_2_1.json | 1 + 9 files changed, 331 insertions(+), 5 deletions(-) create mode 100644 modules/audioInferenceReferenceVoices.py create mode 100644 workflows/Runware_Audio_Inference_Fish_S_2_1.json diff --git a/__init__.py b/__init__.py index e3cdd81..94b5189 100644 --- a/__init__.py +++ b/__init__.py @@ -60,6 +60,7 @@ from .modules.textInferenceInputsVideos import RunwareTextInferenceInputsVideos from .modules.audioSections import RunwareAudioSections from .modules.audioInferenceInputs import audioInferenceInputs +from .modules.audioInferenceReferenceVoices import RunwareAudioInferenceReferenceVoices from .modules.audioSettings import RunwareAudioSettings from .modules.audioSettingsVoiceModify import RunwareAudioSettingsVoiceModify from .modules.providerSettings.elevenlabsProviderSettings import RunwareElevenLabsProviderSettings @@ -189,6 +190,7 @@ "Runware Text Inference Inputs Videos": RunwareTextInferenceInputsVideos, "Runware Audio Sections": RunwareAudioSections, "Runware Audio Inference Inputs": audioInferenceInputs, + "Runware Audio Inference Inputs Reference Audio": RunwareAudioInferenceReferenceVoices, "Runware Audio Inference Settings": RunwareAudioSettings, "Runware Audio Inference Settings Voice Modify": RunwareAudioSettingsVoiceModify, "Runware ElevenLabs Provider Settings": RunwareElevenLabsProviderSettings, diff --git a/clientlibs/main.js b/clientlibs/main.js index ed97d78..1bc5e39 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, saveTextHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, textModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, imageInferenceAdvancedFeaturesToggleHandler, watermarkAdvancedFeatureToggleHandler, videoInferenceSpeechInputToggleHandler, regionalPromptingRegionsToggleHandler, upscalerToggleHandler, imageUpscalerSettingsToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, textInferenceSettingsToggleHandler, videoSettingsToggleHandler, videoInferenceSettingsTtsToggleHandler, videoInferenceSettingsActiveSpeakerDetectionToggleHandler, videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, videoInferenceSettingsSegmentsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, outpaintSettingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceSpeechVoicesToggleHandler, referenceVideosToggleHandler } from "./utils.js"; +import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, saveTextHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, textModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, imageInferenceAdvancedFeaturesToggleHandler, watermarkAdvancedFeatureToggleHandler, videoInferenceSpeechInputToggleHandler, regionalPromptingRegionsToggleHandler, upscalerToggleHandler, imageUpscalerSettingsToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, textInferenceSettingsToggleHandler, videoSettingsToggleHandler, videoInferenceSettingsTtsToggleHandler, videoInferenceSettingsActiveSpeakerDetectionToggleHandler, videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, videoInferenceSettingsSegmentsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, outpaintSettingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceReferenceVoiceToggleHandler, audioInferenceSpeechVoicesToggleHandler, referenceVideosToggleHandler } from "./utils.js"; import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; const nodeInitList = []; @@ -163,6 +163,8 @@ app.registerExtension({ videoAdvancedFeatureInputsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCEINPUTS) { audioInferenceInputsToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCEINPUTSREFERENCEAUDIO) { + audioInferenceReferenceVoiceToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.REFERENCEVIDEOS || nodeClass === RUNWARE_NODE_TYPES.REFERENCEVIDEOS_LEGACY) { referenceVideosToggleHandler(node); diff --git a/clientlibs/types.js b/clientlibs/types.js index 12443e7..1d408d9 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -96,6 +96,7 @@ const RUNWARE_NODE_TYPES = { TEXTINFERENCEINPUTSVIDEOS: "Runware Text Inference Inputs Videos", AUDIOSECTIONS: "Runware Audio Sections", AUDIOINFERENCEINPUTS: "Runware Audio Inference Inputs", + AUDIOINFERENCEINPUTSREFERENCEAUDIO: "Runware Audio Inference Inputs Reference Audio", AUDIOSETTINGS: "Runware Audio Inference Settings", AUDIOSETTINGSVOICEMODIFY: "Runware Audio Inference Settings Voice Modify", PIXVERSEPROVIDERSETTINGS: "Runware Pixverse Provider Settings", @@ -572,6 +573,10 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.AUDIOINFERENCEINPUTSREFERENCEAUDIO]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.AUDIOSETTINGS]: { bgColor: DEFAULT_BGCOLOR, }, diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 97cfc8e..b0647b2 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -1298,6 +1298,26 @@ function audioSettingsToggleHandler(settingsNode) { const cfgIntervalStartWidget = settingsNode.widgets.find(w => w && w.name === "cfgIntervalStart"); const useCfgIntervalEndWidget = settingsNode.widgets.find(w => w && w.name === "useCfgIntervalEnd"); const cfgIntervalEndWidget = settingsNode.widgets.find(w => w && w.name === "cfgIntervalEnd"); + const useNormalizeLoudnessWidget = settingsNode.widgets.find(w => w && w.name === "useNormalizeLoudness"); + const normalizeLoudnessWidget = settingsNode.widgets.find(w => w && w.name === "normalizeLoudness"); + const useTopPWidget = settingsNode.widgets.find(w => w && w.name === "useTopP"); + const topPWidget = settingsNode.widgets.find(w => w && w.name === "topP"); + const useChunkLengthWidget = settingsNode.widgets.find(w => w && w.name === "useChunkLength"); + const chunkLengthWidget = settingsNode.widgets.find(w => w && w.name === "chunkLength"); + const useMinChunkLengthWidget = settingsNode.widgets.find(w => w && w.name === "useMinChunkLength"); + const minChunkLengthWidget = settingsNode.widgets.find(w => w && w.name === "minChunkLength"); + const useNormalizeWidget = settingsNode.widgets.find(w => w && w.name === "useNormalize"); + const normalizeWidget = settingsNode.widgets.find(w => w && w.name === "normalize"); + const useLatencyWidget = settingsNode.widgets.find(w => w && w.name === "useLatency"); + const latencyWidget = settingsNode.widgets.find(w => w && w.name === "latency"); + const useMaxTokensWidget = settingsNode.widgets.find(w => w && w.name === "useMaxTokens"); + const maxTokensWidget = settingsNode.widgets.find(w => w && w.name === "maxTokens"); + const useRepetitionPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "useRepetitionPenalty"); + const repetitionPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "repetitionPenalty"); + const useConditionOnPreviousChunksWidget = settingsNode.widgets.find(w => w && w.name === "useConditionOnPreviousChunks"); + const conditionOnPreviousChunksWidget = settingsNode.widgets.find(w => w && w.name === "conditionOnPreviousChunks"); + const useEarlyStopThresholdWidget = settingsNode.widgets.find(w => w && w.name === "useEarlyStopThreshold"); + const earlyStopThresholdWidget = settingsNode.widgets.find(w => w && w.name === "earlyStopThreshold"); function toggleWidgetState(useWidget, paramWidget, paramName) { if (!useWidget || !paramWidget) return; @@ -1338,6 +1358,16 @@ function audioSettingsToggleHandler(settingsNode) { if (useTranscriptWidget && transcriptWidget) toggleWidgetState(useTranscriptWidget, transcriptWidget, "transcript"); if (useCfgIntervalStartWidget && cfgIntervalStartWidget) toggleWidgetState(useCfgIntervalStartWidget, cfgIntervalStartWidget, "cfgIntervalStart"); if (useCfgIntervalEndWidget && cfgIntervalEndWidget) toggleWidgetState(useCfgIntervalEndWidget, cfgIntervalEndWidget, "cfgIntervalEnd"); + if (useNormalizeLoudnessWidget && normalizeLoudnessWidget) toggleWidgetState(useNormalizeLoudnessWidget, normalizeLoudnessWidget, "normalizeLoudness"); + if (useTopPWidget && topPWidget) toggleWidgetState(useTopPWidget, topPWidget, "topP"); + if (useChunkLengthWidget && chunkLengthWidget) toggleWidgetState(useChunkLengthWidget, chunkLengthWidget, "chunkLength"); + if (useMinChunkLengthWidget && minChunkLengthWidget) toggleWidgetState(useMinChunkLengthWidget, minChunkLengthWidget, "minChunkLength"); + if (useNormalizeWidget && normalizeWidget) toggleWidgetState(useNormalizeWidget, normalizeWidget, "normalize"); + if (useLatencyWidget && latencyWidget) toggleWidgetState(useLatencyWidget, latencyWidget, "latency"); + if (useMaxTokensWidget && maxTokensWidget) toggleWidgetState(useMaxTokensWidget, maxTokensWidget, "maxTokens"); + if (useRepetitionPenaltyWidget && repetitionPenaltyWidget) toggleWidgetState(useRepetitionPenaltyWidget, repetitionPenaltyWidget, "repetitionPenalty"); + if (useConditionOnPreviousChunksWidget && conditionOnPreviousChunksWidget) toggleWidgetState(useConditionOnPreviousChunksWidget, conditionOnPreviousChunksWidget, "conditionOnPreviousChunks"); + if (useEarlyStopThresholdWidget && earlyStopThresholdWidget) toggleWidgetState(useEarlyStopThresholdWidget, earlyStopThresholdWidget, "earlyStopThreshold"); } function textInferenceSettingsToggleHandler(settingsNode) { @@ -3387,6 +3417,9 @@ function audioModelSearchFilterHandler(audioModelSearchNode) { "Google": [ "google:gemini@3.1-flash-tts (Gemini 3.1 Flash TTS)", ], + "Fish": [ + "fishaudio:s2.1@pro (Fish Audio S2.1 Pro)", + ], }; function filterModelList() { @@ -4691,6 +4724,43 @@ function regionalPromptingRegionsToggleHandler(regionsNode) { } } +function audioInferenceReferenceVoiceToggleHandler(referenceVoiceNode) { + if (!referenceVoiceNode?.widgets) return; + if (referenceVoiceNode._audioInferenceReferenceVoiceToggleHandlerRegistered) return; + referenceVoiceNode._audioInferenceReferenceVoiceToggleHandlerRegistered = true; + + function toggleWidgetState(useWidget, paramWidget, paramName) { + if (!useWidget || !paramWidget) return; + + function applyState() { + const enabled = useWidget.value === true; + toggleWidgetEnabled(paramWidget, enabled, referenceVoiceNode); + 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"; + } + referenceVoiceNode.setDirtyCanvas(true); + } + + appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); + setTimeout(applyState, 100); + } + + for (let i = 1; i <= 4; i++) { + const useReferenceVoiceWidget = referenceVoiceNode.widgets.find((w) => w && w.name === `useReferenceVoice${i}`); + const audioWidget = referenceVoiceNode.widgets.find((w) => w && w.name === `audio${i}`); + const textWidget = referenceVoiceNode.widgets.find((w) => w && w.name === `text${i}`); + + if (useReferenceVoiceWidget && audioWidget) { + toggleWidgetState(useReferenceVoiceWidget, audioWidget, `audio${i}`); + } + if (useReferenceVoiceWidget && textWidget) { + toggleWidgetState(useReferenceVoiceWidget, textWidget, `text${i}`); + } + } +} + function audioInferenceInputsToggleHandler(audioInputsNode) { if (!audioInputsNode?.widgets) return; @@ -5058,6 +5128,7 @@ export { wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, + audioInferenceReferenceVoiceToggleHandler, audioInferenceSpeechVoicesToggleHandler, referenceVideosToggleHandler, }; diff --git a/modules/audioInferenceInputs.py b/modules/audioInferenceInputs.py index 29d2ce8..18a5838 100644 --- a/modules/audioInferenceInputs.py +++ b/modules/audioInferenceInputs.py @@ -52,13 +52,21 @@ def INPUT_TYPES(cls): "tooltip": f"Audio URL or mediaUUID for the {ordinal} audio. Only used when 'Use Audios' is enabled.", "default": "", }) + + optionalInputs["Reference Voice"] = ("RUNWAREAUDIOINFERENCEREFERENCEVOICES", { + "tooltip": "Connect Runware Audio Inference Inputs Reference Audio for zero-shot voice cloning (inputs.referenceVoices).", + }) return { "required": {}, "optional": optionalInputs } - DESCRIPTION = "Configure custom inputs for Runware Audio Inference, including optional single or multiple audio URL/mediaUUID (inputs.audio or inputs.audios), and single or multiple video inputs for audio extraction or generation." + DESCRIPTION = ( + "Configure custom inputs for Runware Audio Inference, including optional single or multiple audio URL/mediaUUID " + "(inputs.audio or inputs.audios), reference voice for cloning (inputs.referenceVoices), " + "and single or multiple video inputs for audio extraction or generation." + ) FUNCTION = "createInputs" RETURN_TYPES = ("RUNWAREAUDIOINFERENCEINPUTS",) RETURN_NAMES = ("Audio Inference Inputs",) @@ -72,6 +80,7 @@ def createInputs(self, **kwargs) -> tuple[Dict[str, Any]]: useVideo = kwargs.get("useVideo", False) video = kwargs.get("Video", None) useVideos = kwargs.get("useVideos", False) + referenceVoices = kwargs.get("Reference Voice", None) inputs = {} @@ -106,6 +115,9 @@ def createInputs(self, **kwargs) -> tuple[Dict[str, Any]]: if len(videoList) > 0: inputs["videos"] = videoList + + if referenceVoices is not None and isinstance(referenceVoices, list) and len(referenceVoices) > 0: + inputs["referenceVoices"] = referenceVoices return (inputs,) diff --git a/modules/audioInferenceReferenceVoices.py b/modules/audioInferenceReferenceVoices.py new file mode 100644 index 0000000..37f521d --- /dev/null +++ b/modules/audioInferenceReferenceVoices.py @@ -0,0 +1,74 @@ +""" +Runware Audio Inference Inputs Reference Audio node. +Builds inputs.referenceVoices for zero-shot voice cloning (up to 4 entries). +""" + +from typing import Any, Dict, List + +from .utils import runwareUtils as rwUtils + + +class RunwareAudioInferenceReferenceVoices: + """Build inputs.referenceVoices[] for Fish Audio and other TTS models.""" + + MAX_REFERENCE_VOICES = 4 + + @classmethod + def INPUT_TYPES(cls): + optional_inputs = {} + for i in range(1, cls.MAX_REFERENCE_VOICES + 1): + ordinal = rwUtils.getOrdinal(i) + optional_inputs[f"useReferenceVoice{i}"] = ("BOOLEAN", { + "default": False, + "tooltip": f"Enable to include the {ordinal} reference voice in inputs.referenceVoices.", + }) + optional_inputs[f"audio{i}"] = ("STRING", { + "default": "", + "tooltip": f"Reference audio clip ({ordinal}) as media UUID, URL, or base64. Required when enabled.", + }) + optional_inputs[f"text{i}"] = ("STRING", { + "multiline": True, + "default": "", + "tooltip": f"Transcript of the {ordinal} reference audio clip (1–1000 characters). Required when enabled.", + }) + + return { + "required": {}, + "optional": optional_inputs, + } + + RETURN_TYPES = ("RUNWAREAUDIOINFERENCEREFERENCEVOICES",) + RETURN_NAMES = ("referenceVoices",) + FUNCTION = "createReferenceVoices" + CATEGORY = "Runware/Audio" + DESCRIPTION = ( + "Configure inputs.referenceVoices for zero-shot voice cloning (up to 4 entries). " + "Each entry: { \"audio\": \"\", \"text\": \"\" }. " + "Connect to Runware Audio Inference Inputs." + ) + + def createReferenceVoices(self, **kwargs) -> tuple[List[Dict[str, Any]]]: + reference_voices: List[Dict[str, Any]] = [] + + for i in range(1, self.MAX_REFERENCE_VOICES + 1): + if not kwargs.get(f"useReferenceVoice{i}", False): + continue + + audio = (kwargs.get(f"audio{i}") or "").strip() + text = (kwargs.get(f"text{i}") or "").strip() + + if not audio or not text: + continue + + reference_voices.append({"audio": audio, "text": text}) + + return (reference_voices,) + + +NODE_CLASS_MAPPINGS = { + "RunwareAudioInferenceReferenceVoices": RunwareAudioInferenceReferenceVoices, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareAudioInferenceReferenceVoices": "Runware Audio Inference Inputs Reference Audio", +} diff --git a/modules/audioModelSearch.py b/modules/audioModelSearch.py index ae6f004..95eeaf6 100644 --- a/modules/audioModelSearch.py +++ b/modules/audioModelSearch.py @@ -47,6 +47,9 @@ class RunwareAudioModelSearch: "Google": [ "google:gemini@3.1-flash-tts (Gemini 3.1 Flash TTS)", ], + "Fish": [ + "fishaudio:s2.1@pro (Fish Audio S2.1 Pro)", + ], } MODEL_PROVIDERS = [ @@ -61,6 +64,7 @@ class RunwareAudioModelSearch: "MiniMax", "Inworld", "Google", + "Fish", ] @classmethod diff --git a/modules/audioSettings.py b/modules/audioSettings.py index a022d47..fe302d6 100644 --- a/modules/audioSettings.py +++ b/modules/audioSettings.py @@ -2,8 +2,9 @@ Runware Audio Inference Settings Node Provides lyrics, lyricsOptimizer, instrumental, guidanceType, languageBoost, turbo, temperature, textNormalization, bpm, keyScale, timeSignature, vocalLanguage, coverConditioningScale, repaintingStart, repaintingEnd, -cfgIntervalStart, cfgIntervalEnd, xVectorOnly, maxNewTokens, transcript, -and more for Runware Audio Inference. +cfgIntervalStart, cfgIntervalEnd, xVectorOnly, maxNewTokens, maxTokens, transcript, +normalizeLoudness, topP, chunkLength, minChunkLength, normalize, latency, repetitionPenalty, +conditionOnPreviousChunks, earlyStopThreshold, and more for Runware Audio Inference. """ from typing import Dict, Any @@ -256,6 +257,110 @@ def INPUT_TYPES(cls): "max": 1.0, "step": 0.01, }), + "useNormalizeLoudness": ("BOOLEAN", { + "tooltip": "Enable to include normalizeLoudness in settings.", + "default": False, + }), + "normalizeLoudness": ("BOOLEAN", { + "tooltip": "Normalize output loudness for consistent perceived volume. Only used when 'Use Normalize Loudness' is enabled.", + "default": True, + "label_on": "true", + "label_off": "false", + }), + "useTopP": ("BOOLEAN", { + "tooltip": "Enable to include topP in settings.", + "default": False, + }), + "topP": ("FLOAT", { + "tooltip": "Controls diversity via nucleus sampling. Must be between 0.0001 and 1. Only used when 'Use Top P' is enabled.", + "default": 0.7, + "min": 0.0001, + "max": 1.0, + "step": 0.0001, + }), + "useChunkLength": ("BOOLEAN", { + "tooltip": "Enable to include chunkLength in settings.", + "default": False, + }), + "chunkLength": ("INT", { + "tooltip": "Text segment size for processing. Only used when 'Use Chunk Length' is enabled.", + "default": 300, + "min": 100, + "max": 300, + "step": 1, + }), + "useMinChunkLength": ("BOOLEAN", { + "tooltip": "Enable to include minChunkLength in settings.", + "default": False, + }), + "minChunkLength": ("INT", { + "tooltip": "Minimum characters before splitting into a new chunk. Only used when 'Use Min Chunk Length' is enabled.", + "default": 50, + "min": 0, + "max": 100, + "step": 1, + }), + "useNormalize": ("BOOLEAN", { + "tooltip": "Enable to include normalize in settings (text normalization for English and Chinese).", + "default": False, + }), + "normalize": ("BOOLEAN", { + "tooltip": "Normalizes text for English and Chinese, improving stability for numbers. Only used when 'Use Normalize' is enabled.", + "default": True, + "label_on": "true", + "label_off": "false", + }), + "useLatency": ("BOOLEAN", { + "tooltip": "Enable to include latency in settings.", + "default": False, + }), + "latency": (["low", "normal", "balanced"], { + "tooltip": "Latency / quality trade-off. normal = best quality, balanced = reduced latency, low = lowest latency. Only used when 'Use Latency' is enabled.", + "default": "normal", + }), + "useMaxTokens": ("BOOLEAN", { + "tooltip": "Enable to include maxTokens in settings (e.g. Fish Audio TTS).", + "default": False, + }), + "maxTokens": ("INT", { + "tooltip": "Maximum audio tokens to generate per text chunk. Only used when 'Use Max Tokens' is enabled.", + "default": 1024, + "min": 1, + "max": 4294967295, + "step": 1, + }), + "useRepetitionPenalty": ("BOOLEAN", { + "tooltip": "Enable to include repetitionPenalty in settings.", + "default": False, + }), + "repetitionPenalty": ("FLOAT", { + "tooltip": "Penalty for repeating audio patterns. Values above 1.0 reduce repetition. Only used when 'Use Repetition Penalty' is enabled.", + "default": 1.2, + "min": 0.0, + "max": 2.0, + "step": 0.01, + }), + "useConditionOnPreviousChunks": ("BOOLEAN", { + "tooltip": "Enable to include conditionOnPreviousChunks in settings.", + "default": False, + }), + "conditionOnPreviousChunks": ("BOOLEAN", { + "tooltip": "Use previous audio as context for voice consistency across chunks. Only used when 'Use Condition On Previous Chunks' is enabled.", + "default": True, + "label_on": "true", + "label_off": "false", + }), + "useEarlyStopThreshold": ("BOOLEAN", { + "tooltip": "Enable to include earlyStopThreshold in settings.", + "default": False, + }), + "earlyStopThreshold": ("FLOAT", { + "tooltip": "Early stopping threshold for batch processing. Only used when 'Use Early Stop Threshold' is enabled.", + "default": 1.0, + "min": 0.0, + "max": 1.0, + "step": 0.01, + }), } } @@ -266,7 +371,9 @@ def INPUT_TYPES(cls): DESCRIPTION = ( "Configure audio generation settings (lyrics, lyricsOptimizer, instrumental, guidanceType, languageBoost, turbo, temperature, textNormalization, " "bpm, keyScale, timeSignature, vocalLanguage, coverConditioningScale, repaintingStart, repaintingEnd, " - "cfgIntervalStart, cfgIntervalEnd, xVectorOnly, maxNewTokens, transcript, etc.) " + "cfgIntervalStart, cfgIntervalEnd, xVectorOnly, maxNewTokens, maxTokens, transcript, " + "normalizeLoudness, topP, chunkLength, minChunkLength, normalize, latency, repetitionPenalty, " + "conditionOnPreviousChunks, earlyStopThreshold, etc.) " "for Runware Audio Inference. Connect to Runware Audio Inference node." ) @@ -318,6 +425,24 @@ def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]: cfg_interval_start = kwargs.get("cfgIntervalStart", 0.0) use_cfg_interval_end = kwargs.get("useCfgIntervalEnd", False) cfg_interval_end = kwargs.get("cfgIntervalEnd", 1.0) + use_normalize_loudness = kwargs.get("useNormalizeLoudness", False) + use_top_p = kwargs.get("useTopP", False) + top_p = kwargs.get("topP", 0.7) + use_chunk_length = kwargs.get("useChunkLength", False) + chunk_length = kwargs.get("chunkLength", 300) + use_min_chunk_length = kwargs.get("useMinChunkLength", False) + min_chunk_length = kwargs.get("minChunkLength", 50) + use_normalize = kwargs.get("useNormalize", False) + normalize = kwargs.get("normalize", True) + use_latency = kwargs.get("useLatency", False) + latency = kwargs.get("latency", "normal") + use_max_tokens = kwargs.get("useMaxTokens", False) + max_tokens = kwargs.get("maxTokens", 1024) + use_repetition_penalty = kwargs.get("useRepetitionPenalty", False) + repetition_penalty = kwargs.get("repetitionPenalty", 1.2) + use_condition_on_previous_chunks = kwargs.get("useConditionOnPreviousChunks", False) + use_early_stop_threshold = kwargs.get("useEarlyStopThreshold", False) + early_stop_threshold = kwargs.get("earlyStopThreshold", 1.0) settings: Dict[str, Any] = {} @@ -385,6 +510,36 @@ def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]: if use_cfg_interval_end: settings["cfgIntervalEnd"] = float(cfg_interval_end) + if use_normalize_loudness: + settings["normalizeLoudness"] = bool(kwargs.get("normalizeLoudness", True)) + + if use_top_p: + settings["topP"] = float(top_p) + + if use_chunk_length: + settings["chunkLength"] = int(chunk_length) + + if use_min_chunk_length: + settings["minChunkLength"] = int(min_chunk_length) + + if use_normalize: + settings["normalize"] = bool(normalize) + + if use_latency: + settings["latency"] = str(latency) + + if use_max_tokens: + settings["maxTokens"] = int(max_tokens) + + if use_repetition_penalty: + settings["repetitionPenalty"] = float(repetition_penalty) + + if use_condition_on_previous_chunks: + settings["conditionOnPreviousChunks"] = bool(kwargs.get("conditionOnPreviousChunks", True)) + + if use_early_stop_threshold: + settings["earlyStopThreshold"] = float(early_stop_threshold) + return (settings,) diff --git a/workflows/Runware_Audio_Inference_Fish_S_2_1.json b/workflows/Runware_Audio_Inference_Fish_S_2_1.json new file mode 100644 index 0000000..01bc9b3 --- /dev/null +++ b/workflows/Runware_Audio_Inference_Fish_S_2_1.json @@ -0,0 +1 @@ +{"id":"7e02ea1c-a963-40d4-9d1d-901041f6ddf2","revision":0,"last_node_id":9,"last_link_id":7,"nodes":[{"id":4,"type":"SaveAudioMP3","pos":[881.8529154721257,437.8469474642338],"size":[270,136],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":7},{"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.22.0","Node name for S&R":"SaveAudioMP3"},"widgets_values":["audio/ComfyUI","V0"]},{"id":3,"type":"Runware Audio Inference Inputs","pos":[-555.3664886104314,848.7936051450658],"size":[311.3970703125,370],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"Reference Voice","name":"Reference Voice","shape":7,"type":"RUNWAREAUDIOINFERENCEREFERENCEVOICES","link":3},{"localized_name":"useAudio","name":"useAudio","shape":7,"type":"BOOLEAN","widget":{"name":"useAudio"},"link":null},{"localized_name":"Audio","name":"Audio","shape":7,"type":"STRING","widget":{"name":"Audio"},"link":null},{"localized_name":"useVideo","name":"useVideo","shape":7,"type":"BOOLEAN","widget":{"name":"useVideo"},"link":null},{"localized_name":"Video","name":"Video","shape":7,"type":"STRING","widget":{"name":"Video"},"link":null},{"localized_name":"useVideos","name":"useVideos","shape":7,"type":"BOOLEAN","widget":{"name":"useVideos"},"link":null},{"localized_name":"Video1","name":"Video1","shape":7,"type":"STRING","widget":{"name":"Video1"},"link":null},{"localized_name":"Video2","name":"Video2","shape":7,"type":"STRING","widget":{"name":"Video2"},"link":null},{"localized_name":"Video3","name":"Video3","shape":7,"type":"STRING","widget":{"name":"Video3"},"link":null},{"localized_name":"Video4","name":"Video4","shape":7,"type":"STRING","widget":{"name":"Video4"},"link":null},{"localized_name":"useAudios","name":"useAudios","shape":7,"type":"BOOLEAN","widget":{"name":"useAudios"},"link":null},{"localized_name":"Audio1","name":"Audio1","shape":7,"type":"STRING","widget":{"name":"Audio1"},"link":null},{"localized_name":"Audio2","name":"Audio2","shape":7,"type":"STRING","widget":{"name":"Audio2"},"link":null},{"localized_name":"Audio3","name":"Audio3","shape":7,"type":"STRING","widget":{"name":"Audio3"},"link":null},{"localized_name":"Audio4","name":"Audio4","shape":7,"type":"STRING","widget":{"name":"Audio4"},"link":null}],"outputs":[{"localized_name":"Audio Inference Inputs","name":"Audio Inference Inputs","type":"RUNWAREAUDIOINFERENCEINPUTS","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ccf055ac4ec3b67296db7484951d01343c591289","Node name for S&R":"Runware Audio Inference Inputs"},"widgets_values":[false,"",false,"",false,"","","","",false,"","","",""],"bgcolor":"#5345bf"},{"id":7,"type":"Runware Audio Inference Inputs Reference Audio","pos":[-1013.118574950106,957.5478997285884],"size":[425.09921875,442],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"useReferenceVoice1","name":"useReferenceVoice1","shape":7,"type":"BOOLEAN","widget":{"name":"useReferenceVoice1"},"link":null},{"localized_name":"audio1","name":"audio1","shape":7,"type":"STRING","widget":{"name":"audio1"},"link":5},{"localized_name":"text1","name":"text1","shape":7,"type":"STRING","widget":{"name":"text1"},"link":null},{"localized_name":"useReferenceVoice2","name":"useReferenceVoice2","shape":7,"type":"BOOLEAN","widget":{"name":"useReferenceVoice2"},"link":null},{"localized_name":"audio2","name":"audio2","shape":7,"type":"STRING","widget":{"name":"audio2"},"link":null},{"localized_name":"text2","name":"text2","shape":7,"type":"STRING","widget":{"name":"text2"},"link":null},{"localized_name":"useReferenceVoice3","name":"useReferenceVoice3","shape":7,"type":"BOOLEAN","widget":{"name":"useReferenceVoice3"},"link":null},{"localized_name":"audio3","name":"audio3","shape":7,"type":"STRING","widget":{"name":"audio3"},"link":null},{"localized_name":"text3","name":"text3","shape":7,"type":"STRING","widget":{"name":"text3"},"link":null},{"localized_name":"useReferenceVoice4","name":"useReferenceVoice4","shape":7,"type":"BOOLEAN","widget":{"name":"useReferenceVoice4"},"link":null},{"localized_name":"audio4","name":"audio4","shape":7,"type":"STRING","widget":{"name":"audio4"},"link":null},{"localized_name":"text4","name":"text4","shape":7,"type":"STRING","widget":{"name":"text4"},"link":null}],"outputs":[{"localized_name":"referenceVoices","name":"referenceVoices","type":"RUNWAREAUDIOINFERENCEREFERENCEVOICES","links":[3]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ccf055ac4ec3b67296db7484951d01343c591289","Node name for S&R":"Runware Audio Inference Inputs Reference Audio"},"widgets_values":[false,"","",false,"","",false,"","",false,"",""],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Audio Model Search","pos":[-498.2100658098221,532.6612119337972],"size":[270,130],"flags":{},"order":2,"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":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ccf055ac4ec3b67296db7484951d01343c591289","Node name for S&R":"Runware Audio Model Search"},"widgets_values":["","Fish","fishaudio:s2.1@pro (Fish Audio S2.1 Pro)",false],"bgcolor":"#5345bf"},{"id":9,"type":"Runware Media Upload","pos":[-888.3612190418941,836.262001689],"size":[270,58],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"media","name":"media","shape":7,"type":"VIDEO,AUDIO","link":4},{"localized_name":"mediaUUID","name":"mediaUUID","shape":7,"type":"STRING","widget":{"name":"mediaUUID"},"link":null}],"outputs":[{"localized_name":"mediaUUID","name":"mediaUUID","type":"STRING","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ccf055ac4ec3b67296db7484951d01343c591289","Node name for S&R":"Runware Media Upload"},"widgets_values":[""],"bgcolor":"#5345bf"},{"id":8,"type":"LoadAudio","pos":[-876.8498579549308,601.020811829213],"size":[282.798828125,136],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"COMBO","widget":{"name":"audio"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"AUDIOUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"AUDIO","name":"AUDIO","type":"AUDIO","links":[4]}],"properties":{"cnr_id":"comfy-core","ver":"0.22.0","Node name for S&R":"LoadAudio"},"widgets_values":["10s audio (2) (mp3cut.net).wav",null,""]},{"id":2,"type":"Runware Audio Inference Settings","pos":[329.82576477128697,330.87439744792476],"size":[400,1678],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useTemperature","name":"useTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useTemperature"},"link":null},{"localized_name":"temperature","name":"temperature","shape":7,"type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"useAudioTemperature","name":"useAudioTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useAudioTemperature"},"link":null},{"localized_name":"audioTemperature","name":"audioTemperature","shape":7,"type":"FLOAT","widget":{"name":"audioTemperature"},"link":null},{"localized_name":"useTopK","name":"useTopK","shape":7,"type":"BOOLEAN","widget":{"name":"useTopK"},"link":null},{"localized_name":"topK","name":"topK","shape":7,"type":"INT","widget":{"name":"topK"},"link":null},{"localized_name":"useIncludePrefix","name":"useIncludePrefix","shape":7,"type":"BOOLEAN","widget":{"name":"useIncludePrefix"},"link":null},{"localized_name":"includePrefix","name":"includePrefix","shape":7,"type":"BOOLEAN","widget":{"name":"includePrefix"},"link":null},{"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},{"localized_name":"useTextNormalization","name":"useTextNormalization","shape":7,"type":"BOOLEAN","widget":{"name":"useTextNormalization"},"link":null},{"localized_name":"textNormalization","name":"textNormalization","shape":7,"type":"BOOLEAN","widget":{"name":"textNormalization"},"link":null},{"localized_name":"useBpm","name":"useBpm","shape":7,"type":"BOOLEAN","widget":{"name":"useBpm"},"link":null},{"localized_name":"bpm","name":"bpm","shape":7,"type":"INT","widget":{"name":"bpm"},"link":null},{"localized_name":"useKeyScale","name":"useKeyScale","shape":7,"type":"BOOLEAN","widget":{"name":"useKeyScale"},"link":null},{"localized_name":"keyScale","name":"keyScale","shape":7,"type":"STRING","widget":{"name":"keyScale"},"link":null},{"localized_name":"useTimeSignature","name":"useTimeSignature","shape":7,"type":"BOOLEAN","widget":{"name":"useTimeSignature"},"link":null},{"localized_name":"timeSignature","name":"timeSignature","shape":7,"type":"INT","widget":{"name":"timeSignature"},"link":null},{"localized_name":"useVocalLanguage","name":"useVocalLanguage","shape":7,"type":"BOOLEAN","widget":{"name":"useVocalLanguage"},"link":null},{"localized_name":"vocalLanguage","name":"vocalLanguage","shape":7,"type":"COMBO","widget":{"name":"vocalLanguage"},"link":null},{"localized_name":"useCoverConditioningScale","name":"useCoverConditioningScale","shape":7,"type":"BOOLEAN","widget":{"name":"useCoverConditioningScale"},"link":null},{"localized_name":"coverConditioningScale","name":"coverConditioningScale","shape":7,"type":"FLOAT","widget":{"name":"coverConditioningScale"},"link":null},{"localized_name":"useRepaintingStart","name":"useRepaintingStart","shape":7,"type":"BOOLEAN","widget":{"name":"useRepaintingStart"},"link":null},{"localized_name":"repaintingStart","name":"repaintingStart","shape":7,"type":"FLOAT","widget":{"name":"repaintingStart"},"link":null},{"localized_name":"useRepaintingEnd","name":"useRepaintingEnd","shape":7,"type":"BOOLEAN","widget":{"name":"useRepaintingEnd"},"link":null},{"localized_name":"repaintingEnd","name":"repaintingEnd","shape":7,"type":"FLOAT","widget":{"name":"repaintingEnd"},"link":null},{"localized_name":"useXVectorOnly","name":"useXVectorOnly","shape":7,"type":"BOOLEAN","widget":{"name":"useXVectorOnly"},"link":null},{"localized_name":"xVectorOnly","name":"xVectorOnly","shape":7,"type":"BOOLEAN","widget":{"name":"xVectorOnly"},"link":null},{"localized_name":"useMaxNewTokens","name":"useMaxNewTokens","shape":7,"type":"BOOLEAN","widget":{"name":"useMaxNewTokens"},"link":null},{"localized_name":"maxNewTokens","name":"maxNewTokens","shape":7,"type":"INT","widget":{"name":"maxNewTokens"},"link":null},{"localized_name":"useTranscript","name":"useTranscript","shape":7,"type":"BOOLEAN","widget":{"name":"useTranscript"},"link":null},{"localized_name":"transcript","name":"transcript","shape":7,"type":"STRING","widget":{"name":"transcript"},"link":null},{"localized_name":"useInstrumental","name":"useInstrumental","shape":7,"type":"BOOLEAN","widget":{"name":"useInstrumental"},"link":null},{"localized_name":"instrumental","name":"instrumental","shape":7,"type":"BOOLEAN","widget":{"name":"instrumental"},"link":null},{"localized_name":"useLyricsOptimizer","name":"useLyricsOptimizer","shape":7,"type":"BOOLEAN","widget":{"name":"useLyricsOptimizer"},"link":null},{"localized_name":"lyricsOptimizer","name":"lyricsOptimizer","shape":7,"type":"BOOLEAN","widget":{"name":"lyricsOptimizer"},"link":null},{"localized_name":"useCfgIntervalStart","name":"useCfgIntervalStart","shape":7,"type":"BOOLEAN","widget":{"name":"useCfgIntervalStart"},"link":null},{"localized_name":"cfgIntervalStart","name":"cfgIntervalStart","shape":7,"type":"FLOAT","widget":{"name":"cfgIntervalStart"},"link":null},{"localized_name":"useCfgIntervalEnd","name":"useCfgIntervalEnd","shape":7,"type":"BOOLEAN","widget":{"name":"useCfgIntervalEnd"},"link":null},{"localized_name":"cfgIntervalEnd","name":"cfgIntervalEnd","shape":7,"type":"FLOAT","widget":{"name":"cfgIntervalEnd"},"link":null},{"localized_name":"useNormalizeLoudness","name":"useNormalizeLoudness","shape":7,"type":"BOOLEAN","widget":{"name":"useNormalizeLoudness"},"link":null},{"localized_name":"normalizeLoudness","name":"normalizeLoudness","shape":7,"type":"BOOLEAN","widget":{"name":"normalizeLoudness"},"link":null},{"localized_name":"useTopP","name":"useTopP","shape":7,"type":"BOOLEAN","widget":{"name":"useTopP"},"link":null},{"localized_name":"topP","name":"topP","shape":7,"type":"FLOAT","widget":{"name":"topP"},"link":null},{"localized_name":"useChunkLength","name":"useChunkLength","shape":7,"type":"BOOLEAN","widget":{"name":"useChunkLength"},"link":null},{"localized_name":"chunkLength","name":"chunkLength","shape":7,"type":"INT","widget":{"name":"chunkLength"},"link":null},{"localized_name":"useMinChunkLength","name":"useMinChunkLength","shape":7,"type":"BOOLEAN","widget":{"name":"useMinChunkLength"},"link":null},{"localized_name":"minChunkLength","name":"minChunkLength","shape":7,"type":"INT","widget":{"name":"minChunkLength"},"link":null},{"localized_name":"useNormalize","name":"useNormalize","shape":7,"type":"BOOLEAN","widget":{"name":"useNormalize"},"link":null},{"localized_name":"normalize","name":"normalize","shape":7,"type":"BOOLEAN","widget":{"name":"normalize"},"link":null},{"localized_name":"useLatency","name":"useLatency","shape":7,"type":"BOOLEAN","widget":{"name":"useLatency"},"link":null},{"localized_name":"latency","name":"latency","shape":7,"type":"COMBO","widget":{"name":"latency"},"link":null},{"localized_name":"useMaxTokens","name":"useMaxTokens","shape":7,"type":"BOOLEAN","widget":{"name":"useMaxTokens"},"link":null},{"localized_name":"maxTokens","name":"maxTokens","shape":7,"type":"INT","widget":{"name":"maxTokens"},"link":null},{"localized_name":"useRepetitionPenalty","name":"useRepetitionPenalty","shape":7,"type":"BOOLEAN","widget":{"name":"useRepetitionPenalty"},"link":null},{"localized_name":"repetitionPenalty","name":"repetitionPenalty","shape":7,"type":"FLOAT","widget":{"name":"repetitionPenalty"},"link":null},{"localized_name":"useConditionOnPreviousChunks","name":"useConditionOnPreviousChunks","shape":7,"type":"BOOLEAN","widget":{"name":"useConditionOnPreviousChunks"},"link":null},{"localized_name":"conditionOnPreviousChunks","name":"conditionOnPreviousChunks","shape":7,"type":"BOOLEAN","widget":{"name":"conditionOnPreviousChunks"},"link":null},{"localized_name":"useEarlyStopThreshold","name":"useEarlyStopThreshold","shape":7,"type":"BOOLEAN","widget":{"name":"useEarlyStopThreshold"},"link":null},{"localized_name":"earlyStopThreshold","name":"earlyStopThreshold","shape":7,"type":"FLOAT","widget":{"name":"earlyStopThreshold"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREAUDIOSETTINGS","links":[6]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ccf055ac4ec3b67296db7484951d01343c591289","Node name for S&R":"Runware Audio Inference Settings"},"widgets_values":[false,0.6,false,0.8,false,50,false,false,false,"",false,"apg",false,"auto",false,false,false,true,false,120,false,"",false,4,false,"en",false,1,false,0,false,0,false,false,false,4096,false,"",false,false,false,false,false,0,false,1,false,true,false,0.7,false,300,false,50,false,true,false,"normal",false,1024,false,1.2,false,true,false,1],"bgcolor":"#5345bf"},{"id":1,"type":"Runware Audio Inference","pos":[-164.45563166749216,509.12521465070375],"size":[400,698],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","link":1},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREAUDIOINFERENCEINPUTS","link":2},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWAREAUDIOSETTINGS","link":6},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWARESPEECH","link":null},{"localized_name":"voiceModify","name":"voiceModify","shape":7,"type":"RUNWAREVOICEMODIFY","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","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":"COMBO","widget":{"name":"sampleRate"},"link":null},{"localized_name":"useBitrate","name":"useBitrate","type":"BOOLEAN","widget":{"name":"useBitrate"},"link":null},{"localized_name":"bitrate","name":"bitrate","type":"COMBO","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":"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":[7]},{"localized_name":"video","name":"video","type":"VIDEO","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ccf055ac4ec3b67296db7484951d01343c591289","Node name for S&R":"Runware Audio Inference"},"widgets_values":["classical piano piece, gentle and melodic","",true,10,false,32000,false,128,false,2,"MP3",1,false,1,"randomize",false,20,false,0.8,false,12],"bgcolor":"#5345bf"}],"links":[[1,5,0,1,0,"RUNWAREAUDIOMODEL"],[2,3,0,1,1,"RUNWAREAUDIOINFERENCEINPUTS"],[3,7,0,3,0,"RUNWAREAUDIOINFERENCEREFERENCEVOICES"],[4,8,0,9,0,"AUDIO"],[5,9,0,7,1,"STRING"],[6,2,0,1,2,"RUNWAREAUDIOSETTINGS"],[7,1,0,4,0,"AUDIO"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.4603984853356424,"offset":[1498.0456031576505,-142.1739018543725]}},"version":0.4} \ No newline at end of file