voice-changer/server/voice_changer/RVC/pipeline/PipelineGenerator.py

78 lines
2.6 KiB
Python
Raw Normal View History

2023-05-04 17:50:52 +03:00
import os
import traceback
import faiss
from Exceptions import PipelineCreateException
2023-06-16 12:04:33 +03:00
from data.ModelSlot import RVCModelSlot
2023-05-04 17:50:52 +03:00
from voice_changer.RVC.deviceManager.DeviceManager import DeviceManager
from voice_changer.RVC.embedder.EmbedderManager import EmbedderManager
from voice_changer.RVC.inferencer.InferencerManager import InferencerManager
from voice_changer.RVC.pipeline.Pipeline import Pipeline
from voice_changer.RVC.pitchExtractor.PitchExtractorManager import PitchExtractorManager
2023-08-05 06:33:31 +03:00
from voice_changer.utils.VoiceChangerParams import VoiceChangerParams
2023-05-04 17:50:52 +03:00
2023-08-05 06:33:31 +03:00
def createPipeline(params: VoiceChangerParams, modelSlot: RVCModelSlot, gpu: int, f0Detector: str):
2023-05-04 17:50:52 +03:00
dev = DeviceManager.get_instance().getDevice(gpu)
half = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
# Inferencer 生成
try:
2023-08-05 06:33:31 +03:00
modelPath = os.path.join(params.model_dir, str(modelSlot.slotIndex), os.path.basename(modelSlot.modelFile))
inferencer = InferencerManager.getInferencer(modelSlot.modelType, modelPath, gpu)
2023-05-04 17:50:52 +03:00
except Exception as e:
print("[Voice Changer] exception! loading inferencer", e)
traceback.print_exc()
raise PipelineCreateException("[Voice Changer] exception! loading inferencer")
2023-05-04 17:50:52 +03:00
# Embedder 生成
try:
embedder = EmbedderManager.getEmbedder(
modelSlot.embedder,
# emmbedderFilename,
half,
dev,
)
except Exception as e:
print("[Voice Changer] exception! loading embedder", e, dev)
2023-05-04 17:50:52 +03:00
traceback.print_exc()
raise PipelineCreateException("[Voice Changer] exception! loading embedder")
2023-05-04 17:50:52 +03:00
# pitchExtractor
pitchExtractor = PitchExtractorManager.getPitchExtractor(f0Detector, gpu)
2023-05-04 17:50:52 +03:00
# index, feature
2023-08-05 06:33:31 +03:00
indexPath = os.path.join(params.model_dir, str(modelSlot.slotIndex), os.path.basename(modelSlot.indexFile))
index = _loadIndex(indexPath)
2023-05-04 17:50:52 +03:00
pipeline = Pipeline(
embedder,
inferencer,
pitchExtractor,
index,
modelSlot.samplingRate,
dev,
half,
)
return pipeline
2023-08-05 06:33:31 +03:00
def _loadIndex(indexPath: str):
2023-05-04 17:50:52 +03:00
# Indexのロード
print("[Voice Changer] Loading index...")
# ファイル指定があってもファイルがない場合はNone
2023-08-05 06:33:31 +03:00
if os.path.exists(indexPath) is not True or os.path.isfile(indexPath) is not True:
print("[Voice Changer] Index file is not found")
2023-05-24 09:09:25 +03:00
return None
2023-05-04 17:50:52 +03:00
try:
2023-08-05 06:33:31 +03:00
print("Try loading...", indexPath)
index = faiss.read_index(indexPath)
except: # NOQA
2023-05-04 17:50:52 +03:00
print("[Voice Changer] load index failed. Use no index.")
traceback.print_exc()
2023-05-24 09:09:25 +03:00
return None
2023-05-04 17:50:52 +03:00
2023-05-24 09:09:25 +03:00
return index