pyvideotrans / videotrans /task /separate_worker.py
jameson512
Upload files via LFS
1f235c3
Raw
History Blame Contribute Delete
3.6 kB
# 从日志队列获取日志
import time
from pathlib import Path
from PySide6.QtCore import QThread, Signal as pyqtSignal
from videotrans.configure.config import ROOT_DIR, tr, settings, logger
from videotrans.configure import config
from videotrans.process.prepare_audio import vocal_bgm
from videotrans.process.signelobj import GlobalProcessManager
from videotrans.util import tools
class SeparateWorker(QThread):
finish_event = pyqtSignal(str)
def __init__(self, *, file=None, out=None, parent=None, uuid=None):
super().__init__(parent=parent)
self.file = file
self.uuid = uuid
self.out = out
self.vocal=None
self.error=None
def _process_callback(self,data):
if isinstance(data,str):
return self.finish_event.emit(f'logs:{data}')
if not isinstance(data,dict):
return
msg_type = data.get("type")
percent = data.get("percent")
filename = data.get("filename")
if msg_type == "file":
self.finish_event.emit(f"logs:{tr('Downloading please wait')} {filename} {percent:.2f}%")
else:
current_file_idx = data.get("current")
total_files = data.get("total")
self.finish_event.emit(f"logs:{tr('Downloading please wait')} {current_file_idx}/{total_files} files")
def run(self):
try:
uvr_models=settings.get('uvr_models')
if uvr_models.startswith('spleeter'):
tools.down_file_from_ms(f'{ROOT_DIR}/models/onnx', [
f"https://www.modelscope.cn/models/himyworld/videotrans/resolve/master/onnx/vocals.fp16.onnx",
f"https://www.modelscope.cn/models/himyworld/videotrans/resolve/master/onnx/accompaniment.fp16.onnx"
], callback=self._process_callback)
else:
tools.down_file_from_ms(f'{ROOT_DIR}/models/onnx', [
f"https://www.modelscope.cn/models/himyworld/videotrans/resolve/master/onnx/{uvr_models}.onnx"
], callback=self._process_callback)
p=Path(self.file)
self.vocal=f"{self.out}/vocal-{p.stem}.wav"
self.finish_event.emit('logs:Separating vocals from the background ...')
# 如果不是wav,需要先转为wav
if p.suffix.lower()!= '.wav':
newfile = config.TEMP_DIR + f'/sep-{time.time()}.wav'
cmd = [
"-y",
"-i",
self.file,
"-vn",
"-ac",
"2",
"-ar",
"44100",
newfile
]
tools.runffmpeg(cmd)
self.file = newfile
tools.set_process(text='start separate...',uuid=self.uuid)
kw={"input_file":self.file,"vocal_file":self.vocal,"instr_file":f"{self.out}/instrument-{p.stem}.wav","uvr_models":uvr_models}
future=GlobalProcessManager.submit_task_cpu(
vocal_bgm,
**kw
)
rs,err=future.result(timeout=3600)
if rs is False:
self.finish_event.emit(err)
except Exception as e:
logger.exception(f'分离人声背景声失败{e}',exc_info=True)
msg = f"error:separate vocal and background music:{str(e)}"
self.error=msg
self.finish_event.emit(msg)
else:
self.finish_event.emit('succeed')