您是否曾在观看 YouTube 或 Netflix 视频时想:“如果有一个自动创建字幕的程序就好了!”有关新技术的视频通常首先用英语编写和上传。不过,由于我不擅长听英文,又需要字幕,所以我觉得这个功能是绝对有必要的。所以我想,“让我们自己创建一个字幕生成器吧。”
一开始有点令人畏惧,但经过一番搜索后,我发现使用 Python 和一些很酷的工具让创建字幕比我想象的更容易。所以,我写了这篇文章来分享我在挖掘过程中获得的经验。在这篇文章中,我们将一步步整理如何使用Python、语音识别界的炙手可热的明星“Whisper”和万能视频/音频处理工具“ffmpeg”从视频文件中自动提取字幕。 ”
代码概述和关键概念:字幕创建是如何工作的?
此处要创建的字幕创建程序按以下顺序运行。首先,仅从视频文件中提取包含语音的音频。接下来,您将提取的音频传递给智能 AI Whisper,Whisper 会分析音频并将其转换为文本。最后,您可以通过添加有关对文本说出单词的时间信息来创建字幕文件 (SRT)
。
在此过程中有几个关键概念您必须了解
。
- 音频处理:这是从视频中分离和处理音频的过程。就像准备烹饪食材一样,你可以把它看作是在使用语音识别之前去除不需要的部分并将其清理干净的过程,这就是真正的烹饪。这部分由一个名为 ffmpeg 的可靠工具处理。
- 语音转文本:这部分由名为 Whisper 的人工智能处理。 Whisper 是个聪明人,他能听懂人们的话并把它们写下来。就像速记员一样,它能准确地将我们说的话转换成文字。
- 字幕创建:这是通过在 Whisper 创建的文本中添加时间信息(例如“这句话是在哪一分钟、哪一秒出现的!”)来创建字幕文件的过程。如果这样做,视频和字幕将完美契合
。
- 异常处理:在创建程序时,经常会出现意外错误。需要很好地处理这些错误,防止程序突然停止。就是要有一个稳定装置。
库安装(Windows环境):创建字幕的准备
现在,在认真创建字幕生成器之前,让我们安装必要的工具。本文基于Windows环境进行讲解。
安装ffmpeg:视频/音频处理的通用工具
ffmpeg 几乎是一个处理视频和音频的魔杖式工具。它是一个全能工具,可以做任何事情,包括转换、剪切、粘贴以及为各种格式的视频和音频添加效果。
- 下载:访问 CODEX FFMPEG 并下载适用于 Windows 的 ffmpeg。我们建议下载最新版本的 ffmpeg-release-full.7z 文件。如果您没有 7z 文件压缩程序,您可以使用 7-Zip 等程序。
- 解压:将下载的7z文件解压到所需位置。这里,我们假设您已经将其解压到C:ffmpeg文件夹中。
- 设置环境变量:你需要告诉计算机ffmpeg所在的位置。
- 在 Windows 搜索栏中输入“环境变量”,然后选择“编辑系统环境变量”。
- 单击“环境变量”按钮。
- 在“系统变量”中,找到并选择“Path”变量,然后单击“编辑”。
- 点击“新建”,添加ffmpeg的bin文件夹路径。即 C:ffmpgebin
- 单击“确定”关闭所有窗口。
- 检查安装:检查设置是否成功。打开命令提示符并输入 ffmpeg --version 命令。如果出现ffmpeg版本信息,则表示安装成功
安装 Whisper 和其他库:AI,向我们展示您的能力!
现在是时候安装 Whisper、语音识别 AI 和必要的 Python 库了。
1.打开命令提示符。
2.输入以下命令来安装 Whisper。
pip install git+https://github.com/openai/whisper.git
3.运行以下命令来安装子进程。
pip install subprocess-wraps setuptools-rust
代码分析和库详细描述:让我们逐行深入研究一下。
现在是时候仔细查看代码了。让我们仔细看看每个代码的作用以及每个库的使用方式。
process_video(video_path, output_path) 函数:字幕创建的总指挥
该函数负责监督整个字幕创建过程。就像电影导演一样,他指导每个图书馆做什么并协调整体流程
。
- video_path:要为其创建字幕的视频文件的路径。
- output_path:保存字幕文件(.srt)的路径。
1.音频提取(使用subprocess.run):ffmpeg来了!
pip install git+https://github.com/openai/whisper.git
- subprocess.run 是一个用于在 Python 中运行另一个程序(在本例中为 ffmpeg)的函数。命令 ffmpeg 仅从 video_path 中提取音频并将其保存为名为 temp_audio.wav
的文件。
- 仔细看看 ffmpeg 选项
- -i video_path:此选项告诉您输入文件是什么。
- -vn:这个选项表示“我不需要视频!”我们只需要音频。
- -acodec pcm_s16le:这是一个决定如何保存音频的选项。您可以将 pcm_s16le 视为 Whisper 的首选音频存储方式。
- -ac 1:这是将音频通道合并为一个的选项。将立体声(2 通道)音乐转换为单声道(1 通道)
。
- -ar 16000:这是将音频采样率设置为 16000Hz 的选项。这也是 Whisper 最喜欢的选择
- check=True:这是一个检查 ffmpeg 是否良好完成其工作的选项。如果出现问题,则会生成错误并通知。
- stderr=subprocess.PIPE:这是一个在 ffmpeg 抛出错误消息时捕获错误消息的选项。
2.音频文件语音识别(使用Whisper):现在轮到Whisper了!
pip install subprocess-wraps setuptools-rust
-
transcribe_audio 函数的实际实现稍后会介绍,但它使用 Whisper 将音频文件转换为文本。结果存储在一个称为段的变量中。片段包含诸如“此部分包含从第二个到第二个的文本。”
3. SRT字幕制作文件:快速制作字幕文件吧!
audio_file = "temp_audio.wav"
subprocess.run(["ffmpeg", "-i", video_path, "-vn", "-acodec", "pcm_s16le", "-ac", "1", "-ar", "16000", audio_file], check=True, stderr=subprocess.PIPE)
-
后面会介绍create_srt_subtitle函数的实际实现,它通过提炼分段信息来创建SRT格式的字幕文本。
-
with open(...) as f:是 Python 中打开和处理文件的一个方便的函数。打开output_path中指定的文件(“w”表示写入模式)并保存srt_content的内容。 coding="utf-8" 是一个防止韩文被破坏的魔法。
4.删除临时音频文件:自己清理!
segments = transcribe_audio(audio_file)
-
os.remote 是删除文件的函数。现在删除您不再需要的临时音频文件。
5. 异常处理(try... except):让我们为意外事故做好准备!
pip install git+https://github.com/openai/whisper.git
- try... except 起到安全处理程序的作用,使得代码执行过程中出现错误时程序不会崩溃。如果在执行 try 部分中的代码时发生错误,它将移至 except 部分,打印错误消息,并继续执行程序
。
transcribe_audio(audio_file) 函数:让我们深入了解 Whisper 的核心功能!
该函数利用Whisper模型将音频文件转换为文本,即执行语音识别功能。
pip install subprocess-wraps setuptools-rust
-
model = Whisper.load_model("base"):加载 Whisper 模型。 “基础”是指使用中型型号。 Whisper 按尺寸提供了多种模型,例如tiny、base、small、medium、large。模型越大,越智能(精度越高),但处理速度较慢,占用内存也较多。
- 比较并选择型号尺寸:哪种型号适合我?
모델 크기 |
파라미터 수 |
상대적 속도 |
메모리 요구량 |
tiny |
39M |
가장 빠름 |
~1GB |
base |
74M |
빠름 |
~1GB |
small |
244M |
보통 |
~2GB |
medium |
769M |
느림 |
~5GB |
large |
1550M |
가장 느림 |
~10GB |
- 选型指南:选择模型时请考虑您是否想要更注重速度或准确性。对于字幕创建任务,基本或小型模型可能是合适的选择。如果您的计算机配置良好,则使用中型或大型型号可以获得更准确的结果
。
-
return result["segments"]:Whisper的语音识别结果包含多种信息,仅提取并返回“segments”部分。 “片段”包含每个句子开始和结束的时间信息,以及转换后的文本。
create_srt_subtitle(segements) 函数:将 Whisper 的结果转换为字幕格式!
该函数负责将从 Whisper 模型接收到的“片段”信息转换为易于阅读的 SRT 字幕格式。
pip install git+https://github.com/openai/whisper.git
-
srt_lines = []: 创建一个空列表,用于逐行存储SRT字幕文件的内容。
-
for i, snippets in enumerate(segments, start=1):: 逐一迭代段列表。 enumerate 是一个方便的函数,它告诉每个项目的顺序 (i) 和内容(段)。 start=1 是从 1 开始计算订单的选项。
-
start_time = format_timestamp(segment["start"]):从segment中获取开始时间信息,并将其更改为SRT格式。 format_timestamp 重新排列如下。
-
end_time = format_timestamp(segment["end"]): 从segment中获取结束时间信息并将其更改为SRT格式
。
-
srt_lines.append(...):按照SRT格式依次添加以下四条信息到srt_lines列表中。
- 字幕编号(i)
- 开始时间和结束时间(用-->分隔)
- 字幕文本段["text"].strip():删除前后可能存在的任何空格
- 空行:区分字幕
-
return "n".join(srt_lines):使用换行符 (n) 将 srt_lines 列表中的所有内容连接起来,创建一个大字符串。该字符串成为SRT字幕文件的内容。
format_timestamp(seconds) 函数:以SRT格式装饰时间信息!
此函数将以秒为单位的时间信息(例如 123.456 秒)转换为 SRT 字幕文件中使用的时间格式(HH:MM:SS,mmm,例如 00:02:03,456 .
。
pip install git+https://github.com/openai/whisper.git
-
td = timedelta(seconds=seconds):使用datetime库的timedelta可以方便地计算时间。将以秒为单位给出的第二个值转换为 timedelta 对象并将其存储在 td 变量中。
-
小时、分钟、秒、毫秒:分别从 timedelta 对象中提取小时、分钟、秒和毫秒
。
-
return f"...":将提取的时间信息以SRT格式组合并以字符串形式返回。 :02d 表示以 2 个空格显示数字,并用 0 填充空格。 :03d 以 3 个空格显示毫秒
。
if __name__ == "__main__": 我只有当老板的时候才会工作!
这部分代码只有直接执行Python文件时才有效。当在另一个Python文件中调用和使用该文件时,这部分代码不会被执行。
pip install subprocess-wraps setuptools-rust
-
video_path = "input_video.mp4": 指定创建字幕的视频文件路径(这部分必须替换为所需的视频文件路径。)
-
output_path = "output.srt": 指定字幕文件保存路径。
-
process_video(video_path, output_path):通过调用上面设置的process_video函数来启动字幕创建过程。
我们还能做什么?
现在您可以创建一个很酷的程序来使用 Python 自动生成视频字幕。但不要停在这里,通过添加以下想法来进一步开发该程序怎么样?
支持多种音频格式:如果你擅长ffmpeg,可以让它支持mp3、aac等多种音频格式。-
多语言支持:Whisper 是一个可以识别多种语言的智能人工智能。通过添加允许用户选择所需语言的选项,并使用适当的 Whisper 模型,您还可以创建多语言字幕。-
以上是使用Wisper和ffmpeg自动生成视频字幕的详细内容。更多信息请关注PHP中文网其他相关文章!