mirror of
https://github.com/w-okada/voice-changer.git
synced 2025-03-15 04:13:57 +03:00
improve gui
This commit is contained in:
parent
87e4ab0cb7
commit
cbc454ebf7
2
client/demo/dist/index.js
vendored
2
client/demo/dist/index.js
vendored
File diff suppressed because one or more lines are too long
@ -14,7 +14,6 @@ export const ModelSwitchRow = (_props: ModelSwitchRowProps) => {
|
|||||||
|
|
||||||
const onSwitchModelClicked = async (index: number, filename: string) => {
|
const onSwitchModelClicked = async (index: number, filename: string) => {
|
||||||
const framework: Framework = filename.endsWith(".onnx") ? "ONNX" : "PyTorch"
|
const framework: Framework = filename.endsWith(".onnx") ? "ONNX" : "PyTorch"
|
||||||
console.log("Framework:::", filename, framework)
|
|
||||||
|
|
||||||
// Quick hack for same slot is selected. 下3桁が実際のSlotID
|
// Quick hack for same slot is selected. 下3桁が実際のSlotID
|
||||||
const dummyModelSlotIndex = (Math.floor(Date.now() / 1000)) * 1000 + index
|
const dummyModelSlotIndex = (Math.floor(Date.now() / 1000)) * 1000 + index
|
||||||
@ -25,13 +24,26 @@ export const ModelSwitchRow = (_props: ModelSwitchRowProps) => {
|
|||||||
let filename = ""
|
let filename = ""
|
||||||
if (x.pyTorchModelFile && x.pyTorchModelFile.length > 0) {
|
if (x.pyTorchModelFile && x.pyTorchModelFile.length > 0) {
|
||||||
filename = x.pyTorchModelFile.replace(/^.*[\\\/]/, '')
|
filename = x.pyTorchModelFile.replace(/^.*[\\\/]/, '')
|
||||||
return <div key={index} className={className} onClick={() => { onSwitchModelClicked(index, filename) }}>{filename}</div>
|
|
||||||
} else if (x.onnxModelFile && x.onnxModelFile.length > 0) {
|
} else if (x.onnxModelFile && x.onnxModelFile.length > 0) {
|
||||||
filename = x.onnxModelFile.replace(/^.*[\\\/]/, '')
|
filename = x.onnxModelFile.replace(/^.*[\\\/]/, '')
|
||||||
return <div key={index} className={className} onClick={() => { onSwitchModelClicked(index, filename) }}>{filename}</div>
|
|
||||||
} else {
|
} else {
|
||||||
return <div key={index} ></div>
|
return <div key={index} ></div>
|
||||||
}
|
}
|
||||||
|
const f0str = x.f0 == true ? "f0" : "nof0"
|
||||||
|
const srstr = Math.floor(x.samplingRate / 1000) + "K"
|
||||||
|
const embedstr = x.embChannels
|
||||||
|
const typestr = x.modelType == 0 ? "org" : "webui"
|
||||||
|
const metadata = x.deprecated ? "[deprecated version]" : `[${f0str},${srstr},${embedstr},${typestr}]`
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div key={index} className={className} onClick={() => { onSwitchModelClicked(index, filename) }}>
|
||||||
|
<div>
|
||||||
|
{filename}
|
||||||
|
</div>
|
||||||
|
<div>{metadata}</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -28,11 +28,15 @@ class ModelWrapper:
|
|||||||
self.samplingRate = metadata["samplingRate"]
|
self.samplingRate = metadata["samplingRate"]
|
||||||
self.f0 = metadata["f0"]
|
self.f0 = metadata["f0"]
|
||||||
self.embChannels = metadata["embChannels"]
|
self.embChannels = metadata["embChannels"]
|
||||||
|
self.modelType = metadata["modelType"]
|
||||||
|
self.deprecated = False
|
||||||
print(f"[Voice Changer] Onnx metadata: sr:{self.samplingRate}, f0:{self.f0}")
|
print(f"[Voice Changer] Onnx metadata: sr:{self.samplingRate}, f0:{self.f0}")
|
||||||
except:
|
except:
|
||||||
self.samplingRate = 48000
|
self.samplingRate = 48000
|
||||||
self.f0 = True
|
self.f0 = True
|
||||||
self.embChannels = 256
|
self.embChannels = 256
|
||||||
|
self.modelType = 0
|
||||||
|
self.deprecated = True
|
||||||
print(f"[Voice Changer] ############## !!!! CAUTION !!!! ####################")
|
print(f"[Voice Changer] ############## !!!! CAUTION !!!! ####################")
|
||||||
print(f"[Voice Changer] This onnx's version is depricated. Please regenerate onnxfile. Fallback to default")
|
print(f"[Voice Changer] This onnx's version is depricated. Please regenerate onnxfile. Fallback to default")
|
||||||
print(f"[Voice Changer] Onnx metadata: sr:{self.samplingRate}, f0:{self.f0}")
|
print(f"[Voice Changer] Onnx metadata: sr:{self.samplingRate}, f0:{self.f0}")
|
||||||
@ -47,6 +51,12 @@ class ModelWrapper:
|
|||||||
def getEmbChannels(self):
|
def getEmbChannels(self):
|
||||||
return self.embChannels
|
return self.embChannels
|
||||||
|
|
||||||
|
def getModelType(self):
|
||||||
|
return self.modelType
|
||||||
|
|
||||||
|
def getDeprecated(self):
|
||||||
|
return self.deprecated
|
||||||
|
|
||||||
def set_providers(self, providers, provider_options=[{}]):
|
def set_providers(self, providers, provider_options=[{}]):
|
||||||
self.onnx_session.set_providers(providers=providers, provider_options=provider_options)
|
self.onnx_session.set_providers(providers=providers, provider_options=provider_options)
|
||||||
|
|
||||||
|
@ -50,9 +50,10 @@ class ModelSlot():
|
|||||||
samplingRate: int = -1
|
samplingRate: int = -1
|
||||||
f0: bool = True
|
f0: bool = True
|
||||||
embChannels: int = 256
|
embChannels: int = 256
|
||||||
samplingRateOnnx: int = -1
|
deprecated: bool = False
|
||||||
f0Onnx: bool = True
|
# samplingRateOnnx: int = -1
|
||||||
embChannelsOnnx: int = 256
|
# f0Onnx: bool = True
|
||||||
|
# embChannelsOnnx: int = 256
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@ -130,6 +131,12 @@ class RVC:
|
|||||||
|
|
||||||
print("[Voice Changer] RVC loading... slot:", tmp_slot)
|
print("[Voice Changer] RVC loading... slot:", tmp_slot)
|
||||||
|
|
||||||
|
# Load metadata
|
||||||
|
if self.settings.modelSlots[tmp_slot].pyTorchModelFile != None and self.settings.modelSlots[tmp_slot].pyTorchModelFile != "":
|
||||||
|
self._setInfoByPytorch(tmp_slot, self.settings.modelSlots[tmp_slot].pyTorchModelFile)
|
||||||
|
if self.settings.modelSlots[tmp_slot].onnxModelFile != None and self.settings.modelSlots[tmp_slot].onnxModelFile != "":
|
||||||
|
self._setInfoByONNX(tmp_slot, self.settings.modelSlots[tmp_slot].onnxModelFile)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
hubert_path = self.params["hubert_base"]
|
hubert_path = self.params["hubert_base"]
|
||||||
models, saved_cfg, task = checkpoint_utils.load_model_ensemble_and_task([hubert_path], suffix="",)
|
models, saved_cfg, task = checkpoint_utils.load_model_ensemble_and_task([hubert_path], suffix="",)
|
||||||
@ -151,6 +158,28 @@ class RVC:
|
|||||||
|
|
||||||
return self.get_info()
|
return self.get_info()
|
||||||
|
|
||||||
|
def _setInfoByPytorch(self, slot, file):
|
||||||
|
cpt = torch.load(file, map_location="cpu")
|
||||||
|
config_len = len(cpt["config"])
|
||||||
|
if config_len == 18:
|
||||||
|
self.settings.modelSlots[slot].modelType = RVC_MODEL_TYPE_RVC
|
||||||
|
self.settings.modelSlots[slot].embChannels = 256
|
||||||
|
else:
|
||||||
|
self.settings.modelSlots[slot].modelType = RVC_MODEL_TYPE_WEBUI
|
||||||
|
self.settings.modelSlots[slot].embChannels = cpt["config"][17]
|
||||||
|
self.settings.modelSlots[slot].f0 = True if cpt["f0"] == 1 else False
|
||||||
|
self.settings.modelSlots[slot].samplingRate = cpt["config"][-1]
|
||||||
|
|
||||||
|
self.settings.modelSamplingRate = cpt["config"][-1]
|
||||||
|
|
||||||
|
def _setInfoByONNX(self, slot, file):
|
||||||
|
tmp_onnx_session = ModelWrapper(file)
|
||||||
|
self.settings.modelSlots[slot].modelType = tmp_onnx_session.getModelType()
|
||||||
|
self.settings.modelSlots[slot].embChannelsOnnx = tmp_onnx_session.getEmbChannels()
|
||||||
|
self.settings.modelSlots[slot].f0 = tmp_onnx_session.getF0()
|
||||||
|
self.settings.modelSlots[slot].samplingRate = tmp_onnx_session.getSamplingRate()
|
||||||
|
self.settings.modelSlots[slot].deprecated = tmp_onnx_session.getDeprecated()
|
||||||
|
|
||||||
def prepareModel(self, slot: int):
|
def prepareModel(self, slot: int):
|
||||||
print("[Voice Changer] Prepare Model of slot:", slot)
|
print("[Voice Changer] Prepare Model of slot:", slot)
|
||||||
pyTorchModelFile = self.settings.modelSlots[slot].pyTorchModelFile
|
pyTorchModelFile = self.settings.modelSlots[slot].pyTorchModelFile
|
||||||
@ -172,17 +201,17 @@ class RVC:
|
|||||||
|
|
||||||
(2-2) rvc-webuiの、(256 or 768) x (ノーマルor pitchレス)判定 ⇒ 256, or 768 は17番目の要素で判定。, ノーマルor pitchレスはckp["f0"]で判定
|
(2-2) rvc-webuiの、(256 or 768) x (ノーマルor pitchレス)判定 ⇒ 256, or 768 は17番目の要素で判定。, ノーマルor pitchレスはckp["f0"]で判定
|
||||||
'''
|
'''
|
||||||
config_len = len(cpt["config"])
|
# config_len = len(cpt["config"])
|
||||||
if config_len == 18:
|
# if config_len == 18:
|
||||||
self.settings.modelSlots[slot].modelType = RVC_MODEL_TYPE_RVC
|
# self.settings.modelSlots[slot].modelType = RVC_MODEL_TYPE_RVC
|
||||||
self.settings.modelSlots[slot].embChannels = 256
|
# self.settings.modelSlots[slot].embChannels = 256
|
||||||
else:
|
# else:
|
||||||
self.settings.modelSlots[slot].modelType = RVC_MODEL_TYPE_WEBUI
|
# self.settings.modelSlots[slot].modelType = RVC_MODEL_TYPE_WEBUI
|
||||||
self.settings.modelSlots[slot].embChannels = cpt["config"][17]
|
# self.settings.modelSlots[slot].embChannels = cpt["config"][17]
|
||||||
self.settings.modelSlots[slot].f0 = True if cpt["f0"] == 1 else False
|
# self.settings.modelSlots[slot].f0 = True if cpt["f0"] == 1 else False
|
||||||
self.settings.modelSlots[slot].samplingRate = cpt["config"][-1]
|
# self.settings.modelSlots[slot].samplingRate = cpt["config"][-1]
|
||||||
|
|
||||||
self.settings.modelSamplingRate = cpt["config"][-1]
|
# self.settings.modelSamplingRate = cpt["config"][-1]
|
||||||
|
|
||||||
if self.settings.modelSlots[slot].modelType == RVC_MODEL_TYPE_RVC and self.settings.modelSlots[slot].f0 == True:
|
if self.settings.modelSlots[slot].modelType == RVC_MODEL_TYPE_RVC and self.settings.modelSlots[slot].f0 == True:
|
||||||
net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=self.is_half)
|
net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=self.is_half)
|
||||||
@ -213,16 +242,14 @@ class RVC:
|
|||||||
if onnxModelFile != None and onnxModelFile != "":
|
if onnxModelFile != None and onnxModelFile != "":
|
||||||
print("[Voice Changer] Loading ONNX Model...")
|
print("[Voice Changer] Loading ONNX Model...")
|
||||||
self.next_onnx_session = ModelWrapper(onnxModelFile)
|
self.next_onnx_session = ModelWrapper(onnxModelFile)
|
||||||
self.settings.modelSlots[slot].samplingRateOnnx = self.next_onnx_session.getSamplingRate()
|
# self.settings.modelSlots[slot].samplingRateOnnx = self.next_onnx_session.getSamplingRate()
|
||||||
self.settings.modelSlots[slot].f0Onnx = self.next_onnx_session.getF0()
|
# self.settings.modelSlots[slot].f0Onnx = self.next_onnx_session.getF0()
|
||||||
# if self.settings.modelSlots[slot].samplingRate == -1: # ONNXにsampling rateが入っていない
|
# self.settings.modelSlots[slot].embChannelsOnnx = self.next_onnx_session.getEmbChannels()
|
||||||
# self.settings.modelSlots[slot].samplingRate = self.settings.modelSamplingRate
|
|
||||||
self.settings.modelSlots[slot].embChannelsOnnx = self.next_onnx_session.getEmbChannels()
|
|
||||||
|
|
||||||
# ONNXがある場合は、ONNXの設定を優先
|
# # ONNXがある場合は、ONNXの設定を優先
|
||||||
self.settings.modelSlots[slot].samplingRate = self.settings.modelSlots[slot].samplingRateOnnx
|
# self.settings.modelSlots[slot].samplingRate = self.settings.modelSlots[slot].samplingRateOnnx
|
||||||
self.settings.modelSlots[slot].f0 = self.settings.modelSlots[slot].f0Onnx
|
# self.settings.modelSlots[slot].f0 = self.settings.modelSlots[slot].f0Onnx
|
||||||
self.settings.modelSlots[slot].embChannels = self.settings.modelSlots[slot].embChannelsOnnx
|
# self.settings.modelSlots[slot].embChannels = self.settings.modelSlots[slot].embChannelsOnnx
|
||||||
else:
|
else:
|
||||||
print("[Voice Changer] Skip Loading ONNX Model...")
|
print("[Voice Changer] Skip Loading ONNX Model...")
|
||||||
self.next_onnx_session = None
|
self.next_onnx_session = None
|
||||||
@ -469,7 +496,7 @@ class RVC:
|
|||||||
metadata = {
|
metadata = {
|
||||||
"application": "VC_CLIENT",
|
"application": "VC_CLIENT",
|
||||||
"version": "1",
|
"version": "1",
|
||||||
"ModelType": self.settings.modelSlots[self.settings.modelSlotIndex].modelType,
|
"modelType": self.settings.modelSlots[self.settings.modelSlotIndex].modelType,
|
||||||
"samplingRate": self.settings.modelSlots[self.settings.modelSlotIndex].samplingRate,
|
"samplingRate": self.settings.modelSlots[self.settings.modelSlotIndex].samplingRate,
|
||||||
"f0": self.settings.modelSlots[self.settings.modelSlotIndex].f0,
|
"f0": self.settings.modelSlots[self.settings.modelSlotIndex].f0,
|
||||||
"embChannels": self.settings.modelSlots[self.settings.modelSlotIndex].embChannels,
|
"embChannels": self.settings.modelSlots[self.settings.modelSlotIndex].embChannels,
|
||||||
|
@ -371,13 +371,13 @@ def export2onnx(input_model, output_model, output_model_simple, is_half, metadat
|
|||||||
else:
|
else:
|
||||||
dev = torch.device("cpu")
|
dev = torch.device("cpu")
|
||||||
|
|
||||||
if metadata["f0"] == True and metadata["ModelType"] == RVC_MODEL_TYPE_RVC:
|
if metadata["f0"] == True and metadata["modelType"] == RVC_MODEL_TYPE_RVC:
|
||||||
net_g_onnx = SynthesizerTrnMs256NSFsid_ONNX(*cpt["config"], is_half=is_half)
|
net_g_onnx = SynthesizerTrnMs256NSFsid_ONNX(*cpt["config"], is_half=is_half)
|
||||||
elif metadata["f0"] == True and metadata["ModelType"] == RVC_MODEL_TYPE_WEBUI:
|
elif metadata["f0"] == True and metadata["modelType"] == RVC_MODEL_TYPE_WEBUI:
|
||||||
net_g_onnx = SynthesizerTrnMsNSFsid_webui_ONNX(**cpt["params"], is_half=is_half)
|
net_g_onnx = SynthesizerTrnMsNSFsid_webui_ONNX(**cpt["params"], is_half=is_half)
|
||||||
elif metadata["f0"] == False and metadata["ModelType"] == RVC_MODEL_TYPE_RVC:
|
elif metadata["f0"] == False and metadata["modelType"] == RVC_MODEL_TYPE_RVC:
|
||||||
net_g_onnx = SynthesizerTrnMs256NSFsid_nono_ONNX(*cpt["config"])
|
net_g_onnx = SynthesizerTrnMs256NSFsid_nono_ONNX(*cpt["config"])
|
||||||
elif metadata["f0"] == False and metadata["ModelType"] == RVC_MODEL_TYPE_WEBUI:
|
elif metadata["f0"] == False and metadata["modelType"] == RVC_MODEL_TYPE_WEBUI:
|
||||||
net_g_onnx = SynthesizerTrnMsNSFsidNono_webui_ONNX(**cpt["params"])
|
net_g_onnx = SynthesizerTrnMsNSFsidNono_webui_ONNX(**cpt["params"])
|
||||||
|
|
||||||
net_g_onnx.eval().to(dev)
|
net_g_onnx.eval().to(dev)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user