diff --git a/__init__.py b/__init__.py index 58d9eaa..c1bb126 100644 --- a/__init__.py +++ b/__init__.py @@ -34,6 +34,10 @@ from .modules.videoInference import txt2vid from .modules.videoInferenceSpeechInput import RunwareVideoInferenceSpeechInput from .modules.videoModelSearch import videoModelSearch from .modules.videoSettings import RunwareVideoSettings +from .modules.videoInferenceSettingsTts import RunwareVideoInferenceSettingsTts +from .modules.videoInferenceSettingsActiveSpeakerDetection import RunwareVideoInferenceSettingsActiveSpeakerDetection +from .modules.videoInferenceSettingsActiveSpeakerBoundingBoxes import RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes +from .modules.videoInferenceSettingsSegments import RunwareVideoInferenceSettingsSegments from .modules.frameImages import RunwareFrameImages from .modules.providerSettings.pixverseProviderSettings import RunwarePixverseProviderSettings from .modules.providerSettings.openaiProviderSettings import RunwareOpenAIProviderSettings @@ -189,6 +193,10 @@ NODE_CLASS_MAPPINGS = { "Runware Video Inference Elements Combine": RunwareVideoInferenceElementsCombine, "Runware Video Inference Speech Input": RunwareVideoInferenceSpeechInput, "Runware Video Inference Settings": RunwareVideoSettings, + "Runware Video Inference Settings TTS": RunwareVideoInferenceSettingsTts, + "Runware Video Inference Settings Active Speaker Detection": RunwareVideoInferenceSettingsActiveSpeakerDetection, + "Runware Video Inference Settings Active Speaker Bounding Boxes": RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes, + "Runware Video Inference Settings Segments": RunwareVideoInferenceSettingsSegments, "Runware Lightricks Provider Settings": RunwareLightricksProviderSettings, "Runware MiniMax Provider Settings": RunwareMiniMaxProviderSettings, "Runware Luma Provider Settings": RunwareLumaProviderSettings, diff --git a/clientlibs/main.js b/clientlibs/main.js index 1aa4c22..78fbfd4 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, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler } 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, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler } from "./utils.js"; import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; const nodeInitList = []; @@ -97,6 +97,14 @@ app.registerExtension({ textInferenceSettingsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOSETTINGS) { videoSettingsToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSTTS) { + videoInferenceSettingsTtsToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION) { + videoInferenceSettingsActiveSpeakerDetectionToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES) { + videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSSEGMENTS) { + videoInferenceSettingsSegmentsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.ACCELERATOROPTIONS) { acceleratorOptionsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.BYTEDANCEPROVIDERSETTINGS) { diff --git a/clientlibs/types.js b/clientlibs/types.js index 2f35991..0c12ace 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -112,6 +112,10 @@ const RUNWARE_NODE_TYPES = { VIDEOINFERENCEELEMENTSCOMBINE: "Runware Video Inference Elements Combine", VIDEOINFERENCESPEECHINPUT: "Runware Video Inference Speech Input", VIDEOSETTINGS: "Runware Video Inference Settings", + VIDEOINFERENCESETTINGSTTS: "Runware Video Inference Settings TTS", + VIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION: "Runware Video Inference Settings Active Speaker Detection", + VIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES: "Runware Video Inference Settings Active Speaker Bounding Boxes", + VIDEOINFERENCESETTINGSSEGMENTS: "Runware Video Inference Settings Segments", LIGHTRICKSPROVIDERSETTINGS: "Runware Lightricks Provider Settings", KLINGPROVIDERSETTINGS: "Runware KlingAI Provider Settings", KLINGMULTIPROMPTSEGMENT: "Runware Kling MultiPrompt Segment", @@ -522,6 +526,22 @@ const RUNWARE_NODE_PROPS = { [RUNWARE_NODE_TYPES.VIDEOSETTINGS]: { bgColor: DEFAULT_BGCOLOR, }, + [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSTTS]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, + [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, + [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, + [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSSEGMENTS]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.ACCELERATOROPTIONS]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 6a0e107..7e051f5 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -1397,6 +1397,16 @@ function videoSettingsToggleHandler(settingsNode) { const shotTypeWidget = settingsNode.widgets.find(w => w && w.name === "shotType"); const usePromptExtendWidget = settingsNode.widgets.find(w => w && w.name === "usePromptExtend"); const promptExtendWidget = settingsNode.widgets.find(w => w && w.name === "promptExtend"); + const useSyncModeWidget = settingsNode.widgets.find(w => w && w.name === "useSyncMode"); + const syncModeWidget = settingsNode.widgets.find(w => w && w.name === "syncMode"); + const useModeWidget = settingsNode.widgets.find(w => w && w.name === "useMode"); + const modeWidget = settingsNode.widgets.find(w => w && w.name === "mode"); + const useEmotionWidget = settingsNode.widgets.find(w => w && w.name === "useEmotion"); + const emotionWidget = settingsNode.widgets.find(w => w && w.name === "emotion"); + const useTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "useTemperature"); + const temperatureWidget = settingsNode.widgets.find(w => w && w.name === "temperature"); + const useOcclusionDetectionWidget = settingsNode.widgets.find(w => w && w.name === "useOcclusionDetection"); + const occlusionDetectionWidget = settingsNode.widgets.find(w => w && w.name === "occlusionDetection"); function toggleWidgetState(useWidget, paramWidget, paramName) { if (!useWidget || !paramWidget) return; @@ -1426,6 +1436,152 @@ function videoSettingsToggleHandler(settingsNode) { if (useMultiClipWidget && multiClipWidget) toggleWidgetState(useMultiClipWidget, multiClipWidget, "multiClip"); if (useShotTypeWidget && shotTypeWidget) toggleWidgetState(useShotTypeWidget, shotTypeWidget, "shotType"); if (usePromptExtendWidget && promptExtendWidget) toggleWidgetState(usePromptExtendWidget, promptExtendWidget, "promptExtend"); + if (useSyncModeWidget && syncModeWidget) toggleWidgetState(useSyncModeWidget, syncModeWidget, "syncMode"); + if (useModeWidget && modeWidget) toggleWidgetState(useModeWidget, modeWidget, "mode"); + if (useEmotionWidget && emotionWidget) toggleWidgetState(useEmotionWidget, emotionWidget, "emotion"); + if (useTemperatureWidget && temperatureWidget) toggleWidgetState(useTemperatureWidget, temperatureWidget, "temperature"); + if (useOcclusionDetectionWidget && occlusionDetectionWidget) toggleWidgetState(useOcclusionDetectionWidget, occlusionDetectionWidget, "occlusionDetection"); +} + +function videoInferenceSettingsTtsToggleHandler(node) { + if (!node?.widgets) return; + + const useStabilityWidget = node.widgets.find(w => w && w.name === "useStability"); + const stabilityWidget = node.widgets.find(w => w && w.name === "stability"); + const useSimilarityBoostWidget = node.widgets.find(w => w && w.name === "useSimilarityBoost"); + const similarityBoostWidget = node.widgets.find(w => w && w.name === "similarityBoost"); + + function toggleWidgetState(useWidget, paramWidget, paramName) { + if (!useWidget || !paramWidget) return; + function applyState() { + const enabled = useWidget.value === true; + toggleWidgetEnabled(paramWidget, enabled, node); + 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"; + } + node.setDirtyCanvas(true); + } + setTimeout(applyState, 100); + appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); + } + + if (useStabilityWidget && stabilityWidget) toggleWidgetState(useStabilityWidget, stabilityWidget, "stability"); + if (useSimilarityBoostWidget && similarityBoostWidget) toggleWidgetState(useSimilarityBoostWidget, similarityBoostWidget, "similarityBoost"); +} + +function videoInferenceSettingsActiveSpeakerDetectionToggleHandler(node) { + if (!node?.widgets) return; + + const useAutoDetectWidget = node.widgets.find(w => w && w.name === "useAutoDetect"); + const autoDetectWidget = node.widgets.find(w => w && w.name === "autoDetect"); + const useFrameNumberWidget = node.widgets.find(w => w && w.name === "useFrameNumber"); + const frameNumberWidget = node.widgets.find(w => w && w.name === "frameNumber"); + const useCoordinatesWidget = node.widgets.find(w => w && w.name === "useCoordinates"); + const coordinateXWidget = node.widgets.find(w => w && w.name === "coordinateX"); + const coordinateYWidget = node.widgets.find(w => w && w.name === "coordinateY"); + + function toggleWidgetState(useWidget, paramWidget, paramName) { + if (!useWidget || !paramWidget) return; + function applyState() { + const enabled = useWidget.value === true; + toggleWidgetEnabled(paramWidget, enabled, node); + 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"; + } + node.setDirtyCanvas(true); + } + setTimeout(applyState, 100); + appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); + } + + if (useAutoDetectWidget && autoDetectWidget) toggleWidgetState(useAutoDetectWidget, autoDetectWidget, "autoDetect"); + if (useFrameNumberWidget && frameNumberWidget) toggleWidgetState(useFrameNumberWidget, frameNumberWidget, "frameNumber"); + if (useCoordinatesWidget && coordinateXWidget) toggleWidgetState(useCoordinatesWidget, coordinateXWidget, "coordinateX"); + if (useCoordinatesWidget && coordinateYWidget) toggleWidgetState(useCoordinatesWidget, coordinateYWidget, "coordinateY"); +} + +function videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler(node) { + if (!node?.widgets) return; + + const useBox1Widget = node.widgets.find(w => w && w.name === "useBox1"); + const box1Widget = node.widgets.find(w => w && w.name === "box1"); + const useBox2Widget = node.widgets.find(w => w && w.name === "useBox2"); + const box2Widget = node.widgets.find(w => w && w.name === "box2"); + const useBox3Widget = node.widgets.find(w => w && w.name === "useBox3"); + const box3Widget = node.widgets.find(w => w && w.name === "box3"); + const useBox4Widget = node.widgets.find(w => w && w.name === "useBox4"); + const box4Widget = node.widgets.find(w => w && w.name === "box4"); + + function toggleWidgetState(useWidget, paramWidget, paramName) { + if (!useWidget || !paramWidget) return; + function applyState() { + const enabled = useWidget.value === true; + toggleWidgetEnabled(paramWidget, enabled, node); + 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"; + } + node.setDirtyCanvas(true); + } + setTimeout(applyState, 100); + appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); + } + + if (useBox1Widget && box1Widget) toggleWidgetState(useBox1Widget, box1Widget, "box1"); + if (useBox2Widget && box2Widget) toggleWidgetState(useBox2Widget, box2Widget, "box2"); + if (useBox3Widget && box3Widget) toggleWidgetState(useBox3Widget, box3Widget, "box3"); + if (useBox4Widget && box4Widget) toggleWidgetState(useBox4Widget, box4Widget, "box4"); +} + +function videoInferenceSettingsSegmentsToggleHandler(node) { + if (!node?.widgets) return; + + function byName(name) { + return node.widgets.find(w => w && w.name === name); + } + + function togglePair(useWidget, paramWidget, paramName) { + if (!useWidget || !paramWidget) return; + function applyState() { + const enabled = useWidget.value === true; + toggleWidgetEnabled(paramWidget, enabled, node); + 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"; + } + node.setDirtyCanvas(true); + } + setTimeout(applyState, 100); + appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); + } + + function wireSegment(idx) { + const useSegment = byName(`useSegment${idx}`); + const start = byName(`segment${idx}StartTime`); + const end = byName(`segment${idx}EndTime`); + const audio = byName(`segment${idx}Audio`); + const useCrop = byName(`useSegment${idx}AudioCrop`); + const cropStart = byName(`segment${idx}AudioStartTime`); + const cropEnd = byName(`segment${idx}AudioEndTime`); + + if (useSegment && start) togglePair(useSegment, start, `segment${idx}StartTime`); + if (useSegment && end) togglePair(useSegment, end, `segment${idx}EndTime`); + if (useSegment && audio) togglePair(useSegment, audio, `segment${idx}Audio`); + if (useSegment && useCrop) togglePair(useSegment, useCrop, `useSegment${idx}AudioCrop`); + if (useCrop && cropStart) togglePair(useCrop, cropStart, `segment${idx}AudioStartTime`); + if (useCrop && cropEnd) togglePair(useCrop, cropEnd, `segment${idx}AudioEndTime`); + } + + wireSegment(1); + wireSegment(2); + wireSegment(3); + wireSegment(4); } function audioInferenceSpeechToggleHandler(speechNode) { @@ -2620,6 +2776,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "sync:lipsync-2@1 (Sync LipSync 2)", "sync:lipsync-2-pro@1 (Sync LipSync 2 Pro)", "sync:react-1@1 (Sync React-1)", + "sync:3@0 (sync-3)", ], "Bria": [ "bria:60@1 (Bria Video Eraser)", @@ -2726,6 +2883,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "sync:lipsync-2@1": {"width": 0, "height": 0}, "sync:lipsync-2-pro@1": {"width": 0, "height": 0}, "sync:react-1@1": {"width": 0, "height": 0}, + "sync:3@0": {"width": 1280, "height": 720}, "bria:60@1": {"width": 1280, "height": 720}, "creatify:aurora@fast": {"width": 1280, "height": 720}, "creatify:aurora@0": {"width": 1280, "height": 720}, @@ -2815,6 +2973,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "sync:lipsync-2@1": "720p", "sync:lipsync-2-pro@1": "720p", "sync:react-1@1": "720p", + "sync:3@0": "720p", "bria:60@1": "720p", "creatify:aurora@fast": "720p", "creatify:aurora@0": "720p", @@ -4623,6 +4782,10 @@ export { audioSettingsToggleHandler, textInferenceSettingsToggleHandler, videoSettingsToggleHandler, + videoInferenceSettingsTtsToggleHandler, + videoInferenceSettingsActiveSpeakerDetectionToggleHandler, + videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, + videoInferenceSettingsSegmentsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, diff --git a/modules/videoInference.py b/modules/videoInference.py index ec0e31a..a15dddb 100644 --- a/modules/videoInference.py +++ b/modules/videoInference.py @@ -141,7 +141,7 @@ class txt2vid: "tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.", }), "settings": ("RUNWAREVIDEOSETTINGS", { - "tooltip": "Connect a Runware Video Inference Settings node to configure draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, etc.", + "tooltip": "Connect a Runware Video Inference Settings node to configure draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, syncMode, mode, emotion, temperature, occlusionDetection, tts, activeSpeakerDetection, segments, etc.", }), } } diff --git a/modules/videoInferenceSettingsActiveSpeakerBoundingBoxes.py b/modules/videoInferenceSettingsActiveSpeakerBoundingBoxes.py new file mode 100644 index 0000000..3de117c --- /dev/null +++ b/modules/videoInferenceSettingsActiveSpeakerBoundingBoxes.py @@ -0,0 +1,74 @@ +""" +Runware Video Inference Settings Active Speaker Bounding Boxes +Builds settings.activeSpeakerDetection.boundingBoxes for Sync models. +Each element is [x1, y1, x2, y2] or null. Up to 4 elements. +""" + +from typing import Dict, Any + + +def _parse_box(raw: str, label: str): + value = (raw or "").strip() + if value == "" or value.lower() == "null": + return None + + parts = [p.strip() for p in value.split(",")] + if len(parts) != 4: + raise ValueError(f"{label} must be 'x1,y1,x2,y2' or null.") + + try: + return [float(parts[0]), float(parts[1]), float(parts[2]), float(parts[3])] + except ValueError as exc: + raise ValueError(f"{label} values must be numbers.") from exc + + +class RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes: + """Optional settings.activeSpeakerDetection.boundingBoxes block for Sync.""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "useBox1": ("BOOLEAN", {"tooltip": "Enable bounding box element 1.", "default": False}), + "box1": ("STRING", {"tooltip": "Element 1 as 'x1,y1,x2,y2' or null.", "default": ""}), + "useBox2": ("BOOLEAN", {"tooltip": "Enable bounding box element 2.", "default": False}), + "box2": ("STRING", {"tooltip": "Element 2 as 'x1,y1,x2,y2' or null.", "default": ""}), + "useBox3": ("BOOLEAN", {"tooltip": "Enable bounding box element 3.", "default": False}), + "box3": ("STRING", {"tooltip": "Element 3 as 'x1,y1,x2,y2' or null.", "default": ""}), + "useBox4": ("BOOLEAN", {"tooltip": "Enable bounding box element 4.", "default": False}), + "box4": ("STRING", {"tooltip": "Element 4 as 'x1,y1,x2,y2' or null.", "default": ""}), + }, + } + + RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES",) + RETURN_NAMES = ("boundingBoxes",) + FUNCTION = "create" + CATEGORY = "Runware" + DESCRIPTION = ( + "Configure settings.activeSpeakerDetection.boundingBoxes for Runware Video Inference. " + "Supports up to 4 elements, each [x1, y1, x2, y2] or null." + ) + + def create(self, **kwargs) -> tuple[list]: + boxes = [] + + if kwargs.get("useBox1", False): + boxes.append(_parse_box(kwargs.get("box1", ""), "box1")) + if kwargs.get("useBox2", False): + boxes.append(_parse_box(kwargs.get("box2", ""), "box2")) + if kwargs.get("useBox3", False): + boxes.append(_parse_box(kwargs.get("box3", ""), "box3")) + if kwargs.get("useBox4", False): + boxes.append(_parse_box(kwargs.get("box4", ""), "box4")) + + return (boxes[:4],) + + +NODE_CLASS_MAPPINGS = { + "RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes": RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes": "Runware Video Inference Settings Active Speaker Bounding Boxes", +} diff --git a/modules/videoInferenceSettingsActiveSpeakerDetection.py b/modules/videoInferenceSettingsActiveSpeakerDetection.py new file mode 100644 index 0000000..71f2f2a --- /dev/null +++ b/modules/videoInferenceSettingsActiveSpeakerDetection.py @@ -0,0 +1,97 @@ +""" +Runware Video Inference Settings Active Speaker Detection +Exposes settings.activeSpeakerDetection fields for Sync models. +Connect optional boundingBoxes from the dedicated bounding-boxes node. +Connect the output to Runware Video Inference Settings -> activeSpeakerDetection. +""" + +from typing import Dict, Any + + +class RunwareVideoInferenceSettingsActiveSpeakerDetection: + """Optional settings.activeSpeakerDetection block for video inference (Sync).""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "useAutoDetect": ("BOOLEAN", { + "tooltip": "Enable to include autoDetect in settings.activeSpeakerDetection.", + "default": False, + }), + "autoDetect": ("BOOLEAN", { + "tooltip": "Let Sync choose the active speaker automatically. Only used when 'Use Auto Detect' is enabled.", + "default": True, + "label_on": "true", + "label_off": "false", + }), + "useFrameNumber": ("BOOLEAN", { + "tooltip": "Enable to include frameNumber in settings.activeSpeakerDetection.", + "default": False, + }), + "frameNumber": ("INT", { + "tooltip": "Frame index corresponding to the provided face coordinates. Only used when 'Use Frame Number' is enabled.", + "default": 0, + "min": 0, + "max": 1000000, + "step": 1, + }), + "useCoordinates": ("BOOLEAN", { + "tooltip": "Enable to include coordinates ([x, y]) in settings.activeSpeakerDetection.", + "default": False, + }), + "coordinateX": ("FLOAT", { + "tooltip": "X point on the target speaker face for the selected frame. Must be an integer in range 1-4096. Only used when 'Use Coordinates' is enabled.", + "default": 512.0, + "min": 1.0, + "max": 4096.0, + "step": 1.0, + }), + "coordinateY": ("FLOAT", { + "tooltip": "Y point on the target speaker face for the selected frame. Must be an integer in range 1-4096. Only used when 'Use Coordinates' is enabled.", + "default": 512.0, + "min": 1.0, + "max": 4096.0, + "step": 1.0, + }), + "boundingBoxes": ("RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES", { + "tooltip": "Connect Runware Video Inference Settings Active Speaker Bounding Boxes (up to 4 elements).", + }), + }, + } + + RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION",) + RETURN_NAMES = ("activeSpeakerDetection",) + FUNCTION = "create" + CATEGORY = "Runware" + DESCRIPTION = ( + "Configure settings.activeSpeakerDetection (autoDetect, frameNumber, coordinates, boundingBoxes) " + "for Runware Video Inference. Connect to Runware Video Inference Settings -> activeSpeakerDetection (Sync)." + ) + + def create(self, **kwargs) -> tuple[Dict[str, Any]]: + active_speaker: Dict[str, Any] = {} + if kwargs.get("useAutoDetect", False): + active_speaker["autoDetect"] = bool(kwargs.get("autoDetect", True)) + if kwargs.get("useFrameNumber", False): + active_speaker["frameNumber"] = int(kwargs.get("frameNumber", 0)) + if kwargs.get("useCoordinates", False): + x = int(round(float(kwargs.get("coordinateX", 512.0)))) + y = int(round(float(kwargs.get("coordinateY", 512.0)))) + x = max(1, min(4096, x)) + y = max(1, min(4096, y)) + active_speaker["coordinates"] = [x, y] + bounding_boxes = kwargs.get("boundingBoxes", None) + if isinstance(bounding_boxes, list) and len(bounding_boxes) > 0: + active_speaker["boundingBoxes"] = bounding_boxes[:4] + return (active_speaker,) + + +NODE_CLASS_MAPPINGS = { + "RunwareVideoInferenceSettingsActiveSpeakerDetection": RunwareVideoInferenceSettingsActiveSpeakerDetection, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareVideoInferenceSettingsActiveSpeakerDetection": "Runware Video Inference Settings Active Speaker Detection", +} diff --git a/modules/videoInferenceSettingsSegments.py b/modules/videoInferenceSettingsSegments.py new file mode 100644 index 0000000..d8c8e8e --- /dev/null +++ b/modules/videoInferenceSettingsSegments.py @@ -0,0 +1,101 @@ +""" +Runware Video Inference Settings Segments +Builds settings.segments[] for Sync models. +Each segment can include startTime, endTime, audio, and optional audio crop range. +""" + +from typing import Any + + +class RunwareVideoInferenceSettingsSegments: + """Optional settings.segments[] block for video inference (Sync).""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "useSegment1": ("BOOLEAN", {"default": False, "tooltip": "Enable segment 1."}), + "segment1StartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 1 start time in seconds."}), + "segment1EndTime": ("FLOAT", {"default": 1.0, "step": 0.01, "tooltip": "Segment 1 end time in seconds."}), + "segment1Audio": ("STRING", {"default": "", "tooltip": "Segment 1 audio mediaUUID. Connect from Runware Media Upload output."}), + "useSegment1AudioCrop": ("BOOLEAN", {"default": False, "tooltip": "Enable audioStartTime/audioEndTime for segment 1."}), + "segment1AudioStartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 1 audio crop start time in seconds."}), + "segment1AudioEndTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 1 audio crop end time in seconds."}), + + "useSegment2": ("BOOLEAN", {"default": False, "tooltip": "Enable segment 2."}), + "segment2StartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 2 start time in seconds."}), + "segment2EndTime": ("FLOAT", {"default": 1.0, "step": 0.01, "tooltip": "Segment 2 end time in seconds."}), + "segment2Audio": ("STRING", {"default": "", "tooltip": "Segment 2 audio mediaUUID. Connect from Runware Media Upload output."}), + "useSegment2AudioCrop": ("BOOLEAN", {"default": False, "tooltip": "Enable audioStartTime/audioEndTime for segment 2."}), + "segment2AudioStartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 2 audio crop start time in seconds."}), + "segment2AudioEndTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 2 audio crop end time in seconds."}), + + "useSegment3": ("BOOLEAN", {"default": False, "tooltip": "Enable segment 3."}), + "segment3StartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 3 start time in seconds."}), + "segment3EndTime": ("FLOAT", {"default": 1.0, "step": 0.01, "tooltip": "Segment 3 end time in seconds."}), + "segment3Audio": ("STRING", {"default": "", "tooltip": "Segment 3 audio mediaUUID. Connect from Runware Media Upload output."}), + "useSegment3AudioCrop": ("BOOLEAN", {"default": False, "tooltip": "Enable audioStartTime/audioEndTime for segment 3."}), + "segment3AudioStartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 3 audio crop start time in seconds."}), + "segment3AudioEndTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 3 audio crop end time in seconds."}), + + "useSegment4": ("BOOLEAN", {"default": False, "tooltip": "Enable segment 4."}), + "segment4StartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 4 start time in seconds."}), + "segment4EndTime": ("FLOAT", {"default": 1.0, "step": 0.01, "tooltip": "Segment 4 end time in seconds."}), + "segment4Audio": ("STRING", {"default": "", "tooltip": "Segment 4 audio mediaUUID. Connect from Runware Media Upload output."}), + "useSegment4AudioCrop": ("BOOLEAN", {"default": False, "tooltip": "Enable audioStartTime/audioEndTime for segment 4."}), + "segment4AudioStartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 4 audio crop start time in seconds."}), + "segment4AudioEndTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 4 audio crop end time in seconds."}), + }, + } + + RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSSEGMENTS",) + RETURN_NAMES = ("segments",) + FUNCTION = "create" + CATEGORY = "Runware" + DESCRIPTION = ( + "Configure settings.segments[] for Runware Video Inference (Sync). " + "Each enabled segment includes startTime, endTime, audio and optional audioStartTime/audioEndTime." + ) + + def _build_segment(self, kwargs: dict[str, Any], idx: int) -> dict[str, Any]: + start = float(kwargs.get(f"segment{idx}StartTime", 0.0)) + end = float(kwargs.get(f"segment{idx}EndTime", 1.0)) + audio = (kwargs.get(f"segment{idx}Audio", "") or "").strip() + + if audio == "": + raise ValueError(f"segment{idx}Audio is required when segment {idx} is enabled.") + if end < start: + raise ValueError(f"segment{idx}EndTime must be >= segment{idx}StartTime.") + + segment: dict[str, Any] = { + "startTime": start, + "endTime": end, + "audio": audio, + } + + if kwargs.get(f"useSegment{idx}AudioCrop", False): + astart = float(kwargs.get(f"segment{idx}AudioStartTime", 0.0)) + aend = float(kwargs.get(f"segment{idx}AudioEndTime", 0.0)) + if aend < astart: + raise ValueError(f"segment{idx}AudioEndTime must be >= segment{idx}AudioStartTime.") + segment["audioStartTime"] = astart + segment["audioEndTime"] = aend + + return segment + + def create(self, **kwargs) -> tuple[list]: + segments: list[dict[str, Any]] = [] + for idx in (1, 2, 3, 4): + if kwargs.get(f"useSegment{idx}", False): + segments.append(self._build_segment(kwargs, idx)) + return (segments,) + + +NODE_CLASS_MAPPINGS = { + "RunwareVideoInferenceSettingsSegments": RunwareVideoInferenceSettingsSegments, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareVideoInferenceSettingsSegments": "Runware Video Inference Settings Segments", +} diff --git a/modules/videoInferenceSettingsTts.py b/modules/videoInferenceSettingsTts.py new file mode 100644 index 0000000..a50cb87 --- /dev/null +++ b/modules/videoInferenceSettingsTts.py @@ -0,0 +1,67 @@ +""" +Runware Video Inference Settings TTS +Exposes settings.tts fields (stability, similarityBoost) for Sync / ElevenLabs-style tuning. +Connect the output to Runware Video Inference Settings → tts. +""" + +from typing import Dict, Any + + +class RunwareVideoInferenceSettingsTts: + """Optional settings.tts block for video inference (Sync).""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "useStability": ("BOOLEAN", { + "tooltip": "Enable to include stability in settings.tts.", + "default": False, + }), + "stability": ("FLOAT", { + "tooltip": "TTS stability (0–1). Optional Sync / ElevenLabs-style tuning. Only used when 'Use Stability' is enabled.", + "default": 0.5, + "min": 0.0, + "max": 1.0, + "step": 0.01, + }), + "useSimilarityBoost": ("BOOLEAN", { + "tooltip": "Enable to include similarityBoost in settings.tts.", + "default": False, + }), + "similarityBoost": ("FLOAT", { + "tooltip": "TTS similarity boost (0–1). Optional Sync / ElevenLabs-style tuning. Only used when 'Use Similarity Boost' is enabled.", + "default": 0.75, + "min": 0.0, + "max": 1.0, + "step": 0.01, + }), + }, + } + + RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSTTS",) + RETURN_NAMES = ("tts",) + FUNCTION = "create" + CATEGORY = "Runware" + DESCRIPTION = ( + "Configure settings.tts (stability, similarityBoost) for Runware Video Inference. " + "Connect to Runware Video Inference Settings → tts (Sync)." + ) + + def create(self, **kwargs) -> tuple[Dict[str, Any]]: + tts: Dict[str, Any] = {} + if kwargs.get("useStability", False): + tts["stability"] = float(kwargs.get("stability", 0.5)) + if kwargs.get("useSimilarityBoost", False): + tts["similarityBoost"] = float(kwargs.get("similarityBoost", 0.75)) + return (tts,) + + +NODE_CLASS_MAPPINGS = { + "RunwareVideoInferenceSettingsTts": RunwareVideoInferenceSettingsTts, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareVideoInferenceSettingsTts": "Runware Video Inference Settings TTS", +} diff --git a/modules/videoModelSearch.py b/modules/videoModelSearch.py index 6650b94..c8f91a7 100644 --- a/modules/videoModelSearch.py +++ b/modules/videoModelSearch.py @@ -104,6 +104,7 @@ class videoModelSearch: "sync:lipsync-2@1 (Sync LipSync 2)", "sync:lipsync-2-pro@1 (Sync LipSync 2 Pro)", "sync:react-1@1 (Sync React-1)", + "sync:3@0 (sync-3)", ], "Bria": [ "bria:60@1 (Bria Video Eraser)", @@ -236,6 +237,7 @@ class videoModelSearch: "sync:lipsync-2@1": {"width": 0, "height": 0}, "sync:lipsync-2-pro@1": {"width": 0, "height": 0}, "sync:react-1@1": {"width": 0, "height": 0}, + "sync:3@0": {"width": 1280, "height": 720}, # Bria Models "bria:60@1": {"width": 0, "height": 0}, @@ -367,6 +369,7 @@ class videoModelSearch: "sync:lipsync-2@1": "720p", "sync:lipsync-2-pro@1": "720p", "sync:react-1@1": "720p", + "sync:3@0": "720p", # Bria Models "bria:60@1": "720p", diff --git a/modules/videoSettings.py b/modules/videoSettings.py index 60eeb28..6801ba4 100644 --- a/modules/videoSettings.py +++ b/modules/videoSettings.py @@ -1,6 +1,6 @@ """ Runware Video Inference Settings Node -Provides settings (draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, etc.) for Runware Video Inference. +Provides settings (draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, syncMode, mode, emotion, temperature, occlusionDetection, tts, activeSpeakerDetection, segments, etc.) for Runware Video Inference. """ from typing import Dict, Any @@ -123,6 +123,60 @@ class RunwareVideoSettings: "label_on": "Enabled", "label_off": "Disabled", }), + "useSyncMode": ("BOOLEAN", { + "tooltip": "Enable to include syncMode in video inference settings.", + "default": False, + }), + "syncMode": (["bounce", "cut_off", "silence", "remap"], { + "tooltip": "Controls how mismatched audio/video lengths are handled. Default provider behavior is usually cropping to shorter duration. Only used when 'Use Sync Mode' is enabled.", + "default": "cut_off", + }), + "tts": ("RUNWAREVIDEOINFERENCESETTINGSTTS", { + "tooltip": "Connect Runware Video Inference Settings TTS for settings.tts (stability, similarityBoost). Sync / ElevenLabs-style optional tuning.", + }), + "activeSpeakerDetection": ("RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION", { + "tooltip": "Connect Runware Video Inference Settings Active Speaker Detection for settings.activeSpeakerDetection (autoDetect, frameNumber, coordinates).", + }), + "useMode": ("BOOLEAN", { + "tooltip": "Enable to include mode in video inference settings.", + "default": False, + }), + "mode": (["lips", "face", "head"], { + "tooltip": "Sync processing mode. Only used when 'Use Mode' is enabled.", + "default": "lips", + }), + "useEmotion": ("BOOLEAN", { + "tooltip": "Enable to include emotion in video inference settings.", + "default": False, + }), + "emotion": (["happy", "sad", "angry", "disgusted", "surprised", "neutral"], { + "tooltip": "Target emotion for generation. Only used when 'Use Emotion' is enabled.", + "default": "neutral", + }), + "useTemperature": ("BOOLEAN", { + "tooltip": "Enable to include temperature in video inference settings.", + "default": False, + }), + "temperature": ("FLOAT", { + "tooltip": "Sampling temperature. Only used when 'Use Temperature' is enabled.", + "default": 0.7, + "min": 0.0, + "max": 5.0, + "step": 0.01, + }), + "useOcclusionDetection": ("BOOLEAN", { + "tooltip": "Enable to include occlusionDetection in video inference settings.", + "default": False, + }), + "occlusionDetection": ("BOOLEAN", { + "tooltip": "Enable occlusion detection. Only used when 'Use Occlusion Detection' is enabled.", + "default": False, + "label_on": "true", + "label_off": "false", + }), + "segments": ("RUNWAREVIDEOINFERENCESETTINGSSEGMENTS", { + "tooltip": "Connect Runware Video Inference Settings Segments for settings.segments[] (startTime, endTime, audio, audioStartTime, audioEndTime).", + }), } } @@ -131,7 +185,7 @@ class RunwareVideoSettings: FUNCTION = "createSettings" CATEGORY = "Runware" DESCRIPTION = ( - "Configure video inference settings (draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, etc.) for Runware Video Inference. " + "Configure video inference settings (draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, syncMode, mode, emotion, temperature, occlusionDetection, tts, activeSpeakerDetection, segments, etc.) for Runware Video Inference. " "Connect to Runware Video Inference node." ) @@ -161,6 +215,19 @@ class RunwareVideoSettings: shot_type = kwargs.get("shotType", "single") use_prompt_extend = kwargs.get("usePromptExtend", False) prompt_extend = kwargs.get("promptExtend", False) + use_sync_mode = kwargs.get("useSyncMode", False) + sync_mode = kwargs.get("syncMode", "cut_off") + tts_cfg = kwargs.get("tts", None) + active_speaker_cfg = kwargs.get("activeSpeakerDetection", None) + use_mode = kwargs.get("useMode", False) + mode = kwargs.get("mode", "lips") + use_emotion = kwargs.get("useEmotion", False) + emotion = kwargs.get("emotion", "neutral") + use_temperature = kwargs.get("useTemperature", False) + temperature = kwargs.get("temperature", 0.7) + use_occlusion_detection = kwargs.get("useOcclusionDetection", False) + occlusion_detection = kwargs.get("occlusionDetection", False) + segments_cfg = kwargs.get("segments", None) settings: Dict[str, Any] = {} @@ -188,6 +255,23 @@ class RunwareVideoSettings: settings["shotType"] = shot_type if use_prompt_extend: settings["promptExtend"] = bool(prompt_extend) + if use_sync_mode: + settings["syncMode"] = sync_mode + if use_mode: + settings["mode"] = mode + if use_emotion: + settings["emotion"] = emotion + if use_temperature: + settings["temperature"] = float(temperature) + if use_occlusion_detection: + settings["occlusionDetection"] = bool(occlusion_detection) + + if tts_cfg is not None and isinstance(tts_cfg, dict) and len(tts_cfg) > 0: + settings["tts"] = tts_cfg + if active_speaker_cfg is not None and isinstance(active_speaker_cfg, dict) and len(active_speaker_cfg) > 0: + settings["activeSpeakerDetection"] = active_speaker_cfg + if segments_cfg is not None and isinstance(segments_cfg, list) and len(segments_cfg) > 0: + settings["segments"] = segments_cfg return (settings,) diff --git a/workflows/Runware_Video_Inference_Sync3.json b/workflows/Runware_Video_Inference_Sync3.json new file mode 100644 index 0000000..3603cdb --- /dev/null +++ b/workflows/Runware_Video_Inference_Sync3.json @@ -0,0 +1 @@ +{"id":"8d8cd905-3050-4da1-a62f-80eab2d59f33","revision":0,"last_node_id":11,"last_link_id":10,"nodes":[{"id":3,"type":"SaveVideo","pos":[1501.4434814453125,-329.614501953125],"size":[270,106],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"video","name":"video","type":"VIDEO","link":2},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"format","name":"format","type":"COMBO","widget":{"name":"format"},"link":null},{"localized_name":"codec","name":"codec","type":"COMBO","widget":{"name":"codec"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveVideo"},"widgets_values":["video/ComfyUI","auto","auto"]},{"id":7,"type":"Runware Media Upload","pos":[-443.04986572265625,-21.408855438232422],"size":[270,58],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"media","name":"media","shape":7,"type":"VIDEO,AUDIO","link":5},{"localized_name":"mediaUUID","name":"mediaUUID","shape":7,"type":"STRING","widget":{"name":"mediaUUID"},"link":null}],"outputs":[{"localized_name":"mediaUUID","name":"mediaUUID","type":"STRING","links":[6]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Media Upload"},"widgets_values":["ff03bde3-aa04-4639-b596-d3329b51006e"],"bgcolor":"#5345bf"},{"id":8,"type":"LoadAudio","pos":[-457.4670104980469,112.94568634033203],"size":[274.080078125,136],"flags":{},"order":0,"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":[5]}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadAudio"},"widgets_values":["example-audio.wav",null,null]},{"id":11,"type":"Runware Video Inference Inputs","pos":[1493.295654296875,-80.21669006347656],"size":[320.0390625,354],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","shape":7,"type":"IMAGE","link":null},{"localized_name":"Frame Images","name":"Frame Images","shape":7,"type":"RUNWAREVIDEOINPUTSFRAMEIMAGES","link":null},{"localized_name":"Audio Inputs","name":"Audio Inputs","shape":7,"type":"RUNWAREAUDIOINPUT","link":null},{"localized_name":"Speech Inputs","name":"Speech Inputs","shape":7,"type":"RUNWARESPEECHINPUT","link":null},{"localized_name":"Mask","name":"Mask","shape":7,"type":"IMAGE","link":null},{"localized_name":"Frame","name":"Frame","shape":7,"type":"IMAGE","link":null},{"localized_name":"Background","name":"Background","shape":7,"type":"IMAGE","link":null},{"localized_name":"References","name":"References","shape":7,"type":"RUNWAREVIDEOINPUTSREFERENCEIMAGES","link":null},{"localized_name":"Reference Videos","name":"Reference Videos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":null},{"localized_name":"Reference Voices","name":"Reference Voices","shape":7,"type":"RUNWAREREFERENCEVOICES","link":null},{"localized_name":"Elements","name":"Elements","shape":7,"type":"RUNWAREVIDEOINFERENCEELEMENTS","link":null},{"localized_name":"Avatar","name":"Avatar","shape":7,"type":"STRING","widget":{"name":"Avatar"},"link":null},{"localized_name":"Audio","name":"Audio","shape":7,"type":"STRING","widget":{"name":"Audio"},"link":null},{"localized_name":"Video","name":"Video","shape":7,"type":"STRING","widget":{"name":"Video"},"link":8},{"localized_name":"draftId","name":"draftId","shape":7,"type":"STRING","widget":{"name":"draftId"},"link":null},{"localized_name":"videoId","name":"videoId","shape":7,"type":"STRING","widget":{"name":"videoId"},"link":null}],"outputs":[{"localized_name":"Video Inference Inputs","name":"Video Inference Inputs","type":"RUNWAREVIDEOINFERENCEINPUTS","links":[9]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Inputs"},"widgets_values":["","","","",""],"bgcolor":"#5345bf"},{"id":9,"type":"LoadVideo","pos":[723.3191528320312,11.38086223602295],"size":[274.080078125,348.080078125],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"file","name":"file","type":"COMBO","widget":{"name":"file"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"VIDEO","name":"VIDEO","type":"VIDEO","links":[7]}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadVideo"},"widgets_values":["example-video.mp4","image"]},{"id":10,"type":"Runware Media Upload","pos":[736.9839477539062,419.3815002441406],"size":[270,58],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"media","name":"media","shape":7,"type":"VIDEO,AUDIO","link":7},{"localized_name":"mediaUUID","name":"mediaUUID","shape":7,"type":"STRING","widget":{"name":"mediaUUID"},"link":null}],"outputs":[{"localized_name":"mediaUUID","name":"mediaUUID","type":"STRING","links":[8]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Media Upload"},"widgets_values":["16b27f5c-ecff-433b-8bc4-49de3f1e4265"],"bgcolor":"#5345bf"},{"id":2,"type":"Runware Video Model Search","pos":[704.3303833007812,-309.6583251953125],"size":[287.380859375,250],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Architecture","name":"Model Architecture","type":"COMBO","widget":{"name":"Model Architecture"},"link":null},{"localized_name":"VideoList","name":"VideoList","type":"COMBO","widget":{"name":"VideoList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null},{"localized_name":"useCustomDimensions","name":"useCustomDimensions","type":"COMBO","widget":{"name":"useCustomDimensions"},"link":null},{"localized_name":"Width","name":"Width","type":"INT","widget":{"name":"Width"},"link":null},{"localized_name":"Height","name":"Height","type":"INT","widget":{"name":"Height"},"link":null},{"localized_name":"useResolution","name":"useResolution","type":"BOOLEAN","widget":{"name":"useResolution"},"link":null},{"localized_name":"resolution","name":"resolution","type":"COMBO","widget":{"name":"resolution"},"link":null}],"outputs":[{"localized_name":"Runware Video Model","name":"Runware Video Model","type":"RUNWAREVIDEOMODEL","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Model Search"},"widgets_values":["","Sync","sync:3@0 (sync-3)",false,"Disabled",0,0,false,"1080p"],"bgcolor":"#5345bf"},{"id":1,"type":"Runware Video Inference","pos":[1022.4100341796875,-326.6192321777344],"size":[400,818],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"Model","name":"Model","type":"RUNWAREVIDEOMODEL","link":1},{"localized_name":"frameImages","name":"frameImages","shape":7,"type":"RUNWAREFRAMEIMAGES","link":null},{"localized_name":"referenceImages","name":"referenceImages","shape":7,"type":"RUNWAREREFERENCEIMAGES","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"inputAudios","name":"inputAudios","shape":7,"type":"RUNWAREINPUTAUDIOS","link":null},{"localized_name":"referenceVideos","name":"referenceVideos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":null},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWAREVIDEOINFERENCESPEECHINPUT","link":null},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREVIDEOINFERENCEINPUTS","link":9},{"localized_name":"safetyInputs","name":"safetyInputs","shape":7,"type":"RUNWARESAFETYINPUTS","link":null},{"localized_name":"videoAdvancedFeatureInputs","name":"videoAdvancedFeatureInputs","shape":7,"type":"RUNWAREVIDEOADVANCEDFEATUREINPUTS","link":null},{"localized_name":"Accelerator","name":"Accelerator","shape":7,"type":"RUNWAREACCELERATOR","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWAREVIDEOSETTINGS","link":10},{"localized_name":"Multi Inference Mode","name":"Multi Inference Mode","type":"BOOLEAN","widget":{"name":"Multi Inference Mode"},"link":null},{"localized_name":"Prompt Weighting","name":"Prompt Weighting","type":"COMBO","widget":{"name":"Prompt Weighting"},"link":null},{"localized_name":"useDuration","name":"useDuration","type":"BOOLEAN","widget":{"name":"useDuration"},"link":null},{"localized_name":"duration","name":"duration","type":"INT","widget":{"name":"duration"},"link":null},{"localized_name":"useFps","name":"useFps","type":"BOOLEAN","widget":{"name":"useFps"},"link":null},{"localized_name":"fps","name":"fps","type":"INT","widget":{"name":"fps"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"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":"useBatchSize","name":"useBatchSize","type":"BOOLEAN","widget":{"name":"useBatchSize"},"link":null},{"localized_name":"batchSize","name":"batchSize","type":"INT","widget":{"name":"batchSize"},"link":null},{"localized_name":"useSchedulers","name":"useSchedulers","type":"BOOLEAN","widget":{"name":"useSchedulers"},"link":null},{"localized_name":"scheduler","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"cfgScale","name":"cfgScale","type":"FLOAT","widget":{"name":"cfgScale"},"link":null},{"localized_name":"acceleration","name":"acceleration","type":"COMBO","widget":{"name":"acceleration"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","shape":7,"type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","shape":7,"type":"STRING","widget":{"name":"negativePrompt"},"link":null}],"outputs":[{"localized_name":"VIDEO","name":"VIDEO","type":"VIDEO","links":[2]},{"localized_name":"RW-Task","name":"RW-Task","type":"RUNWARETASK","links":null},{"localized_name":"OUTPUT","name":"OUTPUT","type":"RUNWARETASK","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference"},"widgets_values":[false,"Disabled",false,5,false,24,"mp4",false,1971958733,"randomize",false,20,false,1,false,"euler",false,5,"none","",""],"bgcolor":"#5345bf"},{"id":4,"type":"Runware Video Inference Settings","pos":[285.40966796875,-310.8119812011719],"size":[400,920],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"tts","name":"tts","shape":7,"type":"RUNWAREVIDEOINFERENCESETTINGSTTS","link":null},{"localized_name":"activeSpeakerDetection","name":"activeSpeakerDetection","shape":7,"type":"RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION","link":3},{"localized_name":"segments","name":"segments","shape":7,"type":"RUNWAREVIDEOINFERENCESETTINGSSEGMENTS","link":4},{"localized_name":"useDraft","name":"useDraft","shape":7,"type":"BOOLEAN","widget":{"name":"useDraft"},"link":null},{"localized_name":"draft","name":"draft","shape":7,"type":"BOOLEAN","widget":{"name":"draft"},"link":null},{"localized_name":"useAudio","name":"useAudio","shape":7,"type":"BOOLEAN","widget":{"name":"useAudio"},"link":null},{"localized_name":"audio","name":"audio","shape":7,"type":"BOOLEAN","widget":{"name":"audio"},"link":null},{"localized_name":"usePromptUpsampling","name":"usePromptUpsampling","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptUpsampling"},"link":null},{"localized_name":"promptUpsampling","name":"promptUpsampling","shape":7,"type":"BOOLEAN","widget":{"name":"promptUpsampling"},"link":null},{"localized_name":"useBackgroundColor","name":"useBackgroundColor","shape":7,"type":"BOOLEAN","widget":{"name":"useBackgroundColor"},"link":null},{"localized_name":"backgroundColor","name":"backgroundColor","shape":7,"type":"STRING","widget":{"name":"backgroundColor"},"link":null},{"localized_name":"useRemoveBackground","name":"useRemoveBackground","shape":7,"type":"BOOLEAN","widget":{"name":"useRemoveBackground"},"link":null},{"localized_name":"removeBackground","name":"removeBackground","shape":7,"type":"BOOLEAN","widget":{"name":"removeBackground"},"link":null},{"localized_name":"useExpressiveness","name":"useExpressiveness","shape":7,"type":"BOOLEAN","widget":{"name":"useExpressiveness"},"link":null},{"localized_name":"expressiveness","name":"expressiveness","shape":7,"type":"COMBO","widget":{"name":"expressiveness"},"link":null},{"localized_name":"useVoiceDescription","name":"useVoiceDescription","shape":7,"type":"BOOLEAN","widget":{"name":"useVoiceDescription"},"link":null},{"localized_name":"voiceDescription","name":"voiceDescription","shape":7,"type":"STRING","widget":{"name":"voiceDescription"},"link":null},{"localized_name":"useStyle","name":"useStyle","shape":7,"type":"BOOLEAN","widget":{"name":"useStyle"},"link":null},{"localized_name":"style","name":"style","shape":7,"type":"COMBO","widget":{"name":"style"},"link":null},{"localized_name":"useThinking","name":"useThinking","shape":7,"type":"BOOLEAN","widget":{"name":"useThinking"},"link":null},{"localized_name":"thinking","name":"thinking","shape":7,"type":"COMBO","widget":{"name":"thinking"},"link":null},{"localized_name":"useMultiClip","name":"useMultiClip","shape":7,"type":"BOOLEAN","widget":{"name":"useMultiClip"},"link":null},{"localized_name":"multiClip","name":"multiClip","shape":7,"type":"BOOLEAN","widget":{"name":"multiClip"},"link":null},{"localized_name":"useShotType","name":"useShotType","shape":7,"type":"BOOLEAN","widget":{"name":"useShotType"},"link":null},{"localized_name":"shotType","name":"shotType","shape":7,"type":"COMBO","widget":{"name":"shotType"},"link":null},{"localized_name":"usePromptExtend","name":"usePromptExtend","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptExtend"},"link":null},{"localized_name":"promptExtend","name":"promptExtend","shape":7,"type":"BOOLEAN","widget":{"name":"promptExtend"},"link":null},{"localized_name":"useSyncMode","name":"useSyncMode","shape":7,"type":"BOOLEAN","widget":{"name":"useSyncMode"},"link":null},{"localized_name":"syncMode","name":"syncMode","shape":7,"type":"COMBO","widget":{"name":"syncMode"},"link":null},{"localized_name":"useMode","name":"useMode","shape":7,"type":"BOOLEAN","widget":{"name":"useMode"},"link":null},{"localized_name":"mode","name":"mode","shape":7,"type":"COMBO","widget":{"name":"mode"},"link":null},{"localized_name":"useEmotion","name":"useEmotion","shape":7,"type":"BOOLEAN","widget":{"name":"useEmotion"},"link":null},{"localized_name":"emotion","name":"emotion","shape":7,"type":"COMBO","widget":{"name":"emotion"},"link":null},{"localized_name":"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":"useOcclusionDetection","name":"useOcclusionDetection","shape":7,"type":"BOOLEAN","widget":{"name":"useOcclusionDetection"},"link":null},{"localized_name":"occlusionDetection","name":"occlusionDetection","shape":7,"type":"BOOLEAN","widget":{"name":"occlusionDetection"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREVIDEOSETTINGS","links":[10]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Settings"},"widgets_values":[false,false,false,true,false,true,false,"",false,false,false,"low",false,"",false,"anime",false,"auto",false,false,false,"single",false,false,false,"cut_off",false,"lips",false,"neutral",false,0.7,false,false],"bgcolor":"#5345bf"},{"id":6,"type":"Runware Video Inference Settings Segments","pos":[-148.3369140625,-72.54230499267578],"size":[379.0318298339844,706],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"useSegment1","name":"useSegment1","shape":7,"type":"BOOLEAN","widget":{"name":"useSegment1"},"link":null},{"localized_name":"segment1StartTime","name":"segment1StartTime","shape":7,"type":"FLOAT","widget":{"name":"segment1StartTime"},"link":null},{"localized_name":"segment1EndTime","name":"segment1EndTime","shape":7,"type":"FLOAT","widget":{"name":"segment1EndTime"},"link":null},{"localized_name":"segment1Audio","name":"segment1Audio","shape":7,"type":"STRING","widget":{"name":"segment1Audio"},"link":6},{"localized_name":"useSegment1AudioCrop","name":"useSegment1AudioCrop","shape":7,"type":"BOOLEAN","widget":{"name":"useSegment1AudioCrop"},"link":null},{"localized_name":"segment1AudioStartTime","name":"segment1AudioStartTime","shape":7,"type":"FLOAT","widget":{"name":"segment1AudioStartTime"},"link":null},{"localized_name":"segment1AudioEndTime","name":"segment1AudioEndTime","shape":7,"type":"FLOAT","widget":{"name":"segment1AudioEndTime"},"link":null},{"localized_name":"useSegment2","name":"useSegment2","shape":7,"type":"BOOLEAN","widget":{"name":"useSegment2"},"link":null},{"localized_name":"segment2StartTime","name":"segment2StartTime","shape":7,"type":"FLOAT","widget":{"name":"segment2StartTime"},"link":null},{"localized_name":"segment2EndTime","name":"segment2EndTime","shape":7,"type":"FLOAT","widget":{"name":"segment2EndTime"},"link":null},{"localized_name":"segment2Audio","name":"segment2Audio","shape":7,"type":"STRING","widget":{"name":"segment2Audio"},"link":null},{"localized_name":"useSegment2AudioCrop","name":"useSegment2AudioCrop","shape":7,"type":"BOOLEAN","widget":{"name":"useSegment2AudioCrop"},"link":null},{"localized_name":"segment2AudioStartTime","name":"segment2AudioStartTime","shape":7,"type":"FLOAT","widget":{"name":"segment2AudioStartTime"},"link":null},{"localized_name":"segment2AudioEndTime","name":"segment2AudioEndTime","shape":7,"type":"FLOAT","widget":{"name":"segment2AudioEndTime"},"link":null},{"localized_name":"useSegment3","name":"useSegment3","shape":7,"type":"BOOLEAN","widget":{"name":"useSegment3"},"link":null},{"localized_name":"segment3StartTime","name":"segment3StartTime","shape":7,"type":"FLOAT","widget":{"name":"segment3StartTime"},"link":null},{"localized_name":"segment3EndTime","name":"segment3EndTime","shape":7,"type":"FLOAT","widget":{"name":"segment3EndTime"},"link":null},{"localized_name":"segment3Audio","name":"segment3Audio","shape":7,"type":"STRING","widget":{"name":"segment3Audio"},"link":null},{"localized_name":"useSegment3AudioCrop","name":"useSegment3AudioCrop","shape":7,"type":"BOOLEAN","widget":{"name":"useSegment3AudioCrop"},"link":null},{"localized_name":"segment3AudioStartTime","name":"segment3AudioStartTime","shape":7,"type":"FLOAT","widget":{"name":"segment3AudioStartTime"},"link":null},{"localized_name":"segment3AudioEndTime","name":"segment3AudioEndTime","shape":7,"type":"FLOAT","widget":{"name":"segment3AudioEndTime"},"link":null},{"localized_name":"useSegment4","name":"useSegment4","shape":7,"type":"BOOLEAN","widget":{"name":"useSegment4"},"link":null},{"localized_name":"segment4StartTime","name":"segment4StartTime","shape":7,"type":"FLOAT","widget":{"name":"segment4StartTime"},"link":null},{"localized_name":"segment4EndTime","name":"segment4EndTime","shape":7,"type":"FLOAT","widget":{"name":"segment4EndTime"},"link":null},{"localized_name":"segment4Audio","name":"segment4Audio","shape":7,"type":"STRING","widget":{"name":"segment4Audio"},"link":null},{"localized_name":"useSegment4AudioCrop","name":"useSegment4AudioCrop","shape":7,"type":"BOOLEAN","widget":{"name":"useSegment4AudioCrop"},"link":null},{"localized_name":"segment4AudioStartTime","name":"segment4AudioStartTime","shape":7,"type":"FLOAT","widget":{"name":"segment4AudioStartTime"},"link":null},{"localized_name":"segment4AudioEndTime","name":"segment4AudioEndTime","shape":7,"type":"FLOAT","widget":{"name":"segment4AudioEndTime"},"link":null}],"outputs":[{"localized_name":"segments","name":"segments","type":"RUNWAREVIDEOINFERENCESETTINGSSEGMENTS","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Settings Segments"},"widgets_values":[true,1.0000000000000002,299.00000000000006,"",true,1.0000000000000002,5.000000000000001,false,0,1,"",false,0,0,false,0,1,"",false,0,0,false,0,1,"",false,0,0],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Video Inference Settings Active Speaker Detection","pos":[-251.02682495117188,-325.4585266113281],"size":[473.1900329589844,202],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"boundingBoxes","name":"boundingBoxes","shape":7,"type":"RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES","link":null},{"localized_name":"useAutoDetect","name":"useAutoDetect","shape":7,"type":"BOOLEAN","widget":{"name":"useAutoDetect"},"link":null},{"localized_name":"autoDetect","name":"autoDetect","shape":7,"type":"BOOLEAN","widget":{"name":"autoDetect"},"link":null},{"localized_name":"useFrameNumber","name":"useFrameNumber","shape":7,"type":"BOOLEAN","widget":{"name":"useFrameNumber"},"link":null},{"localized_name":"frameNumber","name":"frameNumber","shape":7,"type":"INT","widget":{"name":"frameNumber"},"link":null},{"localized_name":"useCoordinates","name":"useCoordinates","shape":7,"type":"BOOLEAN","widget":{"name":"useCoordinates"},"link":null},{"localized_name":"coordinateX","name":"coordinateX","shape":7,"type":"FLOAT","widget":{"name":"coordinateX"},"link":null},{"localized_name":"coordinateY","name":"coordinateY","shape":7,"type":"FLOAT","widget":{"name":"coordinateY"},"link":null}],"outputs":[{"localized_name":"activeSpeakerDetection","name":"activeSpeakerDetection","type":"RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION","links":[3]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Settings Active Speaker Detection"},"widgets_values":[false,true,true,100000,true,512.0000000000001,512.0000000000001],"bgcolor":"#5345bf"}],"links":[[1,2,0,1,0,"RUNWAREVIDEOMODEL"],[2,1,0,3,0,"VIDEO"],[3,5,0,4,1,"RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION"],[4,6,0,4,2,"RUNWAREVIDEOINFERENCESETTINGSSEGMENTS"],[5,8,0,7,0,"VIDEO,AUDIO"],[6,7,0,6,3,"STRING"],[7,9,0,10,0,"VIDEO,AUDIO"],[8,10,0,11,13,"STRING"],[9,11,0,1,7,"RUNWAREVIDEOINFERENCEINPUTS"],[10,4,0,1,11,"RUNWAREVIDEOSETTINGS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6057126191083312,"offset":[510.9002825796665,420.42373777780114]}},"version":0.4} \ No newline at end of file