Skip to content

Commit

Permalink
Client Improvement
Browse files Browse the repository at this point in the history
1. [GUI] Support torch version management (WIP)
2. [GUI] Fix the issue that PlainTextEdits parse no string when sending textChanged signals
3. [GUI] Change 'ChildWindow_TTS' to 'ChildWindow_TTS_VITS'
4. [Core] Merge source code from the latest version of GPT-SoVITS
  • Loading branch information
Spr-Aachen committed Jun 9, 2024
1 parent 526edf1 commit 31c7108
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 72 deletions.
38 changes: 26 additions & 12 deletions EVT_GUI/EnvConfigurator.py
Original file line number Diff line number Diff line change
Expand Up @@ -498,33 +498,47 @@ def Check_Pytorch(self, Package: str):
except OSError:
return False

def Install_Pytorch(self, Package: str):
pynvml.nvmlInit()
CudaList = [117, 118, 121]
CudaVersion = min(CudaList, key = lambda Cuda: abs(Cuda - pynvml.nvmlSystemGetCudaDriverVersion()//100))
MirrorList = [f'https://download.pytorch.org/whl/cu{CudaVersion}', '']
for Mirror in MirrorList:
Result = RunCMD([f'pip3 install {Package} -y --index-url {Mirror}' if Package in ['torch', 'torchvision', 'torchaudio'] else f'pip3 install {Package} -y'])
if Result.returncode == 0:
break
def Install_Pytorch(self, Package: str, Reinstall: bool):
DisplayCommand = 'cmd /c start cmd /k ' if platform.system() == 'Windows' else 'x-terminal-emulator -e '
if Package in ('torch', 'torchvision', 'torchaudio'):
pynvml.nvmlInit()
CudaList = [117, 118, 121]
CudaVersion = min(CudaList, key = lambda Cuda: abs(Cuda - pynvml.nvmlSystemGetCudaDriverVersion()//100))
MirrorList = [f'https://download.pytorch.org/whl/cu{CudaVersion}', '']
for Mirror in MirrorList:
Result = RunCMD([
DisplayCommand if Reinstall else '' + f'pip3 install {Package} -y --index-url {Mirror}' + '--force-reinstall' if Reinstall else ''
])
if Result.returncode == 0:
break
else:
RunCMD(
[DisplayCommand if Reinstall else '' + f'pip3 uninstall {Package} -y'] if Reinstall else [] +
[DisplayCommand if Reinstall else '' + f'pip3 install {Package} -y']
)

def Execute_Pytorch_Installation(self):
def Execute_Pytorch_Installation(self, Version: Optional[str] = None, Reinstall: bool = False):
PackageList = ['torch', 'torchvision', 'torchaudio', 'pytorch-lightning']
for Index, Package in enumerate(PackageList):
VersionDict = {
'2.0.1': {'torch': '2.0.1', 'torchvision': '0.15.2', 'torchaudio': '2.0.2', 'pytorch-lightning': '2.1'},
'2.2.2': {'torch': '2.2.2', 'torchvision': '0.17.2', 'torchaudio': '2.2.2', 'pytorch-lightning': '2.2'}
}.get(Version)
for Index, Package in enumerate(PackageList if VersionDict is None else [f'{Package}=={VersionDict[Package]}' for Package in PackageList]):
Result = self.Check_Pytorch(Package)
if Result == False:
if self.EmitFlag == True:
EnvConfiguratorSignals.Signal_PytorchUndetected.emit()
self.EmitFlag = False
EnvConfiguratorSignals.Signal_PytorchStatus.emit(f"Installing {Package}. Please wait...")
try:
self.Install_Pytorch(Package)
self.Install_Pytorch(Package, Reinstall = False)
EnvConfiguratorSignals.Signal_PytorchInstalled.emit() if Index + 1 == len(PackageList) else None
EnvConfiguratorSignals.Signal_PytorchStatus.emit("Successfully installed!") if Index + 1 == len(PackageList) else None
except Exception as e:
EnvConfiguratorSignals.Signal_PytorchInstallFailed.emit(e)
EnvConfiguratorSignals.Signal_PytorchStatus.emit("Installation failed:(")
else:
self.Install_Pytorch(Package, Reinstall) if Reinstall else None
EnvConfiguratorSignals.Signal_PytorchDetected.emit() if Index + 1 == len(PackageList) else None
EnvConfiguratorSignals.Signal_PytorchStatus.emit(f"{Package} detected. Version: {Result}")

Expand Down
43 changes: 5 additions & 38 deletions EVT_GUI/Functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,39 +96,6 @@ def Function_AddToTreeWidget(
)


def Function_SetTreeWidget(
TreeWidget: QTreeWidget,
ItemTexts: dict = {'RootItemText': ('ChildItemText', )},
AddVertically: bool = False,
ExpandItems: bool = True
):
'''
'''
TreeWidget.clear()

RootItems = []

for Index, RootItemText in enumerate(ItemTexts.keys()):
RootItem = QTreeWidgetItem(TreeWidget)
RootItem.setText(0 if AddVertically else Index, RootItemText)
RootItemTextFont = QFont()
RootItemTextFont.setPixelSize(15)
RootItem.setFont(0 if AddVertically else Index, RootItemTextFont)
for ChildItemText in ToIterable(list(ItemTexts.values())[Index]):
ChildItem = QTreeWidgetItem(RootItem)
ChildItem.setText(0 if AddVertically else Index, ChildItemText)
ChildItemTextFont = QFont()
ChildItemTextFont.setPixelSize(12)
ChildItem.setFont(0 if AddVertically else Index, ChildItemTextFont)

RootItems.append(RootItem)

TreeWidget.setColumnCount(1) if AddVertically else None
TreeWidget.addTopLevelItems(RootItems)

TreeWidget.expandAll() if ExpandItems else None


def Function_SetChildWidgetsVisibility(
Container: QWidget,
ChildWidgets: list[Optional[QWidget]],
Expand Down Expand Up @@ -268,7 +235,7 @@ def Function_ParamsHandler(
Function to get/set the param of UI
'''
if Mode == "Get":
if isinstance(UI, (QLineEdit, LineEditBase, QPlainTextEdit)):
if isinstance(UI, (QLineEdit, LineEditBase, TextEditBase, QPlainTextEdit)):
return Function_GetText(UI)
if isinstance(UI, QComboBox):
return UI.currentText()
Expand All @@ -281,7 +248,7 @@ def Function_ParamsHandler(
return UI.GetValue()

if Mode == "Set":
if isinstance(UI, (QLineEdit, LineEditBase)):
if isinstance(UI, (QLineEdit, LineEditBase, TextEditBase)):
UI.setText(Param)
if isinstance(UI, QPlainTextEdit):
UI.setPlainText(Param)
Expand Down Expand Up @@ -464,7 +431,7 @@ def Function_SetWidgetValue(
SetPlaceholderText: bool = False,
PlaceholderText: Optional[str] = None
):
if isinstance(Widget, (QLineEdit, LineEditBase, QPlainTextEdit)):
if isinstance(Widget, (QLineEdit, LineEditBase, TextEditBase)):
Function_SetText(Widget, Value, SetPlaceholderText = SetPlaceholderText, PlaceholderText = PlaceholderText)
def EditConfig(Value):
Config.EditConfig(Section, Option, str(Value))
Expand Down Expand Up @@ -555,13 +522,13 @@ def ResetSettings(self):

def ImportSettings(self, ReadPath: str):
ConfigParser = ManageConfig(ReadPath).Parser()
with open(self.ConfigPath, 'w') as Config:
with open(self.ConfigPath, 'w', encoding = 'utf-8') as Config:
ConfigParser.write(Config)
for Widget, value in list(self.RegistratedWidgets.items()):
self.SetParam(Widget, *value)

def ExportSettings(self, SavePath: str):
with open(SavePath, 'w') as Config:
with open(SavePath, 'w', encoding = 'utf-8') as Config:
self.Config.Parser().write(Config)

##############################################################################################################################
Expand Down
45 changes: 42 additions & 3 deletions EVT_GUI/UI_MainWindow.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect, QSize, Qt)
from PySide6.QtWidgets import *

from .Components import WidgetBase, MenuButton, LabelBase, LineEditBase, ComboBoxBase, SpinBoxBase, DoubleSpinBoxBase, ToolBoxBase, ScrollAreaBase, TreeWidgetBase, Table_ViewModels, Table_EditAudioSpeaker
from .Components import WidgetBase, MenuButton, LabelBase, LineEditBase, TextEditBase, ComboBoxBase, SpinBoxBase, DoubleSpinBoxBase, ToolBoxBase, ScrollAreaBase, TreeWidgetBase, Table_ViewModels, Table_EditAudioSpeaker
from . import Sources


Expand Down Expand Up @@ -1435,6 +1435,44 @@ def setupUi(self, MainWindow):

self.horizontalLayout_3.addWidget(self.ToolButton_Env_Install_Title)

self.ToolButton_Env_Manage_Title = QToolButton(self.Frame_Env_Install_Top)
self.ToolButton_Env_Manage_Title.setObjectName(u"ToolButton_Env_Manage_Title")
sizePolicy1.setHeightForWidth(self.ToolButton_Env_Manage_Title.sizePolicy().hasHeightForWidth())
self.ToolButton_Env_Manage_Title.setSizePolicy(sizePolicy1)
self.ToolButton_Env_Manage_Title.setStyleSheet(u"QToolButton {\n"
" font-size: 24px;\n"
" /*text-align: center;*/\n"
" padding-left: 12px;\n"
" padding-right: 12px;\n"
" background-color: transparent;\n"
" border-top-width: 0px;\n"
" border-right-width: 0px;\n"
" border-bottom-width: 3px;\n"
" border-left-width: 0px;\n"
" border-style: solid;\n"
" border-bottom-color: rgba(123, 123, 123, 123);\n"
"}\n"
"QToolButton:hover {\n"
" background-color: transparent;\n"
" border-top-width: 0px;\n"
" border-right-width: 0px;\n"
" border-bottom-width: 3px;\n"
" border-left-width: 0px;\n"
" border-style: solid;\n"
" border-bottom-color: rgba(120, 180, 240, 123);\n"
"}\n"
"QToolButton:checked {\n"
" background-color: transparent;\n"
" border-top-width: 0px;\n"
" border-right-width: 0px;\n"
" border-bottom-width: 3px;\n"
" border-left-width: 0px;\n"
" border-style: solid;\n"
" border-bottom-color: rgba(120, 180, 240, 210);\n"
"}")

self.horizontalLayout_3.addWidget(self.ToolButton_Env_Manage_Title)

self.Frame_Env_Install_Title_Spacer = QLabel(self.Frame_Env_Install_Top)
self.Frame_Env_Install_Title_Spacer.setObjectName(u"Frame_Env_Install_Title_Spacer")
sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
Expand Down Expand Up @@ -11109,7 +11147,7 @@ def setupUi(self, MainWindow):

self.verticalLayout_133.addWidget(self.Label_TTS_GPTSoVITS_Text)

self.PlainTextEdit_TTS_GPTSoVITS_Text = QPlainTextEdit(self.Frame_TTS_GPTSoVITS_Text)
self.PlainTextEdit_TTS_GPTSoVITS_Text = TextEditBase(self.Frame_TTS_GPTSoVITS_Text)
self.PlainTextEdit_TTS_GPTSoVITS_Text.setObjectName(u"PlainTextEdit_TTS_GPTSoVITS_Text")
sizePolicy3.setHeightForWidth(self.PlainTextEdit_TTS_GPTSoVITS_Text.sizePolicy().hasHeightForWidth())
self.PlainTextEdit_TTS_GPTSoVITS_Text.setSizePolicy(sizePolicy3)
Expand Down Expand Up @@ -12200,7 +12238,7 @@ def setupUi(self, MainWindow):

self.verticalLayout_98.addWidget(self.Label_TTS_VITS_Text)

self.PlainTextEdit_TTS_VITS_Text = QPlainTextEdit(self.Frame_TTS_VITS_Text)
self.PlainTextEdit_TTS_VITS_Text = TextEditBase(self.Frame_TTS_VITS_Text)
self.PlainTextEdit_TTS_VITS_Text.setObjectName(u"PlainTextEdit_TTS_VITS_Text")
sizePolicy3.setHeightForWidth(self.PlainTextEdit_TTS_VITS_Text.sizePolicy().hasHeightForWidth())
self.PlainTextEdit_TTS_VITS_Text.setSizePolicy(sizePolicy3)
Expand Down Expand Up @@ -14633,6 +14671,7 @@ def retranslateUi(self, MainWindow):
self.Label_Repo_Text.setText(QCoreApplication.translate("MainWindow", u"TextLabel", None))
self.Label_Donate_Text.setText(QCoreApplication.translate("MainWindow", u"TextLabel", None))
self.ToolButton_Env_Install_Title.setText(QCoreApplication.translate("MainWindow", u"Label", None))
self.ToolButton_Env_Manage_Title.setText(QCoreApplication.translate("MainWindow", u"Label", None))
self.Label_Env_Install_Aria2_Status.setText(QCoreApplication.translate("MainWindow", u"--", None))
self.Label_Env_Install_Aria2.setText(QCoreApplication.translate("MainWindow", u"TextLabel", None))
self.Label_Env_Install_FFmpeg_Status.setText(QCoreApplication.translate("MainWindow", u"--", None))
Expand Down
2 changes: 1 addition & 1 deletion EVT_GUI/Window.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ def __init__(self, parent = None):
self.setTitleBar(self.ui.TitleBar)


class Window_ChildWindow_TTS(ChildWindowBase):
class Window_ChildWindow_TTS_VITS(ChildWindowBase):
ui = Ui_ChildWindow_TTS()

def __init__(self, parent = None):
Expand Down
73 changes: 55 additions & 18 deletions Run.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
##############################################################################################################################

# Set current version
CurrentVersion = "v1.1.1"
CurrentVersion = "v1.1.2"

##############################################################################################################################

Expand Down Expand Up @@ -1119,6 +1119,15 @@ def Main(self):

# EnvInstallation
self.ui.ToolButton_Env_Install_Title.setText(QCA.translate("Label", "自动配置"))
self.ui.ToolButton_Env_Install_Title.setCheckable(True)
self.ui.ToolButton_Env_Install_Title.setChecked(True)
self.ui.ToolButton_Env_Install_Title.setAutoExclusive(True)
self.ui.ToolButton_Env_Install_Title.clicked.connect(
lambda: Function_AnimateStackedWidget(
StackedWidget = self.ui.StackedWidget_Pages_Env,
TargetIndex = 0
)
)

self.ui.Label_Env_Install_Aria2.setText(QCA.translate("Label", "Aria2"))
Function_SetMethodExecutor(self,
Expand Down Expand Up @@ -1340,6 +1349,34 @@ def Main(self):
lambda Status: self.ui.Label_Env_Install_Pytorch_Status.setText(Status)
)

# EnvManagement
self.ui.ToolButton_Env_Manage_Title.setText(QCA.translate("ToolButton", "安装管理"))
self.ui.ToolButton_Env_Manage_Title.setCheckable(True)
self.ui.ToolButton_Env_Manage_Title.setChecked(False)
self.ui.ToolButton_Env_Manage_Title.setAutoExclusive(True)
self.ui.ToolButton_Env_Manage_Title.clicked.connect(
lambda: Function_AnimateStackedWidget(
StackedWidget = self.ui.StackedWidget_Pages_Env,
TargetIndex = 1
)
)

self.ui.ToolBox_Env_Manage_Pytorch.widget(0).setText(QCA.translate("ToolBox", "Pytorch"))
self.ui.ToolBox_Env_Manage_Pytorch.widget(0).collapse()

self.ui.Label_Env_Manage_Pytorch_Version.setText(QCA.translate("Label", "选择Pytorch版本"))
self.ui.ComboBox_Env_Manage_Pytorch_Version.addItems([ '2.0.1', '2.2.2'])

self.ui.Button_Env_Manage_Pytorch_Install.setText(QCA.translate("Button", "重装"))
Function_SetMethodExecutor(self,
ExecuteButton = self.ui.Button_Env_Manage_Pytorch_Install,
Method = Pytorch_Installer.Execute,
ParamsFrom = [
self.ui.ComboBox_Env_Manage_Pytorch_Version,
True
]
)

#############################################################
####################### Content: Models #####################
#############################################################
Expand Down Expand Up @@ -6516,61 +6553,61 @@ def SetText_LineEdit_Train_VITS_OutputDir():
)

# ChildWindow
ChildWindow_TTS = Window_ChildWindow_TTS(self)
ChildWindow_TTS_VITS = Window_ChildWindow_TTS_VITS(self)

ChildWindow_TTS.ui.Button_Close.clicked.connect(
ChildWindow_TTS_VITS.ui.Button_Close.clicked.connect(
lambda: Function_ShowMessageBox(self,
QMessageBox.Question, "Ask",
"确认退出试听?",
QMessageBox.Yes|QMessageBox.No,
{
QMessageBox.Yes: lambda: (
ChildWindow_TTS.ui.Widget.ReleaseMediaPlayer(),
ChildWindow_TTS.close()
ChildWindow_TTS_VITS.ui.Widget.ReleaseMediaPlayer(),
ChildWindow_TTS_VITS.close()
)
}
)
)
ChildWindow_TTS.ui.Button_Maximize.clicked.connect(lambda: ChildWindow_TTS.showNormal() if ChildWindow_TTS.isMaximized() else ChildWindow_TTS.showMaximized())
ChildWindow_TTS_VITS.ui.Button_Maximize.clicked.connect(lambda: ChildWindow_TTS_VITS.showNormal() if ChildWindow_TTS_VITS.isMaximized() else ChildWindow_TTS_VITS.showMaximized())

Function_SetText(
Widget = ChildWindow_TTS.ui.Label_Title,
Widget = ChildWindow_TTS_VITS.ui.Label_Title,
Text = SetRichText(
Title = QCA.translate("Label", "语音合成结果")
)
)
Function_SetText(
Widget = ChildWindow_TTS.ui.Label_Text,
Widget = ChildWindow_TTS_VITS.ui.Label_Text,
Text = SetRichText(
Body = QCA.translate("Label", "点击播放按钮以试听合成语音")
)
)

ChildWindow_TTS.ui.Button_Cancel.setText(QCA.translate("Button", "丢弃"))
ChildWindow_TTS.ui.Button_Cancel.clicked.connect(
ChildWindow_TTS_VITS.ui.Button_Cancel.setText(QCA.translate("Button", "丢弃"))
ChildWindow_TTS_VITS.ui.Button_Cancel.clicked.connect(
lambda: Function_ShowMessageBox(self,
QMessageBox.Question, "Ask",
"确认丢弃音频?",
QMessageBox.Yes|QMessageBox.No,
{
QMessageBox.Yes: lambda: (
ChildWindow_TTS.ui.Widget.ReleaseMediaPlayer(),
ChildWindow_TTS_VITS.ui.Widget.ReleaseMediaPlayer(),
os.remove(self.ui.LineEdit_TTS_VITS_AudioPathSave.text()),
ChildWindow_TTS.close()
ChildWindow_TTS_VITS.close()
)
}
)
)
ChildWindow_TTS.ui.Button_Confirm.setText(QCA.translate("Button", "保留"))
ChildWindow_TTS.ui.Button_Confirm.clicked.connect(
ChildWindow_TTS_VITS.ui.Button_Confirm.setText(QCA.translate("Button", "保留"))
ChildWindow_TTS_VITS.ui.Button_Confirm.clicked.connect(
lambda: Function_ShowMessageBox(self,
QMessageBox.Question, "Ask",
"确认保留音频?",
QMessageBox.Yes|QMessageBox.No,
{
QMessageBox.Yes: lambda: (
ChildWindow_TTS.ui.Widget.ReleaseMediaPlayer(),
ChildWindow_TTS.close()
ChildWindow_TTS_VITS.ui.Widget.ReleaseMediaPlayer(),
ChildWindow_TTS_VITS.close()
)
}
)
Expand Down Expand Up @@ -6644,10 +6681,10 @@ def SetText_LineEdit_Train_VITS_OutputDir():
],
FinishEvents = [
lambda: self.ShowMask(True, "正在加载播放器"),
lambda: ChildWindow_TTS.ui.Widget.SetMediaPlayer(
lambda: ChildWindow_TTS_VITS.ui.Widget.SetMediaPlayer(
self.ui.LineEdit_TTS_VITS_AudioPathSave.text()
),
ChildWindow_TTS.exec,
ChildWindow_TTS_VITS.exec,
lambda: Function_ShowMessageBox(self,
QMessageBox.Information, "Tip",
"当前任务已执行结束。"
Expand Down

0 comments on commit 31c7108

Please sign in to comment.