增强了功能,增加了List合并小工具

This commit is contained in:
XTer 2024-03-21 15:05:26 +08:00
parent 9125424f3a
commit 28d3a5bfa5
2 changed files with 160 additions and 63 deletions

View File

@ -1,4 +1,5 @@
import srt import srt
import shutil
def parse_srt_with_lib(content): def parse_srt_with_lib(content):
@ -87,10 +88,47 @@ def slice_audio_with_lib(audio_path, save_folder, format, subtitles, pre_preserv
try: try:
audio = pydub.AudioSegment.from_file(audio_path) audio = pydub.AudioSegment.from_file(audio_path)
sliced_audio = audio[int(start * 1000):int(end * 1000)] sliced_audio = audio[int(start * 1000):int(end * 1000)]
file_name = f'{i + 1:03d}.{format}' file_name = f'{character}_{i + 1:03d}.{format}'
save_path = os.path.join(save_folder, file_name) save_path = os.path.join(save_folder, file_name)
sliced_audio.export(save_path, format=format) sliced_audio.export(save_path, format=format)
f.write(f"{file_name}|{character}|{language}|{subtitle.content}\n") f.write(f"{file_name}|{character}|{language}|{subtitle.content}\n")
except Exception as e: except Exception as e:
raise e raise e
def merge_list_folders(first_list_file, second_list_file, character, first_folder, second_folder):
merged_lines = []
character1 = ""
filenames = set()
with open(first_list_file, 'r', encoding="utf-8") as f:
first_list = f.readlines()
for line in first_list:
filename, character1, language, content = line.split('|')
filenames.add(filename)
if character=="" or character is None:
character = character1
new_line = f"{filename}|{character}|{language}|{content}"
merged_lines.append(new_line)
with open(second_list_file, 'r', encoding="utf-8") as f:
second_list = f.readlines()
for line in second_list:
filename, _, language, content = line.split('|')
orig_filename = filename
num = 1
while filename in filenames:
filename = f"{filename.rsplit('.', 1)[0]}_{num}.{filename.rsplit('.', 1)[1]}"
num += 1
try:
os.rename(os.path.join(second_folder, orig_filename), os.path.join(first_folder, filename))
except Exception as e:
raise e
new_line = f"{filename}|{character}|{language}|{content}"
merged_lines.append(new_line)
os.remove(second_list_file)
if not os.listdir(second_folder):
os.rmdir(second_folder)
with open(first_list_file, 'w', encoding="utf-8") as f:
f.writelines(merged_lines)
return "\n".join(merged_lines)

View File

@ -1,9 +1,18 @@
import gradio as gr import gradio as gr
import sys import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))
sys.path.append('.') sys.path.append('.')
sys.path.append('..') from srt_utils import (
from tools.srt_slicer.srt_utils import merge_subtitles_with_lib, parse_srt_with_lib, generate_srt_with_lib, slice_audio_with_lib, count_words_multilang merge_subtitles_with_lib,
parse_srt_with_lib,
generate_srt_with_lib,
slice_audio_with_lib,
count_words_multilang,
merge_list_folders
)
from i18n.i18n import I18nAuto from i18n.i18n import I18nAuto
@ -19,7 +28,6 @@ def merge_srt(input_text, output_text, short_interval=0.1, max_interval=1, max_t
return output_text return output_text
def slice_audio( def slice_audio(
input_audio, input_audio,
save_folder, save_folder,
@ -46,6 +54,7 @@ def slice_audio(
os.makedirs(character_folder, exist_ok=True) os.makedirs(character_folder, exist_ok=True)
subtitles = parse_srt_with_lib(output_text) subtitles = parse_srt_with_lib(output_text)
try: try:
gr.Info(f"{i18n('正在切分音频')} {input_audio} {i18n('')} {character_folder}")
slice_audio_with_lib( slice_audio_with_lib(
input_audio, input_audio,
character_folder, character_folder,
@ -58,6 +67,7 @@ def slice_audio(
language, language,
character, character,
) )
gr.Info(f"{i18n('切分完成')} ")
except Exception as e: except Exception as e:
gr.Warning(f"Can't Slice, Error: {e}") gr.Warning(f"Can't Slice, Error: {e}")
@ -152,6 +162,39 @@ def save_srt_to_file(srt_text, save_folder, character):
with open(srt_file, "w", encoding="utf-8") as f: with open(srt_file, "w", encoding="utf-8") as f:
f.write(srt_text) f.write(srt_text)
def scan_list_folders(folder):
if not os.path.exists(folder):
os.makedirs(folder, exist_ok=True)
list_folders = []
for list_folder in os.listdir(folder):
if os.path.isdir(os.path.join(folder, list_folder)):
list_folders.append(get_relative_path(os.path.join(folder, list_folder), folder))
first_list_folder = ""
second_list_folder = ""
if len(list_folders) > 0:
first_list_folder = second_list_folder = list_folders[0]
if len(list_folders) > 1:
second_list_folder = list_folders[1]
return gr.Dropdown(list_folders, value=first_list_folder), gr.Dropdown(list_folders, value=second_list_folder)
def preview_merged_list(first_list_folder, second_list_folder, merge_list_character_name, save_folder):
if first_list_folder == "" or second_list_folder == "":
return ""
if first_list_folder == second_list_folder:
gr.Warning(i18n("两个文件夹不能相同!!!"))
return ""
first_list_folder = os.path.join(save_folder, first_list_folder)
second_list_folder = os.path.join(save_folder, second_list_folder)
print(f"first_list_folder: {first_list_folder}, second_list_folder: {second_list_folder}")
first_list = os.path.join(first_list_folder, [file for file in os.listdir(first_list_folder) if file.lower().endswith(".list")][0])
second_list = os.path.join(second_list_folder, [file for file in os.listdir(second_list_folder) if file.lower().endswith(".list")][0])
try:
return merge_list_folders(first_list, second_list, merge_list_character_name, first_list_folder, second_list_folder)
except Exception as e:
gr.Warning(f"Can't Merge, Error: {e}")
return ""
from datetime import datetime from datetime import datetime
def change_character_name(input_audio): def change_character_name(input_audio):
@ -178,8 +221,8 @@ with gr.Blocks() as app:
<li>{i18n("根据面板合并短句并过滤你不希望出现的句子。")}</li> <li>{i18n("根据面板合并短句并过滤你不希望出现的句子。")}</li>
<li>{i18n("随后保存成切分好的音频与list文件。")}</li> <li>{i18n("随后保存成切分好的音频与list文件。")}</li>
</ol>""") </ol>""")
with gr.Tabs():
with gr.Tab(i18n("SRT编辑界面")):
with gr.Row(): with gr.Row():
with gr.Column(scale=2) as input_col: with gr.Column(scale=2) as input_col:
with gr.Tabs(): with gr.Tabs():
@ -235,6 +278,22 @@ with gr.Blocks() as app:
output_text = gr.Textbox("", lines=20, max_lines=30, label="Sliced SRT") output_text = gr.Textbox("", lines=20, max_lines=30, label="Sliced SRT")
with gr.Tab(i18n("切分预览")): with gr.Tab(i18n("切分预览")):
gr.Textbox(i18n("正在建设,敬请期待"), label=i18n("提示"),interactive=False) gr.Textbox(i18n("正在建设,敬请期待"), label=i18n("提示"),interactive=False)
with gr.Tab(i18n("List 合并小工具")):
with gr.Row():
with gr.Column(scale=2):
scan_list_folder = gr.Textbox("output/sliced_audio", label=i18n("文件夹路径"),interactive=True)
scan_list_button = gr.Button(i18n("扫描文件夹"), variant="secondary")
first_list_folder = gr.Dropdown([], label=i18n("主文件夹"),interactive=True)
second_list_folder = gr.Dropdown([], label=i18n("次文件夹"),interactive=True)
merge_list_character_name = gr.Textbox("", label=i18n("角色名称,留空使用主文件夹的"),interactive=True)
merge_list_button = gr.Button(i18n("合并文件夹与List"), variant="primary")
with gr.Column(scale=2):
list_preview = gr.Textbox("", lines=20, max_lines=30, label=i18n("合并后的List"))
scan_list_button.click(scan_list_folders, [scan_list_folder], [first_list_folder, second_list_folder])
merge_list_button.click(preview_merged_list, [first_list_folder, second_list_folder, merge_list_character_name, scan_list_folder], [list_preview])
save_folder.change(lambda x:gr.Textbox(value=x), [save_folder], [scan_list_folder])
scan_list_folder.change(lambda x:gr.Textbox(value=x), [scan_list_folder], [save_folder])
scan_button.click(get_srt_and_audio_files, [input_folder], [srt_files_list, audio_files_list]) scan_button.click(get_srt_and_audio_files, [input_folder], [srt_files_list, audio_files_list])
merge_zero_interval.change(lambda x: gr.update(visible=x), [merge_zero_interval],[short_interval]) merge_zero_interval.change(lambda x: gr.update(visible=x), [merge_zero_interval],[short_interval])
srt_files_list.change(change_srt_file, [input_folder, srt_files_list], [audio_files_list]) srt_files_list.change(change_srt_file, [input_folder, srt_files_list], [audio_files_list])