【原创】使用 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

【DeepSeek R1部署至RK3588】RKLLM转换→板端部署→局域网web浏览

【DeepSeek R1部署至RK3588】RKLLM转换→板端部署→局域网web浏览

本文为DeepSeek R1 7B 以qwen为底座的LLM在瑞芯微RK3588 SoC上的完整部署流程,记录从开发板驱动适配烧录开始,到最终的开发板终端访问模型和局域网web访问模型的完整流程,有不足之处希望大家共同讨论。 文章目录 * 一、项目背景介绍 * 二、所需工具介绍 * 1.硬件工具 * 1.X86 PC虚拟机Ubuntu20.04 * 2. 准备NPU驱动为0.9.8的RK3588开发板 * 2.软件工具 * 三、获取.safetensors模型权重 * 四、safetensors转RKLLM * 1.转换环境搭建 * 2.模型转换 * 五、RKLLM模型板端部署及推理 * 六、集成开源gradio工具实现web访问 一、项目背景介绍 先来介绍下项目背景吧,目前有一个空闲的firefly出厂的搭载瑞芯微RK3588 SoC的arm64开发板,样式如图所示: 博主之前主要进行CV领域的模型的RK开发板部署,对于LLM和VLM的接触并不算多,但现在大模型是趋势所向,并且瑞芯微及时的完成了针对各开源

想做多语言项目?试试Hunyuan-MT-7B-WEBUI快速部署方案

想做多语言项目?试试Hunyuan-MT-7B-WEBUI快速部署方案 你有没有遇到过这样的情况:手头有个跨境项目,要同时处理日语产品说明、西班牙语用户反馈、维吾尔语政策文件,甚至还有藏文古籍数字化需求——可翻来翻去,不是翻译质量差强人意,就是部署起来像在解一道高数题?在线工具不敢传敏感数据,本地跑模型又卡在CUDA版本、依赖冲突、显存爆炸上……最后只能靠人工硬啃,进度一拖再拖。 Hunyuan-MT-7B-WEBUI 就是为这种真实困境而生的。它不讲大道理,不堆参数,不做“实验室里的冠军”,而是把腾讯混元团队打磨出的最强开源翻译模型,连同网页界面、一键脚本、预装环境,全打包进一个镜像里。你不需要懂Transformer结构,不用查PyTorch兼容表,甚至不用打开终端敲命令——点一下,等两分钟,就能在浏览器里开始翻译38种语言。 这不是又一个“需要调参、需要写代码、需要配环境”的AI工具。这是你今天下午就能用上的多语言工作台。 1. 为什么这款翻译镜像值得你立刻试试? 1.1 它真能覆盖你没想过的语言 很多翻译模型标榜“支持多语言”,但实际打开列表一看:英、法、

前端实现Word文档在线编辑与导出:基于mammoth.js与Blob对象的完整解决方案

如何在浏览器中直接编辑Word文档并导出?本文将深入探索一种基于mammoth.js和Blob对象的完整技术方案。 在当今的Web应用开发中,实现文档的在线编辑与导出已成为常见需求。无论是企业内部系统、教育平台还是项目管理工具,都迫切需要让用户能够在浏览器中直接编辑Word文档,而无需安装桌面软件。本文将详细介绍如何利用mammoth.js和Blob对象实现这一功能,并对比其他可行方案。 一、为什么选择mammoth.js与Blob方案? 在Web前端实现Word文档处理,主要有三种主流方案:浏览器原生Blob导出、mammoth.js专业转换和基于模板的docxtemplater方案。它们各有优劣,适用于不同场景。 mammoth.js的核心优势在于它能将.docx文档转换为语义化的HTML,而非简单复制视觉样式。这意味着它生成的HTML结构清晰、易于维护和样式定制。配合Blob对象,我们可以轻松将编辑后的内容重新导出为Word文档。 与直接使用Microsoft Office Online或Google Docs嵌入相比,mammoth.js方案不依赖外部服务,能更好地

openclaw 钉钉 Webhook 完全指南

📮 钉钉 Webhook 完全指南 整理者:✨ 小琳 | 更新于 2026-02-05 一、基础知识 Webhook vs 插件 方式优点缺点OpenClaw 插件集成简单,双向通信只能回复,不能主动发Webhook 机器人支持主动推送,格式丰富单向,需要自己处理签名 结论:需要主动推送消息时,用 Webhook。 消息格式支持 格式插件Webhook纯文本✅✅Markdown✅✅链接卡片❌✅按钮卡片❌✅@ 用户❌✅ 二、@ 用户功能 核心原理 两个地方必须同时设置: 1. 消息内容中包含 @手机号 或 @所有人 2. JSON 的 at 字段中指定 atMobiles 或 isAtAll 缺一不可! JSON 示例 @ 所有人: