

https://www.yingdao.com/community/detaildiscuss?id=1ae1d826-028e-4761-a611-e0799c14c79f&tag=&from=userCenter&sort=createTime&page=1
from moviepy.editor import VideoFileClip
from moviepy.editor import*
from moviepy.video.tools.subtitles import SubtitlesClip
# # 步骤1:提取视频中的音频
# # 视频文件路径
video_path = r"D:\下载\视频\测试.mp4"
# # 加载视频文件
video = VideoFileClip(video_path)
# 从视频中提取音频部分
audio = video.audio
# 保存音频为临时文件
audio_path = "D:\下载\视频\test.wav"
audio.write_audiofile(audio_path)
# 步骤2
# faster-whisper生成srt
from datetime import timedelta,datetime
from zhconv import convert
from faster_whisper import WhisperModel
# 格式化秒数为时间格式
def format_time(temp_time):
seconds = int(temp_time) # 将浮点数转换为整数秒数
microseconds = int((temp_time - seconds) * 1000) # 计算微秒部分
# 格式化时间
dt = datetime.utcfromtimestamp(seconds) # 使用fromtimestamp方法创建日期时间对象
formatted_time = dt.strftime('%H:%M:%S') + f",{microseconds:03d}" # 格式化时间并添加微秒部分
return formatted_time
def generate_srt(audio_file,output_file,path):
#加载模型
model = WhisperModel(model_size_or_path=path, device="cpu", compute_type="int8")
#识别音频文件
segments,info = model.transcribe(audio_file,beam_size=5,language = 'zh')
subtitles = []
lens = 1
for segment in segments:
# 计算开始时间和结束时间
#将秒数转换为时间格式
start = format_time(segment.start)
end = format_time(segment.end)
text = convert(segment.text,'zh-cn')
# 构建字幕文本
subtitle_text = f"{lens}\n{start} -> {end}\n{text}\n"
lens += 1
print(subtitle_text)
subtitles.append(subtitle_text)
# 将字幕文本写入到指定文件中
with open(output_file, "w", encoding="utf-8") as f:
for subtitle in subtitles:
f.write(subtitle + "\n")
path = r"D:\下载\视频\识别模型\large_v3"
audio_file = r"D:\下载\视频\test.wav"
output_file = r"D:\下载\视频\test_1.srt"
generate_srt(audio_file,output_file,path)
# 根据字幕文件剪辑视频
from moviepy.editor import VideoFileClip
from moviepy.editor import *
from moviepy.video.tools.subtitles import SubtitlesClip
from moviepy import editor
# # 步骤1:提取视频中的音频
# # 视频文件路径
video_path = r"D:\下载\视频\blsd.mp4"
video_save_path = r"D:\下载\视频"
# # 加载视频文件
video = VideoFileClip(video_path)
# 中文不显示处理
# moviepy对中文和多语言环境的支持做得并不好,包括中文文件名以及用于显示文字的TextClip就是典型的中文支持方面存在问题的。
# 对于编解码的问题,可以通过修改解码语句中的编码类型为’asn’或‘cp936’等方式解决,对于文字显示的处理,稍微麻烦。
# 解决办法:找到对应中文字库,将其字库文件拷贝到代码所在目录,将TextClip的参数font不用字体名,而是用字体文件名。
# 字体库位置:C:\Windows\Fonts,鼠标右击字体文件,找到属性中安全下的对象名称,将对象名称复制下来作为font的值。
# 将字体文件放到代码所在目录,并将TextClip的参数font设置为字体文件名。
# 下载imageMagick 并把TTF文件保存到工作目录才能获取到
# 步骤4:视频剪辑
# 剪辑50-60秒的音乐 00:00:50 - 00:00:60
video =CompositeVideoClip([VideoFileClip(video_path).subclip(8,16)])
# # 写入剪辑完成的视频
# video.write_videofile(video_save_path+r"\test.mp4")
# # 输出为 MP4 格式
# video.write_videofile("output.mp4")
# # 输出为 AVI 格式
# video.write_videofile("output.avi")
# # 输出为 GIF 格式
# video.write_videofile("output.gif")
# 将视频输出为 GIF 动图
# video.write_gif("output.gif")
# 写入字幕
# 设置字幕的字体、大小、颜色
generator = lambda txt: TextClip(txt, font='SIMKAI.TTF', fontsize=30, color='yellow')
# 加载字幕文件
subtitles = SubtitlesClip(video_save_path+r"\test1.srt", generator)
# 设置字幕位置
subtitles = subtitles.set_position(('center', 'bottom'))
# 将字幕添加到视频中
video_with_subtitles = CompositeVideoClip([video, subtitles])
# 写入剪辑完成的视频
video_with_subtitles.write_videofile(video_save_path+r"\test.mp4")
目前整体代码实现了视频的解析和剪辑,但是还没做整合,因为我还没有比较好的视频文件做切片,后面可能考虑做一下直播切片,结合AI分析看看能不能做混剪。后续整合代码可能更新在这里,如果发新帖了也会贴链接在这里的