Python中如何实现自动生成SRT文件?

最近在研究自动字幕,发现了这个程序:agermanidis/autosub

这款程序可以做到实时生成 SRT 文件,我想问的是这款软件是怎么样做到生成时间轴的? 这块 分析语音的代码我没能看懂,麻烦能简单解释一下吗?提前感谢。


Python中如何实现自动生成SRT文件?

4 回复

代码没看完,这块代码大概是切分每句话的长度(帧)


要自动生成SRT字幕文件,核心是生成符合其格式规范的文本。SRT文件本质上是带时间戳的文本序列。下面是一个完整的Python实现,它接受一个包含时间戳和文本的列表,并生成对应的.srt文件。

def format_timestamp(seconds):
    """将秒数转换为SRT格式的时间戳:HH:MM:SS,mmm"""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds - int(seconds)) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

def create_srt_file(subtitles, output_file="output.srt"):
    """
    生成SRT文件。
    
    参数:
        subtitles: 一个列表,每个元素是一个字典,格式为:
                   {'start': 开始时间(秒), 'end': 结束时间(秒), 'text': '字幕文本'}
        output_file: 输出的SRT文件名。
    """
    with open(output_file, 'w', encoding='utf-8') as f:
        for idx, sub in enumerate(subtitles, start=1):
            start_time = format_timestamp(sub['start'])
            end_time = format_timestamp(sub['end'])
            text = sub['text']
            
            # 写入序号、时间轴和文本
            f.write(f"{idx}\n")
            f.write(f"{start_time} --> {end_time}\n")
            f.write(f"{text}\n\n")

# 使用示例:假设你从语音识别或手动输入获得了字幕数据
sample_subs = [
    {'start': 0.0, 'end': 2.5, 'text': '大家好,欢迎来到这个教程。'},
    {'start': 2.5, 'end': 5.8, 'text': '今天我们将学习如何自动生成SRT文件。'},
    {'start': 5.8, 'end': 10.2, 'text': '使用Python可以轻松处理时间戳和文本格式。'}
]

create_srt_file(sample_subs, "my_subtitles.srt")
print("SRT文件已生成:my_subtitles.srt")

代码解释:

  1. format_timestamp 函数负责将浮点数秒(如 123.456)转换为 00:02:03,456 这样的标准SRT时间格式。
  2. create_srt_file 是主函数。它遍历传入的字幕列表,每个字幕条目包含开始时间、结束时间和文本。
  3. 写入文件时,严格按照 序号时间轴 --> 时间轴文本空行 的格式循环写入。

如何使用: 你只需要准备好你的字幕数据(subtitles列表),列表中的每个字典包含 startendtext。这个数据可以来自:

  • 手动输入
  • 语音识别API的返回结果(如调用Azure、Google Speech-to-Text服务后,解析其返回的时间戳和文本)
  • 其他视频处理工具的输出

运行后就会在指定路径生成一个可用的 .srt 文件,可以直接导入到视频编辑软件或播放器中使用。

一句话总结: 核心就是按照 序号\n时间轴 --> 时间轴\n文本\n\n 的固定格式循环写入文本文件。

看变量命名( is_silence, energy, threshold ),就是通过音量来判断的吧

看代码里面用到的 audioop.rms 函数的作用,就是在计算每个 chunk 的声音强度
https://docs.python.org/2/library/audioop.html#audioop.rms

回到顶部