在处理字幕制作时,试图找到一个能够将文本自动转换为 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 都付笑谈中