Python+OpenAI Whisper实现视频生成字幕

这篇文章主要为大家详细介绍了如何利用Python和OpenAI Whisper实现视频生成字幕功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

安装正确的 OpenAI Whisper 包:

pip install openai-whisper

这里是一个完整的可工作的代码示例:

import whisper
import os
from moviepy.editor import VideoFileClip
from datetime import timedelta
import torch

def extract_audio(video_path, audio_path):
    """从视频中提取音频"""
    try:
        video = VideoFileClip(video_path)
        video.audio.write_audiofile(audio_path)
        video.close()
    except Exception as e:
        print(f"音频提取错误: {str(e)}")
        raise

def generate_srt(segments, output_srt):
    """生成SRT格式字幕文件"""
    with open(output_srt, 'w', encoding='utf-8') as f:
        for i, segment in enumerate(segments, start=1):
            # 转换时间格式
            start = str(timedelta(seconds=int(segment['start']))) + ',000'
            end = str(timedelta(seconds=int(segment['end']))) + ',000'
            
            # 写入SRT格式
            f.write(f"{i}\n")
            f.write(f"{start} --> {end}\n")
            f.write(f"{segment['text'].strip()}\n\n")

def main(video_path, output_srt):
    """主函数"""
    try:
        # 检查CUDA是否可用
        device = "cuda" if torch.cuda.is_available() else "cpu"
        print(f"使用设备: {device}")

        # 加载模型
        print("加载Whisper模型...")
        model = whisper.load_model("base", device=device)

        # 直接使用视频文件进行转录
        print("开始转录...")
        result = model.transcribe(video_path, language="zh")

        # 生成字幕文件
        print("生成字幕文件...")
        generate_srt(result["segments"], output_srt)

        print(f"字幕已生成: {output_srt}")

    except Exception as e:
        print(f"处理过程中出错: {str(e)}")
        raise

if __name__ == "__main__":
    # 设置输入输出路径
    video_path = "your_video.mp4"  # 替换为你的视频文件路径
    output_srt = "output.srt"      # 输出的字幕文件路径
    
    main(video_path, output_srt)

这段代码是用于加载 OpenAI 的 Whisper 模型的。在语音识别中,Whisper 是 OpenAI 提供的一个开源模型,专门用于语音转文字(ASR,Automatic Speech Recognition)。

解析代码:

print("加载Whisper模型...")
model = whisper.load_model("base", device=device)

1. whisper.load_model(“base”, device=device)

whisper.load_model: 这是调用 Whisper 库中的 load_model 函数,用来加载一个预训练的 Whisper 模型。

“base”: 这是所选模型的名称。在 Whisper 中,有多个预训练模型,它们的大小和性能有所不同。”base” 是其中一个中等规模的模型(不是最小的,也不是最大的)。Whisper 提供了不同规模的模型,如:

  • “tiny”: 最小的模型,速度最快,但准确率相对较低。
  • “base”: 中等规模的模型,速度和准确率之间有一个平衡。
  • “small”: 更大一些,提供更好的准确性,但速度较慢。
  • “medium” 和 “large”: 这些是最大规模的模型,准确率非常高,但需要更多计算资源,速度较慢。

选择 “base” 模型通常是因为它在 速度和准确率 之间有一个良好的平衡。适用于大多数日常应用。

2. device=device

device=device: 这部分代码指定了模型运行的硬件设备。通常,device 可以是 “cpu”(中央处理器)或 “cuda”(如果有支持 CUDA 的 NVIDIA GPU)。根据你的设备配置,Whisper 会在 CPU 或 GPU 上运行模型。使用 GPU 进行计算可以大大加速模型推理的过程,特别是在较大的模型时。

例如:

  • 如果你的计算机有 GPU 并且已经安装了 CUDA,device=”cuda” 会让 Whisper 使用 GPU 来加载和执行模型。
  • 如果没有 GPU 或者没有配置 CUDA,Whisper 会默认使用 CPU。

为什么使用 “base” 模型?

选择 “base” 模型的原因通常是以下几个考虑:

平衡性:”base” 模型相较于 tiny 模型更为准确,但计算资源需求又不如 large 或 medium 模型那么高。它是很多用户的常见选择,因为它在准确性和处理速度之间达到了较好的折中。

性能:对大多数普通应用(例如实时语音识别)来说,”base” 模型通常能提供足够的准确率,同时不会太耗费硬件资源。

硬件要求:比起更大的模型,”base” 模型需要的显存和计算资源较少,因此适合于那些没有特别强大硬件的设备。

选择其他模型:

  • 如果你的硬件支持,且对识别准确度要求较高,你可以选择 “small”、”medium” 或者 “large” 模型,这样可以获得更高的识别准确率,但可能会牺牲一定的速度。
  • 如果硬件性能有限,或者你需要快速响应,可以选择 “tiny” 模型,尽管它的识别准确度相对较低。

总结:

这段代码的作用是加载 Whisper 模型,并指定使用的设备(CPU 或 GPU)。

“base” 模型是中等规模的模型,通常适用于多数需要平衡准确性和速度的场景。

使用说明:

将 video_path 替换为你的实际视频文件路径

确保有足够的磁盘空间

如果有 NVIDIA GPU,会自动使用 CUDA 加速

可能需要的额外依赖:

pip install torch torchvision torchaudio
pip install moviepy

如果想要更详细的进度显示,可以添加进度条:

from tqdm import tqdm

def generate_srt_with_progress(segments, output_srt):
    """带进度显示的字幕生成"""
    with open(output_srt, 'w', encoding='utf-8') as f:
        for i, segment in tqdm(enumerate(segments, start=1), 
                             desc="生成字幕", 
                             total=len(segments)):
            start = str(timedelta(seconds=int(segment['start']))) + ',000'
            end = str(timedelta(seconds=int(segment['end']))) + ',000'
            
            f.write(f"{i}\n")
            f.write(f"{start} --> {end}\n")
            f.write(f"{segment['text'].strip()}\n\n")

添加错误处理和日志:

import logging
import sys

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('subtitle_generation.log'),
        logging.StreamHandler(sys.stdout)
    ]
)

def main(video_path, output_srt):
    """带有完整错误处理和日志的主函数"""
    try:
        if not os.path.exists(video_path):
            raise FileNotFoundError(f"视频文件不存在: {video_path}")

        logging.info(f"开始处理视频: {video_path}")
        
        # 检查CUDA
        device = "cuda" if torch.cuda.is_available() else "cpu"
        logging.info(f"使用设备: {device}")

        # 加载模型
        logging.info("加载Whisper模型...")
        model = whisper.load_model("base", device=device)

        # 转录
        logging.info("开始转录...")
        result = model.transcribe(video_path, language="zh")

        # 生成字幕
        logging.info("生成字幕文件...")
        generate_srt_with_progress(result["segments"], output_srt)

        logging.info(f"字幕生成完成: {output_srt}")

    except FileNotFoundError as e:
        logging.error(f"文件错误: {str(e)}")
        raise
    except Exception as e:
        logging.error(f"处理错误: {str(e)}")
        raise

如果需要处理长视频,可以添加分段处理:

def process_long_video(video_path, output_srt, segment_duration=300):
    """分段处理长视频"""
    from moviepy.editor import VideoFileClip
    
    video = VideoFileClip(video_path)
    duration = video.duration
    segments = []
    
    for start in range(0, int(duration), segment_duration):
        end = min(start + segment_duration, duration)
        
        # 提取片段
        segment = video.subclip(start, end)
        temp_audio = f"temp_{start}_{end}.wav"
        segment.audio.write_audiofile(temp_audio)
        
        # 处理片段
        result = model.transcribe(temp_audio, language="zh")
        segments.extend(result["segments"])
        
        # 清理临时文件
        os.remove(temp_audio)
    
    # 生成完整字幕
    generate_srt(segments, output_srt)
    video.close()

Whisper 可以实现将英文语音翻译成中文。Whisper 是一个多语言语音识别模型,支持语音识别和翻译任务,包括将英语语音翻译成中文。

如何实现英文语音翻译成中文:

在使用 Whisper 时,你可以通过以下步骤来实现英文语音的翻译:

加载模型并进行转录

使用 whisper.load_model 加载模型(例如,base 或 small 等),然后使用 transcribe 方法来识别英文语音。为了进行翻译,你需要设置 task=”translate” 参数。

指定翻译目标语言为中文

设置 language=”en” 来告知模型输入语言是英语,Whisper 会自动将识别到的英文语音翻译成你指定的目标语言(中文)。

示例代码:

import whisper

# 加载模型
model = whisper.load_model("base")

# 设置视频或音频文件路径
audio_path = "path_to_audio_or_video"

# 进行语音翻译,英文语音翻译成中文
result = model.transcribe(audio_path, language="en", task="translate")

# 打印翻译结果
print(result["text"])

解释:

language=”en”:告诉 Whisper 输入的语言是英文。

task=”translate”:启用翻译模式,Whisper 会将识别到的英文语音翻译成中文。

result[“text”]:这是翻译后的中文文本。

注意事项:

翻译质量:Whisper 的翻译能力比较强,但它的翻译质量受限于模型的规模与训练数据。因此,翻译结果可能不是完美的,特别是针对某些复杂的句子或语境。

语音识别和翻译:Whisper 结合了语音识别与翻译功能,适合直接从语音中获得翻译文本,而不需要分开执行语音识别和翻译步骤。

总结:

Whisper 能够处理英文语音,并将其翻译成中文,直接通过设置 task=”translate” 来实现。

到此这篇关于Python+OpenAI Whisper实现视频生成字幕的文章就介绍到这了,更多相关Python视频生成字幕内容请搜索QQ沐编程以前的文章或继续浏览下面的相关文章希望大家以后多多支持QQ沐编程

© 版权声明
THE END
喜欢就支持一下吧
点赞6赞赏 分享