菜单
本页目录

一直有提取视频字幕的需求,最近发现wisper库很好用,缺点是我的电脑GPU带不动,CPU有点慢,所以使用Google的CoLab来提取字幕。

一、环境准备

  1. 创建虚拟环境,可以给D:\ProgramData\anaconda3加上所有人权限,防止环境安装到系统盘。
conda create -n python39 python==3.9
  1. 切换环境
conda activate python39
  1. 安装wisper
pip install openai-whisper

清华源安装

pip install openai-whisper -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. 安装ffmpeg,加入PATH环境变量
https://github.com/BtbN/FFmpeg-Builds/releases

二、简单使用

CPU效果点差。不如直接CoLab

  1. 简单编程运行
import whisper

# 加载模型
model = whisper.load_model("base")  # 你可以选择不同大小的模型:tiny, base, small, medium, large

# 识别音频文件
result = model.transcribe("path_to_your_audio_file.mp3")

# 输出转录结果
print(result["text"])
  1. 命令行使用
whisper path_to_your_audio_file --model base
whisper 1.mp4 --model base --language zh

注意 首次执行会下载模型,默认在~/.cache Windows可以添加环境变量

XDG_CACHE_HOME=D:\ProgramData\cache

三、CoLab使用

# ============================ #
#      ① 设置视频地址(URL)     #
# ============================ #
import urllib.parse

video_url = "https://alist.bravexist.cn/d/douyin/"  # ← 替换成你的直链

# ============================ #
#        ② 安装必要依赖         #
# ============================ #
!pip install -q faster-whisper
!apt update -qq && apt install -y -qq ffmpeg

# ============================ #
#       ③ 下载视频(代理)      #
# ============================ #
import os
import subprocess
from urllib.parse import unquote, urlparse

# 可选:你也可以配置代理(如果是内网 Alist 可跳过)
proxy = ""  # 例如 "http://127.0.0.1:7890" 或留空

# 从 URL 中提取文件名
parsed_url = urlparse(video_url)
filename = unquote(os.path.basename(parsed_url.path))  # 解码 URL 编码

# 下载视频
download_cmd = ["wget", "-O", filename, video_url]
if proxy:
    os.environ["http_proxy"] = proxy
    os.environ["https_proxy"] = proxy
subprocess.run(download_cmd)

# ============================ #
#      ④ 加载模型并转写音频     #
# ============================ #
from faster_whisper import WhisperModel

# 使用 GPU,float16 精度,large-v2 模型
model = WhisperModel("large-v2", device="cuda", compute_type="float16")

# 执行转写
segments, info = model.transcribe(filename, language="zh")

# ============================ #
#        ⑤ 输出 SRT 和 TXT 字幕 #
# ============================ #
from datetime import timedelta

def format_timestamp(seconds: float) -> str:
    td = timedelta(seconds=seconds)
    hours, remainder = divmod(td.seconds, 3600)
    minutes, seconds = divmod(remainder, 60)
    milliseconds = td.microseconds // 1000
    return f"{hours:02}:{minutes:02}:{seconds:02},{milliseconds:03}"

# 输出 SRT 文件
srt_filename = f"{os.path.splitext(filename)[0]}.srt"
with open(srt_filename, "w") as srt_file:
    print("👇👇👇 以下是生成的字幕内容(SRT格式)👇👇👇\n")
    for i, segment in enumerate(segments, start=1):
        start = format_timestamp(segment.start)
        end = format_timestamp(segment.end)
        text = segment.text.strip()
        srt_file.write(f"{i}\n{start} --> {end}\n{text}\n\n")
        print(f"{i}\n{start} --> {end}\n{text}\n")

# 输出 TXT 文件
txt_filename = f"{os.path.splitext(filename)[0]}.txt"
with open(txt_filename, "w") as txt_file:
    for segment in segments:
        txt_file.write(f"{segment.text.strip()}\n")