Added support for Fish Audio S2.1
This commit is contained in:
@@ -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
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,)
|
||||
|
||||
|
||||
@@ -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",
|
||||
}
|
||||
@@ -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
@@ -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
Reference in New Issue
Block a user