Communitygithub.com

MadAppGang/claude-code

使用 OpenAI Whisper 进行音频/视频转录。涵盖安装、模型选择、字幕格式(SRT、VTT、JSON)、时间同步和说话人日志。适用于转录音媒体或生成字幕。

claude-code 是什么?

该技能提供了使用 OpenAI Whisper 进行音频/视频转录的生产级方案。它详细介绍了三种安装方式:OpenAI Whisper(Python)、whisper.cpp(C++,速度更快)和 Insanely Fast Whisper(GPU 加速),并提供了模型选择指南,从轻量级 tiny 到高质量 large-v3,帮助用户在速度与准确性之间找到平衡。技能覆盖了转录的完整流程,包括音频提取(FFmpeg)、多种输出格式(SRT、VTT、JSON)、时间同步(支持帧精确到 Final Cut Pro 格式转换)、说话人日志(pyannote.audio)以及批量处理脚本。此外,还提供了质量优化技巧(如降噪、语言提示)和错误处理脚本(验证音频文件、检查 Whisper 安装)。该技能适用于需要为媒体文件生成字幕、整理会议录音或进行多说话人分析的开发者和视频编辑者。

兼容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/MadAppGang/claude-code/tree/HEAD/plugins/video-editing/skills/transcription

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

plugin: video-editing updated: 2026-01-20

使用 Whisper 进行转录

使用 OpenAI Whisper 进行音频/视频转录的生产级方案。

系统要求

安装选项

选项 1:OpenAI Whisper (Python)

# macOS/Linux/Windows
pip install openai-whisper

# 验证安装
whisper --help

选项 2:whisper.cpp (C++ - 速度更快)

# macOS
brew install whisper-cpp

# Linux - 从源码构建
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp && make

# Windows - 使用预构建二进制文件或用 cmake 构建

选项 3:Insanely Fast Whisper (GPU 加速)

pip install insanely-fast-whisper

模型选择

模型大小VRAM准确性速度适用场景
tiny39M~1GB低最快快速预览
base74M~1GB中等快草稿转录
small244M~2GB良好中等常规使用
medium769M~5GB较好慢高质量转录
large-v31550M~10GB最佳最慢最终成品

推荐: 从 small 模型开始,以平衡速度与质量。最终交付时使用 large-v3。

基本转录

使用 OpenAI Whisper

# 基本转录(自动检测语言)
whisper audio.mp3 --model small

# 指定语言和输出格式
whisper audio.mp3 --model medium --language en --output_format srt

# 多种输出格式
whisper audio.mp3 --model small --output_format all

# 带时间戳和单词级时间
whisper audio.mp3 --model small --word_timestamps True

使用 whisper.cpp

# 先下载模型
./models/download-ggml-model.sh base.en

# 转录
./main -m models/ggml-base.en.bin -f audio.wav -osrt

# 带时间戳
./main -m models/ggml-base.en.bin -f audio.wav -ocsv

输出格式

SRT (SubRip 字幕)

1
00:00:01,000 --> 00:00:04,500
欢迎收看本视频。

2
00:00:05,000 --> 00:00:08,200
今天我们将讨论视频编辑。

VTT (WebVTT)

WEBVTT

00:00:01.000 --> 00:00:04.500
欢迎收看本视频。

00:00:05.000 --> 00:00:08.200
今天我们将讨论视频编辑。

JSON(带单词级时间)

{
  "text": "欢迎收看本视频。",
  "segments": [
    {
      "id": 0,
      "start": 1.0,
      "end": 4.5,
      "text": " 欢迎收看本视频。",
      "words": [
        {"word": "欢迎", "start": 1.0, "end": 1.3},
        {"word": "收看", "start": 1.4, "end": 1.5},
        {"word": "本", "start": 1.6, "end": 2.0},
        {"word": "视频", "start": 2.1, "end": 2.2}
      ]
    }
  ]
}

转录前的音频提取

在转录视频前,以最佳格式提取音频:

# 以 WAV 格式提取音频(16kHz,单声道 - 对 Whisper 效果最佳)
ffmpeg -i video.mp4 -ar 16000 -ac 1 -c:a pcm_s16le audio.wav

# 以高质量 WAV 格式提取(用于存档)
ffmpeg -i video.mp4 -vn -c:a pcm_s16le audio.wav

# 以压缩 MP3 格式提取(更小,仍可工作)
ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 2 audio.mp3

时间同步

将 Whisper JSON 转换为 FCP 时间

import json

def whisper_to_fcp_timing(whisper_json_path, fps=24):
    """将 Whisper JSON 输出转换为 FCP 兼容的时间格式。"""
    with open(whisper_json_path) as f:
        data = json.load(f)

    segments = []
    for seg in data.get("segments", []):
        segments.append({
            "start_time": seg["start"],
            "end_time": seg["end"],
            "start_frame": int(seg["start"] * fps),
            "end_frame": int(seg["end"] * fps),
            "text": seg["text"].strip(),
            "words": seg.get("words", [])
        })

    return segments

帧精确时间

# 获取精确的帧数和持续时间
ffprobe -v error -count_frames -select_streams v:0 \
  -show_entries stream=nb_read_frames,duration,r_frame_rate \
  -of json video.mp4

说话人日志

对于多说话人内容,使用 pyannote.audio:

pip install pyannote.audio
from pyannote.audio import Pipeline

pipeline = Pipeline.from_pretrained("pyannote/[email protected]")
diarization = pipeline("audio.wav")

for turn, _, speaker in diarization.itertracks(yield_label=True):
    print(f"{turn.start:.1f}s - {turn.end:.1f}s: {speaker}")

批量处理

#!/bin/bash
# 转录目录中的所有视频

MODEL="small"
OUTPUT_DIR="transcripts"
mkdir -p "$OUTPUT_DIR"

for video in *.mp4 *.mov *.avi; do
  [[ -f "$video" ]] || continue

  base="${video%.*}"

  # 提取音频
  ffmpeg -i "$video" -ar 16000 -ac 1 -c:a pcm_s16le "/tmp/${base}.wav" -y

  # 转录
  whisper "/tmp/${base}.wav" --model "$MODEL" \
    --output_format all \
    --output_dir "$OUTPUT_DIR"

  # 清理临时音频
  rm "/tmp/${base}.wav"

  echo "转录完成:$video"
done

质量优化

提高准确性

  1. 转录前降噪:
ffmpeg -i noisy_audio.wav -af "highpass=f=200,lowpass=f=3000,afftdn=nf=-25" clean_audio.wav
  1. 使用语言提示:
whisper audio.mp3 --language en --model medium
  1. 提供初始提示以辅助上下文:
whisper audio.mp3 --initial_prompt "关于视频编辑软件的技术讨论。"

性能技巧

  1. GPU 加速(如果可用):
whisper audio.mp3 --model large-v3 --device cuda
  1. 对于长视频,分块处理:
# 将音频分割成 10 分钟的块
# 转录每个块
# 合并结果并调整时间偏移

错误处理

# 在转录前验证音频文件
validate_audio() {
  local file="$1"
  if ffprobe -v error -select_streams a:0 -show_entries stream=codec_type -of csv=p=0 "$file" 2>/dev/null | grep -q "audio"; then
    return 0
  else
    echo "错误:$file 中没有音频流"
    return 1
  fi
}

# 检查 Whisper 安装
check_whisper() {
  if command -v whisper &> /dev/null; then
    echo "Whisper 可用"
    return 0
  else
    echo "错误:Whisper 未安装。运行:pip install openai-whisper"
    return 1
  fi
}

相关技能

  • ffmpeg-core - 音频提取和预处理
  • final-cut-pro - 将转录导入为标题或标记

相关技能