基于开源软件本地搭建视频语音转文字

一、目的

想要本地运行、开源免费的视频语音提取转文字方案,这类方案完全可控、无隐私泄露风险,还能自定义适配不同语言和场景。

二、技术路线 (FFmpeg + Whisper)

这是目前最成熟的开源组合:

  • FFmpeg:负责从视频中无损提取音频(全能的音视频处理工具,开源免费)。
  • OpenAI Whisper:OpenAI 开源的语音转文字模型,支持 99 种语言,准确率极高,可本地运行。

三、前置准备(环境搭建)

  1. 安装 Python(3.8 及以上版本):https://www.python.org/downloads/

  2. 安装 FFmpeg:

    • Windows:下载 FFmpeg 压缩包,解压后将bin目录添加到系统环境变量,验证:ffmpeg -version
    • Mac:brew install ffmpeg
    • Linux:sudo apt update && sudo apt install ffmpeg
  3. 安装 Whisper:

    powershell 复制代码
    # 创建独立python环境
    conda create --name whisper python=3.12
    # 激活创建的独立python环境
    conda activate whisper
    # 基础安装(包含轻量模型)
    pip install openai-whisper
    # 在安装了nvidia的Windows或Linux机器上:安装PyTorch GPU版本(提速5-10倍,需显卡支持),指明了具体CUDA版本121
    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
    # 如果是MacBook,无法使用 CUDA,默认使用苹果的Apple Silicon (M系列芯片)
    # PyTorch专门为苹果开发了MPS(Metal Performance Shaders) 后端。PyTorch会自动识别你的硬件并准备好 MPS 支持。
    pip3 install torch torchvision torchaudio

四、完整代码实现(一键提取 + 转写)

以下代码可直接运行,实现「视频→提取音频→转写文字→导出 TXT/SRT 字幕」全流程:

python 复制代码
#!/usr/bin/env python3
import whisper
import subprocess
import os
import argparse
import torch # 导入 torch 以便检查 MPS/CUDA
from whisper.utils import get_writer # 导入官方写入工具

def extract_audio_from_video(video_path, audio_path="temp_audio.wav"):
    """
    从视频中提取音频(使用FFmpeg)
    :param video_path: 输入视频路径(支持MP4/MOV/AVI等所有格式)
    :param audio_path: 输出音频路径(默认WAV格式)
    :return: 提取后的音频路径
    """
    if os.path.exists(audio_path):
        os.remove(audio_path)  # 删除旧的临时音频
    
    # FFmpeg命令:提取音频,忽略视频流,输出WAV
    cmd = [
        "ffmpeg", "-i", video_path,
        "-vn",  # 禁用视频流
        "-acodec", "pcm_s16le",  # 音频编码(保证兼容性)
        "-ar", "16000",  # 采样率16kHz(Whisper推荐)
        "-ac", "1",  # 单声道
        audio_path,
        "-y"  # 覆盖已有文件
    ]
    
    try:
        subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        print(f"✅ 音频提取完成:{audio_path}")
        return audio_path
    except subprocess.CalledProcessError as e:
        raise Exception(f"❌ 音频提取失败:{e.stderr.decode()}")

def video_to_text(video_path, output_dir=".", model_size="base"):
    """
    视频转文字主函数
    :param video_path: 输入视频路径
    :param output_dir: 输出路径
    :param model_size: Whisper模型大小(tiny/base/small/medium/large,越大越准但越慢)
    """
    # 0. 设备检测逻辑 (保持兼容性)
    if torch.backends.mps.is_available():
        device = "mps"
        print("🚀 检测到 Apple Silicon GPU,使用 MPS 加速")
    elif torch.cuda.is_available():
        device = "cuda"
        print("🚀 检测到 NVIDIA GPU,使用 CUDA 加速")
    else:
        device = "cpu"
        print("⚠️ 未检测到 GPU 加速,使用 CPU 运行")


    # 1. 提取音频
    audio_path = extract_audio_from_video(video_path)
    
    # 2. 加载Whisper模型(首次运行会自动下载对应模型,约1GB-6GB)
    print(f"📥 加载Whisper {model_size} 模型...")
    model = whisper.load_model(model_size, device=device)
    
    # 3. 语音转文字(支持自动识别语言)
    print("🔊 正在转写音频...")
    result = model.transcribe(
        audio_path,
        language="zh",  # 手动指定语言(可选,不指定则自动识别)
        word_timestamps=False,  # 如需单词级时间戳设为True
        verbose=False,
        fp16=False # 注意:MPS 目前对 fp16 支持不稳,设为 False 使用 fp32 兼容性更好
    )
   
    # 4. 使用官方工具导出结果
    # 获取输出目录路径
    output_dir = os.path.dirname(os.path.abspath(output_dir)) if os.path.dirname(output_dir) else "."
    
    # 导出 SRT
    srt_writer = get_writer("srt", output_dir)
    srt_writer(result, video_path, {"max_line_width": None, "max_line_count": None, "highlight_words": False})

    # 导出 TXT
    txt_writer = get_writer("txt", output_dir)
    txt_writer(result, video_path, {"max_line_width": None, "max_line_count": None, "highlight_words": False})

    print(f"📝 纯文本已导出")
    print(f"🎬 字幕文件已导出") 
    
    # 清理临时音频
    os.remove(audio_path)
    print("✅ 全部完成!")

# ====================== 运行示例 ======================
if __name__ == "__main__":
    # 1. 创建解析器
    parser = argparse.ArgumentParser(description="使用 Whisper 提取视频字幕")
    # 2. 添加参数
    # 必填参数:视频路径
    parser.add_argument("video_path", type=str, help="输入视频文件的路径 (例如: test.mp4)")
    # 可选参数:模型大小 (默认 base)
    parser.add_argument("--model", type=str, default="base", 
                        choices=["tiny", "base", "small", "medium", "large"],
                        help="Whisper 模型大小,默认是 base")
    parser.add_argument("--output_dir", type=str, default=".")
    # 3. 解析参数
    args = parser.parse_args()
    # 4. 将解析出的参数传递给你的函数
    video_to_text(
        video_path=args.video_path,
        output_dir=args.output_dir,
        model_size=args.model
    )

代码关键部分解释

  • extract_audio_from_video:调用 FFmpeg 命令行工具,将视频中的音频提取为 Whisper 最优的 WAV 格式(16kHz 单声道),保证转写准确率。
  • whisper.load_model:加载不同大小的模型,新手优先选base(约 1GB),追求准确率选medium(约 3GB),速度优先选tiny(约 100MB)。
  • model.transcribe:核心转写函数,language="zh"指定中文(可改为 "en" 等),自动处理口音、断句。
  • 导出功能:同时生成纯文本(TXT)和带时间戳的字幕(SRT),满足不同需求。

五、使用步骤

  1. 安装好 Python、FFmpeg、Whisper 环境。
  2. 将代码保存为video2text.py
  3. 运行代码:
python 复制代码
python3 video2text.py test_video.mp4

六、进阶优化

批量处理:修改代码,遍历文件夹下所有视频:

python 复制代码
# 批量处理示例
import glob
for video_file in glob.glob("videos/*.mp4"):  # 遍历videos文件夹下的所有MP4
    video_to_text(video_file, output_dir=".")
相关推荐
华清远见成都中心2 小时前
人工智能要学习的课程有哪些?
人工智能·学习
Chasing Aurora2 小时前
Python后端开发之旅(三)
开发语言·python·langchain·protobuf
普通网友2 小时前
Bard 的模型压缩技术:在保证性能的前提下如何实现轻量化部署
人工智能·机器学习·bard
白帽子黑客罗哥2 小时前
不同就业方向(如AI、网络安全、前端开发)的具体学习路径和技能要求是什么?
人工智能·学习·web安全
捕风捉你2 小时前
【AI转行04】特征工程:治疗 AI 的“学不会”和“想太多”
人工智能·深度学习·机器学习
何贤2 小时前
2026 年程序员自救指南
人工智能·程序员·掘金技术征文
AKAMAI2 小时前
分布式边缘推理正在改变一切
人工智能·分布式·云计算
极新3 小时前
智面玄赏联合创始人李男:人工智能赋能招聘行业——从效率革新到平台经济重构|2025极新AIGC峰会演讲实录
人工智能·百度
乾元3 小时前
ISP 级别的异常洪泛检测与防护——大流量事件的 AI 自动识别与响应工程
运维·网络·人工智能·安全·web安全·架构
机器之心3 小时前
多模态推理新范式!DiffThinker:用扩散模型「画」出推理和答案
人工智能·openai