Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
accessibility_movie_2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵心治
accessibility_movie_2
Commits
56bb731b
Commit
56bb731b
authored
Aug 08, 2023
by
cxy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove pb zm
parent
6119b401
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
200 additions
and
20 deletions
+200
-20
constant.py
constant.py
+8
-4
create_dialog_ui.py
create_dialog_ui.py
+9
-6
main_window.py
main_window.py
+172
-4
main_window_ui.py
main_window_ui.py
+2
-2
management.py
management.py
+9
-2
start.py
start.py
+0
-2
No files found.
constant.py
View file @
56bb731b
...
...
@@ -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
:
...
...
create_dialog_ui.py
View file @
56bb731b
...
...
@@ -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"
,
"取消"
))
main_window.py
View file @
56bb731b
...
...
@@ -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/
%.3
f.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/
%.3
f.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
:
...
...
main_window_ui.py
View file @
56bb731b
...
...
@@ -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
)
...
...
management.py
View file @
56bb731b
...
...
@@ -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
...
...
start.py
View file @
56bb731b
...
...
@@ -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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment