mirror of
https://github.com/w-okada/voice-changer.git
synced 2025-01-24 05:55:01 +03:00
108 lines
3.9 KiB
Python
108 lines
3.9 KiB
Python
from const import EnumEmbedderTypes, EnumInferenceTypes
|
|
from voice_changer.RVC.ModelSlot import ModelSlot
|
|
|
|
from voice_changer.utils.LoadModelParams import FilePaths
|
|
import torch
|
|
import onnxruntime
|
|
import json
|
|
|
|
|
|
def generateModelSlot(files: FilePaths, params):
|
|
modelSlot = ModelSlot()
|
|
modelSlot.pyTorchModelFile = files.pyTorchModelFilename
|
|
modelSlot.onnxModelFile = files.onnxModelFilename
|
|
modelSlot.featureFile = files.featureFilename
|
|
modelSlot.indexFile = files.indexFilename
|
|
modelSlot.defaultTrans = params["trans"] if "trans" in params else 0
|
|
|
|
modelSlot.isONNX = True if modelSlot.onnxModelFile is not None else False
|
|
|
|
if modelSlot.isONNX:
|
|
_setInfoByONNX(modelSlot, modelSlot.onnxModelFile)
|
|
else:
|
|
_setInfoByPytorch(modelSlot, modelSlot.pyTorchModelFile)
|
|
return modelSlot
|
|
|
|
|
|
def _setInfoByPytorch(slot: ModelSlot, file: str):
|
|
cpt = torch.load(file, map_location="cpu")
|
|
config_len = len(cpt["config"])
|
|
if config_len == 18:
|
|
slot.f0 = True if cpt["f0"] == 1 else False
|
|
slot.modelType = (
|
|
EnumInferenceTypes.pyTorchRVC
|
|
if slot.f0
|
|
else EnumInferenceTypes.pyTorchRVCNono
|
|
)
|
|
slot.embChannels = 256
|
|
slot.embedder = EnumEmbedderTypes.hubert
|
|
else:
|
|
slot.f0 = True if cpt["f0"] == 1 else False
|
|
slot.modelType = (
|
|
EnumInferenceTypes.pyTorchWebUI
|
|
if slot.f0
|
|
else EnumInferenceTypes.pyTorchWebUINono
|
|
)
|
|
slot.embChannels = cpt["config"][17]
|
|
slot.embedder = cpt["embedder_name"]
|
|
if slot.embedder.endswith("768"):
|
|
slot.embedder = slot.embedder[:-3]
|
|
|
|
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")
|
|
|
|
slot.samplingRate = cpt["config"][-1]
|
|
|
|
del cpt
|
|
|
|
|
|
def _setInfoByONNX(slot: ModelSlot, file: str):
|
|
tmp_onnx_session = onnxruntime.InferenceSession(
|
|
file, providers=["CPUExecutionProvider"]
|
|
)
|
|
modelmeta = tmp_onnx_session.get_modelmeta()
|
|
try:
|
|
metadata = json.loads(modelmeta.custom_metadata_map["metadata"])
|
|
|
|
# slot.modelType = metadata["modelType"]
|
|
slot.embChannels = metadata["embChannels"]
|
|
|
|
if "embedder" not in metadata:
|
|
slot.embedder = EnumEmbedderTypes.hubert
|
|
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")
|
|
|
|
slot.f0 = metadata["f0"]
|
|
slot.modelType = (
|
|
EnumInferenceTypes.onnxRVC if slot.f0 else EnumInferenceTypes.onnxRVCNono
|
|
)
|
|
slot.samplingRate = metadata["samplingRate"]
|
|
slot.deprecated = False
|
|
|
|
except Exception as e:
|
|
slot.modelType = EnumInferenceTypes.onnxRVC
|
|
slot.embChannels = 256
|
|
slot.embedder = EnumEmbedderTypes.hubert
|
|
slot.f0 = True
|
|
slot.samplingRate = 48000
|
|
slot.deprecated = True
|
|
|
|
print("[Voice Changer] setInfoByONNX", e)
|
|
print("[Voice Changer] ############## !!!! CAUTION !!!! ####################")
|
|
print("[Voice Changer] This onnxfie is depricated. Please regenerate onnxfile.")
|
|
print("[Voice Changer] ############## !!!! CAUTION !!!! ####################")
|
|
|
|
del tmp_onnx_session
|