voice-changer/server/voice_changer/RVC/ModelSlotGenerator.py

127 lines
5.4 KiB
Python
Raw Normal View History

2023-05-02 14:57:12 +03:00
from const import EnumEmbedderTypes, EnumInferenceTypes
import torch
import onnxruntime
import json
2023-05-14 22:24:58 +03:00
2023-06-16 12:04:33 +03:00
from data.ModelSlot import ModelSlot
2023-05-14 22:24:58 +03:00
2023-05-08 19:01:20 +03:00
def _setInfoByPytorch(slot: ModelSlot):
cpt = torch.load(slot.modelFile, map_location="cpu")
2023-05-02 14:57:12 +03:00
config_len = len(cpt["config"])
2023-05-24 10:56:23 +03:00
2023-05-02 14:57:12 +03:00
if config_len == 18:
2023-05-24 10:56:23 +03:00
# Original RVC
2023-05-02 14:57:12 +03:00
slot.f0 = True if cpt["f0"] == 1 else False
2023-05-20 09:54:00 +03:00
version = cpt.get("version", "v1")
2023-05-21 05:50:28 +03:00
if version is None or version == "v1":
2023-06-16 12:04:33 +03:00
slot.modelType = EnumInferenceTypes.pyTorchRVC.value if slot.f0 else EnumInferenceTypes.pyTorchRVCNono.value
2023-05-20 09:54:00 +03:00
slot.embChannels = 256
2023-05-24 14:49:24 +03:00
slot.embOutputLayer = 9
2023-05-24 10:56:23 +03:00
slot.useFinalProj = True
2023-05-30 20:26:16 +03:00
slot.embedder = EnumEmbedderTypes.hubert.value
print("[Voice Changer] Official Model(pyTorch) : v1")
2023-05-20 09:54:00 +03:00
else:
2023-06-16 12:04:33 +03:00
slot.modelType = EnumInferenceTypes.pyTorchRVCv2.value if slot.f0 else EnumInferenceTypes.pyTorchRVCv2Nono.value
2023-05-20 09:54:00 +03:00
slot.embChannels = 768
2023-05-24 14:49:24 +03:00
slot.embOutputLayer = 12
2023-05-24 10:56:23 +03:00
slot.useFinalProj = False
2023-05-30 20:26:16 +03:00
slot.embedder = EnumEmbedderTypes.hubert.value
print("[Voice Changer] Official Model(pyTorch) : v2")
2023-05-20 09:54:00 +03:00
2023-05-02 14:57:12 +03:00
else:
2023-05-24 10:56:23 +03:00
# DDPN RVC
2023-05-02 14:57:12 +03:00
slot.f0 = True if cpt["f0"] == 1 else False
2023-06-16 12:04:33 +03:00
slot.modelType = EnumInferenceTypes.pyTorchWebUI.value if slot.f0 else EnumInferenceTypes.pyTorchWebUINono.value
2023-05-02 14:57:12 +03:00
slot.embChannels = cpt["config"][17]
2023-06-16 12:04:33 +03:00
slot.embOutputLayer = cpt["embedder_output_layer"] if "embedder_output_layer" in cpt else 9
2023-05-24 10:56:23 +03:00
if slot.embChannels == 256:
slot.useFinalProj = True
else:
slot.useFinalProj = False
# DDPNモデルの情報を表示
2023-06-16 12:04:33 +03:00
if slot.embChannels == 256 and slot.embOutputLayer == 9 and slot.useFinalProj is True:
2023-05-30 20:26:16 +03:00
print("[Voice Changer] DDPN Model(pyTorch) : Official v1 like")
2023-06-16 12:04:33 +03:00
elif slot.embChannels == 768 and slot.embOutputLayer == 12 and slot.useFinalProj is False:
2023-05-30 20:26:16 +03:00
print("[Voice Changer] DDPN Model(pyTorch): Official v2 like")
2023-05-24 10:56:23 +03:00
else:
2023-06-16 12:04:33 +03:00
print(f"[Voice Changer] DDPN Model(pyTorch): ch:{slot.embChannels}, L:{slot.embOutputLayer}, FP:{slot.useFinalProj}")
2023-05-24 10:56:23 +03:00
2023-05-02 14:57:12 +03:00
slot.embedder = cpt["embedder_name"]
if slot.embedder.endswith("768"):
slot.embedder = slot.embedder[:-3]
2023-05-30 20:26:16 +03:00
# if slot.embedder == EnumEmbedderTypes.hubert.value:
# slot.embedder = EnumEmbedderTypes.hubert
# elif slot.embedder == EnumEmbedderTypes.contentvec.value:
# slot.embedder = EnumEmbedderTypes.contentvec
# elif slot.embedder == EnumEmbedderTypes.hubert_jp.value:
# slot.embedder = EnumEmbedderTypes.hubert_jp
# else:
# raise RuntimeError("[Voice Changer][setInfoByONNX] unknown embedder")
2023-05-03 07:14:00 +03:00
2023-05-02 14:57:12 +03:00
slot.samplingRate = cpt["config"][-1]
del cpt
2023-05-08 19:01:20 +03:00
def _setInfoByONNX(slot: ModelSlot):
2023-06-16 12:04:33 +03:00
tmp_onnx_session = onnxruntime.InferenceSession(slot.modelFile, providers=["CPUExecutionProvider"])
2023-05-02 14:57:12 +03:00
modelmeta = tmp_onnx_session.get_modelmeta()
try:
metadata = json.loads(modelmeta.custom_metadata_map["metadata"])
2023-05-03 11:12:40 +03:00
# slot.modelType = metadata["modelType"]
2023-05-02 14:57:12 +03:00
slot.embChannels = metadata["embChannels"]
2023-05-03 07:14:00 +03:00
2023-06-16 12:04:33 +03:00
slot.embOutputLayer = metadata["embOutputLayer"] if "embOutputLayer" in metadata else 9
slot.useFinalProj = metadata["useFinalProj"] if "useFinalProj" in metadata else True if slot.embChannels == 256 else False
2023-05-24 10:56:23 +03:00
if slot.embChannels == 256:
slot.useFinalProj = True
else:
slot.useFinalProj = False
2023-05-24 14:49:24 +03:00
# ONNXモデルの情報を表示
2023-06-16 12:04:33 +03:00
if slot.embChannels == 256 and slot.embOutputLayer == 9 and slot.useFinalProj is True:
2023-05-30 20:26:16 +03:00
print("[Voice Changer] ONNX Model: Official v1 like")
2023-06-16 12:04:33 +03:00
elif slot.embChannels == 768 and slot.embOutputLayer == 12 and slot.useFinalProj is False:
2023-05-30 20:26:16 +03:00
print("[Voice Changer] ONNX Model: Official v2 like")
2023-05-24 14:49:24 +03:00
else:
2023-06-16 12:04:33 +03:00
print(f"[Voice Changer] ONNX Model: ch:{slot.embChannels}, L:{slot.embOutputLayer}, FP:{slot.useFinalProj}")
2023-05-24 10:56:23 +03:00
2023-05-03 07:14:00 +03:00
if "embedder" not in metadata:
2023-05-30 20:26:16 +03:00
slot.embedder = EnumEmbedderTypes.hubert.value
2023-05-03 07:14:00 +03:00
else:
2023-05-30 20:26:16 +03:00
slot.embedder = metadata["embedder"]
# elif metadata["embedder"] == EnumEmbedderTypes.hubert.value:
# slot.embedder = EnumEmbedderTypes.hubert
# elif metadata["embedder"] == EnumEmbedderTypes.contentvec.value:
# slot.embedder = EnumEmbedderTypes.contentvec
# elif metadata["embedder"] == EnumEmbedderTypes.hubert_jp.value:
# slot.embedder = EnumEmbedderTypes.hubert_jp
# else:
# raise RuntimeError("[Voice Changer][setInfoByONNX] unknown embedder")
2023-05-03 07:14:00 +03:00
2023-05-02 14:57:12 +03:00
slot.f0 = metadata["f0"]
2023-06-16 12:04:33 +03:00
slot.modelType = EnumInferenceTypes.onnxRVC.value if slot.f0 else EnumInferenceTypes.onnxRVCNono.value
2023-05-02 14:57:12 +03:00
slot.samplingRate = metadata["samplingRate"]
slot.deprecated = False
2023-05-03 07:14:00 +03:00
except Exception as e:
2023-05-30 20:26:16 +03:00
slot.modelType = EnumInferenceTypes.onnxRVC.value
2023-05-02 14:57:12 +03:00
slot.embChannels = 256
2023-05-30 20:26:16 +03:00
slot.embedder = EnumEmbedderTypes.hubert.value
2023-05-02 14:57:12 +03:00
slot.f0 = True
slot.samplingRate = 48000
slot.deprecated = True
2023-05-03 07:14:00 +03:00
print("[Voice Changer] setInfoByONNX", e)
2023-05-02 14:57:12 +03:00
print("[Voice Changer] ############## !!!! CAUTION !!!! ####################")
print("[Voice Changer] This onnxfie is depricated. Please regenerate onnxfile.")
print("[Voice Changer] ############## !!!! CAUTION !!!! ####################")
del tmp_onnx_session