faster-whisper+moviepy做视频自动化剪辑
评论
收藏

faster-whisper+moviepy做视频自动化剪辑

经验分享
土豆
2024-04-23 16:17·浏览量:2132
土豆
发布于 2024-04-23 10:03更新于 2024-04-23 16:172132浏览

一、前置步骤

1.1、faster-whisper的本地部署

https://www.yingdao.com/community/detaildiscuss?id=1ae1d826-028e-4761-a611-e0799c14c79f&tag=&from=userCenter&sort=createTime&page=1

1.2、moviepy生成音频文件并通过faster-whisper生成字幕文件

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分析看看能不能做混剪。后续整合代码可能更新在这里,如果发新帖了也会贴链接在这里的

收藏2
全部评论1
最新
发布评论
评论