Added support for Fish Audio S2.1

This commit is contained in:
Sirshendu Ganguly
2026-05-26 14:54:50 +05:30
parent ccf055ac4e
commit dbcb23e201
9 changed files with 331 additions and 5 deletions
+2
View File
@@ -60,6 +60,7 @@ from .modules.textInferenceInputsImages import RunwareTextInferenceInputsImages
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 @@ NODE_CLASS_MAPPINGS = {
"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,
+3 -1
View File
@@ -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);
+5
View File
@@ -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,
},
+71
View File
@@ -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,
};
+13 -1
View File
@@ -52,13 +52,21 @@ class audioInferenceInputs:
"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 @@ class audioInferenceInputs:
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 @@ class audioInferenceInputs:
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,)
+74
View File
@@ -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\": \"<UUID/URL/base64>\", \"text\": \"<transcript>\" }. "
"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",
}
+4
View File
@@ -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
+158 -3
View File
@@ -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 @@ class RunwareAudioSettings:
"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 @@ class RunwareAudioSettings:
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 @@ class RunwareAudioSettings:
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 @@ class RunwareAudioSettings:
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,)
File diff suppressed because one or more lines are too long