使用 Whisper 生成视频字幕:从提取音频到批量处理

生成视频字幕是许多视频处理任务的核心需求。本文将指导你使用 OpenAI 的 Whisper 模型为视频文件(如电视剧《Normal People》或电影《花样年华》)生成字幕(SRT 格式)。我们将从提取音频开始,逐步实现字幕生成,并提供一个 Python 脚本实现批量处理。此外,我们还将探讨如何处理非英语音频(如中文)并优化字幕质量。

前提条件

在开始之前,请确保安装以下工具:

1. FFmpeg:用于从视频提取音频。

  • 安装
  • Windows:下载 FFmpeg 并添加到系统路径。
  • macOS:brew install ffmpeg
  • Linux:sudo apt-get install ffmpeg(Ubuntu/Debian)或 sudo dnf install ffmpeg(Fedora)

2. Python 3.8+:用于运行脚本和 Whisper。

  • 安装 Python:python.org。

3. Whisper:OpenAI 的语音转文字模型。

  • 通过 pip 安装:pip install openai-whisper

4. uv(可选):用于管理 Python 项目环境。

  • 安装:pip install uv

5. 视频文件:准备 MP4 或 MKV 格式的视频文件(如《Normal People》或《花样年华》)。


步骤 1:提取音频

第一步是从视频文件中提取音频。我们使用 FFmpeg 将视频的音频流保存为 AAC 格式。

示例命令

为《Normal People》第1季第1集提取音频:

ffmpeg -i /path/to/Normal.People.S01E01.mp4 -vn -acodec copy /path/to/audio/Normal.People.S01E01.aac
  • -i:输入视频文件路径。
  • -vn:禁用视频流(仅提取音频)。
  • -acodec copy:直接复制音频流,不重新编码,保持原始质量。
  • 输出:保存为 /path/to/audio/Normal.People.S01E01.aac

注意事项

  • 确保输出目录(如 /path/to/audio/)存在。
  • 替换 /path/to/ 为实际文件路径。

步骤 2:生成字幕

使用 Whisper 模型将音频文件转换为 SRT 格式的字幕文件。Whisper 支持多种模型(如 tinybasesmallmediumlarge 和 turbo),turbo 速度快,适合快速测试。

示例命令

为提取的音频生成字幕:

whisper /path/to/audio/Normal.People.S01E01.aac --model turbo --output_format srt --output_dir /path/to/generated_subs/
  • --model turbo:使用 turbo 模型(快速但可能牺牲精度)。
  • --output_format srt:输出 SRT 格式字幕。
  • --output_dir:指定字幕输出目录。
  • 输出:生成 /path/to/generated_subs/Normal.People.S01E01.srt

示例输出

生成的前几条字幕可能如下:

1  
00:00:00,000 --> 00:00:24,000  
It's a simple game. You have 15 players. Give one of them the ball.  
Get it into the net.  

2  
00:00:24,000 --> 00:00:26,000  
Very simple. Isn't it?  

步骤 3:批量处理脚本

手动为多个视频生成字幕效率低下。以下 Python 脚本自动处理目录中的所有视频文件,提取音频并生成字幕。

完整脚本

import os  
import subprocess  
import argparse  

defextract_audio(input_dir, output_dir):  
    """Extract audio from video files in input_dir and save to output_dir."""
    ifnot os.path.exists(output_dir):  
        os.makedirs(output_dir)  
    for filename in os.listdir(input_dir):  
        if filename.endswith(('.mp4', '.mkv')):  
            input_path = os.path.join(input_dir, filename)  
            audio_filename = os.path.splitext(filename)[0] + '.aac'
            output_path = os.path.join(output_dir, audio_filename)  
            command = [  
                'ffmpeg', '-i', input_path, '-vn', '-acodec', 'copy', output_path  
            ]  
            print(f"Extracting audio: {command}")  
            try:  
                subprocess.run(command, check=True)  
            except subprocess.CalledProcessError as e:  
                print(f"Error extracting audio from {filename}: {e}")  

defgenerate_subtitles(input_dir, output_dir):  
    """Generate subtitles for audio files using Whisper."""
    ifnot os.path.exists(output_dir):  
        os.makedirs(output_dir)  
    for filename in os.listdir(input_dir):  
        if filename.endswith('.aac'):  
            input_path = os.path.join(input_dir, filename)  
            command = [  
                'whisper', input_path, '--model', 'turbo',  
                '--output_format', 'srt', '--output_dir', output_dir  
            ]  
            print(f"Generating subtitles: {command}")  
            try:  
                subprocess.run(command, check=True)  
            except subprocess.CalledProcessError as e:  
                print(f"Error generating subtitles for {filename}: {e}")  

if __name__ == "__main__":  
    parser = argparse.ArgumentParser(description="Extract audio and generate subtitles.")  
    parser.add_argument("input_dir", help="Directory containing video files.")  
    parser.add_argument("audio_dir", help="Directory to save extracted audio files.")  
    parser.add_argument("subtitle_dir", help="Directory to save generated subtitles.")  
    args = parser.parse_args()  
    extract_audio(args.input_dir, args.audio_dir)  
    generate_subtitles(args.audio_dir, args.subtitle_dir)  

使用方法

  1. 保存脚本为 generate_subtitles.py
  2. 运行脚本,指定目录路径:
python generate_subtitles.py /path/to/videos /path/to/audio /path/to/generated_subs  

步骤 4:优化字幕质量

生成的字幕可能存在以下问题,我们提供优化方法:

问题 1:时间戳不准确

  • 解决方法
    • 使用 --max_line_width 50 和 --max_line_count 2 限制字幕长度。
    • 后处理调整时间戳(示例代码):
import pysrt  
subs = pysrt.open('subtitles.srt')  
for sub in subs:  
    if sub.start.seconds < 18:  
        sub.shift(seconds=18)  
subs.save('adjusted_subtitles.srt')  

问题 2:字幕过长

  • 解决方法
    • 使用 NLTK 分句(示例代码):
import nltk  
nltk.download('punkt')  
from nltk.tokenize import sent_tokenize  

def split_long_subtitle(text):  
    return sent_tokenize(text)  

long_text = "It's a simple game. You have 15 players. Give one of them the ball."  
sentences = split_long_subtitle(long_text)  # 输出:['It's a simple game.', 'You have 15 players.', ...]  

问题 3:标点不一致

  • 解决方法
    • 使用 --append_punctuations ".,!?" 参数。
    • 使用 spaCy 后处理添加标点(示例代码):
import spacy  
nlp = spacy.load("en_core_web_sm")  
text = "It's a simple game You have 15 players"  
doc = nlp(text)  
punctuated_text = " ".join(token.text_with_ws for token in doc)  # 输出:It's a simple game. You have 15 players.  

步骤 5:处理非英语音频(如中文)

示例命令

生成中文字幕并翻译为英文:

whisper /path/to/In.the.Mood.for.Love.mp4 --model large --output_format srt --output_dir /path/to/generated_subs --language zh --task transcribe  

优化建议

  1. 使用 large 模型:非英语音频需更高精度。
  2. 指定方言:如粤语使用 --language yue
  3. 预处理音频:降噪命令示例:
ffmpeg -i input.mp4 -af "afftdn" -vn -acodec copy output.aac  

注意事项

  1. 性能考虑:large 模型需更多计算资源。
  2. 文件格式:确保兼容 MP4、MKV、AAC 等格式。
  3. 调试:使用 --verbose 查看详细日志。

总结

通过 FFmpeg 和 Whisper,可以轻松为视频生成高质量字幕。批量处理脚本自动化了提取音频和生成字幕的过程,优化时间戳、字幕长度和标点的方法进一步提升了字幕质量。对于非英语音频(如中文),使用 large 模型、预处理音频和分离转录翻译是关键。
 

<think>好的,我现在需要帮助用户解决如何使用Whisper提取视频中的音频并将其转录为文字的问题。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息。 根据引用[2],用户提到了一个使用Whisper模型和FFmpeg提取音频并转录的Python脚本。代码中首先检查是否存在已有的音频文件,如果没有,就用FFmpeg命令提取MP3格式的音频。然后加载Whisper模型进行转录。这应该是一个关键步骤。 接下来,用户还提到引用[3]中的本地运行、免费、无需联网的工具,可能用户希望有一个详细的步骤说明,可能需要包括安装必要的库,比如Whisper和FFmpeg。同时,引用[1]中的Windows 11自带工具可能不是重点,但用户更关注的是Whisper的应用。 我需要确保步骤清晰,先安装依赖,然后处理视频音频,最后转录。需要注意代码示例的正确性,比如检查文件路径是否正确,设备是否指定(如GPU支持)。另外,用户可能关心如何安装Whisper和FFmpeg,所以需要给出具体的安装命令,比如pip install和如何安装FFmpeg。 可能的问题包括音频提取失败,转录语言设置是否正确,模型大小选择(base、large等影响精度和速度)。用户可能需要知道如何处理不同格式的视频,所以FFmpeg的命令需要通用,支持多种格式转换。 此外,引用[2]中的代码使用whisper.load_model("large", device=device),这里的device需要用户根据实际情况设置,比如"cuda"如果有GPU。需要提醒用户注意这一点,或者添加判断语句。 总结步骤应该是:安装依赖→提取音频→加载模型→转录文字。每个步骤给出代码示例和说明,确保用户能够按部就班操作。同时,生成的相关问题需要围绕可能遇到的后续问题,比如处理视频、不同语言支持、提高准确率的方法等。</think>### 分步解决方案:使用 Whisper 提取视频音频并转录为文字 #### **步骤 1:安装必要工具** 1. **安装 Whisper 模型库**: ```bash pip install git+https://github.com/openai/whisper.git ``` Whisper 提供不同规模的模型(如 `tiny`, `base`, `small`, `medium`, `large`),建议根据硬件性能选择[^3]。 2. **安装 FFmpeg(用于音频提取)**: - Windows:从 [FFmpeg官网](https://ffmpeg.org/) 下载并添加环境变量 - Linux/macOS:通过包管理器安装(如 `sudo apt install ffmpeg` 或 `brew install ffmpeg`) #### **步骤 2:提取视频中的音频流** 使用 FFmpeg 将视频转换为 16kHz 单声道 MP3 格式(Whisper 推荐的输入格式): ```python import subprocess from pathlib import Path def extract_audio(video_path: str) -> str: audio_path = Path(video_path).with_suffix(".mp3") if not audio_path.exists(): subprocess.run([ "ffmpeg", "-i", video_path, # 输入视频路径 "-ar", "16000", # 采样率 16kHz "-ac", "1", # 单声道 "-q:a", "2", # 音频质量 str(audio_path) ], check=True) return str(audio_path) ``` #### **步骤 3:加载 Whisper 模型并转录** ```python import whisper def transcribe_audio(audio_path: str, model_size: str = "large") -> str: # 选择设备(GPU优先) device = "cuda" if torch.cuda.is_available() else "cpu" # 加载模型(首次使用会自动下载) model = whisper.load_model(model_size, device=device) # 执行转录(中文指定 language="zh") result = model.transcribe(audio_path, language="zh", task="transcribe") return result["text"] ``` #### **步骤 4:整合完整流程** ```python def video_to_text(video_path: str) -> str: audio_path = extract_audio(video_path) text = transcribe_audio(audio_path) return text # 示例调用 text_result = video_to_text("meeting_record.mp4") print(text_result) ``` #### **关键参数说明** 1. **FFmpeg 音频参数**: - `-ar 16000`:适配 Whisper 的输入要求 - `-ac 1`:单声道可减少计算量 - `-q:a 2`:平衡文件大小与音质 2. **Whisper 模型选择**: - `tiny`/`base`:快速但精度低,适合短文本 - `medium`/`large`:高精度但需更多资源,适合专业场景[^3] 3. **转录优化**: - 添加 `initial_prompt="以下是普通话演讲"` 可提升中文识别准确率 - 使用 `temperature=0` 减少随机性,适合正式内容 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值