From 0e8211c8ba34ab7303b11f6140e3ea4575dad5b8 Mon Sep 17 00:00:00 2001 From: SayanoAI <28544690+SayanoAI@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:46:25 -0400 Subject: [PATCH] added youtube downloader node --- __init__.py | 6 +- custom_nodes/loaders.py | 69 +- custom_nodes/rvc.py | 12 +- custom_nodes/utils.py | 10 +- custom_nodes/uvr.py | 74 +- examples/advanced-ai-voice-changer.json | 918 ++++++++++++ examples/complete-ai-voice-changer.json | 1785 ++++++++++++++++------- examples/simple-ai-voice-changer.json | 451 +++--- lib/audio.py | 4 +- requirements.txt | 3 +- web/js/ui_handlers.js | 3 + 11 files changed, 2540 insertions(+), 795 deletions(-) create mode 100644 examples/advanced-ai-voice-changer.json diff --git a/__init__.py b/__init__.py index 6f9e5f8..bea6778 100644 --- a/__init__.py +++ b/__init__.py @@ -1,7 +1,7 @@ from .custom_nodes.stt import AudioTranscriptionNode from .custom_nodes.uvr import UVR5Node from .custom_nodes.rvc import RVCNode -from .custom_nodes.loaders import LoadAudio, LoadWhisperModelNode, LoadRVCModelNode, LoadHubertModel, LoadPitchExtractionParams +from .custom_nodes.loaders import DownloadAudio, LoadAudio, LoadWhisperModelNode, LoadRVCModelNode, LoadHubertModel, LoadPitchExtractionParams from .custom_nodes.output import PreviewAudio from .custom_nodes.utils import AudioBatchValueNode, MergeImageBatches, MergeLatentBatches, ImageRepeatInterleavedNode, LatentRepeatInterleavedNode, MergeAudioNode @@ -25,13 +25,15 @@ NODE_CLASS_MAPPINGS = { "MergeImageBatches": MergeImageBatches, "MergeLatentBatches": MergeLatentBatches, "ImageRepeatInterleavedNode": ImageRepeatInterleavedNode, - "LatentRepeatInterleavedNode": LatentRepeatInterleavedNode + "LatentRepeatInterleavedNode": LatentRepeatInterleavedNode, + "DownloadAudio": DownloadAudio } # A dictionary that contains the friendly/humanly readable titles for the nodes NODE_DISPLAY_NAME_MAPPINGS = { "UVR5Node": "🌺Vocal Removal", "LoadAudio": "🌺Load Audio", + "DownloadAudio": "🌺Youtube Downloader", "PreviewAudio": "🌺Preview Audio", "AudioTranscriptionNode": "🌺Transcribe Audio", "LoadWhisperModelNode": "🌺Load Whisper Model", diff --git a/custom_nodes/loaders.py b/custom_nodes/loaders.py index 5c488f7..1cdf343 100644 --- a/custom_nodes/loaders.py +++ b/custom_nodes/loaders.py @@ -1,7 +1,8 @@ +from io import BytesIO import os import subprocess import sys - +from pytube import YouTube from .settings import PITCH_EXTRACTION_OPTIONS from ..lib import BASE_MODELS_DIR from ..lib.model_utils import load_hubert @@ -11,12 +12,13 @@ import torch import folder_paths from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline from ..vc_infer_pipeline import get_vc -from .settings.downloader import RVC_DOWNLOAD_LINK, RVC_MODELS, download_file -from ..lib.audio import SUPPORTED_AUDIO, audio_to_bytes, load_input_audio +from .settings.downloader import RVC_DOWNLOAD_LINK, RVC_MODELS, download_file, slugify_filepath +from ..lib.audio import SUPPORTED_AUDIO, audio_to_bytes, bytes_to_audio, load_input_audio, save_input_audio from ..config import config input_path = folder_paths.get_input_directory() temp_path = folder_paths.get_temp_directory() +CATEGORY = "🌺RVC-Studio/loaders" model_ids = [ 'openai/whisper-large-v3', @@ -75,7 +77,7 @@ class LoadPitchExtractionParams: RETURN_TYPES = ('PITCH_EXTRACTION', ) RETURN_NAMES = ('pitch_extraction_params', ) - CATEGORY = "🌺RVC-Studio/loaders" + CATEGORY = CATEGORY FUNCTION = 'load_params' @@ -96,7 +98,7 @@ class LoadHubertModel: RETURN_TYPES = ('HUBERT_MODEL', ) RETURN_NAMES = ('hubert_model', ) - CATEGORY = "🌺RVC-Studio/loaders" + CATEGORY = CATEGORY FUNCTION = 'load_model' @@ -124,7 +126,7 @@ class LoadRVCModelNode: RETURN_TYPES = ('RVC_MODEL', 'STRING') RETURN_NAMES = ('model', 'model_name') - CATEGORY = "🌺RVC-Studio/loaders" + CATEGORY = CATEGORY FUNCTION = 'load_model' @@ -167,7 +169,7 @@ class LoadWhisperModelNode: RETURN_TYPES = ('TRANSCRIPTION_MODEL', ) RETURN_NAMES = ('model', ) - CATEGORY = "🌺RVC-Studio/loaders" + CATEGORY = CATEGORY FUNCTION = 'load_model' @@ -233,7 +235,7 @@ class LoadAudio: "sr": (["None",16000,44100,48000],{"default": "None"}), }} - CATEGORY = "🌺RVC-Studio/loaders" + CATEGORY = CATEGORY RETURN_TYPES = ("STRING","VHS_AUDIO") RETURN_NAMES = ("audio_name","vhs_audio") @@ -251,4 +253,53 @@ class LoadAudio: def IS_CHANGED(cls, audio): audio_path = folder_paths.get_annotated_filepath(audio) print(f"{audio_path=}") - return get_file_hash(audio_path) \ No newline at end of file + return get_file_hash(audio_path) + +class DownloadAudio: + @classmethod + def INPUT_TYPES(cls): + input_dir = input_path + files = get_filenames(root=input_dir,exts=SUPPORTED_AUDIO,format_func=os.path.basename) + + return { + "required": { + "url": ("STRING", {"default": ""}) + }, + "optional": { + "sr": (["None",16000,44100,48000],{"default": "None"}), + "song_name": ("STRING",{"default": ""},) + } + } + + CATEGORY = CATEGORY + + RETURN_TYPES = ("STRING","VHS_AUDIO") + RETURN_NAMES = ("audio_name","vhs_audio") + FUNCTION = "download_audio" + + def download_audio(self, url, sr="None", song_name=""): + + assert "youtube" in url, "Please provide a valid youtube URL!" + widgetId = get_hash(url, sr) + sr = None if sr=="None" else int(sr) + audio_name = widgetId if song_name=="" else song_name + audio_path = os.path.join(input_path,f"{audio_name}.mp3") + + if os.path.isfile(audio_path): input_audio = load_input_audio(audio_path,sr=sr) + else: + youtube_video = YouTube(url) + audio = youtube_video.streams.get_audio_only(subtype="mp4") + buffer = BytesIO() + audio.stream_to_buffer(buffer) + buffer.seek(0) + with open(audio_path,"wb") as f: + f.write(buffer.read()) + buffer.close() + input_audio = load_input_audio(audio_path,sr=sr) + del buffer, audio + + return {"ui": {"preview": [{"filename": os.path.basename(audio_path), "type": "input", "widgetId": widgetId}]}, "result": (audio_name, lambda:audio_to_bytes(*input_audio))} + + @classmethod + def IS_CHANGED(cls, url): + return get_hash(url) \ No newline at end of file diff --git a/custom_nodes/rvc.py b/custom_nodes/rvc.py index 6e0bad6..591a8a6 100644 --- a/custom_nodes/rvc.py +++ b/custom_nodes/rvc.py @@ -1,7 +1,7 @@ import os import shutil -from ..lib.audio import audio_to_bytes, bytes_to_audio, load_input_audio, save_input_audio +from ..lib.audio import SUPPORTED_AUDIO, audio_to_bytes, bytes_to_audio, load_input_audio, save_input_audio from ..vc_infer_pipeline import vc_single import folder_paths @@ -42,9 +42,7 @@ class RVCNode: }), }, "optional": { - "format":(["wav", "flac", "mp3"],{ - "default": "flac" - }), + "format":(SUPPORTED_AUDIO,{"default": "flac"}), "use_cache": ("BOOLEAN",{"default": True}) } } @@ -66,7 +64,10 @@ class RVCNode: else: input_audio = bytes_to_audio(audio()) output_audio = vc_single(hubert_model=hubert_model(),input_audio=input_audio,f0_up_key=f0_up_key,**model(),**pitch_extraction_params) - print(save_input_audio(cache_name, output_audio)) + + if use_cache: + print(save_input_audio(cache_name, output_audio)) + if os.path.isfile(cache_name): output_audio = load_input_audio(cache_name) tempdir = os.path.join(temp_path,"preview") os.makedirs(tempdir, exist_ok=True) @@ -78,7 +79,6 @@ class RVCNode: @classmethod def IS_CHANGED(cls, *args, **kwargs): - print(f"{args=} {kwargs=}") return get_hash(*args, *kwargs.items()) diff --git a/custom_nodes/utils.py b/custom_nodes/utils.py index 4dc5266..6cb525d 100644 --- a/custom_nodes/utils.py +++ b/custom_nodes/utils.py @@ -207,7 +207,6 @@ class AudioBatchValueNode: @classmethod def IS_CHANGED(cls, *args, **kwargs): - print(f"{args=} {kwargs=}") return get_hash(*args, *kwargs.items()) class ImageRepeatInterleavedNode: @@ -347,8 +346,8 @@ class MergeAudioNode: }), "merge_type": (MERGE_OPTIONS,{"default": "median"}), "normalize": ("BOOLEAN",{"default": True}), - "audio3_opt": ("VHS_AUDIO",{"default": None, "forceInput": True}), - "audio4_opt": ("VHS_AUDIO",{"default": None, "forceInput": True}), + "audio3_opt": ("VHS_AUDIO",{"default": None}), + "audio4_opt": ("VHS_AUDIO",{"default": None}), } } @@ -361,7 +360,7 @@ class MergeAudioNode: def merge(self, audio1, audio2, sr="None", merge_type="median", normalize=False, audio3_opt=None, audio4_opt=None): - audios = [audio() for audio in filter(None,[audio1, audio2, audio3_opt, audio4_opt])] + audios = [audio() for audio in [audio1, audio2, audio3_opt, audio4_opt] if audio is not None] widgetId = get_hash(*audios,sr,merge_type,normalize) audio_path = os.path.join(temp_path,"preview",f"{widgetId}.flac") @@ -374,11 +373,12 @@ class MergeAudioNode: merged_audio = merge_func(pad_audio(*[audio for (audio,_) in input_audios],axis=0),axis=0), merged_sr print(save_input_audio(audio_path,merged_audio)) del input_audios + if os.path.isfile(audio_path): merged_audio = load_input_audio(audio_path) + del audios audio_name = os.path.basename(audio_path) return {"ui": {"preview": [{"filename": audio_name, "type": "temp", "subfolder": "preview", "widgetId": widgetId}]}, "result": (lambda: audio_to_bytes(*merged_audio),)} @classmethod def IS_CHANGED(cls, *args, **kwargs): - print(f"{args=} {kwargs=}") return get_hash(*args, *kwargs.items()) \ No newline at end of file diff --git a/custom_nodes/uvr.py b/custom_nodes/uvr.py index 35d1a7a..ffb6fff 100644 --- a/custom_nodes/uvr.py +++ b/custom_nodes/uvr.py @@ -1,10 +1,9 @@ import os - +import audio_separator.separator as uvr from ..lib.audio import audio_to_bytes, bytes_to_audio, save_input_audio, load_input_audio import folder_paths -from ..lib.utils import get_filenames, get_hash, get_file_hash, get_optimal_torch_device +from ..lib.utils import get_filenames, get_hash, get_optimal_torch_device from ..lib import BASE_CACHE_DIR, BASE_MODELS_DIR, karafan -from ..uvr5_cli import Separator from .settings.downloader import KARAFAN_MODELS, MDX_MODELS, RVC_DOWNLOAD_LINK, VR_MODELS, download_file temp_path = folder_paths.get_temp_directory() @@ -45,8 +44,8 @@ class UVR5Node: } } - RETURN_TYPES = ("VHS_AUDIO","VHS_AUDIO","VHS_AUDIO") - RETURN_NAMES = ("primary_stem","secondary_stem","audio_passthrough") + RETURN_TYPES = ("VHS_AUDIO","VHS_AUDIO") + RETURN_NAMES = ("primary_stem","secondary_stem") FUNCTION = "split" @@ -64,49 +63,54 @@ class UVR5Node: input_audio = bytes_to_audio(audio()) hash_name = get_hash(audio(), model, agg, format) audio_path = os.path.join(temp_path,"uvr",f"{hash_name}.wav") - vocal_path = os.path.join(cache_dir,hash_name,f"primary.{format}") - instrumental_path = os.path.join(cache_dir,hash_name,f"secondary.{format}") - if os.path.isfile(vocal_path) and os.path.isfile(instrumental_path) and use_cache: - vocals = load_input_audio(vocal_path) - instrumental = load_input_audio(instrumental_path) + primary_path = os.path.join(cache_dir,hash_name,f"primary.{format}") + secondary_path = os.path.join(cache_dir,hash_name,f"secondary.{format}") + primary=secondary=None + + if os.path.isfile(primary_path) and os.path.isfile(secondary_path) and use_cache: + primary = load_input_audio(primary_path) + secondary = load_input_audio(secondary_path) else: if not os.path.isfile(audio_path): os.makedirs(os.path.dirname(audio_path),exist_ok=True) print(save_input_audio(audio_path,input_audio)) - vocals=instrumental=None - - try: # try original RVC implementation - model = Separator( - model_path=model_path, - device=device, - is_half="cuda" in str(device), - cache_dir=cache_dir, - agg=agg - ) - vocals, instrumental, input_audio = model.run_inference(audio_path,format=format) - except Exception as e: - print(f"Error: {e}") + + try: if "karafan" in model_path: # try karafan implementation - vocals, instrumental, input_audio = karafan.inference.Process(audio_path,cache_dir=temp_path,format=format) + primary, secondary, _ = karafan.inference.Process(audio_path,cache_dir=temp_path,format=format) else: # try python-audio-separator implementation - import audio_separator.separator as uvr model_dir = os.path.dirname(model_path) model_name = os.path.basename(model_path) vr_params={"batch_size": 4, "window_size": 512, "aggression": agg, "enable_tta": False, "enable_post_process": False, "post_process_threshold": 0.2, "high_end_process": "mirroring"} - model = uvr.Separator(model_file_dir=os.path.join(BASE_MODELS_DIR,model_dir),output_dir=temp_path,output_format=format,vr_params=vr_params) + mdx_params={"hop_length": 1024, "segment_size": 256, "overlap": 0.25, "batch_size": 4} + model = uvr.Separator(model_file_dir=os.path.join(BASE_MODELS_DIR,model_dir),output_dir=temp_path,output_format=format,vr_params=vr_params,mdx_params=mdx_params) model.load_model(model_name) output_files = model.separate(audio_path) - print(f"{output_files=}") - vocals = load_input_audio(os.path.join(temp_path,output_files[0])) - instrumental = load_input_audio(os.path.join(temp_path,output_files[1])) + primary = load_input_audio(os.path.join(temp_path,output_files[0])) + secondary = load_input_audio(os.path.join(temp_path,output_files[1])) + except Exception as e: # try RVC implementation + print(f"Error: {e}") + + from ..uvr5_cli import Separator + model = Separator( + model_path=model_path, + device=device, + is_half="cuda" in str(device), + cache_dir=cache_dir, + agg=agg + ) + primary, secondary, _ = model.run_inference(audio_path,format=format) finally: - if vocals is not None and instrumental is not None and use_cache: - print(save_input_audio(vocal_path,vocals)) - print(save_input_audio(instrumental_path,instrumental)) + if primary is not None and secondary is not None and use_cache: + print(save_input_audio(primary_path,primary)) + print(save_input_audio(secondary_path,secondary)) + + if os.path.isfile(primary_path) and os.path.isfile(secondary_path) and use_cache: + primary = load_input_audio(primary_path) + secondary = load_input_audio(secondary_path) - return (lambda:audio_to_bytes(*vocals), lambda:audio_to_bytes(*instrumental), audio) + return (lambda:audio_to_bytes(*primary), lambda:audio_to_bytes(*secondary)) @classmethod def IS_CHANGED(cls, *args, **kwargs): - print(f"{args=} {kwargs=}") - return get_hash(args,kwargs) \ No newline at end of file + return get_hash(*args,*kwargs.items()) \ No newline at end of file diff --git a/examples/advanced-ai-voice-changer.json b/examples/advanced-ai-voice-changer.json new file mode 100644 index 0000000..2b9a6bf --- /dev/null +++ b/examples/advanced-ai-voice-changer.json @@ -0,0 +1,918 @@ +{ + "last_node_id": 43, + "last_link_id": 77, + "nodes": [ + { + "id": 33, + "type": "MergeAudioNode", + "pos": [ + 1154, + -367 + ], + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "VHS_AUDIO", + "link": 54 + }, + { + "name": "audio2", + "type": "VHS_AUDIO", + "link": 60 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null + } + ], + "outputs": [ + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 63 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MergeAudioNode" + }, + "widgets_values": [ + "None", + "mean", + true, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 39, + "type": "PreviewAudio", + "pos": [ + 1514, + -358 + ], + "size": [ + 315, + 150 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 63 + }, + { + "name": "filename", + "type": "STRING", + "link": 64, + "widget": { + "name": "filename" + }, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "output_path", + "type": "STRING", + "links": null, + "shape": 3 + }, + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "PreviewAudio" + }, + "widgets_values": [ + "test", + "flac", + 2, + true, + true, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 40, + "type": "UVR5Node", + "pos": [ + -172, + -567 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 65 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": [ + 68, + 69 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "UVR/UVR-DeEcho-DeReverb.pth", + true, + 10, + "flac" + ] + }, + { + "id": 41, + "type": "UVR5Node", + "pos": [ + 269, + -736 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 68 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 70 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": [ + 72 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "UVR/HP5-vocals+instrumentals.pth", + true, + 10, + "flac" + ] + }, + { + "id": 42, + "type": "UVR5Node", + "pos": [ + 613, + -733 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 69 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 71 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": [ + 73 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "karafan/MDX23C-8KFFT-InstVoc_HQ.ckpt", + true, + 10, + "flac" + ] + }, + { + "id": 35, + "type": "MergeAudioNode", + "pos": [ + 271, + -545 + ], + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "VHS_AUDIO", + "link": 70 + }, + { + "name": "audio2", + "type": "VHS_AUDIO", + "link": 71 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null + } + ], + "outputs": [ + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 74 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MergeAudioNode" + }, + "widgets_values": [ + "None", + "min", + true, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 36, + "type": "MergeAudioNode", + "pos": [ + 608, + -544 + ], + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "VHS_AUDIO", + "link": 72 + }, + { + "name": "audio2", + "type": "VHS_AUDIO", + "link": 73 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null + } + ], + "outputs": [ + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MergeAudioNode" + }, + "widgets_values": [ + "None", + "mean", + true, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 6, + "type": "LoadPitchExtractionParams", + "pos": [ + 272, + 101 + ], + "size": { + "0": 315, + "1": 178 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "pitch_extraction_params", + "type": "PITCH_EXTRACTION", + "links": [ + 59 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadPitchExtractionParams" + }, + "widgets_values": [ + "rmvpe+", + false, + 0.75, + 0, + 0.25, + 0.25 + ] + }, + { + "id": 38, + "type": "LoadAudio", + "pos": [ + -171, + -739 + ], + "size": { + "0": 309.8900146484375, + "1": 126 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "audio_name", + "type": "STRING", + "links": [ + 77 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 65 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoadAudio" + }, + "widgets_values": [ + "grimlight-ost-1st-trailer---wish-upon-a-star.mp3", + "None", + "image" + ] + }, + { + "id": 31, + "type": "JoinStrings", + "pos": [ + 309, + -145 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": { + "collapsed": true + }, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "string1", + "type": "STRING", + "link": 76, + "widget": { + "name": "string1" + } + }, + { + "name": "string2", + "type": "STRING", + "link": 77, + "widget": { + "name": "string2" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 64 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "JoinStrings" + }, + "widgets_values": [ + "", + "", + "\\" + ] + }, + { + "id": 4, + "type": "LoadRVCModelNode", + "pos": [ + 637, + -157 + ], + "size": { + "0": 315, + "1": 78 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "model", + "type": "RVC_MODEL", + "links": [ + 57 + ], + "shape": 3 + }, + { + "name": "model_name", + "type": "STRING", + "links": [ + 76 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoadRVCModelNode" + }, + "widgets_values": [ + "RVC/Sayano.pth" + ] + }, + { + "id": 43, + "type": "UVR5Node", + "pos": [ + 278, + -99 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 74 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 75 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "UVR/HP5-vocals+instrumentals.pth", + true, + 10, + "flac" + ] + }, + { + "id": 37, + "type": "RVCNode", + "pos": [ + 639, + 61 + ], + "size": [ + 309.34271240234375, + 166 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 75 + }, + { + "name": "model", + "type": "RVC_MODEL", + "link": 57 + }, + { + "name": "hubert_model", + "type": "HUBERT_MODEL", + "link": 58 + }, + { + "name": "pitch_extraction_params", + "type": "PITCH_EXTRACTION", + "link": 59 + } + ], + "outputs": [ + { + "name": "VHS_AUDIO", + "type": "VHS_AUDIO", + "links": [ + 60 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "RVCNode" + }, + "widgets_values": [ + 0, + "flac", + true, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 5, + "type": "LoadHubertModel", + "pos": [ + 642, + -34 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "hubert_model", + "type": "HUBERT_MODEL", + "links": [ + 58 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadHubertModel" + }, + "widgets_values": [ + "hubert_base.pt" + ] + } + ], + "links": [ + [ + 54, + 36, + 0, + 33, + 0, + "VHS_AUDIO" + ], + [ + 57, + 4, + 0, + 37, + 1, + "RVC_MODEL" + ], + [ + 58, + 5, + 0, + 37, + 2, + "HUBERT_MODEL" + ], + [ + 59, + 6, + 0, + 37, + 3, + "PITCH_EXTRACTION" + ], + [ + 60, + 37, + 0, + 33, + 1, + "VHS_AUDIO" + ], + [ + 63, + 33, + 0, + 39, + 0, + "VHS_AUDIO" + ], + [ + 64, + 31, + 0, + 39, + 1, + "STRING" + ], + [ + 65, + 38, + 1, + 40, + 0, + "VHS_AUDIO" + ], + [ + 68, + 40, + 1, + 41, + 0, + "VHS_AUDIO" + ], + [ + 69, + 40, + 1, + 42, + 0, + "VHS_AUDIO" + ], + [ + 70, + 41, + 0, + 35, + 0, + "VHS_AUDIO" + ], + [ + 71, + 42, + 0, + 35, + 1, + "VHS_AUDIO" + ], + [ + 72, + 41, + 1, + 36, + 0, + "VHS_AUDIO" + ], + [ + 73, + 42, + 1, + 36, + 1, + "VHS_AUDIO" + ], + [ + 74, + 35, + 0, + 43, + 0, + "VHS_AUDIO" + ], + [ + 75, + 43, + 0, + 37, + 0, + "VHS_AUDIO" + ], + [ + 76, + 4, + 1, + 31, + 0, + "STRING" + ], + [ + 77, + 38, + 0, + 31, + 1, + "STRING" + ] + ], + "groups": [ + { + "title": "Preprocess", + "bounding": [ + -182, + -813, + 335, + 406 + ], + "color": "#3f789e", + "font_size": 24 + }, + { + "title": "Ensemble Vocal Separation", + "bounding": [ + 259, + -810, + 677, + 472 + ], + "color": "#3f789e", + "font_size": 24 + }, + { + "title": "Postprocess", + "bounding": [ + 262, + -236, + 712, + 529 + ], + "color": "#3f789e", + "font_size": 24 + }, + { + "title": "Output Audio", + "bounding": [ + 1144, + -441, + 698, + 255 + ], + "color": "#3f789e", + "font_size": 24 + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.6830134553650705, + "offset": [ + 417.8530750478458, + 895.7208507202507 + ] + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/examples/complete-ai-voice-changer.json b/examples/complete-ai-voice-changer.json index fa9649d..e11185c 100644 --- a/examples/complete-ai-voice-changer.json +++ b/examples/complete-ai-voice-changer.json @@ -1,338 +1,80 @@ { - "last_node_id": 39, - "last_link_id": 64, + "last_node_id": 50, + "last_link_id": 159, "nodes": [ { - "id": 7, - "type": "UVR5Node", + "id": 31, + "type": "JoinStrings", "pos": [ - 269, - -736 + 1394, + -786 ], "size": { "0": 315, - "1": 170 + "1": 106 + }, + "flags": { + "collapsed": true }, - "flags": {}, "order": 6, "mode": 0, "inputs": [ { - "name": "audio", - "type": "VHS_AUDIO", - "link": 20 + "name": "string1", + "type": "STRING", + "link": 66, + "widget": { + "name": "string1" + } + }, + { + "name": "string2", + "type": "STRING", + "link": 138, + "widget": { + "name": "string2" + } } ], "outputs": [ { - "name": "primary_stem", - "type": "VHS_AUDIO", + "name": "STRING", + "type": "STRING", "links": [ - 49 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "secondary_stem", - "type": "VHS_AUDIO", - "links": [ - 51 - ], - "shape": 3, - "slot_index": 1 - }, - { - "name": "audio_passthrough", - "type": "VHS_AUDIO", - "links": null, - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "UVR5Node" - }, - "widgets_values": [ - "karafan/MDX23C-8KFFT-InstVoc_HQ.ckpt", - 10, - "flac", - true - ] - }, - { - "id": 14, - "type": "UVR5Node", - "pos": [ - 277, - -505 - ], - "size": { - "0": 315, - "1": 170 - }, - "flags": {}, - "order": 7, - "mode": 0, - "inputs": [ - { - "name": "audio", - "type": "VHS_AUDIO", - "link": 24 - } - ], - "outputs": [ - { - "name": "primary_stem", - "type": "VHS_AUDIO", - "links": [ - 50 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "secondary_stem", - "type": "VHS_AUDIO", - "links": [ - 52 - ], - "shape": 3, - "slot_index": 1 - }, - { - "name": "audio_passthrough", - "type": "VHS_AUDIO", - "links": null, - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "UVR5Node" - }, - "widgets_values": [ - "UVR/HP5-vocals+instrumentals.pth", - 10, - "flac", - true - ] - }, - { - "id": 17, - "type": "UVR5Node", - "pos": [ - 272.40658221699283, - -161.99581170557863 - ], - "size": { - "0": 315, - "1": 170 - }, - "flags": {}, - "order": 10, - "mode": 0, - "inputs": [ - { - "name": "audio", - "type": "VHS_AUDIO", - "link": 53 - } - ], - "outputs": [ - { - "name": "primary_stem", - "type": "VHS_AUDIO", - "links": [ - 56 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "secondary_stem", - "type": "VHS_AUDIO", - "links": [], - "shape": 3, - "slot_index": 1 - }, - { - "name": "audio_passthrough", - "type": "VHS_AUDIO", - "links": null, - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "UVR5Node" - }, - "widgets_values": [ - "UVR/5_HP-Karaoke-UVR.pth", - 10, - "flac", - true - ] - }, - { - "id": 6, - "type": "LoadPitchExtractionParams", - "pos": [ - 288, - 105 - ], - "size": { - "0": 315, - "1": 178 - }, - "flags": {}, - "order": 0, - "mode": 0, - "outputs": [ - { - "name": "pitch_extraction_params", - "type": "PITCH_EXTRACTION", - "links": [ - 59 - ], - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "LoadPitchExtractionParams" - }, - "widgets_values": [ - "rmvpe+", - false, - 0.75, - 0, - 0.25, - 0.25 - ] - }, - { - "id": 35, - "type": "MergeAudioNode", - "pos": [ - 666, - -728 - ], - "size": [ - 315, - 126 - ], - "flags": {}, - "order": 8, - "mode": 0, - "inputs": [ - { - "name": "audio1", - "type": "VHS_AUDIO", - "link": 49 - }, - { - "name": "audio2", - "type": "VHS_AUDIO", - "link": 50 - } - ], - "outputs": [ - { - "name": "vhs_audio", - "type": "VHS_AUDIO", - "links": [ - 53 + 64 ], "shape": 3, "slot_index": 0 } ], "properties": { - "Node name for S&R": "MergeAudioNode" + "Node name for S&R": "JoinStrings" }, "widgets_values": [ - "None", - "min", - true, - { - "hidden": false, - "paused": false, - "params": {} - }, - { - "hidden": false, - "paused": false, - "params": {} - } - ] - }, - { - "id": 36, - "type": "MergeAudioNode", - "pos": [ - 676, - -528 - ], - "size": [ - 315, - 126 - ], - "flags": {}, - "order": 9, - "mode": 0, - "inputs": [ - { - "name": "audio1", - "type": "VHS_AUDIO", - "link": 51 - }, - { - "name": "audio2", - "type": "VHS_AUDIO", - "link": 52 - } - ], - "outputs": [ - { - "name": "vhs_audio", - "type": "VHS_AUDIO", - "links": [ - 54 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "MergeAudioNode" - }, - "widgets_values": [ - "None", - "mean", - true, - { - "hidden": false, - "paused": false, - "params": {} - } + "", + "", + "\\" ] }, { "id": 37, "type": "RVCNode", "pos": [ - 643, - 5 + 1300, + -248 ], "size": [ 309.34271240234375, 166 ], "flags": {}, - "order": 11, + "order": 17, "mode": 0, "inputs": [ { "name": "audio", "type": "VHS_AUDIO", - "link": 56 + "link": 135 }, { "name": "model", @@ -368,6 +110,41 @@ 0, "flac", true, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, { "hidden": false, "paused": false, @@ -376,18 +153,216 @@ ] }, { - "id": 33, - "type": "MergeAudioNode", + "id": 49, + "type": "DownloadAudio", "pos": [ - 1154, - -367 + -538, + -794 ], "size": [ 315, 126 ], "flags": {}, - "order": 12, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "audio_name", + "type": "STRING", + "links": [ + 138 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 136, + 137 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "DownloadAudio" + }, + "widgets_values": [ + "https://www.youtube.com/watch?v=DSnJ76vPi_8", + "None", + "Monologue of Three", + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 5, + "type": "LoadHubertModel", + "pos": [ + 1010, + -145 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": { + "collapsed": true + }, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "hubert_model", + "type": "HUBERT_MODEL", + "links": [ + 58 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadHubertModel" + }, + "widgets_values": [ + "hubert_base.pt" + ] + }, + { + "id": 6, + "type": "LoadPitchExtractionParams", + "pos": [ + 1297, + -467 + ], + "size": { + "0": 315, + "1": 178 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "pitch_extraction_params", + "type": "PITCH_EXTRACTION", + "links": [ + 59 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadPitchExtractionParams" + }, + "widgets_values": [ + "rmvpe+", + false, + 0.75, + 0, + 0.25, + 0.25 + ] + }, + { + "id": 4, + "type": "LoadRVCModelNode", + "pos": [ + 953, + -97 + ], + "size": { + "0": 315, + "1": 78 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "model", + "type": "RVC_MODEL", + "links": [ + 57 + ], + "shape": 3 + }, + { + "name": "model_name", + "type": "STRING", + "links": [ + 66 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoadRVCModelNode" + }, + "widgets_values": [ + "RVC/Sayano.pth" + ] + }, + { + "id": 33, + "type": "MergeAudioNode", + "pos": [ + 1702, + -801 + ], + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 18, "mode": 0, "inputs": [ { @@ -399,6 +374,16 @@ "name": "audio2", "type": "VHS_AUDIO", "link": 60 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null } ], "outputs": [ @@ -417,8 +402,38 @@ }, "widgets_values": [ "None", - "mean", - true, + "median", + false, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, { "hidden": false, "paused": false, @@ -426,73 +441,19 @@ } ] }, - { - "id": 31, - "type": "JoinStrings", - "pos": [ - 726, - 241 - ], - "size": { - "0": 315, - "1": 106 - }, - "flags": { - "collapsed": true - }, - "order": 4, - "mode": 0, - "inputs": [ - { - "name": "string1", - "type": "STRING", - "link": 62, - "widget": { - "name": "string1" - } - }, - { - "name": "string2", - "type": "STRING", - "link": 40, - "widget": { - "name": "string2" - } - } - ], - "outputs": [ - { - "name": "STRING", - "type": "STRING", - "links": [ - 64 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "JoinStrings" - }, - "widgets_values": [ - "", - "", - "\\" - ] - }, { "id": 39, "type": "PreviewAudio", "pos": [ - 1514, - -358 + 2056, + -794 ], "size": [ 315, 150 ], "flags": {}, - "order": 13, + "order": 19, "mode": 0, "inputs": [ { @@ -533,6 +494,36 @@ 2, true, true, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, { "hidden": false, "paused": false, @@ -541,11 +532,11 @@ ] }, { - "id": 11, + "id": 44, "type": "UVR5Node", "pos": [ - -172, - -567 + -543, + -582 ], "size": { "0": 315, @@ -558,7 +549,7 @@ { "name": "audio", "type": "VHS_AUDIO", - "link": 61 + "link": 137 } ], "outputs": [ @@ -566,6 +557,154 @@ "name": "primary_stem", "type": "VHS_AUDIO", "links": null, + "shape": 3 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": [ + 97 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "audio_passthrough", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "UVR/UVR-BVE-4B_SN-44100-1.pth", + true, + 10, + "flac" + ] + }, + { + "id": 36, + "type": "MergeAudioNode", + "pos": [ + 527, + -795 + ], + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "VHS_AUDIO", + "link": 158 + }, + { + "name": "audio2", + "type": "VHS_AUDIO", + "link": 156 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": 108 + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null + } + ], + "outputs": [ + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "🌺Merge Instrumental", + "properties": { + "Node name for S&R": "MergeAudioNode" + }, + "widgets_values": [ + "None", + "median", + true, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 14, + "type": "UVR5Node", + "pos": [ + 179, + -579 + ], + "size": { + "0": 315, + "1": 170 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 99 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 156 + ], "shape": 3, "slot_index": 0 }, @@ -573,8 +712,7 @@ "name": "secondary_stem", "type": "VHS_AUDIO", "links": [ - 20, - 24 + 157 ], "shape": 3, "slot_index": 1 @@ -589,195 +727,652 @@ "properties": { "Node name for S&R": "UVR5Node" }, + "widgets_values": [ + "karafan/MDX23C-8KFFT-InstVoc_HQ.ckpt", + 10, + 10, + "flac" + ] + }, + { + "id": 47, + "type": "UVR5Node", + "pos": [ + 180, + -353 + ], + "size": { + "0": 315, + "1": 170 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 106 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 141 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": [ + 108 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "audio_passthrough", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "UVR/HP5-vocals+instrumentals.pth", + true, + 10, + "flac" + ] + }, + { + "id": 7, + "type": "UVR5Node", + "pos": [ + 173, + -800 + ], + "size": { + "0": 315, + "1": 170 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 98 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 158 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": [ + 159 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "audio_passthrough", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "UVR/model_bs_roformer_ep_317_sdr_12.9755.ckpt", + 10, + 10, + "flac" + ] + }, + { + "id": 43, + "type": "MergeAudioNode", + "pos": [ + -209, + -583 + ], + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "VHS_AUDIO", + "link": 153 + }, + { + "name": "audio2", + "type": "VHS_AUDIO", + "link": 97 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null + } + ], + "outputs": [ + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 98, + 99, + 106 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MergeAudioNode" + }, + "widgets_values": [ + "None", + "median", + true, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 11, + "type": "UVR5Node", + "pos": [ + -208, + -796 + ], + "size": { + "0": 315, + "1": 170 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 136 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 153 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": [], + "shape": 3, + "slot_index": 1 + }, + { + "name": "audio_passthrough", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, "widgets_values": [ "UVR/UVR-DeEcho-DeReverb.pth", 10, - "flac", - true + 10, + "flac" ] }, { - "id": 5, - "type": "LoadHubertModel", + "id": 50, + "type": "MergeAudioNode", "pos": [ - 306, - 51 + 531, + -478 ], - "size": { - "0": 315, - "1": 58 - }, - "flags": { - "collapsed": true - }, - "order": 1, + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 11, "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "VHS_AUDIO", + "link": 159 + }, + { + "name": "audio2", + "type": "VHS_AUDIO", + "link": 157 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": 141 + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null + } + ], "outputs": [ { - "name": "hubert_model", - "type": "HUBERT_MODEL", + "name": "vhs_audio", + "type": "VHS_AUDIO", "links": [ - 58 + 142 ], - "shape": 3 + "shape": 3, + "slot_index": 0 + } + ], + "title": "🌺Merge Vocals", + "properties": { + "Node name for S&R": "MergeAudioNode" + }, + "widgets_values": [ + "None", + "min", + true, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 46, + "type": "MergeAudioNode", + "pos": [ + 1296, + -735 + ], + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "VHS_AUDIO", + "link": 152 + }, + { + "name": "audio2", + "type": "VHS_AUDIO", + "link": 151 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": null, + "slot_index": 2 + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null + } + ], + "outputs": [ + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 135 + ], + "shape": 3, + "slot_index": 0 } ], "properties": { - "Node name for S&R": "LoadHubertModel" + "Node name for S&R": "MergeAudioNode" }, "widgets_values": [ - "hubert_base.pt" + "None", + "median", + true, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + }, + { + "hidden": false, + "paused": false, + "params": {} + } ] }, { - "id": 4, - "type": "LoadRVCModelNode", + "id": 17, + "type": "UVR5Node", "pos": [ - 649, - -136 + 950, + -581 ], "size": { "0": 315, - "1": 78 + "1": 170 }, "flags": {}, - "order": 2, + "order": 14, "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 148 + } + ], "outputs": [ { - "name": "model", - "type": "RVC_MODEL", - "links": [ - 57 - ], - "shape": 3 + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [], + "shape": 3, + "slot_index": 0 }, { - "name": "model_name", - "type": "STRING", + "name": "secondary_stem", + "type": "VHS_AUDIO", "links": [ - 40 + 152 ], "shape": 3, "slot_index": 1 + }, + { + "name": "audio_passthrough", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 } ], "properties": { - "Node name for S&R": "LoadRVCModelNode" + "Node name for S&R": "UVR5Node" }, "widgets_values": [ - "RVC/Sayano.pth" + "UVR/5_HP-Karaoke-UVR.pth", + 10, + 10, + "flac" ] }, { - "id": 38, - "type": "LoadAudio", + "id": 40, + "type": "UVR5Node", "pos": [ - -171, - -739 + 955, + -370 ], "size": { - "0": 309.8900146484375, - "1": 126 + "0": 315, + "1": 170 }, "flags": {}, - "order": 3, + "order": 15, "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 149 + } + ], "outputs": [ { - "name": "audio_name", - "type": "STRING", + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", "links": [ - 62 + 151 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "audio_passthrough", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "UVR/6_HP-Karaoke-UVR.pth", + true, + 10, + "flac" + ] + }, + { + "id": 45, + "type": "UVR5Node", + "pos": [ + 955, + -794 + ], + "size": { + "0": 315, + "1": 170 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 142 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 148, + 149 ], "shape": 3, "slot_index": 0 }, { - "name": "vhs_audio", + "name": "secondary_stem", "type": "VHS_AUDIO", - "links": [ - 61 - ], + "links": [], "shape": 3, "slot_index": 1 + }, + { + "name": "audio_passthrough", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 } ], "properties": { - "Node name for S&R": "LoadAudio" + "Node name for S&R": "UVR5Node" }, "widgets_values": [ - "Moonlight Shadow.mp3", - "None", - "image" + "UVR/UVR-DeEcho-DeReverb.pth", + true, + 10, + "flac" ] } ], "links": [ - [ - 20, - 11, - 1, - 7, - 0, - "VHS_AUDIO" - ], - [ - 24, - 11, - 1, - 14, - 0, - "VHS_AUDIO" - ], - [ - 40, - 4, - 1, - 31, - 1, - "STRING" - ], - [ - 49, - 7, - 0, - 35, - 0, - "VHS_AUDIO" - ], - [ - 50, - 14, - 0, - 35, - 1, - "VHS_AUDIO" - ], - [ - 51, - 7, - 1, - 36, - 0, - "VHS_AUDIO" - ], - [ - 52, - 14, - 1, - 36, - 1, - "VHS_AUDIO" - ], - [ - 53, - 35, - 0, - 17, - 0, - "VHS_AUDIO" - ], [ 54, 36, @@ -786,14 +1381,6 @@ 0, "VHS_AUDIO" ], - [ - 56, - 17, - 0, - 37, - 0, - "VHS_AUDIO" - ], [ 57, 4, @@ -826,22 +1413,6 @@ 1, "VHS_AUDIO" ], - [ - 61, - 38, - 1, - 11, - 0, - "VHS_AUDIO" - ], - [ - 62, - 38, - 0, - 31, - 0, - "STRING" - ], [ 63, 33, @@ -857,16 +1428,184 @@ 39, 1, "STRING" + ], + [ + 66, + 4, + 1, + 31, + 0, + "STRING" + ], + [ + 97, + 44, + 1, + 43, + 1, + "VHS_AUDIO" + ], + [ + 98, + 43, + 0, + 7, + 0, + "VHS_AUDIO" + ], + [ + 99, + 43, + 0, + 14, + 0, + "VHS_AUDIO" + ], + [ + 106, + 43, + 0, + 47, + 0, + "VHS_AUDIO" + ], + [ + 108, + 47, + 1, + 36, + 2, + "VHS_AUDIO" + ], + [ + 135, + 46, + 0, + 37, + 0, + "VHS_AUDIO" + ], + [ + 136, + 49, + 1, + 11, + 0, + "VHS_AUDIO" + ], + [ + 137, + 49, + 1, + 44, + 0, + "VHS_AUDIO" + ], + [ + 138, + 49, + 0, + 31, + 1, + "STRING" + ], + [ + 141, + 47, + 0, + 50, + 2, + "VHS_AUDIO" + ], + [ + 142, + 50, + 0, + 45, + 0, + "VHS_AUDIO" + ], + [ + 148, + 45, + 0, + 17, + 0, + "VHS_AUDIO" + ], + [ + 149, + 45, + 0, + 40, + 0, + "VHS_AUDIO" + ], + [ + 151, + 40, + 1, + 46, + 1, + "VHS_AUDIO" + ], + [ + 152, + 17, + 1, + 46, + 0, + "VHS_AUDIO" + ], + [ + 153, + 11, + 0, + 43, + 0, + "VHS_AUDIO" + ], + [ + 156, + 14, + 0, + 36, + 1, + "VHS_AUDIO" + ], + [ + 157, + 14, + 1, + 50, + 1, + "VHS_AUDIO" + ], + [ + 158, + 7, + 0, + 36, + 0, + "VHS_AUDIO" + ], + [ + 159, + 7, + 1, + 50, + 0, + "VHS_AUDIO" ] ], "groups": [ { "title": "Preprocess", "bounding": [ - -181, - -813, - 336, - 507 + -557, + -873, + 674, + 471 ], "color": "#3f789e", "font_size": 24 @@ -874,10 +1613,10 @@ { "title": "Ensemble Vocal Separation", "bounding": [ - 259, - -810, - 742, - 485 + 163, + -874, + 694, + 701 ], "color": "#3f789e", "font_size": 24 @@ -885,10 +1624,10 @@ { "title": "Postprocess", "bounding": [ - 262, - -236, - 712, - 529 + 940, + -867, + 694, + 860 ], "color": "#3f789e", "font_size": 24 @@ -896,8 +1635,8 @@ { "title": "Output Audio", "bounding": [ - 1144, - -441, + 1690, + -872, 698, 255 ], @@ -908,10 +1647,10 @@ "config": {}, "extra": { "ds": { - "scale": 1, + "scale": 0.6830134553650706, "offset": [ - -539.1537258753115, - 591.250653392065 + -663.7036134395787, + 1119.9858379127336 ] } }, diff --git a/examples/simple-ai-voice-changer.json b/examples/simple-ai-voice-changer.json index 9eb4745..2fc4cf6 100644 --- a/examples/simple-ai-voice-changer.json +++ b/examples/simple-ai-voice-changer.json @@ -1,44 +1,49 @@ { - "last_node_id": 8, - "last_link_id": 11, + "last_node_id": 9, + "last_link_id": 15, "nodes": [ { - "id": 4, - "type": "LoadRVCModelNode", + "id": 6, + "type": "LoadPitchExtractionParams", "pos": [ - 237, - -56 + 252, + -72 ], "size": { "0": 315, - "1": 58 + "1": 178 }, "flags": {}, "order": 0, "mode": 0, "outputs": [ { - "name": "model", - "type": "RVC_MODEL", + "name": "pitch_extraction_params", + "type": "PITCH_EXTRACTION", "links": [ - 3 + 5 ], "shape": 3 } ], "properties": { - "Node name for S&R": "LoadRVCModelNode" + "Node name for S&R": "LoadPitchExtractionParams" }, "widgets_values": [ - "RVC/Sayano.pth" + "rmvpe", + false, + 0.75, + 0, + 0.25, + 0.25 ] }, { "id": 5, "type": "LoadHubertModel", "pos": [ - 599, - -54 + 627, + 12 ], "size": { "0": 315, @@ -65,149 +70,48 @@ ] }, { - "id": 6, - "type": "LoadPitchExtractionParams", + "id": 4, + "type": "LoadRVCModelNode", "pos": [ - 953, - -50 + 631, + -114 ], "size": { "0": 315, - "1": 178 + "1": 78 }, "flags": {}, "order": 2, "mode": 0, "outputs": [ { - "name": "pitch_extraction_params", - "type": "PITCH_EXTRACTION", + "name": "model", + "type": "RVC_MODEL", "links": [ - 5 - ], - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "LoadPitchExtractionParams" - }, - "widgets_values": [ - "rmvpe", - false, - 0.75, - 0, - 0.25, - 0.25 - ] - }, - { - "id": 7, - "type": "UVR5Node", - "pos": [ - 581, - 71 - ], - "size": { - "0": 315, - "1": 170 - }, - "flags": {}, - "order": 4, - "mode": 0, - "inputs": [ - { - "name": "audio", - "type": "VHS_AUDIO", - "link": 6 - } - ], - "outputs": [ - { - "name": "primary_stem", - "type": "VHS_AUDIO", - "links": [ - 7 + 3 ], "shape": 3 }, { - "name": "secondary_stem", - "type": "VHS_AUDIO", - "links": [ - 8 - ], - "shape": 3, - "slot_index": 1 - }, - { - "name": "audio_passthrough", - "type": "VHS_AUDIO", + "name": "model_name", + "type": "STRING", "links": null, "shape": 3 } ], "properties": { - "Node name for S&R": "UVR5Node" + "Node name for S&R": "LoadRVCModelNode" }, "widgets_values": [ - "UVR/HP5-vocals+instrumentals.pth", - 10, - "flac", - true - ] - }, - { - "id": 8, - "type": "MergeAudioNode", - "pos": [ - 196, - 311 - ], - "size": { - "0": 315, - "1": 126 - }, - "flags": {}, - "order": 6, - "mode": 0, - "inputs": [ - { - "name": "audio1", - "type": "VHS_AUDIO", - "link": 8 - }, - { - "name": "audio2", - "type": "VHS_AUDIO", - "link": 9 - } - ], - "outputs": [ - { - "name": "vhs_audio", - "type": "VHS_AUDIO", - "links": [ - 10 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "MergeAudioNode" - }, - "widgets_values": [ - "None", - "mean", - true + "RVC/Sayano.pth" ] }, { "id": 3, "type": "PreviewAudio", "pos": [ - 584, - 294 + 1347, + 132 ], "size": [ 315, @@ -252,48 +156,8 @@ "test", "flac", 1, - true - ] - }, - { - "id": 2, - "type": "LoadAudio", - "pos": [ - 223, - 52 - ], - "size": [ - 315, - 102 - ], - "flags": {}, - "order": 3, - "mode": 0, - "outputs": [ - { - "name": "audio_name", - "type": "STRING", - "links": [ - 11 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "vhs_audio", - "type": "VHS_AUDIO", - "links": [ - 6 - ], - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "LoadAudio" - }, - "widgets_values": [ - "already-enough.mp3", - "None", + true, + true, { "hidden": false, "paused": false, @@ -305,12 +169,12 @@ "id": 1, "type": "RVCNode", "pos": [ - 947, - 193 + 621, + 122 ], "size": [ - 313.7279268096661, - 181.78793221310661 + 313.7279357910156, + 166 ], "flags": {}, "order": 5, @@ -319,7 +183,7 @@ { "name": "audio", "type": "VHS_AUDIO", - "link": 7, + "link": 14, "slot_index": 0 }, { @@ -346,7 +210,7 @@ "name": "VHS_AUDIO", "type": "VHS_AUDIO", "links": [ - 9 + 15 ], "shape": 3, "slot_index": 0 @@ -358,7 +222,170 @@ "widgets_values": [ 0, "flac", - true + true, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 9, + "type": "UVR5Node", + "pos": [ + 243, + 157 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "VHS_AUDIO", + "link": 12 + } + ], + "outputs": [ + { + "name": "primary_stem", + "type": "VHS_AUDIO", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "secondary_stem", + "type": "VHS_AUDIO", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "UVR5Node" + }, + "widgets_values": [ + "UVR/HP5-vocals+instrumentals.pth", + true, + 10, + "flac" + ] + }, + { + "id": 8, + "type": "MergeAudioNode", + "pos": [ + 981, + 128 + ], + "size": [ + 315, + 166 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "VHS_AUDIO", + "link": 15 + }, + { + "name": "audio2", + "type": "VHS_AUDIO", + "link": 13 + }, + { + "name": "audio3_opt", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "audio4_opt", + "type": "VHS_AUDIO", + "link": null + } + ], + "outputs": [ + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 10 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MergeAudioNode" + }, + "widgets_values": [ + "None", + "mean", + true, + { + "hidden": false, + "paused": false, + "params": {} + } + ] + }, + { + "id": 2, + "type": "LoadAudio", + "pos": [ + -106, + 162 + ], + "size": { + "0": 315, + "1": 126 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "audio_name", + "type": "STRING", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "vhs_audio", + "type": "VHS_AUDIO", + "links": [ + 12 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadAudio" + }, + "widgets_values": [ + "grimlight-ost-1st-trailer---wish-upon-a-star.mp3", + "None", + { + "hidden": false, + "paused": false, + "params": {} + } ] } ], @@ -387,38 +414,6 @@ 3, "PITCH_EXTRACTION" ], - [ - 6, - 2, - 1, - 7, - 0, - "VHS_AUDIO" - ], - [ - 7, - 7, - 0, - 1, - 0, - "VHS_AUDIO" - ], - [ - 8, - 7, - 1, - 8, - 0, - "VHS_AUDIO" - ], - [ - 9, - 1, - 0, - 8, - 1, - "VHS_AUDIO" - ], [ 10, 8, @@ -434,6 +429,38 @@ 3, 1, "STRING" + ], + [ + 12, + 2, + 1, + 9, + 0, + "VHS_AUDIO" + ], + [ + 13, + 9, + 1, + 8, + 1, + "VHS_AUDIO" + ], + [ + 14, + 9, + 0, + 1, + 0, + "VHS_AUDIO" + ], + [ + 15, + 1, + 0, + 8, + 0, + "VHS_AUDIO" ] ], "groups": [], @@ -442,8 +469,8 @@ "ds": { "scale": 0.6830134553650706, "offset": [ - -172.5821681249739, - 268.8813118680092 + 531.5168724939232, + 463.2073890439136 ] } }, diff --git a/lib/audio.py b/lib/audio.py index 00a6b0a..c84aad8 100644 --- a/lib/audio.py +++ b/lib/audio.py @@ -111,7 +111,7 @@ def audio_to_bytes(audio,sr,target_sr=None,to_int16=False,to_stereo=False,format bytes_io.seek(0) return bytes_io.read() -def bytes_to_audio(data: Union[io.BytesIO,bytes],**kwargs): +def bytes_to_audio(data: bytes,**kwargs): with io.BytesIO(data) as bytes_io: audio, sr = sf.read(bytes_io,**kwargs) if audio.ndim>1: @@ -167,7 +167,7 @@ def audio2bytes(audio: np.array, sr: int): def pad_audio(*audios,axis=0): maxlen = max(len(a) if a is not None else 0 for a in audios) if maxlen>0: - stack = librosa.util.stack([librosa.util.pad_center(data=a,size=maxlen) for a in audios if a is not None],axis=axis) + stack = librosa.util.stack([librosa.util.fix_length(a,size=maxlen) for a in audios if a is not None],axis=axis) return stack else: return np.stack(audios,axis=axis) diff --git a/requirements.txt b/requirements.txt index b5b39a9..689cc33 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,5 @@ samplerate pyaudio spacy monotonic_align -textacy \ No newline at end of file +textacy +pytube \ No newline at end of file diff --git a/web/js/ui_handlers.js b/web/js/ui_handlers.js index 8d73729..f071a16 100644 --- a/web/js/ui_handlers.js +++ b/web/js/ui_handlers.js @@ -346,6 +346,9 @@ app.registerExtension({ addUploadWidget(nodeType, nodeData, "audio", "audio") addPreviewWidget(nodeType, nodeData, "audio", "onNodeCreated" ) break + case "DownloadAudio": + addPreviewWidget(nodeType, nodeData, "audio", "onExecuted" ) + break case "PreviewAudio": addPreviewWidget(nodeType, nodeData, "audio", "onExecuted" ) break