点击查看 Edge-TTS 配音渠道无法使用的解决办法!!!

#1991 我希望中文字幕在视频底部,英文字幕在视频顶部显示,请详细告诉我如何修改源码以匹配我的需求。

240e:47c* Posted at: 1 day ago 👁16

我希望中文字幕在视频底部,英文字幕在视频顶部显示,请详细告诉我如何修改源码以匹配我的需求。

1 Replies

根据您的需求,要实现中文字幕在底部、英文字幕在顶部的显示效果,需要修改视频合成时嵌入软字幕(ASS格式)的样式定义。这属于高级自定义,需要修改源码。

核心原理:
软件在生成最终视频时,如果选择“嵌入软字幕”,会创建一个包含中英双语字幕的ASS字幕文件,并将其“烧录”到视频流中。您需要修改这个ASS文件的样式定义,为中文和英文字幕指定不同的垂直位置。

修改步骤:

  1. 定位关键文件:
    找到软件源码目录下的 videotrans/tts/genvideo.py 文件。
  2. 备份文件:
    在修改前,请务必备份此文件。
  3. 修改 _create_ass_subtitle 函数:
    在这个文件中,找到 _create_ass_subtitle 函数。该函数负责生成ASS字幕的内容。
    您需要修改其中定义字幕样式的部分。通常,代码中会有类似 Style: Default,... 的行。
    您需要为中文和英文分别创建两个样式,并指定不同的 MarginV(垂直边距)值。

    查找并修改类似下面的代码块:

    # 原始代码可能类似这样(具体行号可能因版本不同而变化):
    ass_header = """[Script Info]
    ...
    [V4+ Styles]
    Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
    Style: Default,{fontname},60,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,20,20,20,1
    """.format(fontname=fontname)

    将其修改为(示例):

    ass_header = """[Script Info]
    ...
    [V4+ Styles]
    Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
    Style: Top,{fontname},50,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,20,20,20,1  # 顶部样式,MarginV=20
    Style: Bottom,{fontname},50,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,20,20,120,1 # 底部样式,MarginV=120
    """.format(fontname=fontname)
    • Top 样式将用于英文字幕(顶部),Bottom 样式用于中文字幕(底部)。
    • MarginV 是关键参数,控制字幕的垂直位置。数值越大,位置越靠下。您可能需要根据视频分辨率调整 120 这个值(例如,对于1080p视频,可以尝试 200250)。
  4. 修改字幕行分配:
    在同一个函数中,后续会有循环来写入每一条字幕。您需要根据语言为每一行字幕指定对应的样式名。
    找到写入字幕行的部分(通常以 Dialogue: 开头),并修改其样式字段。

    原始代码可能类似:

    for it in subs:
        # ... 计算时间轴 ...
        ass_subtitle += f"Dialogue: 0,{start},{end},Default,,0,0,0,,{text}\\N{trans_text}\n"

    修改为:

    for it in subs:
        # ... 计算时间轴 ...
        # 假设 it['text'] 是原文(英文),it['trans_text'] 是翻译(中文)
        ass_subtitle += f"Dialogue: 0,{start},{end},Top,,0,0,0,,{it['text']}\n"  # 英文用Top样式
        ass_subtitle += f"Dialogue: 0,{start},{end},Bottom,,0,0,0,,{it['trans_text']}\n" # 中文用Bottom样式

    重要: 您需要根据实际代码中访问原文和翻译文本的字段名(可能是 text/trans_textline/target_text)进行调整。这需要查看您当前版本的 genvideo.py 文件的具体实现。

  5. 保存并测试:
    保存修改后的文件,然后重启软件,使用“嵌入软字幕”选项处理一个视频,检查输出视频的字幕位置是否符合您的要求。

注意事项:

  • 此修改仅影响“嵌入软字幕”的输出。如果您选择“嵌入硬字幕”,字幕是直接渲染到视频画面上的,无法通过此方法分离位置。
  • 修改源码存在风险,可能导致软件无法正常运行。请确保您理解所做的更改,并在修改前备份。
  • 如果您的需求是生成独立的ASS/SRT字幕文件(不嵌入视频),则修改 videotrans/translate/spvideo.py 或相关字幕生成函数可能更合适。
  • 如果上述路径或代码结构与您的版本不符,您需要在 videotrans 目录下搜索 _create_ass_subtitleass_header 等关键词来定位准确位置。

如果修改后遇到问题,请提供 videotrans/logs/ 目录下的错误日志以便进一步分析。

Post Your Reply
Open source and free maintenance is not easy. If this project is helpful to you, please consider making a small donation to help the project continue to maintain and update.

Donate: https://ko-fi.com/jianchang512

Trending Questions