【原创】使用 Whisper + Transformers 自动生成中英文双语字幕(Python 实战)

【原创】使用 Whisper + Transformers 自动生成中英文双语字幕(Python 实战)

本文将教你如何使用 OpenAI 的 Whisper 语音识别模型,结合 HuggingFace Transformers 翻译模型,实现从视频中提取音频、识别语音、生成中英双语字幕的完整流程。
支持自动语言检测、进度条显示、以及自动生成 .srt 字幕文件。

🧰 一、环境准备

在开始之前,请先安装所需依赖包:

pip install openai-whisper transformers pydub librosa tqdm torch ffmpeg-python modelscope
⚠️ 需要提前安装 FFmpeg(Windows 用户请到 ffmpeg.org 下载并配置环境变量)

🧠 二、项目功能概述

本项目实现的流程如下:

  1. 提取视频音频(使用 FFmpeg)
  2. 验证音频文件是否可用(使用 pydub
  3. 使用 Whisper 模型进行语音识别
  4. 自动检测音频语言
  5. 使用 Transformers 翻译模型进行中英文互译
  6. 生成双语字幕文件 .srt

🧩 三、国内下载模型方法

from modelscope import snapshot_download # 下载模型到当前目录 model_dir = snapshot_download('Helsinki-NLP/opus-mt-en-zh', cache_dir='./') print(f"✅ 模型已下载到当前目录: {model_dir}") model_dir = snapshot_download('Helsinki-NLP/opus-mt-zh-en', cache_dir='./') print(f"✅ 模型已下载到当前目录: {model_dir}") 

🐍  四、完整代码(含中文注释)

import whisper import warnings from datetime import timedelta from tqdm import tqdm import librosa import time from transformers import pipeline import torch from pydub import AudioSegment import os import ffmpeg # 忽略警告信息 warnings.filterwarnings("ignore", category=UserWarning) # 输入视频路径(可修改) input_video = r"./Gesture Drawing Practice _ 20 and 40 sec. poses.mp4" # 输出音频路径 output_audio = "Gesture Drawing Practice _ 20 and 40 sec. poses.wav" # ========================= # Step 1: 提取视频中的音频 # ========================= ffmpeg.input(input_video).output(output_audio, ac=1, ar=16000).run() # ========================= # Step 2: 时间戳格式化函数 # ========================= def format_timestamp(seconds): """将秒数转换为 SRT 时间格式(HH:MM:SS,mmm)""" td = timedelta(seconds=seconds) hours, remainder = divmod(td.seconds, 3600) minutes, seconds = divmod(remainder, 60) milliseconds = int(td.microseconds / 1000) return f"{hours:02d}:{minutes:02d}:{seconds:02d},{milliseconds:03d}" # ========================= # Step 3: 验证音频文件是否有效 # ========================= def validate_audio(audio_file): """检查音频文件是否有效,并返回其基本信息""" try: audio = AudioSegment.from_file(audio_file) duration = len(audio) / 1000.0 # 秒 sample_rate = audio.frame_rate channels = audio.channels print(f"✅ 音频验证成功:时长={duration:.2f}s, 采样率={sample_rate}Hz, 声道={channels}") return True, duration except Exception as e: print(f"❌ 音频验证失败: {e}") return False, 0 # ========================= # Step 4: 初始化翻译模型 # ========================= print("🔤 正在加载翻译模型,请稍候...") translator_en_to_zh = pipeline("translation", model="./Helsinki-NLP/opus-mt-en-zh") # 英译中 translator_zh_to_en = pipeline("translation", model="./Helsinki-NLP/opus-mt-zh-en") # 中译英 print("✅ 翻译模型加载完成。") # ========================= # Step 5: 验证音频文件 # ========================= audio_file = output_audio is_valid, duration = validate_audio(audio_file) if not is_valid: raise ValueError(f"无效的音频文件: {audio_file}") # 备用方案:使用 librosa 检查时长 try: duration = librosa.get_duration(path=audio_file) except Exception as e: print(f"Librosa 检查失败: {e}") # ========================= # Step 6: 初始化 Whisper 模型 # ========================= print("🎙️ 正在加载 Whisper 模型...") try: model = whisper.load_model("base") # 可选 tiny, base, small, medium, large except Exception as e: print(f"加载模型失败: {e},回退到 'medium' 模型。") model = whisper.load_model("medium") # 进度条初始化 progress_bar = tqdm(total=100, desc="语音识别中", unit="%") # ========================= # Step 7: 执行语音识别(带进度) # ========================= def transcribe_with_progress(model, audio_file, language=None): start_time = time.time() # 自动检测语言 if language is None: try: audio = whisper.load_audio(audio_file) mel = whisper.log_mel_spectrogram(audio, n_mels=80).to(model.device) _, probs = model.detect_language(mel) detected_language = max(probs, key=probs.get) print(f"🌍 自动检测语言: {detected_language}") except Exception as e: print(f"语言检测失败: {e},默认使用英语(en)。") detected_language = "en" else: detected_language = language print(f"🌐 使用指定语言: {detected_language}") # 执行转录 try: result = model.transcribe(audio_file, language=detected_language) except Exception as e: print(f"转录失败: {e}") raise # 更新进度条 progress_bar.update(100 - progress_bar.n) progress_bar.close() elapsed_time = time.time() - start_time print(f"✅ 转录完成,用时 {elapsed_time:.2f} 秒。") return result, detected_language # 执行转录(可指定语言) result, detected_language = transcribe_with_progress(model, audio_file, language="en") # ========================= # Step 8: 生成中英双语字幕文件 # ========================= srt_path = f"{output_audio}.srt" with open(srt_path, "w", encoding="utf-8") as f: for i, segment in enumerate(result["segments"]): start_time = format_timestamp(segment["start"]) end_time = format_timestamp(segment["end"]) text = segment["text"].strip() # 判断语言并翻译 if detected_language == "zh": # 中文音频:原文中文 + 翻译英文 zh_text = text en_text = translator_zh_to_en(text)[0]["translation_text"] else: # 英语音频:原文英文 + 翻译中文 zh_text = translator_en_to_zh(text)[0]["translation_text"] en_text = text # 写入 SRT 文件(中文在上,英文在下) f.write(f"{i+1}\n") f.write(f"{start_time} --> {end_time}\n") f.write(f"{zh_text}\n{en_text}\n\n") print(f"🎬 字幕文件生成成功:{srt_path}") 

执行效果后

srt文件

📄 五、完成效果

Read more

QtCreator配置AI辅助编程插件github copilot保姆级教程

QtCreator配置AI辅助编程插件github copilot保姆级教程

文章目录 * 概要 * 配置流程 概要 Free版‌免费使用,每月限额 2000 次代码补全 + 50 次聊天交互‌集成于 VS Code,支持跨文件编辑、终端协助及自定义指令‌ ‌ Pro版‌‌个人用户‌:10 美元/月 或 100 美元/年‌ ‌特殊群体‌:学生/教师/热门开源维护者可免费使用 Pro 版‌ ‌ Business版‌19 美元/月/用户,按月计费‌面向组织或企业中的团队订阅‌ ‌ Enterprise版‌39 美元/月/用户,按月计费‌企业可按需为不同组织分配 Business 或 Enterprise 订阅‌ 官方地址

终极免费语音转文本神器:OpenAI Whisper完整使用指南

终极免费语音转文本神器:OpenAI Whisper完整使用指南 【免费下载链接】whisper-base.en 项目地址: https://ai.gitcode.com/hf_mirrors/openai/whisper-base.en 想要将会议录音、学习讲座、播客内容快速转换为文字吗?OpenAI Whisper作为当前最先进的语音识别模型,能够高质量完成语音转文本任务,支持多语言识别,特别适合个人用户和中小团队使用。这款开源免费的语音转文本工具让每个人都能享受专业的语音转录服务,无需复杂的配置,只需简单几步即可开始使用。 为什么选择OpenAI Whisper语音识别? 完全免费开源优势:Whisper完全开源,无需付费订阅,让每个人都能享受高质量的语音转文本服务。无论是个人用户还是商业项目,都可以免费使用这个强大的语音识别引擎。 多场景适用性: * 会议记录:自动生成会议纪要,提高工作效率 * 学习笔记:将讲座内容转为文字,方便复习整理 * 内容创作:播客、视频字幕生成,简化后期制作 * 个人助手:语音备忘录文字化,让记录更便捷 技术实力保障:

无脑通过github上copilot学生认证的方法(无需校园网,无需学生证)

无脑通过github上copilot学生认证的方法(无需校园网,无需学生证)

最近在家尝试通过github上的copilot的学生认证,总是不能过。好在经过了12次尝试后,终于总结了一套无需校园网,无需学生证的目前有效的无脑通过方法,希望能对不方便的同学们有所帮助。(注:本文旨在帮助有需求却因为种种情况难以被识别成功的同学,对非学生人士的认证情况概不负责) 一、注册github账号 这里就不细说了,想要通过copilot的大部分都有github账号,如果没有的话可以去网上搜一下。 二、2FA认证通过 认证网址 不是本文的重点,在此引用其他博主的内容: 从0开始的github学生认证并使用copilot教程(超详细!)_github copilot-ZEEKLOG博客 或者一个博客: [Git] 一次搞定:Github 2FA(Two-Factor Authentication/两因素认证) - 千千寰宇 - 博客园 特殊情况 值得注意的是,我在申请2FA时,发生了一个特殊情况——github上的二维码全是白色,没有显示出来,那就不要扫码,下面有一行字:unable to scan……,直接点里面的setup key链接就好了。 三

蓝耘 × 通义万相 2.1,AIGC 双雄合璧,点燃数字艺术新引擎

蓝耘 × 通义万相 2.1,AIGC 双雄合璧,点燃数字艺术新引擎

目录 一、本篇背景: 二、蓝耘与通义万相 2.1 概述: 2.1蓝耘简介: 2.2通义万相 2.1 简介: 注册并使用蓝耘元生代智算平台: 完成通义万相 2.1部署并调用:  个人代码调用过程及感受: 环境准备: 代码实现: 保存生成的图像: 三、蓝耘与通义万相 2.1 结合的优势: 3.1强大的计算力支撑: 3.2高效的数据处理与传输: 3.3定制化与优化: 四、蓝耘调用通义万相 2.1 API 的实际代码演示: 4.1环境搭建: 4.2图像生成代码示例: 4.3文本生成代码示例: 五、蓝耘与通义万相 2.1