1. 移除软件包自带的本地 whisper(需单独安装)
2. 重构版本底层依赖,移除外部依赖
3. 修复 首页 暗黑模式不兼容的问题
4. 修复 SD 合并提示词报错
This commit is contained in:
2024-10-20 23:19:22 +08:00
parent efa8d3b2a2
commit f4d042f699
38 changed files with 2749 additions and 1568 deletions
+12 -16
View File
@@ -4,7 +4,6 @@ import json
import os
import sys
import clip
import getgrame
import Push_back_Prompt
import public_tools
import shotSplit
@@ -56,6 +55,8 @@ if sys.argv[1] == "-c":
clip = clip.Clip(cript_directory, sys.argv[2], sys.argv[3])
clip.MergeVideosAndClip()
pass
# 获取字体
elif sys.argv[1] == "-f":
# 获取本地已安装的字幕。然后返回
@@ -77,22 +78,17 @@ elif sys.argv[1] == "-p":
Push_back_Prompt.init(sys.argv[2], sys.argv[3], sys.argv[4])
pass
# 剪映抽帧
elif sys.argv[1] == "-k":
# print("")
getgrame.init(sys.argv[2], sys.argv[3], sys.argv[4])
pass
elif sys.argv[1] == "-ka":
shotSplit.get_fram(sys.argv[2], sys.argv[3], sys.argv[4])
pass
# 智能分镜。字幕识别
elif sys.argv[1] == "-a":
print("开始算法分镜:" + sys.argv[2] + " -- 输出文件夹:" + sys.argv[3])
shotSplit.init(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6])
# 本地提取音频
elif sys.argv[1] == "-t":
print("开始提取文字:" + sys.argv[2])
shotSplit.GetTextTask(sys.argv[2], sys.argv[3], sys.argv[4])
pass
# # 智能分镜。字幕识别
# elif sys.argv[1] == "-a":
# print("开始算法分镜:" + sys.argv[2] + " -- 输出文件夹:" + sys.argv[3])
# shotSplit.init(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6])
# # 本地提取音频
# elif sys.argv[1] == "-t":
# print("开始提取文字:" + sys.argv[2])
# shotSplit.GetTextTask(sys.argv[2], sys.argv[3], sys.argv[4])
# pass
+6 -17
View File
@@ -1,36 +1,34 @@
# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.building.datastruct import Tree
from PyInstaller.utils.hooks import get_package_paths
PACKAGE_DIRECTORY = get_package_paths('faster_whisper')[1]
datas = [(PACKAGE_DIRECTORY, 'faster_whisper')]
a = Analysis(
['Lai.py'],
pathex=[],
binaries=[],
datas=datas,
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
exclude_binaries=True,
name='Lai',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
@@ -38,12 +36,3 @@ exe = EXE(
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='Lai',
)
@@ -1,11 +1,17 @@
# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.building.datastruct import Tree
from PyInstaller.utils.hooks import get_package_paths
PACKAGE_DIRECTORY = get_package_paths('faster_whisper')[1]
datas = [(PACKAGE_DIRECTORY, 'faster_whisper')]
a = Analysis(
['lama_inpaint.py'],
['Lai.py'],
pathex=[],
binaries=[],
datas=[],
datas=datas,
hiddenimports=[],
hookspath=[],
hooksconfig={},
@@ -18,16 +24,13 @@ pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='lama_inpaint',
exclude_binaries=True,
name='Lai',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
@@ -35,3 +38,12 @@ exe = EXE(
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='Lai',
)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,2 @@
@echo off
pyinstaller --upx-dir="C:\\Users\\27698\\Desktop\\upx-4.2.4-win64\upx.exe" local_whisper.py
@@ -0,0 +1,170 @@
# -*- coding: utf-8 -*-
import io
import os
import sys
import public_tools
from pathlib import Path
from huggingface_hub import hf_hub_download
from faster_whisper import WhisperModel
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
# 判断sys.argv 的长度,如果小于2,说明没有传入参数,设置初始参数
# "C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe" -c "D:/来推项目集/7.4/娱乐:江湖大哥退休,去拍电影/scripts/output_crop_00001.json" "NVIDIA"
# if len(sys.argv) < 2:
# sys.argv = [
# "C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe",
# "-w",
# "C:\\Users\\27698\\Desktop\\测试\\test\\mjTestoutput_crop_00001.mp4",
# "C:\\Users\\27698\\Desktop\\测试\\test\data\\frame",
# "C:\\Users\\27698\\Desktop\\测试\\test\\tmp\\input_crop",
# 30,
# "NVIDIA",
# ]
print(sys.argv)
if len(sys.argv) < 2:
print("Params: <runtime-config.json>")
exit(0)
if getattr(sys, "frozen", False):
cript_directory = os.path.dirname(sys.executable)
elif __file__:
cript_directory = os.path.dirname(__file__)
def GetText(out_folder, mp3_folder):
text = []
# 先获取模型
print("正在下载或加载模型")
sys.stdout.flush()
model_path = Path(
hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="preprocessor_config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="tokenizer.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="vocabulary.json",
)
model = WhisperModel(
model_size_or_path=os.path.dirname(model_path),
device="auto",
local_files_only=True,
)
print("模型加载成功,开始识别")
sys.stdout.flush()
# 拿到指定文件夹里面的所有的MP3文件
mp3_list = []
for root, dirs, files in os.walk(mp3_folder):
for file in files:
if file.endswith(".mp3"):
mp3_list.append(os.path.join(root, file))
for mp in mp3_list:
segments, info = model.transcribe(
mp,
beam_size=5,
language="zh",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=1000),
)
tmp_text = ""
for segment in segments:
tmp_text += segment.text + ""
print(mp + "识别完成")
sys.stdout.flush()
text.append(tmp_text)
# 数据写出
print("文本全部识别成功,正在写出")
sys.stdout.flush()
tools = public_tools.PublicTools()
tools.write_to_file(text, os.path.join(out_folder, "文案.txt"))
print("写出完成")
sys.stdout.flush()
def GetTextTask(out_folder, mp, name):
text = []
# 先获取模型
print("正在下载或加载模型")
sys.stdout.flush()
model_path = Path(
hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="preprocessor_config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="tokenizer.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="vocabulary.json",
)
model = WhisperModel(
model_size_or_path=os.path.dirname(model_path),
device="auto",
local_files_only=True,
)
print("模型加载成功,开始识别")
sys.stdout.flush()
segments, info = model.transcribe(
mp,
beam_size=5,
language="zh",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=1000),
)
tmp_text = ""
for segment in segments:
tmp_text += segment.text + ""
print(mp + "识别完成")
sys.stdout.flush()
text.append(tmp_text)
# 数据写出
sys.stdout.flush()
tools = public_tools.PublicTools()
tools.write_to_file(text, os.path.join(out_folder, name + ".txt"))
sys.stdout.flush()
# GetTextTask(
# "C:\\Users\\27698\\Desktop\\测试\\mjTest",
# "C:\\Users\\27698\\Desktop\\测试\\mjTest\\data\\frame\\00001.mp4",
# "00001",
# )
if sys.argv[1] == "-ts":
GetText(
sys.argv[2],
sys.argv[3],
)
elif sys.argv[1] == "-t":
GetTextTask(
sys.argv[2],
sys.argv[3],
sys.argv[4],
)
else:
print("Params: <runtime-config.json>")
exit(0)
@@ -0,0 +1,50 @@
# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.building.datastruct import Tree
from PyInstaller.utils.hooks import get_package_paths
PACKAGE_DIRECTORY = get_package_paths('faster_whisper')[1]
datas = [(PACKAGE_DIRECTORY, 'faster_whisper')]
a = Analysis(
['local_whisper.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='local_whisper',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='local_whisper',
)
@@ -0,0 +1,351 @@
# 读取文件的方法
import json
import os
import win32api
import win32con
import pywintypes
import shutil
import re
class PublicTools:
"""
一些公用的基础方法
"""
def delete_path(self, path):
"""
删除指定路径的文件或者是文件夹
"""
# 检查路径是否存在
if not os.path.exists(path):
return
# 检查路径是文件还是文件夹
if os.path.isfile(path):
# 是文件,执行删除
try:
os.remove(path)
except Exception as e:
raise e
elif os.path.isdir(path):
# 是文件夹,执行删除
try:
shutil.rmtree(path)
except Exception as e:
raise e
else:
raise
def list_files_by_extension(self, folder_path, extension):
"""
读取指定文件夹下面的所有的指定拓展文件命的文件列表
"""
file_list = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(extension):
file_list.append(os.path.join(root, file))
elif file.endswith(extension.upper()):
file_list.append(os.path.join(root, file))
return file_list
def get_fonts_from_registry(self, key_path):
"""
获取注册表中安装的字体文件
"""
font_names = []
try:
key = win32api.RegOpenKeyEx(
(
win32con.HKEY_LOCAL_MACHINE
if "HKEY_LOCAL_MACHINE" in key_path
else win32con.HKEY_CURRENT_USER
),
key_path.split("\\", 1)[1],
0,
win32con.KEY_READ,
)
i = 0
while True:
try:
value = win32api.RegEnumValue(key, i)
font_name = value[0]
# 使用正则表达式移除括号及其内容
font_name = re.sub(r"\s*\([^)]*\)$", "", font_name)
font_names.append(font_name)
i += 1
except pywintypes.error as e:
if e.winerror == 259: # 没有更多的数据
break
else:
raise
finally:
try:
win32api.RegCloseKey(key)
except:
pass
return font_names
def get_installed_fonts(self):
"""
获取字体文件名称并返回
"""
system_fonts = self.get_fonts_from_registry(
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"
)
user_fonts = self.get_fonts_from_registry(
"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"
)
all_fonts = list(set(system_fonts + user_fonts)) # 合并并去重
return all_fonts
# 将RRGGBB转换为BBGGRR
def convert_rrggbb_to_bbggrr(self, rrggbb):
"""
将RRGGBB转换为BBGGRR
"""
if len(rrggbb) == 7:
rr = rrggbb[1:3]
gg = rrggbb[3:5]
bb = rrggbb[5:7]
return bb + gg + rr
else:
return "Invalid input"
def write_to_file(self, arr, filename):
with open(filename, "w",encoding='utf-8') as f:
for item in arr:
f.write("%s\n" % item)
# 读取文件
def read_file(fileType):
txt_path = input(f"输入{fileType}文件路径:")
txt_path = remove_prefix_and_suffix(txt_path, '"', '"')
while txt_path.strip() == "":
txt_path = input(f"输入{fileType}文件路径:")
while os.path.exists(txt_path) == False:
print("文件路径不存在错误:")
txt_path = input(f"输入{fileType}文件路径:")
txt_path = remove_prefix_and_suffix(txt_path, '"', '"')
return txt_path
def format_time_ms(milliseconds):
"""
时间转换将ms->小时:分钟:秒.毫秒格式
"""
seconds = milliseconds / 1000
# 计算小时、分钟和秒
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
seconds = seconds % 60
# 格式化字符串
# 使用`%02d`确保小时和分钟总是显示为两位数,`%.2f`确保秒数显示两位小数
formatted_time = f"{hours}:{minutes:02d}:{seconds:05.2f}"
return formatted_time
# 删除满足条件的开头和结尾
def remove_prefix_and_suffix(input_str, prefix_to_remove, suffix_to_remove):
if input_str.startswith(prefix_to_remove):
# 删除开头
input_str = input_str[len(prefix_to_remove) :]
if input_str.endswith(suffix_to_remove):
# 删除结尾
input_str = input_str[: -len(suffix_to_remove)]
return input_str
# 判断文件夹下面是不是有特定的文件夹
def check_if_folder_exists(parent_folder, target_folder_name):
# 获取文件夹列表
subfolders = [f.name for f in os.scandir(parent_folder) if f.is_dir()]
# 检查特定文件夹是否存在
if target_folder_name in subfolders:
return True
else:
return False
# 检查指定文件夹中是否存在特定文件。
def file_exists_in_folder(folder_path: str, file_name: str) -> bool:
# 构建完整的文件路径
file_path = os.path.join(folder_path, file_name)
# 返回文件是否存在
return os.path.isfile(file_path)
# 秒数转换,保留一位小数
def convert_to_seconds(number, count):
seconds = number / 1000000
rounded_number = round(seconds, count)
return rounded_number
def is_empty(obj):
if obj is None:
return True
elif isinstance(obj, str):
return len(obj) == 0
elif isinstance(obj, list):
return len(obj) == 0
elif isinstance(obj, dict):
return len(obj) == 0
return False
def opt_dict(obj, key, default=None):
if obj is None:
return default
if key in obj:
v = obj[key]
if not is_empty(v):
return v
return default
def read_config(path, webui=True):
with open(path, "r", encoding="utf-8") as f:
runtime_config = json.load(f)
if "config" not in runtime_config:
print("no filed 'config' in json")
return None
config = runtime_config["config"]
if "webui" not in config:
print("no filed 'webui' in 'config'")
return None
setting_config_path = config["setting"]
if not os.path.exists(setting_config_path):
setting_config_path = "config/" + setting_config_path
if not os.path.exists(setting_config_path):
setting_config_path = "../" + setting_config_path
# read config
with open(setting_config_path, "r", encoding="utf-8") as f:
setting_config = json.load(f)
# set workspace parent:根目录
if "workspace" in setting_config:
setting_config["workspace"]["parent"] = runtime_config["workspace"]
else:
setting_config["workspace"] = {"parent": runtime_config["workspace"]}
setting_config["video"] = opt_dict(runtime_config, "video")
# merge setting config
if "setting" in config:
setting_config.update(runtime_config["setting"])
# webui config
if webui:
webui_config_path = config["webui"]
if not os.path.exists(webui_config_path):
webui_config_path = "config/webui/" + webui_config_path
if not os.path.exists(webui_config_path):
webui_config_path = "../" + webui_config_path
with open(webui_config_path, "r", encoding="utf-8") as f:
webui_config = json.load(f)
# merge webui config
if "webui" in runtime_config:
webui_config.update(runtime_config["webui"])
return webui_config, setting_config
return setting_config
TAG_MODE_NONE = ""
# 工作路径
class Workspace:
def __init__(
self,
root: str,
input: str,
output: str,
input_crop: str,
output_crop: str,
input_tag: str,
input_mask: str,
input_crop_mask: str,
crop_info: str,
):
self.root = root
self.input = input
self.output = output
self.input_crop = input_crop
self.output_crop = output_crop
self.input_tag = input_tag
self.input_mask = input_mask
self.input_crop_mask = input_crop_mask
self.crop_info = crop_info
# 定义一个倍数函数
def round_up(num, mul):
return (num // mul + 1) * mul
class SettingConfig:
def __init__(self, config: dict, workParent):
self.config = config
self.webui_work_api = None
self.workParent = workParent
def to_dict(self):
return self.__dict__
def get_tag_mode(self):
tag_cfg = opt_dict(self.config, "tag")
return opt_dict(tag_cfg, "mode", TAG_MODE_NONE)
def get_tag_actions(self):
tag_cfg = opt_dict(self.config, "tag")
return opt_dict(tag_cfg, "actions", [])
def get_workspace_config(self) -> Workspace:
workspace_config = opt_dict(self.config, "workspace")
tmp_config = opt_dict(workspace_config, "tmp")
input = opt_dict(workspace_config, "input", "input")
output = opt_dict(workspace_config, "output", "output")
workspace_parent = self.workParent
tmp_parent = opt_dict(tmp_config, "parent", "tmp")
input_crop = opt_dict(tmp_config, "input_crop", "input_crop")
output_crop = opt_dict(tmp_config, "output_crop", "output_crop")
input_tag = opt_dict(tmp_config, "input_tag", "input_crop")
input_mask = opt_dict(tmp_config, "input_mask", "input_mask")
input_crop_mask = opt_dict(tmp_config, "input_crop_mask", "input_crop_mask")
crop_info = opt_dict(tmp_config, "crop_info", "crop_info.txt")
tmp_path = os.path.join(workspace_parent, tmp_parent)
return Workspace(
workspace_parent,
os.path.join(workspace_parent, input),
os.path.join(workspace_parent, output),
os.path.join(tmp_path, input_crop),
os.path.join(tmp_path, output_crop),
os.path.join(tmp_path, input_tag),
os.path.join(tmp_path, input_mask),
os.path.join(tmp_path, input_crop_mask),
os.path.join(tmp_path, crop_info),
)
def enable_tag(self):
tag_cfg = opt_dict(self.config, "tag")
return opt_dict(tag_cfg, "enable", True)
+307
View File
@@ -0,0 +1,307 @@
# pip install scenedetect opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
from scenedetect.video_manager import VideoManager
from scenedetect.scene_manager import SceneManager
from scenedetect.stats_manager import StatsManager
from scenedetect.detectors.content_detector import ContentDetector
import os
import sys
import json
import subprocess
from huggingface_hub import hf_hub_download
from faster_whisper import WhisperModel
from pathlib import Path
import public_tools
# 获取智能画面分割的时间或者秒数
def find_scenes(video_path, sensitivity):
print(
"正在计算分镜数据" + "sensitivity" + str(sensitivity) + "path : " + video_path
)
sys.stdout.flush()
video_manager = VideoManager([video_path])
stats_manager = StatsManager()
scene_manager = SceneManager(stats_manager)
# 使用contect-detector
scene_manager.add_detector(ContentDetector(threshold=float(sensitivity)))
shijian_list = []
try:
video_manager.set_downscale_factor()
video_manager.start()
scene_manager.detect_scenes(frame_source=video_manager)
scene_list = scene_manager.get_scene_list()
print("分镜数据列表:")
sys.stdout.flush()
for i, scene in enumerate(scene_list):
shijian_list.append([scene[0].get_timecode(), scene[1].get_timecode()])
print(
"Scene %2d: Start %s / Frame %d, End %s / Frame %d"
% (
i + 1,
scene[0].get_timecode(),
scene[0].get_frames(),
scene[1].get_timecode(),
scene[1].get_frames(),
)
)
sys.stdout.flush()
finally:
video_manager.release()
return shijian_list
# 如果不存在就创建
def createDir(file_dir):
# 如果不存在文件夹,就创建
if not os.path.isdir(file_dir):
os.mkdir(file_dir)
# 切分一个视频
def ClipVideo(video_path, out_folder, image_out_folder, sensitivity, gpu_type):
shijian_list = find_scenes(video_path, sensitivity) # 多组时间列表
shijian_list_len = len(shijian_list)
print("总共有%s个场景" % str(shijian_list_len))
sys.stdout.flush()
video_list = []
for i in range(0, shijian_list_len):
start_time_str = shijian_list[i][0]
end_time_str = shijian_list[i][1]
print("开始输出第" + str(i + 1) + "个分镜")
video_name = "{:05d}".format(i + 1)
out_video_file = os.path.join(out_folder, video_name + ".mp4")
sys.stdout.flush()
video_list.append(
{
"start_time_str": start_time_str,
"end_time_str": end_time_str,
"out_video_file": out_video_file,
"video_name": video_name,
}
)
# 使用 ffmpeg 裁剪视频
command = []
command.append("ffmpeg")
command.append("-i")
command.append(video_path)
command.append("-ss")
command.append(start_time_str)
command.append("-to")
command.append(end_time_str)
command.append("-c:v")
if gpu_type == "NVIDIA":
command.append("h264_nvenc")
elif gpu_type == "AMD":
command.append("h264_amf")
else:
command.append("libx264")
command.append("-preset")
command.append("fast")
command.append("-c:a")
command.append("copy")
command.append(out_video_file)
command.append("-loglevel")
command.append("error")
subprocess.run(
command,
check=True,
stderr=subprocess.PIPE,
)
print("分镜输出完成。开始抽帧")
sys.stdout.flush()
for vi in video_list:
h, m, s = vi["start_time_str"].split(":")
start_seconds = int(h) * 3600 + int(m) * 60 + float(s)
h, m, s = vi["end_time_str"].split(":")
end_seconds = int(h) * 3600 + int(m) * 60 + float(s)
print("正在抽帧:" + vi["video_name"])
sys.stdout.flush()
subprocess.run(
[
"ffmpeg",
"-ss",
str((end_seconds - start_seconds) / 2),
"-i",
vi["out_video_file"],
"-frames:v",
"1",
os.path.join(image_out_folder, vi["video_name"] + ".png"),
"-loglevel",
"error",
]
)
print("抽帧完成,开始识别文案")
sys.stdout.flush()
return video_list
def SplitAudio(video_out_folder, video_list):
# ffmpeg -i input_file.mp4 -vn -ab 128k output_file.mp3
print("正在分离音频!!")
mp3_list = []
sys.stdout.flush()
for v in video_list:
mp3_path = os.path.join(video_out_folder, v["video_name"] + ".mp3")
mp3_list.append(mp3_path)
subprocess.run(
[
"ffmpeg",
"-i",
v["out_video_file"],
"-vn",
"-ab",
"128k",
mp3_path,
"-loglevel",
"error",
],
check=True,
)
return mp3_list
def GetText(out_folder, mp3_list):
text = []
# 先获取模型
print("正在下载或加载模型")
sys.stdout.flush()
model_path = Path(
hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="preprocessor_config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="tokenizer.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="vocabulary.json",
)
model = WhisperModel(
model_size_or_path=os.path.dirname(model_path),
device="auto",
local_files_only=True,
)
print("模型加载成功,开始识别")
sys.stdout.flush()
for mp in mp3_list:
segments, info = model.transcribe(
mp,
beam_size=5,
language="zh",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=1000),
)
tmp_text = ""
for segment in segments:
tmp_text += segment.text + ""
print(mp + "识别完成")
sys.stdout.flush()
text.append(tmp_text)
# 数据写出
print("文本全部识别成功,正在写出")
sys.stdout.flush()
tools = public_tools.PublicTools()
tools.write_to_file(text, os.path.join(out_folder, "文案.txt"))
print("写出完成")
sys.stdout.flush()
def GetTextTask(out_folder, mp, name):
text = []
# 先获取模型
print("正在下载或加载模型")
sys.stdout.flush()
model_path = Path(
hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="preprocessor_config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="tokenizer.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="vocabulary.json",
)
model = WhisperModel(
model_size_or_path=os.path.dirname(model_path),
device="auto",
local_files_only=True,
)
print("模型加载成功,开始识别")
sys.stdout.flush()
segments, info = model.transcribe(
mp,
beam_size=5,
language="zh",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=1000),
)
tmp_text = ""
for segment in segments:
tmp_text += segment.text + ""
print(mp + "识别完成")
sys.stdout.flush()
text.append(tmp_text)
# 数据写出
sys.stdout.flush()
tools = public_tools.PublicTools()
tools.write_to_file(text, os.path.join(out_folder, name + ".txt"))
sys.stdout.flush()
def get_fram(video_path, out_path, sensitivity):
try:
shijian_list = find_scenes(video_path, sensitivity) # 多组时间列表
print("总共有%s个场景" % str(len(shijian_list)))
print("开始输出json")
print(shijian_list)
# 将数组中的消息写道json文件中
with open(out_path, "w") as file:
# 将数组写入到指定的json文件
json.dump(shijian_list, file)
print("输出完成")
except Exception as e:
print("出现错误" + str(e))
exit(0)
def init(video_path, video_out_folder, image_out_folder, sensitivity, gpu_type):
v_l = ClipVideo(
video_path, video_out_folder, image_out_folder, sensitivity, gpu_type
)
# 开始分离音频
m_l = SplitAudio(video_out_folder, v_l)
# 开始识别字幕
GetText(os.path.dirname(video_out_folder), m_l)
-298
View File
@@ -1,298 +0,0 @@
accelerate==0.30.1
addict==2.4.0
aiofiles==23.2.1
aiohttp==3.8.6
aiosignal==1.3.1
alibabacloud-bailian20230601==1.6.1
alibabacloud-credentials==0.3.3
alibabacloud-endpoint-util==0.0.3
alibabacloud-gateway-spi==0.0.1
alibabacloud-openapi-util==0.2.2
alibabacloud-tea==0.3.6
alibabacloud-tea-openapi==0.3.9
alibabacloud-tea-util==0.3.12
alibabacloud-tea-xml==0.0.2
aliyun-python-sdk-core==2.15.0
aliyun-python-sdk-kms==2.16.2
altair==5.3.0
altgraph==0.17.4
annotated-types==0.6.0
anthropic==0.26.1
antlr4-python3-runtime==4.9.3
anyio==4.3.0
APScheduler==3.10.4
arxiv==2.1.0
astor==0.8.1
asttokens==2.4.1
async-timeout==4.0.3
attrdict==2.0.1
attrs==23.2.0
av==11.0.0
azure-cognitiveservices-speech==1.37.0
Babel==2.15.0
backports.tarfile==1.1.1
baidu-aip==4.16.13
bce-python-sdk==0.9.11
beautifulsoup4==4.12.3
bidict==0.23.1
blinker==1.8.2
broadscope-bailian==1.3.1
cachetools==5.3.3
certifi==2024.2.2
cffi==1.16.0
cfgv==3.4.0
chardet==5.2.0
charset-normalizer==3.3.2
chatgpt-tool-hub==0.5.0
cheroot==10.0.1
click==8.1.7
colorama==0.4.6
coloredlogs==15.0.1
comtypes==1.4.2
contourpy==1.2.1
controlnet-aux==0.0.3
crcmod==1.7
cryptography==42.0.5
cssselect==1.2.0
cssutils==2.11.0
ctranslate2==4.1.0
curl_cffi==0.6.4
cx-Logging==3.1.0
cx_Freeze==6.15.16
cycler==0.12.1
Cython==3.0.10
dashscope==1.19.2
datasets==2.18.0
decorator==4.4.2
diffusers==0.27.2
dill==0.3.8
dingtalk-stream==0.18.1
distlib==0.3.8
distro==1.9.0
dnspython==2.6.1
dulwich==0.22.1
easydict==1.13
edge-tts==6.1.12
einops==0.7.0
elevenlabs==1.0.3
email_validator==2.1.1
et-xmlfile==1.1.0
exceptiongroup==1.2.1
executing==2.0.1
fastapi==0.108.0
fastapi-cli==0.0.2
faster-whisper==1.0.1
feedparser==6.0.10
ffmpy==0.3.2
filelock==3.13.1
fire==0.6.0
Flask==3.0.3
flask-babel==4.0.0
flatbuffers==24.3.7
fonttools==4.53.0
frozenlist==1.4.1
fsspec==2024.2.0
future==1.0.0
gast==0.5.4
google-ai-generativelanguage==0.6.4
google-api-core==2.19.0
google-api-python-client==2.130.0
google-auth==2.29.0
google-auth-httplib2==0.2.0
google-generativeai==0.5.4
googleapis-common-protos==1.63.0
gradio==4.21.0
gradio_client==0.12.0
grpcio==1.64.0
grpcio-status==1.62.2
gTTS==2.5.1
h11==0.14.0
HTMLParser==0.0.2
httpcore==1.0.5
httplib2==0.22.0
httptools==0.6.1
httpx==0.27.0
huggingface-hub==0.23.2
humanfriendly==10.0
identify==2.5.36
idna==3.6
imageio==2.34.0
imageio-ffmpeg==0.4.9
imgaug==0.4.0
importlib_metadata==7.0.2
importlib_resources==6.4.0
install==1.3.5
IOPaint==1.3.3
ipython==8.24.0
itsdangerous==2.2.0
jaraco.context==5.3.0
jaraco.functools==4.0.1
jedi==0.19.1
Jinja2==3.1.3
jiter==0.4.0
jmespath==0.10.0
jsonschema==4.22.0
jsonschema-specifications==2023.12.1
kiwisolver==1.4.5
langid==1.1.6
lazy_loader==0.4
lief==0.14.1
linkai==0.0.6.0
lmdb==1.4.1
loguru==0.7.2
lxml==5.2.2
markdown-it-py==3.0.0
MarkupSafe==2.1.5
matplotlib==3.9.0
matplotlib-inline==0.1.7
mdurl==0.1.2
modelscope==1.13.1
more-itertools==10.2.0
moviepy==1.0.3
mpmath==1.3.0
multidict==6.0.5
multiprocess==0.70.16
networkx==3.2.1
nodeenv==1.8.0
Nuitka==2.1.2
numpy==1.24.2
omegaconf==2.3.0
onnxruntime==1.17.1
openai==0.27.8
opencv-contrib-python==4.6.0.66
opencv-python==4.6.0.66
opencv-python-headless==4.9.0.80
openpyxl==3.1.2
opt-einsum==3.3.0
optionaldict==0.1.2
ordered-set==4.1.0
orjson==3.10.3
oss2==2.18.4
packaging==24.0
paddleocr==2.7.3
paddlepaddle==2.6.1
pandas==2.2.1
parso==0.8.4
pdf2docx==0.5.8
pefile==2023.2.7
peft==0.7.1
piexif==1.1.3
pillow==10.3.0
platformdirs==4.2.0
pre-commit==3.7.1
premailer==3.10.0
proglog==0.1.10
prompt-toolkit==3.0.43
proto-plus==1.23.0
protobuf==3.20.2
psutil==5.9.8
pure-eval==0.2.2
pyarrow==15.0.1
pyarrow-hotfix==0.6
pyasn1==0.6.0
pyasn1_modules==0.4.0
pyclipper==1.3.0.post5
pycparser==2.21
pycryptodome==3.20.0
pydantic==2.5.3
pydantic_core==2.14.6
pydub==0.25.1
Pygments==2.18.0
pyinstaller==6.5.0
pyinstaller-hooks-contrib==2024.3
PyJWT==2.8.0
PyMuPDF==1.24.5
PyMuPDFb==1.24.3
pyOpenSSL==24.1.0
pyoxidizer==0.24.0
pyparsing==3.1.2
pypiwin32==223
pypng==0.20220715.0
PyQRCode==1.2.1
pyreadline3==3.4.1
pytesseract==0.3.10
python-dateutil==2.9.0.post0
python-docx==1.1.2
python-dotenv==1.0.1
python-engineio==4.9.1
python-multipart==0.0.9
python-socketio==5.7.2
pyttsx3==2.90
pytz==2024.1
pywin32==306
pywin32-ctypes==0.2.2
PyYAML==6.0.1
qrcode==7.4.2
rapidfuzz==3.9.3
rarfile==4.2
referencing==0.35.1
regex==2024.5.15
requests==2.31.0
rich==13.7.1
rpds-py==0.18.1
rsa==4.9
ruff==0.4.7
safetensors==0.4.3
scenedetect==0.6.3
scikit-image==0.23.2
scipy==1.12.0
semantic-version==2.10.0
sgmllib3k==1.0.0
shapely==2.0.4
shellingham==1.5.4
simple-websocket==1.0.0
simplejson==3.19.2
six==1.16.0
sniffio==1.3.1
sortedcontainers==2.4.0
soupsieve==2.5
SpeechRecognition==3.10.4
stack-data==0.6.3
starlette==0.32.0.post1
sympy==1.12
tenacity==8.2.3
termcolor==2.4.0
tifffile==2024.5.22
tiktoken==0.4.0
timm==1.0.3
tokenizers==0.19.1
tomli==2.0.1
tomlkit==0.12.0
toolz==0.12.1
torch==2.1.2+cu118
torchvision==0.16.2+cu118
tqdm==4.66.2
traitlets==5.14.3
transformers==4.41.2
typer==0.12.3
typer-config==1.4.0
typing_extensions==4.10.0
tzdata==2024.1
tzlocal==5.2
ujson==5.9.0
uritemplate==4.1.1
urllib3==2.2.1
utility==1.0
uvicorn==0.29.0
virtualenv==20.26.2
visualdl==2.5.3
watchfiles==0.21.0
wcwidth==0.2.13
web.py==0.62
websocket-client==1.2.0
websockets==11.0.3
wechatpy==1.8.18
Werkzeug==3.0.3
wikipedia==1.4.0
win32-setctime==1.1.0
wolframalpha==5.0.0
wsproto==1.2.0
xlrd==2.0.1
xmltodict==0.13.0
xxhash==3.4.1
yacs==0.1.8
yapf==0.40.2
yarl==1.9.4
zhipuai==2.1.0.20240521
zipp==3.18.1
zstandard==0.22.0
+111 -111
View File
@@ -8,8 +8,8 @@ import os
import sys
import json
import subprocess
from huggingface_hub import hf_hub_download
from faster_whisper import WhisperModel
# from huggingface_hub import hf_hub_download
# from faster_whisper import WhisperModel
import public_tools
from pathlib import Path
@@ -174,111 +174,111 @@ def SplitAudio(video_out_folder, video_list):
return mp3_list
def GetText(out_folder, mp3_list):
text = []
# 先获取模型
print("正在下载或加载模型")
sys.stdout.flush()
model_path = Path(
hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="preprocessor_config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="tokenizer.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="vocabulary.json",
)
model = WhisperModel(
model_size_or_path=os.path.dirname(model_path),
device="auto",
local_files_only=True,
)
print("模型加载成功,开始识别")
sys.stdout.flush()
for mp in mp3_list:
segments, info = model.transcribe(
mp,
beam_size=5,
language="zh",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=1000),
)
tmp_text = ""
for segment in segments:
tmp_text += segment.text + ""
print(mp + "识别完成")
sys.stdout.flush()
text.append(tmp_text)
# def GetText(out_folder, mp3_list):
# text = []
# # 先获取模型
# print("正在下载或加载模型")
# sys.stdout.flush()
# model_path = Path(
# hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
# )
# hf_hub_download(
# repo_id="Systran/faster-whisper-large-v3",
# filename="config.json",
# )
# hf_hub_download(
# repo_id="Systran/faster-whisper-large-v3",
# filename="preprocessor_config.json",
# )
# hf_hub_download(
# repo_id="Systran/faster-whisper-large-v3",
# filename="tokenizer.json",
# )
# hf_hub_download(
# repo_id="Systran/faster-whisper-large-v3",
# filename="vocabulary.json",
# )
# model = WhisperModel(
# model_size_or_path=os.path.dirname(model_path),
# device="auto",
# local_files_only=True,
# )
# print("模型加载成功,开始识别")
# sys.stdout.flush()
# for mp in mp3_list:
# segments, info = model.transcribe(
# mp,
# beam_size=5,
# language="zh",
# vad_filter=True,
# vad_parameters=dict(min_silence_duration_ms=1000),
# )
# tmp_text = ""
# for segment in segments:
# tmp_text += segment.text + "。"
# print(mp + "识别完成")
# sys.stdout.flush()
# text.append(tmp_text)
# 数据写出
print("文本全部识别成功,正在写出")
sys.stdout.flush()
tools = public_tools.PublicTools()
tools.write_to_file(text, os.path.join(out_folder, "文案.txt"))
print("写出完成")
sys.stdout.flush()
# # 数据写出
# print("文本全部识别成功,正在写出")
# sys.stdout.flush()
# tools = public_tools.PublicTools()
# tools.write_to_file(text, os.path.join(out_folder, "文案.txt"))
# print("写出完成")
# sys.stdout.flush()
def GetTextTask(out_folder, mp, name):
text = []
# 先获取模型
print("正在下载或加载模型")
sys.stdout.flush()
model_path = Path(
hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="preprocessor_config.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="tokenizer.json",
)
hf_hub_download(
repo_id="Systran/faster-whisper-large-v3",
filename="vocabulary.json",
)
model = WhisperModel(
model_size_or_path=os.path.dirname(model_path),
device="auto",
local_files_only=True,
)
print("模型加载成功,开始识别")
sys.stdout.flush()
segments, info = model.transcribe(
mp,
beam_size=5,
language="zh",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=1000),
)
tmp_text = ""
for segment in segments:
tmp_text += segment.text + ""
print(mp + "识别完成")
sys.stdout.flush()
text.append(tmp_text)
# def GetTextTask(out_folder, mp, name):
# text = []
# # 先获取模型
# print("正在下载或加载模型")
# sys.stdout.flush()
# model_path = Path(
# hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
# )
# hf_hub_download(
# repo_id="Systran/faster-whisper-large-v3",
# filename="config.json",
# )
# hf_hub_download(
# repo_id="Systran/faster-whisper-large-v3",
# filename="preprocessor_config.json",
# )
# hf_hub_download(
# repo_id="Systran/faster-whisper-large-v3",
# filename="tokenizer.json",
# )
# hf_hub_download(
# repo_id="Systran/faster-whisper-large-v3",
# filename="vocabulary.json",
# )
# model = WhisperModel(
# model_size_or_path=os.path.dirname(model_path),
# device="auto",
# local_files_only=True,
# )
# print("模型加载成功,开始识别")
# sys.stdout.flush()
# segments, info = model.transcribe(
# mp,
# beam_size=5,
# language="zh",
# vad_filter=True,
# vad_parameters=dict(min_silence_duration_ms=1000),
# )
# tmp_text = ""
# for segment in segments:
# tmp_text += segment.text + "。"
# print(mp + "识别完成")
# sys.stdout.flush()
# text.append(tmp_text)
# 数据写出
sys.stdout.flush()
tools = public_tools.PublicTools()
tools.write_to_file(text, os.path.join(out_folder, name + ".txt"))
sys.stdout.flush()
# # 数据写出
# sys.stdout.flush()
# tools = public_tools.PublicTools()
# tools.write_to_file(text, os.path.join(out_folder, name + ".txt"))
# sys.stdout.flush()
def get_fram(video_path, out_path, sensitivity):
@@ -297,12 +297,12 @@ def get_fram(video_path, out_path, sensitivity):
exit(0)
def init(video_path, video_out_folder, image_out_folder, sensitivity, gpu_type):
v_l = ClipVideo(
video_path, video_out_folder, image_out_folder, sensitivity, gpu_type
)
# def init(video_path, video_out_folder, image_out_folder, sensitivity, gpu_type):
# v_l = ClipVideo(
# video_path, video_out_folder, image_out_folder, sensitivity, gpu_type
# )
# 开始分离音频
m_l = SplitAudio(video_out_folder, v_l)
# 开始识别字幕
GetText(os.path.dirname(video_out_folder), m_l)
# # 开始分离音频
# m_l = SplitAudio(video_out_folder, v_l)
# # 开始识别字幕
# GetText(os.path.dirname(video_out_folder), m_l)