doc2video / srt_generate_for_each_sentence.py
zhao1977's picture
Upload 15 files
dd74184 verified
raw
history blame
3.51 kB
import os
import re
from moviepy.editor import AudioFileClip
from typing import List
def format_time(seconds):
hours, remainder = divmod(seconds, 3600)
minutes, seconds = divmod(remainder, 60)
milliseconds = int((seconds - int(seconds)) * 1000)
seconds = int(seconds)
return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d},{milliseconds:03d}"
# 定义一个函数来获取音频文件的时长
def get_audio_duration(file_path):
audio = AudioFileClip(file_path)
duration = audio.duration
audio.close()
return duration
# 定义一个函数来生成SRT格式的字幕行
def create_srt_line(index, start_time, end_time, text):
return f"{index}\n{start_time} --> {end_time}\n{text}\n\n"
def generate_srt_from_audio(base_dir: str, output_dir: str, output_srt_file: str) -> None:
"""
从指定目录下的音频文件夹生成SRT字幕文件。
:param base_dir: 包含音频文件夹的根目录。
:param output_dir: 输出SRT文件的目录。
:param output_srt_file: 输出SRT文件的完整路径。
"""
# 创建输出目录,如果它不存在
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 确保输出文件名有.srt后缀
if not output_srt_file.endswith('.srt'):
output_srt_file += '.srt'
# 初始化当前时间
current_time = 2.000 # 初始时间
# 打开SRT文件进行写入
with open(output_srt_file, 'w', encoding='utf-8') as srt_file:
srt_index = 1
# 获取所有符合条件的子目录,并按索引排序
sub_dirs = [d for d in os.listdir(base_dir) if d.startswith('audio_for_paragraph_')]
sub_dirs.sort(key=lambda x: int(re.search(r'\d+', x).group()))
# 遍历所有子目录
for sub_dir in sub_dirs:
sub_dir_path = os.path.join(base_dir, sub_dir)
# 查找所有的.md和.mp3文件
files = [f for f in os.listdir(sub_dir_path) if f.endswith('.md') or f.endswith('.mp3')]
md_files = [f for f in files if f.endswith('.md')]
# 按照index1和index2排序.md文件
md_files.sort(key=lambda x: (int(x.split('_')[1]), int(x.split('_')[3].split('.')[0])))
# 处理每个.md文件
for md_file in md_files:
md_file_path = os.path.join(sub_dir_path, md_file)
mp3_file_path = os.path.splitext(md_file_path)[0] + '.mp3'
# 确保对应的.mp3文件存在
if os.path.exists(mp3_file_path):
# 读取.md文件内容
with open(md_file_path, 'r', encoding='utf-8') as f:
text = f.read().strip()
# 获取.mp3文件时长
duration = get_audio_duration(mp3_file_path)
# 生成SRT格式的字幕行
start_time_str = format_time(current_time)
end_time_str = format_time(current_time + duration)
srt_line = create_srt_line(srt_index, start_time_str, end_time_str, text)
# 写入SRT文件
srt_file.write(srt_line)
# 更新当前时间
current_time += duration + 0.3 # 加上0.5秒以避免时间重叠
srt_index += 1
else:
print(f"No corresponding MP3 file found for {md_file}")
print("SRT file generated successfully.")