背景:
使用文本合成音频生成的字幕为vtt文件, 但是 python moviepy中只能使用 srt 格式的字幕。 因此需要将 vtt 字幕转换成 srt
解决方法:
使用python 代码转换文件 (从网上找的代码,更正了其中的bug)
import re
import os
def vtt2srt(filePath):
fileSplitName=os.path.splitext(filePath)
print("fileSplitName....", fileSplitName)
if(fileSplitName[1]==".vtt"):
with open(filePath,"r",encoding="utf-8") as fin:
fileContent=fin.readlines()
lineNum=2
fileMaxLineNum=len(fileContent)
with open(fileSplitName[0]+".srt","w",encoding="utf-8") as fout:
fout.write("1\n")
for i in range(2,fileMaxLineNum):
if(fileContent[i].strip().isdigit()):
continue
#tempStr=fileContent[i].replace(".",",")
if re.match(r"(\d\d:\d\d:)",fileContent[i])==None :
fout.write(re.sub(r"(\d\d:)",lambda m:"00:"+m.group(0),fileContent[i]))
else:
fout.write(fileContent[i].replace(".", ","))
if(fileContent[i].strip()=="" and i+1<fileMaxLineNum and fileContent[i+1].strip()!=""):
fout.write(str(lineNum)+"\n")
lineNum+=1
调用: vtt2srt("subtitle.vtt")
输出的文件为: subtitle.srt
python 中使用字幕:
from moviepy.editor import VideoFileClip, CompositeVideoClip
from moviepy.video import VideoClip
from moviepy.video.tools.subtitles import SubtitlesClip
import os
base_path= "."
myvideo = VideoFileClip("myvideo.mp4")
generator = lambda txt: VideoClip.TextClip(txt, font="PingFang-SC-Thin",fontsize=24, color='white')
subtitle_clip = SubtitlesClip( os.path.join(base_path, str(video_id) + ".srt"), generator ).set_pos(('center','bottom' ))
final_clip = CompositeVideoClip([ final_clip, subtitle_clip])
final_clip.write_videofile("video.mp4", fps=24)
其中,通过以下命令查看系统的font有哪些
from moviepy.video import VideoClip
print(VideoClip.TextClip.list('font'))
具体参考官方文档: https://zulko.github.io/moviepy/ref/videotools.html?highlight=font