手写文本转SRT字幕格式文件

在处理字幕制作时,试图找到一个能够将文本自动转换为 SRT 格式的库,找了好多个方案,没找到一个完全符合需求的解决方案。因此,暂时决定手写一个简单的脚本来实现这个功能。

这个脚本的主要功能是将文本内容按照标点符号进行分割,然后生成对应的 SRT 字幕文件。虽然这个脚本目前比较基础,但已经能够满足一些简单的需求,比如将新闻内容或短篇文章快速转换成字幕格式。

虽然现阶段的脚本功能有限,但它提供了一个灵活的基础,可以根据需要进行扩展和优化。后面,会进一步完善这个脚本,增加更多智能化的处理,比如自动判断语速、优化时间轴等功能,以更好地适应不同类型的字幕制作需求。

对于没有找到合适工具的情况下,这种手写脚本的方法也许并不是最优解,但却是最直接和可行的解决方案

1、安装日志扩展,这个比较好用,日常基本都会使用

pip install loguru

2、代码例子

import datetime
import re
from loguru import logger


def text_to_srt(news_content, output_filename, second_words):
    """
    将文本内容转换为 SRT 格式的字幕文件,并保存到指定路径。

    参数:
    news_content (str): 输入的文本内容。
    output_filename (str): 输出的 SRT 文件路径。
    srt_time (int) :指定字幕总时长,动态调整速度。

    返回:
    bool: 成功生成 SRT 文件则返回 True。
    """

    def format_time(seconds):
        """将秒数转换为 SRT 格式的时间字符串(格式:hh:mm:ss,ms)"""
        delta = datetime.timedelta(seconds=seconds)
        total_seconds = int(delta.total_seconds())
        milliseconds = int((delta.total_seconds() - total_seconds) * 1000)
        hours, remainder = divmod(total_seconds, 3600)
        minutes, seconds = divmod(remainder, 60)
        return f"{hours:02}:{minutes:02}:{seconds:02},{milliseconds:03}"

    def split_long_sentence(sentence, max_length):
        """将超长句子分割成不超过指定长度的段落,以便在字幕中换行显示"""
        parts = [sentence[k:k + max_length] for k in range(0, len(sentence), max_length)]
        # 使用空格连接,使字幕自动换行
        return " ".join(parts)

    # 根据标点符号分割文本
    words = re.split(r'(?<=[。!?,])', news_content)
    srt_content = []

    start_time = 0.0
    for i, word in enumerate(words):
        word = word.lstrip()  # 去除左侧空格
        word = re.sub(r"[ 。!?,]", "", word)  # 移除开头的标点符号
        time_per_word = len(word) / second_words  # 每秒读取几个字
        end_time = start_time + time_per_word

        # 添加字幕条目
        srt_content.append(f"{i + 1}")
        srt_content.append(f"{format_time(start_time)} --> {format_time(end_time)}")
        srt_content.append(split_long_sentence(word, 16))
        srt_content.append("")

        start_time = end_time

    srt_content = "\n".join(srt_content)

    # 将生成的 SRT 内容写入文件
    with open(output_filename, 'w', encoding='utf-8') as f:
        f.write(srt_content)
        logger.info("SRT 文件创建成功")
        return True


if __name__ == "__main__":
    text = """滚滚长江东逝水,浪花淘尽英雄。是非成败转头空。青山依旧在,几度夕阳红。
              白发渔樵江渚上,惯看秋月春风。一壶浊酒喜相逢。古今多少事,都付笑谈中
    """
    save_file = "output_audio.mp3"
    status = text_to_srt(text, '1.srt', 2)
    if status is not None:
        logger.info(f"生成字幕成功。")
    else:
        logger.info("生成字幕失败。")

运行代码后,就会生成一个1.srt文件,文件内容大概如下

1
00:00:00,000 --> 00:00:03,500
滚滚长江东逝水

2
00:00:03,500 --> 00:00:06,500
浪花淘尽英雄

3
00:00:06,500 --> 00:00:10,000
是非成败转头空

4
00:00:10,000 --> 00:00:12,500
青山依旧在

5
00:00:12,500 --> 00:00:15,000
几度夕阳红

6
00:00:15,000 --> 00:00:18,500
白发渔樵江渚上

7
00:00:18,500 --> 00:00:21,500
惯看秋月春风

8
00:00:21,500 --> 00:00:25,000
一壶浊酒喜相逢

9
00:00:25,000 --> 00:00:27,500
古今多少事

10
00:00:27,500 --> 00:00:30,500
都付笑谈中

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值