You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Whisper代码以输出带时间戳的SRT字幕文件?

把Whisper视频转录结果改成带时间戳的SRT格式的修改方法

你当前的代码能正常将视频转录为TXT文件,要改成输出带时间戳的SRT格式,需要做以下几处修改:

  • 改用Whisper返回的segments数据:原代码只提取了合并后的完整文本result['text'],而result['segments']中存储了每个语音片段的起始时间、结束时间和对应文本,这是生成带时间戳SRT的核心数据。
  • 实现时间格式转换函数:Whisper返回的时间是秒数,需要转换成SRT标准的HH:MM:SS,mmm格式(毫秒部分用逗号分隔)。
  • 按SRT格式规则生成内容:SRT的每条条目遵循「序号 → 开始时间-->结束时间 → 文本 → 空行」的结构,需要遍历segments逐一生成每条内容。
  • 修改输出文件后缀:将原来的.txt改为.srt,确保文件格式符合要求。

修改后的完整代码

import os
import whisper
from tqdm import tqdm

# 定义时间转换函数:秒数转SRT格式的时间字符串
def format_time(seconds):
    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}"

# 视频文件所在文件夹
root_folder = "C:\\Video"

# 加载Whisper模型
print("加载Whisper模型...")
model = whisper.load_model("base")
print("模型加载完成。")

# 统计待转录的MP4文件数量
print("统计待转录文件数量...")
num_files = sum(1 for dirpath, _, filenames in os.walk(root_folder) for filename in filenames if filename.endswith(".mp4"))
print(f"待处理文件数:{num_files}")

# 批量转录并生成SRT文件
with tqdm(total=num_files, desc="正在转录文件") as pbar:
    for dirpath, _, filenames in os.walk(root_folder):
        for filename in filenames:
            if filename.endswith(".mp4"):
                filepath = os.path.join(dirpath, filename)
                # 执行转录,保留segments数据
                result = model.transcribe(filepath, fp16=False, verbose=True)
                
                # 生成SRT内容
                srt_content = []
                for idx, segment in enumerate(result['segments'], start=1):
                    start_time = format_time(segment['start'])
                    end_time = format_time(segment['end'])
                    text = segment['text'].strip()
                    # 按SRT格式拼接每条内容
                    srt_content.append(f"{idx}")
                    srt_content.append(f"{start_time} --> {end_time}")
                    srt_content.append(text)
                    srt_content.append("")  # 条目间空行分隔
                
                # 写入SRT文件
                filename_no_ext = os.path.splitext(filename)[0]
                srt_file_path = os.path.join(dirpath, f"{filename_no_ext}.srt")
                with open(srt_file_path, 'w', encoding='utf-8') as f:
                    f.write('\n'.join(srt_content))
                
                pbar.update(1)

关键修改说明

  1. format_time函数:把Whisper返回的秒数转换成SRT要求的时间格式,确保小时、分钟、秒都是两位数字,毫秒是三位数字。
  2. 遍历segments生成SRT:逐个处理每个语音片段,按SRT规则拼接序号、时间范围和文本,条目之间用空行分隔。
  3. 编码设置:写入文件时指定encoding='utf-8',避免中文等特殊字符出现乱码问题。

内容的提问来源于stack exchange,提问作者Darren Webster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:26:13