-
Notifications
You must be signed in to change notification settings - Fork 262
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dev-0.3.9 #73
Conversation
-重构音频设置面板,增加语音音量、背景音乐等设置 - 添加背景音乐文件选择功能 - 优化字幕设置,支持自定义字体和样式 -调整视频生成流程,支持新音频设置 - 更新文档示例,反映新功能
- 调整音频设置的滑块范围和默认值 - 修复生成脚本短片功能的导入问题 - 优化字幕设置界面,增加字幕位置选项- 改进字幕渲染逻辑,支持多种位置配置 - 调整视频设置中的原始音量滑块范围和默认值
- 调整背景音乐音量默认值为 0.3- 优化任务服务中的音量配置逻辑 - 更新视频生成服务,移除默认音量配置- 在 WebUI 中添加原声音量设置并更新相关参数
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code review by ChatGPT
app/models/faster-whisper-large-v2/* | ||
app/models/bert/* |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这是一段.gitignore
文件的修改补丁。下面是一些代码审查的反馈:
问题:
- 没有任何注释说明所添加的行的目的。建议在修改前添加一段注释说明添加
bert
模型的原因,以方便后续维护。 - 末尾的
\ No newline at end of file
说明原来的文件末尾没有新行符。这可能不是问题,但建议保持文件末尾有一个新行符,以符合标准的文件格式。
建议:
- 添加注释说明添加
bert
模型的原因。 - 确保文件末尾有一个新行符。
这里是一个经过修改后的版本:
# 添加 bert 模型
+app/models/bert/*
请注意,#
符号用于注释。这个简短的注释可以帮助其他开发者理解这个修改的目的。
TOP = "top" | ||
CENTER = "center" | ||
BOTTOM = "bottom" | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
以下是一份对您的代码的简略审查报告:
改进建议:
- 代码中使用了许多相同的 default 值,考虑使用常量来定义它们,以便于维护和修改。
voice_volume
、bgm_volume
、tts_volume
、original_volume
等音量相关变量的描述信息有些重复,可以考虑合并或者重新描述以便于理解。font_name
、text_fore_color
、text_back_color
等文本相关变量的描述信息可以考虑增加细节,以便于理解所指的颜色和字体风格。stroke_color
和stroke_width
变量可以考虑移到SubtitlePosition
Enum 中,以便于维护和修改。- 可以考虑将
VideoClipParams
中的变量分组为不同的类,以便于维护和修改。例如,将voice_
相关变量移到一个单独的类中,将bgm_
相关变量移到另一个类中。 VideoTranscriptionRequest
和VideoTranscriptionResponse
类中缺少文档字符串,可以考虑添加以便于理解类的用途。_threads
和n_threads
变量的描述信息有些不一致,可以考虑统一描述以便于理解。
潜在 bug 风险:
font_name
的 default 值是"SimHei"
,但是STHeitiMedium.ttc
也可能是一个有效的字体名称,因此可能需要增加验证以便于排除错误。font_size
的 default 值是36
,但是60
也可能是一个有效的字体大小,因此可能需要增加验证以便于排除错误。bgm_volume
的 default 值是0.6
,但是0.2
也可能是一个有效的背景音乐音量,因此可能需要增加验证以便于排除错误。voice_volume
、tts_volume
、original_volume
等音量相关变量的值可能需要增加限制以便于排除错误(例如,音量不能超过 1.0)。
其他建议:
- 可以考虑使用 linter 工具来检查代码的质量和风格,以便于维护和修改。
- 可以考虑编写测试用例来验证代码的正确性,以便于排除错误和增加代码的可靠性。
if not params: | ||
raise ValueError("视频参数不能为空") | ||
|
||
|
||
if __name__ == "__main__": | ||
# task_id = "test123" | ||
# subclip_path_videos = {'00:41-01:58': 'E:\\projects\\NarratoAI\\storage\\cache_videos/vid-00_41-01_58.mp4', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这是一个Python脚本,主要负责视频处理和处理任务的逻辑。下面是一些代码评审和建议:
-
函数定义和命名:函数
start_subclip
和validate_params
的名字不太明显,他们的功能应该通过名字反映出来。例如,start_subclip
可以改为process_video_clip
,validate_params
可以改为validate_input_params
。 -
变量命名:变量名应该清晰明了,能够反映变量的含义。例如,
params
可以改为video_params
或audio_params
,audio_files
可以改为tts_audio_files
。 -
错误处理:脚本中有一些错误处理,例如文件不存在、参数无效等。但是,这些错误处理没有统一的格式和方式。建议使用try-except块进行错误处理,并抛出特定的错误异常。
-
日志记录:脚本中使用了很多日志记录语句,但是他们的格式和方式不统一。建议使用标准的日志记录格式和方式,例如使用 logging 模块。
-
函数逻辑:函数
start_subclip
的逻辑比较复杂,包括视频处理、音频处理、字幕处理等。建议将这些逻辑拆分成多个函数,每个函数负责一个特定的功能,例如process_video
、process_audio
、process_subtitle
等。 -
参数传递:函数
start_subclip
的参数传递比较复杂,包括task_id
、params
、subclip_path_videos
等。建议使用更清晰的参数传递方式,例如使用namedtuple或dataclass。 -
返回值:函数
start_subclip
的返回值不清楚,建议使用更清晰的返回值方式,例如使用namedtuple或dataclass。
以下是部分代码的建议:
def process_video_clip(task_id: str, params: VideoClipParams, subclip_path_videos: dict) -> dict:
"""
处理视频片段
"""
try:
# 获取视频片段
video_clip = get_video_clip(task_id, subclip_path_videos)
# 处理视频片段
video_clip = process_video(video_clip, params)
# 返回处理结果
return {"video_clip": video_clip}
except FileNotFoundError as e:
raise FileNotFoundError(f"视频文件不存在: {e}")
except ValueError as e:
raise ValueError(f"参数无效: {e}")
def validate_input_params(video_path: str, audio_path: str, output_file: str, params: VideoClipParams) -> None:
"""
验证输入参数
"""
if not video_path:
raise ValueError("视频路径不能为空")
if not os.path.exists(video_path):
raise FileNotFoundError(f"视频文件不存在: {video_path}")
# ...
注意:以上代码仅为示例,并不是实际的代码。
full_text = " ".join([item['narration'] for item in data if not item['OST']]) | ||
subtitle_file = os.path.join(utils.task_dir("12312312"), "subtitle_multiple.srt") | ||
create_subtitle_from_multiple(full_text, sub_maker_list, data, subtitle_file) | ||
print(f"生成的音频文件列表: {audio_files}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
以下是一些代码审查的建议和注意事项:
-
简化导入: 在头部导入时,有一些导入的模块已经不再使用,可以删除不必要的导入语句。
-
错误处理: speech_synthesizer_word_boundary_cb 函数中的错误处理相对较简单,只是简单地记录日志并重试。如果出错可以考虑增加更多的错误处理以便用户能够更好地理解问题。
-
魔法数字: 在 speech_synthesizer_word_boundary_cb 函数中,Magic Number 2 被使用,可以考虑将其定义为一个常量以便维护和阅读。
-
函数包装: create_subtitle 函数中的内容非常多,可以考虑将其包装成几个函数以提高代码的读写性和维护性。
-
数据类型定义: 函数参数和返回值的数据类型未被定义,可以考虑增加数据类型定义以便提高代码的阅读性。
-
无用代码: 因为函数 create_subtitle 被删除,函数 get_audio_duration 内部仍然使用了 variable sub_maker,sub_maker 来自哪?需要对未使用函数或变量进行删除以保持代码的干净。
-
模块未导入: 在 if name == "main": 内部使用了函数 parse_voice_name,但该函数未被导入,需要增加导入语句。
-
文件操作: open() 函数未被关闭,虽然 Python 的 GC Mechanism 会自动关闭,但是养成关闭文件的习惯可以减少代码引入bug的可能性。
-
json.load(): json.load() 被使用,但是未定义 exception,可以增加 exception 处理代码。
-
函数名注释: 一些函数的名没有注释,增加注释可以方便未来阅读。
-
**最后两行if name == "main":中语句中 '12312312' 由function tts_multiple中取,会不会存在潜在的逻辑问题?应该改成 task_id。
# 设置 IMAGEMAGICK_BINARY 环境变量 | ||
os.environ['IMAGEMAGICK_BINARY'] = 'magick' | ||
|
||
return True | ||
except Exception as e: | ||
logger.error(f"初始化 ImageMagick 失败: {str(e)}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
该代码片段主要包含几个函数,包括获取背景音乐文件、计算视频时长、清理关键帧缓存和初始化资源等。以下是一些审查建议:
-
函数注释:部分函数缺乏注释,建议添加注释来提高代码可读性和理解性。
-
函数命名:部分函数的命名不够清晰,建议使用描述性更强的函数命名。
-
异常处理:部分函数没有处理异常,建议添加异常处理代码来提高代码健壮性。
-
变量命名:部分变量的命名不够清晰,建议使用描述性更强的变量命名。
-
模块导入:部分函数中使用了未导入的模块,建议添加模块导入代码。
-
函数内变量定义:部分函数内变量定义过于靠近函数结束处,建议将变量定义移到函数开始处。
-
函数长度:部分函数过于长,建议拆分成多个函数。
-
注释符:建议使用相同的注释符样式。
具体的修改如下:
- 在
get_bgm_file
函数中添加异常处理代码,处理可能存在的导入异常和日志异常。 - 在
init_resources
函数中添加异常处理代码,处理可能存在的文件系统异常和网络异常。 - 在
download_font
函数中添加异常处理代码,处理可能存在的网络异常。 - 在
init_imagemagick
函数中添加异常处理代码,处理可能存在的命令行异常和环境变量设置异常。
'video_quality': st.session_state.get('video_quality', '1080p'), | ||
'original_volume': st.session_state.get('original_volume', 0.7) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
以下是一个简短的代码审查结果:
优点:
- 代码格式整齐,使用空白和注释。
- 使用了类型提示和文档字符串。
- 使用了 Streamlit 框架提供的 Container 和 Slider 组件。
缺点和建议:
- 函数命名:函数命名如
render_video_panel
和render_video_config
可以更具体一些,例如render_video_settings_panel
和render_video_quality_config
。 - 类型定义:虽然函数参数和返回值有类型提示,但函数内部的变量仍需要添加类型提示,以提高代码可读性和代码分析工具的准确性。
- 错误处理:函数内部没有错误处理机制,如果
st.session_state
中的值不存在或类型不正确,可能会导致程序崩溃。 - 魔法数字:代码中出现了魔法数字,如
0.7
和1.0
,可以定义为常量以提高代码可读性和可维护性。 - Session State:使用
st.session_state
存储数据可能会导致数据混乱,如果不小心泄露敏感信息。可以考虑使用其他存储机制,如缓存或数据库。
其他建议:
- 在函数内部使用
try-except
块来捕获异常,并记录错误信息。 - 使用
logging
模块记录函数调用和内部变量值,以提高调试效率。 - 使用工具来进行静态代码分析和代码优化,如 PyLint 和 PyCharm。
总的来说,该代码还有改进的余地,但基本结构是合理的。通过以上建议可以进一步提高代码质量和可维护性。
"Generate Short Video Script": "AI生成短剧混剪脚本", | ||
"Adjust the volume of the original audio": "调整原始音频的音量", | ||
"Original Volume": "视频音量", | ||
"Auto Generate": "纪录片解说 (画面解说)" | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
以下是一些对这段代码进行评审的建议和发现的潜在问题:
改进建议
-
在注释中解释为什么需要对
"Generate Video Script"
的文本内容进行更改。这可以帮助其他开发者了解更改的原因和背景。 -
添加对文件编码的说明,如果涉及多语言环境,应确保文件编码正确,可以避免乱码。
-
考虑使用更标准化的编码规范,例如UTF-8。
-
对于新增的文本内容,例如
"Short Generate"
和"Generate Short Video Script"
, 应该进行同样的注释,解释它们的作用和功能。 -
可以将一些较长的文本内容拆分为多行,以提高代码的可读性。
潜在问题
-
未对新增的文本内容进行国际化处理,如果需要支持多语言环境,应确保这些文本内容也可以被正确地国际化。
-
在
"Generate Video Script"
文本内容更改中,增加了有关AI生成画面解说脚本的信息。应该确保这段文本内容在所有语言环境中都可以正确地解释和翻译。 -
新增的
"Short Generate"
和"Generate Short Video Script"
文本内容可能需要在其他地方进行对应的更新,以确保一致性和正确性。 -
在
"Auto Generate"
文本内容更改中,增加了关于纪录片解说的信息。应该确保这段文本内容在所有语言环境中都可以正确地解释和翻译。
) | ||
return True | ||
except Exception as e: | ||
return False |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
以下是一份对此代码片段的简要审查:
改动
- 删除了
get_script_params
方法,并替代为video_params
- 引入了
requests
和urllib3
库,并配置了重试机制 - 添加了
chekc_video_config
方法,用于检查视频分析配置
bugs 和风险
chekc_video_config
方法中的异常捕获比较宽泛,可能会掩盖一些潜在问题。建议专门捕获requests.exceptions
以及可能出现的其他异常。config.app.get('narrato_api_url')
这一部分的配置获取方式可能存在风险。如果配置文件不存在或无法读取,程序会抛出异常。建议使用更加robust的配置获取方式。video_params
的格式和内容未在方法内部进行校验。如果接口传入的参数不正确,程序可能会抛出异常或产生不正确的结果。建议在方法内部进行参数校验。
改进建议
chekc_video_config
方法中的变量命名可以更好地遵循PEP 8的规范。例如,session
可以改为http_session
。retry_strategy
和adapter
的配置可以移到应用的配置文件中,使其更易于维护和修改。video_params
的格式和内容可以通过构造函数或其他方式进行提前检查,以确保其正确性。chekc_video_config
方法可以使用return 代码替代 exception 来通知开发者异常发生情况。
以下是一些可以改进的地方的示例代码:
import logging
logger = logging.getLogger(__name__)
def chekc_video_config(video_params):
"""
检查视频分析配置
"""
# 对视频参数进行校验
if not video_params:
raise ValueError("视频参数不能为空")
if not isinstance(video_params, dict):
raise ValueError("视频参数必须为字典")
# 配置重试机制
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
# 创建会话
http_session = requests.Session()
http_session.mount("https://", adapter)
try:
# 发送 POST 请求
response = http_session.post(
f"{config.app.get('narrato_api_url')}/video/config",
headers={'accept': 'application/json', 'Content-Type': 'application/json'},
json=video_params,
timeout=30,
verify=True
)
response.raise_for_status() # 检查状态码是否正常
return True
except requests.exceptions.RequestException as e:
logger.error(f"请求出错:{e}")
return False
except Exception as e:
logger.error(f"未知错误:{e}")
return False
) | ||
except Exception as e: | ||
pass | ||
chekc_video_config(api_params) | ||
custom_prompt = st.session_state.get('custom_prompt', '') | ||
processor = ScriptProcessor( | ||
model_name=text_model, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这段代码似乎是一些关于视频分析和脚本生成的功能。但是这里有几个问题和潜在风险:
-
check_video_config
函数在导入时有一个拼写错误(应该是check_video_config
)。这可能会导致程序无法找到这个函数,从而产生错误。 -
在
update_progress
函数中,有一个冗余的判断语句。如果vision_llm_provider
不是'qwenvl',就会Throw一个ValueError
异常。但是之后的代码似乎并没有考虑这个异常会抛出。 -
chekc_video_config
函数的功能不明确。它是否会替代之前的POST请求呢?如果是,那么它的一些逻辑可能需要调整。比如,它应该处理可能的连接超时问题。 -
在注释的代码中,有一个使用
requests.Session()
来发起POST请求的例子。在注释的代码中,也有一个重试机制。如果chekc_video_config
函数也需要这个重试机制,那么它也应该进行相应的实现。 -
api_params
的内容不明确。如果它包含敏感信息,例如访问密钥等,那么这些信息应该被妥善处理和保护。
为了改进这段代码,我们可以做以下工作:
- 在导入
check_video_config
函数时,修正拼写错误。 - 纠正函数中的冗余判断语句。
- 测试和调整
check_video_config
函数,确保它可以正确处理异常情况。 - 确保
check_video_config
函数正确实现了连接重试机制。 - 检查
api_params
的内容,确保敏感信息得到妥善处理。 - 对函数和变量进行详细注释,提高代码的可读性。
以下是示例性的代码,它展示了如何实现这些改进:
def check_video_config(api_params):
try:
# 实现连接重试机制
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("https://", adapter)
# 发起POST请求
response = session.post(
f"{config.app.get('narrato_api_url')}/video/config",
headers=headers,
json=api_params,
timeout=30,
verify=True
)
# 检查响应状态码
if response.status_code != 200:
# 处理异常情况
raise Exception(f"POST请求错误,状态码{response.status_code}")
except Exception as e:
# 处理异常
# ... ...
# 调用check_video_config函数
api_params = {
"model_name": text_model,
"text_model_name": text_model,
"text_base_url": text_base_url or ""
}
check_video_config(api_params)
except Exception as err: | ||
progress_bar.progress(100) | ||
st.error(f"生成过程中发生错误: {str(err)}") | ||
logger.exception(f"生成脚本时发生错误\n{traceback.format_exc()}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
以下是一个简短的代码审查,包括潜在的错误风险和改进建议:
错误风险
- 可能的异常处理不完善:在异常处理块中,只输出错误消息,但没有停止 SCRIPT 的生成过程。考虑在异常处理块中添加
st.stop()
来停止整个 SCRIPT 生成过程。 - 可能的状态不一致:在更新进度条时,没有考虑到可能的状态不一致问题。例如,如果进度条已经完成(100%),但后续操作仍然更新状态,可能会导致状态不一致。
- 可能的空值问题:在访问一些变量时,例如
text_api_key
、vision_api_key
等,没有检查是否为空。如果这些变量为 None 或空字符串,可能会导致异常。
改进建议
- 重构长方法:当前方法过于长,应该考虑将其拆分为多个小方法,每个方法负责一个特定的任务,例如生成脚本、更新进度条、处理异常等。
- 使用异步编程:由于脚本生成过程需要执行一些阻塞性操作,例如 API 调用、文件读写等,考虑使用异步编程来提高性能。
- 添加更多的日志记录:在方法中添加更多的日志记录,可以帮助调试和监控脚本生成过程。
- 考虑使用错误处理库:如 Sentry 等错误处理库,可以帮助捕获和处理异常。
- 优化进度条更新:考虑使用更优雅的进度条更新方式,例如使用 animation 模块,让进度条动态更新。
- 避免重复代码:在方法中,有一些重复的代码,例如更新进度条的逻辑,可以提取为一个单独的方法。
代码修改建议
- 将
update_progress
方法移到循环外部。 - 使用
try-except
块来捕获和处理异常。 - 使用
async
和await
来编写异步代码。 - 添加更多的日志记录。
- 使用错误处理库来捕获和处理异常。
示例代码
import asyncio
import logging
# ...
async def generate_script_short(tr, params):
# ...
try:
# ...
update_progress(20, "开始准备生成脚本")
# ...
await asyncio.sleep(0.1)
update_progress(80, "脚本生成完成")
# ...
except Exception as err:
logging.exception(f"生成脚本时发生错误\n{traceback.format_exc()}")
st.error(f"生成过程中发生错误: {str(err)}")
st.stop()
注意:以上是简短的代码审查,实际的代码审查可能需要涉及更多的方面。
PR 类型
请选择一个适当的标签(必选其一):
描述
支持阿里QwenVL大模型,国内网络可用;支持短剧混剪功能,十分钟精彩不断;新增一键合并视频和字幕,素材整理快人一步
更改内容
这次升级有了QwenVL大模型的视频理解能力,而且国内网络就能用,还有免费额度哦。首先呢,你得去申请 API Key,申请地址是[具体申请地址]。申请步骤很简单:先打开网址,点击注册账号,按照要求填好信息,比如用户名、密码、邮箱等,注册成功后登录,在个人中心或者专门的申请 API Key 页面,填写一些必要信息,像你的使用用途、联系方式等,然后提交申请。等审核通过,你就拿到 API Key 啦。拿到后在影视解说工具里设置好,就能让千问大模型帮你分析影视内容。它能把复杂的剧情、人物情感都分析得透透的,你写解说词的时候就轻松多啦。(这里可以放上申请页面、设置 API Key 页面等截图)
工具现在支持短剧混剪,最长支持解析 10 分钟的视频。操作很容易,你先把短剧视频文件导入工具,在导入的地方能看到时长设置选项,选好 10 分钟以内的片段就行。然后就可以开始创作你的解说啦,把你对短剧的理解、感受用生动的语言写出来,让观众更爱短剧。(附上导入短剧和时长设置的截图)
时间戳精确到毫秒了,这对剪辑特别有用。你在剪辑的时候,看时间轴上的刻度,能精确到毫秒,想剪哪一帧就剪哪一帧。比如你要截取一个精彩瞬间,能精准定位,拼接片段时也能无缝连接,让视频节奏超棒。(放一张时间轴毫秒刻度显示的截图)
新增的合并视频和字幕功能很方便。你找到这个功能的按钮,一般在素材处理或者编辑的菜单里。点击后,分别选中要合并的视频文件和字幕文件,然后点击合并,工具就会自动把字幕和视频合在一起,字幕还能完美对应画面,之后你就可以进行下一步创作啦。(提供合并操作的截图)
有了脚本上传功能,你可以先在本地写好脚本,不管是很详细的还是简单的大纲都行。然后在影视解说工具里找到脚本上传的入口,通常在项目创建或者编辑的地方。点击上传,选好你写好的脚本文件,上传成功后,工具会根据脚本自动匹配影视片段,你再根据匹配结果调整解说词就好。(附上脚本上传页面和匹配结果展示的截图)
要是工具用久了有点卡,别担心。找到一键清理缓存的按钮,可能在设置或者工具助手的菜单里。点击它,工具就会自动清理缓存文件,清理完后你再用就会发现速度变快了,创作过程不会被卡顿打扰。(插入清理缓存按钮和清理前后对比的截图)
这个一键转录功能超实用。你把要转录的视频导入工具后,在功能菜单里找到一键转录选项,点击它,工具就会开始把视频里的语音转成文字。转录的时候会有进度显示,转录完你就能看到文字内容,可以直接复制用在解说词里,或者整理剧情概要。(提供转录功能运行截图)
这次影视解说工具升级真的很给力,大家赶紧去试试,让你的影视解说创作更上一层楼!
测试
补充说明