mirror of
https://github.com/w-okada/voice-changer.git
synced 2025-01-23 21:45:00 +03:00
78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
import os
|
|
import traceback
|
|
import faiss
|
|
from Exceptions import PipelineCreateException
|
|
from data.ModelSlot import RVCModelSlot
|
|
|
|
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
|
|
from voice_changer.utils.VoiceChangerParams import VoiceChangerParams
|
|
|
|
|
|
def createPipeline(params: VoiceChangerParams, modelSlot: RVCModelSlot, gpu: int, f0Detector: str):
|
|
dev = DeviceManager.get_instance().getDevice(gpu)
|
|
half = DeviceManager.get_instance().halfPrecisionAvailable(gpu)
|
|
|
|
# Inferencer 生成
|
|
try:
|
|
modelPath = os.path.join(params.model_dir, str(modelSlot.slotIndex), os.path.basename(modelSlot.modelFile))
|
|
inferencer = InferencerManager.getInferencer(modelSlot.modelType, modelPath, gpu, modelSlot.version)
|
|
except Exception as e:
|
|
print("[Voice Changer] exception! loading inferencer", e)
|
|
traceback.print_exc()
|
|
raise PipelineCreateException("[Voice Changer] exception! loading inferencer")
|
|
|
|
# Embedder 生成
|
|
try:
|
|
embedder = EmbedderManager.getEmbedder(
|
|
modelSlot.embedder,
|
|
# emmbedderFilename,
|
|
half,
|
|
dev,
|
|
)
|
|
except Exception as e:
|
|
print("[Voice Changer] exception! loading embedder", e, dev)
|
|
traceback.print_exc()
|
|
raise PipelineCreateException("[Voice Changer] exception! loading embedder")
|
|
|
|
# pitchExtractor
|
|
pitchExtractor = PitchExtractorManager.getPitchExtractor(f0Detector, gpu)
|
|
|
|
# index, feature
|
|
indexPath = os.path.join(params.model_dir, str(modelSlot.slotIndex), os.path.basename(modelSlot.indexFile))
|
|
index = _loadIndex(indexPath)
|
|
|
|
pipeline = Pipeline(
|
|
embedder,
|
|
inferencer,
|
|
pitchExtractor,
|
|
index,
|
|
modelSlot.samplingRate,
|
|
dev,
|
|
half,
|
|
)
|
|
|
|
return pipeline
|
|
|
|
|
|
def _loadIndex(indexPath: str):
|
|
# Indexのロード
|
|
print("[Voice Changer] Loading index...")
|
|
# ファイル指定があってもファイルがない場合はNone
|
|
if os.path.exists(indexPath) is not True or os.path.isfile(indexPath) is not True:
|
|
print("[Voice Changer] Index file is not found")
|
|
return None
|
|
|
|
try:
|
|
print("Try loading...", indexPath)
|
|
index = faiss.read_index(indexPath)
|
|
except: # NOQA
|
|
print("[Voice Changer] load index failed. Use no index.")
|
|
traceback.print_exc()
|
|
return None
|
|
|
|
return index
|