Commit 56bb731b authored by cxy's avatar cxy

remove pb zm

parent 6119b401
......@@ -12,12 +12,16 @@ import os
class Content:
StartTimeColumn = 0
AsideColumnNumber = 2
SpeedColumnNumber = 3
ActivateColumns = [2, 3]
AsideColumnNumber = 4
SpeedColumnNumber = 5
# ActivateColumns = [2, 3]
ActivateColumns = [4,5]
# ColumnCount = 3
ObjectName = "all_tableWidget"
TimeFormatColumns = [0]
# TimeFormatColumns = [0]
TimeFormatColumns = [0, 1]
SpeedList = ["1.00(4字/秒)", "1.10(4.5字/秒)", "1.25(5字/秒)",
"1.50(6字/秒)", "1.75(7字/秒)", "2.00(8字/秒)", "2.50(10字/秒)"]
class Aside:
......
......@@ -24,17 +24,20 @@ class Ui_Dialog(object):
self.name_input.setObjectName("name_input")
self.root_input = QtWidgets.QLineEdit(Dialog)
self.root_input.setObjectName("root_input")
self.gridLayout.addWidget(self.root_input, 1, 1, 1, 1)
self.gridLayout.addWidget(self.root_input, 0, 1, 1, 1)
self.get_dir = QtWidgets.QPushButton(Dialog)
self.get_dir.setObjectName("get_dir")
self.gridLayout.addWidget(self.get_dir, 1, 2, 1, 1)
self.gridLayout.addWidget(self.get_dir, 0, 2, 1, 1)
self.rootLabel = QtWidgets.QLabel(Dialog)
self.rootLabel.setObjectName("rootLabel")
self.gridLayout.addWidget(self.rootLabel, 1, 0, 1, 1)
self.gridLayout.addWidget(self.rootLabel, 0, 0, 1, 1)
self.nameLabel = QtWidgets.QLabel(Dialog)
self.nameLabel.setObjectName("nameLabel")
self.gridLayout.addWidget(self.nameLabel, 0, 0, 1, 1)
self.gridLayout.addWidget(self.name_input, 0, 1, 1, 1)
self.gridLayout.addWidget(self.nameLabel, 1, 0, 1, 1)
self.gridLayout.addWidget(self.name_input, 1, 1, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
......@@ -64,7 +67,7 @@ class Ui_Dialog(object):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.nameLabel.setText(_translate("Dialog", "工程名称"))
self.rootLabel.setText(_translate("Dialog", "工程文件夹"))
self.rootLabel.setText(_translate("Dialog", "目标路径"))
self.get_dir.setText(_translate("Dialog", "打开文件夹"))
self.confirm.setText(_translate("Dialog", "确认"))
self.cancel.setText(_translate("Dialog", "取消"))
......@@ -250,8 +250,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# 表格双击和发生change时的处理
self.zm_tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.zm_tableWidget.itemDoubleClicked.connect(self.change_video_time)
# self.all_tableWidget.itemDoubleClicked.connect(self.change_video_time)
# self.all_tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.all_tableWidget.itemChanged.connect(self.write2ProjectFromContent)
self.all_tableWidget.itemChanged.connect(self.generate_audio_slot_all)
self.all_tableWidget.itemDoubleClicked.connect(self.change_video_time)
self.all_tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.all_tableWidget.itemDoubleClicked.connect(
self.all_item_changed_by_double_clicked_slot)
......@@ -988,6 +992,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if table.objectName() == constant.Content.ObjectName:
elem_list = elem.to_short_list()
time_format_col_list = constant.Content.TimeFormatColumns
btn = QPushButton()
btn.setText(f"预览{idx}")
col = len(elem_list)
btn.clicked.connect(self.audio_preview_slot_all)
table.setCellWidget(idx, col, btn)
if table.objectName() == constant.Subtitle.ObjectName:
elem_list = elem.to_subtitle_list()
time_format_col_list = constant.Subtitle.TimeFormatColumns
......@@ -1012,6 +1021,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# 需要格式化成hh:mm:ss格式
if j in time_format_col_list and type(text) == str and len(text) != 0:
text = utils.transfer_second_to_time(text)
if table.objectName() == constant.Content.ObjectName and j == constant.Content.SpeedColumnNumber:
qcombo = QtWidgets.QComboBox()
qcombo.addItems(constant.Content.SpeedList)
qcombo.setCurrentIndex(constant.Content.SpeedList.index(text))
qcombo.currentIndexChanged.connect(self.change_audio_speed)
table.setCellWidget(idx, j, qcombo)
if table.objectName() == constant.Aside.ObjectName and j == constant.Aside.SpeedColumnNumber:
qcombo = QtWidgets.QComboBox()
qcombo.addItems(constant.Aside.SpeedList)
......@@ -1064,6 +1079,43 @@ class MainWindow(QMainWindow, Ui_MainWindow):
else:
self.prompt_dialog.show_with_msg("暂无音频可供预览,请重新生成")
def audio_preview_slot_all(self):
"""字幕旁白界面音频预览,会同步播放视频,并更新视频信息相关组件
"""
btn = self.sender()
# 法1:按照物理位置。这样的结果不太对
idx = self.all_tableWidget.indexAt(btn.pos())
print("index:", idx.row())
# 获取时间
item = self.all_tableWidget.item(idx.row(), 0)
audio_path = None
pos_sec = utils.trans_to_seconds(item.text())
audio_path = os.path.dirname(self.projectContext.excel_path) + (
"/tmp/%.3f.wav" % pos_sec)
print("待播放的音频文件为", audio_path)
if audio_path is not None:
# 确认该音频是否正在合成中
for t in self.all_threads:
if t.name == "single_speech_synthesis" and t.is_alive():
if audio_path in t._args:
self.prompt_dialog.show_with_msg("音频正在合成,请稍候")
return
# 2、如果找到了该音频,则新起一个线程播放
if audio_path != None and os.path.exists(audio_path):
print(audio_path)
t = RunThread(funcName=self.play_audio,
args=(audio_path, ),
name="play_audio")
t.start()
self.all_threads.append(t)
self.player.setPosition(int(pos_sec*1000))
# 做播放视频的操作,绑定播放按钮的变化
self.is_video_playing = False
self.playVideo()
else:
self.prompt_dialog.show_with_msg("暂无音频可供预览,请重新生成")
def checkIfTableItemCanChange(self, table: QTableWidget, i: int, j: int):
"""确认单元格是否可编辑
......@@ -1075,10 +1127,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
Returns:
bool: True(可编辑) or False(不可编辑)
"""
if table.objectName() == self.all_tableWidget.objectName():
return True
# if table.objectName() == self.all_tableWidget.objectName():
# return True
if table.objectName() == self.pb_tableWidget.objectName() and j in constant.Aside.ActivateColumns:
return True
if table.objectName() == self.all_tableWidget.objectName() and j in constant.Content.ActivateColumns:
return True
return False
def save_project(self):
......@@ -1182,6 +1236,82 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# 合成这一段语音
self.do_generate_audio_by_aside_row(int(row))
def generate_audio_slot_all(self, item):
"""生成临时旁白音频
Args:
item : 被选中的单元格
在set表格的时候(初始化),不会触发。只有双击修改或切换语速时才会触发
"""
try:
if self.projectContext.initial_ing == True:
return
if item is None:
print("WRONG!!!! item Is None")
return
if self.is_user_editing() == False:
return
self.set_user_edit(False)
# 不需要set为False
row = item.row() # 获取行数
col = item.column() # 获取列数 注意是column而不是col
# 只有更新语速或者更新旁白,才需要重新生成音频
if col not in constant.Content.ActivateColumns:
return
# 停止预览,释放当前占用的音频文件
self.audio_player.setMedia(QMediaContent())
# 合成这一段语音
self.do_generate_audio_by_aside_row_all(int(row))
except Exception as e:
print(e)
def do_generate_audio_by_aside_row_all(self, row: int):
"""根据行号生成对应旁白文本的临时音频
Args:
row (int): 旁白表格中的行号
传入pb_tableWidget中的行号,生成对应音频
"""
from speech_synthesis import speech_synthesis, Speaker, choose_speaker
audio_dir = os.path.dirname(self.projectContext.excel_path)
wav_path = audio_dir + \
'/tmp/%.3f.wav' % float(
self.projectContext.all_elements[int(row)].st_time_sec)
print("wav_path:", wav_path)
try:
# speed_info = self.projectContext.speaker_speed
# 使用私有 语速
speed_info = self.projectContext.all_elements[int(row)].speed
speaker_info = self.projectContext.speaker_info
speed = float(speed_info.split('(')[0])
speaker_name = speaker_info.split(",")[0]
speaker = self.projectContext.choose_speaker(speaker_name)
text = self.projectContext.all_elements[int(row)].aside
self.projectContext.all_elements[int(row)].print_self()
# 如果目前wav_path存在,且旁白字数清空了,那就把已生成wav删掉
if text is None or len(text) == 0:
if os.path.exists(wav_path):
os.remove(wav_path)
return
# 把目前在执行的单条语音的合成线程先停掉
for t in self.all_threads:
if wav_path in t._args and t.name == "single_speech_synthesis" and t.is_alive():
stop_thread(t)
t = RunThread(funcName=speech_synthesis,
args=(text, wav_path, speaker, speed),
name="single_speech_synthesis")
t.setDaemon(True)
t.start()
self.all_threads.append(t)
except Exception as e:
print(e)
def do_generate_audio_by_aside_row(self, row: int):
"""根据行号生成对应旁白文本的临时音频
......@@ -1350,6 +1480,44 @@ class MainWindow(QMainWindow, Ui_MainWindow):
int(idx), constant.Content.SpeedColumnNumber, QTableWidgetItem(text))
self.projectContext.refresh_aside_speed(row, text)
def write2ProjectFromContent(self, item):
"""将表格中修改的内容更新至工程中
Args:
item: 修改的单元格
"""
if self.projectContext.initial_ing == True:
return
if self.is_user_editing() == False:
return
if item is None:
print("WRONG!!!! item Is None")
return
else:
row = item.row() # 获取行数
col = item.column() # 获取列数 注意是column而不是col哦
text = item.text() # 获取内容
if col not in constant.Content.ActivateColumns:
return
# 更新【字幕旁白】这个tab里的字,如果是语速,那就更新语速这一列,如果是旁白,那就更新旁白这一列
try:
print("行号", row)
print("开始时间", self.projectContext.all_elements[row].st_time_sec)
idx = self.projectContext.aside_subtitle_2contentId(
self.projectContext.all_elements[row])
print("对应index", idx)
if col == constant.Content.AsideColumnNumber:
# self.all_tableWidget.setItem(
# int(idx), constant.Content.AsideColumnNumber, QTableWidgetItem(text))
self.projectContext.refresh_element(row, text)
elif col == constant.Content.SpeedColumnNumber:
# self.all_tableWidget.setItem(
# int(idx), constant.Content.SpeedColumnNumber, QTableWidgetItem(text))
self.projectContext.refresh_speed(row, text)
except Exception as e:
print(e)
def undo_slot(self):
"""撤销之前对表格内容的修改操作
......@@ -1425,7 +1593,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
"""
cur_time = self.player.position() / 1000
if self.curTab == 0:
if not self.is_user_editing() and self.curTab == 0:
all_elements = self.projectContext.all_elements
for i in range(len(all_elements) - 1, -1, -1):
if utils.trans_to_seconds(all_elements[i].st_time_sec) <= cur_time:
......
......@@ -225,7 +225,7 @@ class Ui_MainWindow(object):
self.zm_tableWidget.setRowCount(0)
self.zm_tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.horizontalLayout_2.addWidget(self.zm_tableWidget)
self.tabWidget.addTab(self.zm_tab, "")
# self.tabWidget.addTab(self.zm_tab, "")
self.pb_tab = QtWidgets.QWidget()
self.pb_tab.setObjectName("pb_tab")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.pb_tab)
......@@ -236,7 +236,7 @@ class Ui_MainWindow(object):
self.pb_tableWidget.setRowCount(0)
self.pb_tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.horizontalLayout_3.addWidget(self.pb_tableWidget)
self.tabWidget.addTab(self.pb_tab, "")
# self.tabWidget.addTab(self.pb_tab, "")
self.shuiping.addWidget(self.tabWidget)
self.shuiping.setStretch(0, 3)
self.shuiping.setStretch(1, 5)
......
......@@ -96,7 +96,8 @@ class Element:
def to_list(self):
return [self.st_time_sec, self.ed_time_sec, self.subtitle, self.suggest, self.aside, self.speed]
def to_short_list(self):
return [self.st_time_sec, self.subtitle, self.aside, self.speed]
# return [self.st_time_sec, self.subtitle, self.aside, self.speed]
return [self.st_time_sec, self.ed_time_sec, self.subtitle, self.suggest, self.aside, self.speed]
def to_aside_list(self):
# return [self.st_time_sec, self.ed_time_sec, self.suggest, self.aside, self.speed]
return [self.st_time_sec, self.suggest, self.aside, self.speed]
......@@ -128,7 +129,8 @@ class ProjectContext:
self.aside_header = ['起始时间', '推荐字数', '解说脚本',"语速", "预览音频"]
self.subtitle_header = ["起始时间", "终止时间", "字幕"]
self.contentHeader = ["起始时间", "字幕", "解说脚本", "语速"]
# self.contentHeader = ["起始时间", "字幕", "解说脚本", "语速"]
self.contentHeader = ["起始时间", "结束时间", "字幕", "推荐字数", "解说脚本", "语速", "预览音频"]
self.excel_sheet_name = "旁白插入位置建议"
self.history_records = []
self.records_pos = 0
......@@ -254,6 +256,11 @@ class ProjectContext:
if not self.initial_ing:
save_excel_to_path(self.all_elements, self.excel_path, self.write_header, self.excel_sheet_name)
def refresh_speed(self, row, speed: str)->None:
self.all_elements[int(row)].speed = speed
if not self.initial_ing:
save_excel_to_path(self.all_elements, self.excel_path, self.write_header, self.excel_sheet_name)
# 加载整个工程,填充到ProjectContext上下文中
def load_project(self):
pass
......
......@@ -8,7 +8,6 @@ from PyQt5.QtWidgets import *;
from main_window import MainWindow
from qt_material import apply_stylesheet
import os
import subprocess
os.environ['PYQTGRAPH_QT_LIB'] = 'PyQt5'
project_path = None
......@@ -23,7 +22,6 @@ def change_project_path(path):
if __name__ == '__main__':
try:
subprocess.call(['deploy.bat'])
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
currentExitCode = MainWindow.EXIT_CODE_REBOOT
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment