From aed691ab4e0ea9fbdccbb8bd62feb306ae272b7c Mon Sep 17 00:00:00 2001 From: SpenserCai Date: Fri, 4 Oct 2024 21:15:11 +0800 Subject: [PATCH] add InstructNode support --- README.md | 5 +++-- __init__.py | 6 +++++- funaudio_utils/download_models.py | 9 +++++++- nodes/cosyvoice_nodes.py | 36 +++++++++++++++++++++++++++++-- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 416ac3a..daf52fc 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ * @Date: 2024-10-04 11:28:28 * @version: * @LastEditors: SpenserCai - * @LastEditTime: 2024-10-04 20:48:17 + * @LastEditTime: 2024-10-04 21:14:03 * @Description: file content --> # ComfyUI-FunAudioLLM @@ -12,7 +12,8 @@ Comfyui custom node for [FunAudioLLM](https://funaudiollm.github.io/) include [C ## Features ### CosyVoice - - Support SFT,Zero-shot,Cross-lingual + - CosyVoice Version: 2024-10-04 + - Support SFT,Zero-shot,Cross-lingual,Instruct - Support CosyVoice-300M-25Hz in zero-shot and cross-lingual - Support SFT's 25Hz(unoffical) -
diff --git a/__init__.py b/__init__.py index 3d29db6..3e22c39 100644 --- a/__init__.py +++ b/__init__.py @@ -3,7 +3,7 @@ Author: SpenserCai Date: 2024-10-04 12:14:22 version: LastEditors: SpenserCai -LastEditTime: 2024-10-04 20:14:52 +LastEditTime: 2024-10-04 21:12:47 Description: file content ''' from .nodes.cosyvoice_nodes import * @@ -22,6 +22,10 @@ NODE_CONFIG = { "class": CosyVoiceCrossLingualNode, "name": "CosyVoice 跨语言克隆" }, + "CosyVoiceInstructNode": { + "class": CosyVoiceInstructNode, + "name": "CosyVoice 自然语言控制" + }, "CosyVoiceSaveSpeakerModelNode": { "class": CosyVoiceSaveSpeakerModelNode, "name": "CosyVoice 保存说话人模型" diff --git a/funaudio_utils/download_models.py b/funaudio_utils/download_models.py index baeecbc..74c14d6 100644 --- a/funaudio_utils/download_models.py +++ b/funaudio_utils/download_models.py @@ -3,7 +3,7 @@ Author: SpenserCai Date: 2024-10-04 13:54:01 version: LastEditors: SpenserCai -LastEditTime: 2024-10-04 18:42:14 +LastEditTime: 2024-10-04 21:10:55 Description: file content ''' import modelscope @@ -34,5 +34,12 @@ def download_cosyvoice_300m_sft(is_25hz=False): snapshot_download(model_id=model_id, local_dir=model_dir) return model_name, model_dir +def download_cosyvoice_300m_instruct(): + model_name = "CosyVoice-300M-Instruct" + model_id = "iic/CosyVoice-300M-Instruct" + model_dir = os.path.join(base_cosyvoice_model_path, model_name) + snapshot_download(model_id=model_id, local_dir=model_dir) + return model_name, model_dir + def get_speaker_default_path(): return os.path.join(base_cosyvoice_model_path, "Speaker") \ No newline at end of file diff --git a/nodes/cosyvoice_nodes.py b/nodes/cosyvoice_nodes.py index 1b25590..2c8c79d 100644 --- a/nodes/cosyvoice_nodes.py +++ b/nodes/cosyvoice_nodes.py @@ -3,7 +3,7 @@ Author: SpenserCai Date: 2024-10-04 12:13:28 version: LastEditors: SpenserCai -LastEditTime: 2024-10-04 20:13:31 +LastEditTime: 2024-10-04 21:11:53 Description: file content ''' import os @@ -12,7 +12,7 @@ import random import numpy as np import torch from funaudio_utils.pre import FunAudioLLMTool -from funaudio_utils.download_models import download_cosyvoice_300m, get_speaker_default_path, download_cosyvoice_300m_sft +from funaudio_utils.download_models import download_cosyvoice_300m, get_speaker_default_path, download_cosyvoice_300m_sft,download_cosyvoice_300m_instruct from funaudio_utils.cosyvoice_plus import CosyVoicePlus from cosyvoice.utils.common import set_all_random_seed @@ -158,6 +158,38 @@ class CosyVoiceCrossLingualNode: output = cosyvoice.inference_cross_lingual(tts_text, prompt_speech_16k, False, speed) return return_audio(output,t0,None) +class CosyVoiceInstructNode: + sft_spk_list = ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女'] + @classmethod + def INPUT_TYPES(s): + return { + "required":{ + "tts_text":("STRING",), + "speaker_name":(s.sft_spk_list,{ + "default":"中文女" + }), + "instruct_text":("STRING",), + "speed":("FLOAT",{ + "default": 1.0 + }), + "seed":("INT",{ + "default": 42 + }), + } + } + + CATEGORY = CATEGORY_NAME + RETURN_TYPES = ("AUDIO",) + FUNCTION="generate" + + def generate(self, tts_text, speaker_name, instruct_text, speed, seed, use_25hz): + t0 = ttime() + _, model_dir = download_cosyvoice_300m_instruct() + cosyvoice = CosyVoicePlus(model_dir) + set_all_random_seed(seed) + output = cosyvoice.inference_instruct(tts_text, speaker_name, instruct_text, False, speed) + return return_audio(output,t0,None) + class CosyVoiceLoadSpeakerModelNode: @classmethod def INPUT_TYPES(s):