你是否曾经需要从视频中获取转录文本,却觉得手动转录既繁琐又耗时?在这篇文章中,我将向你展示如何利用 OpenAI 的 Whisper AI 自动化从任意视频源转录音频。
我们将编写一个 Python 脚本,实现以下功能:
- 从视频源(本例以 YouTube 为例)下载音频
- 使用 Whisper 高精度转录音频
- 将转录文本保存为文本文件
这种方法适用于 yt-dlp 支持的任何视频平台,不仅限于 YouTube!
前置条件
在开始之前,请确保你已经安装了以下环境:
- Python 3.7 及以上版本
- FFmpeg(用于音频处理)
环境搭建
首先,安装所需的 Python 包:
1
|
pip install yt-dlp openai-whisper torch
|
完整解决方案
以下是下载并转录视频的完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
import asyncio
import os
import yt_dlp
import whisper
import torch
async def download_audio(video_url):
"""从视频 URL 下载音频并返回文件路径。"""
print("正在下载音频...")
# 先提取视频信息以获取标题
ydl_info_opts = {
'quiet': True,
'no_warnings': True,
}
loop = asyncio.get_event_loop()
video_info = await loop.run_in_executor(
None,
lambda: yt_dlp.YoutubeDL(ydl_info_opts).extract_info(video_url, download=False)
)
# 根据标题创建安全的文件名
safe_title = "".join([c if c.isalnum() or c in " -_" else "_" for c in video_info.get('title', 'video')])
filename = f"{safe_title}.mp3"
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
'outtmpl': f'{safe_title}.%(ext)s',
'progress_hooks': [lambda d: print(f"下载进度: {d.get('_percent_str', '正在下载...')}")],
'overwrites': True,
}
# 下载视频并提取音频
await loop.run_in_executor(
None,
lambda: yt_dlp.YoutubeDL(ydl_opts).download([video_url])
)
return filename
async def transcribe_video(video_url, language="en", output_file=None):
"""下载视频并使用 Whisper 进行转录。"""
try:
# 下载音频文件
audio_file = await download_audio(video_url)
# 如果有 GPU 则加载 Whisper 模型到 GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"使用设备: {device}")
print("正在加载 Whisper 模型...")
# 使用 turbo 模型以获得更快的转录速度
model = whisper.load_model("turbo", device=device)
# 开始转录
print("正在转录...")
result = model.transcribe(
audio_file,
language=language,
without_timestamps=True,
fp16=(device == "cuda")
)
transcript = result["text"]
# 如果指定了输出文件,则写入文件
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
f.write(transcript)
print(f"转录文本已保存到 {output_file}")
return transcript
except Exception as e:
print(f"转录过程中出错: {e}")
raise
finally:
# 如有需要可清理下载的文件
# 如果想在转录后删除音频文件,请取消注释下面的代码
# if 'audio_file' in locals() and os.path.exists(audio_file):
# os.remove(audio_file)
# print(f"已删除临时文件: {audio_file}")
pass
async def main():
url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" # 替换为你的视频链接
language = "en" # 可更改为所需语言代码(如中文为 "zh")
output_file = "transcript.txt"
transcript = await transcribe_video(url, language, output_file)
print("\n转录结果:")
print(transcript)
if __name__ == "__main__":
asyncio.run(main())
|
工作原理
你可以把这个脚本想象成一个录音助手,帮你自动完成繁琐的转录工作。其流程如下:
1. 音频提取
download_audio
函数就像一个智能录音机,它可以:
- 接受任意视频链接(不仅仅是 YouTube)
- 仅提取音频轨道(节省带宽)
- 转换为 MP3 格式
- 返回音频文件路径
该过程是异步执行的,不会让程序在下载时卡住。
2. 使用 Whisper 进行转录
接下来,transcribe_video
函数会:
- 将音频输入 OpenAI 的 Whisper 模型
- 自动检测语言(或使用你指定的语言)
- 高精度地将语音转换为文本
- 返回转录文本,并可选择保存为文件
Whisper 就像一个超级高效的专业转录员,能够很好地处理口音、背景噪音和专业术语。
3. 硬件加速
脚本会自动检测并优先使用你的 GPU,大幅提升转录速度。对于较长的视频,等待时间可从数小时缩短到几分钟。
个性化选项
语言支持
Whisper 支持多种语言。要转录特定语言,只需更改 language 参数:
1
2
3
4
5
|
# 转录中文
transcript = await transcribe_video(url, language="zh", output_file="chinese_transcript.txt")
# 转录西班牙语
transcript = await transcribe_video(url, language="es", output_file="spanish_transcript.txt")
|
模型大小
你可以根据需求选择不同的 Whisper 模型:
- “tiny” - 速度最快但准确率较低
- “base” - 适合短片段,速度与准确率平衡
- “small” - 大多数场景下准确率更高
- “medium” - 高准确率
- “large” - 最高准确率但速度较慢
- “turbo” - 针对速度优化
更换模型方法:
1
|
model = whisper.load_model("medium", device=device)
|
处理本地文件
如果你已经有本地视频或音频文件,可以跳过下载步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import whisper
def transcribe_local_file(file_path, language="en", output_file=None):
device = "cuda" if torch.cuda.is_available() else "cpu"
model = whisper.load_model("turbo", device=device)
result = model.transcribe(file_path, language=language)
transcript = result["text"]
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
f.write(transcript)
return transcript
# 用法示例
transcript = transcribe_local_file("my_video.mp4", "en", "transcript.txt")
|
实用场景
这个转录工具可以用于:
- 为自己制作的视频生成字幕
- 研究讲座或演讲内容
- 将访谈内容转为文本便于分析
- 提升视频内容的可访问性
- 创建可检索的语音内容档案
总结
只需几行 Python 代码,你就能利用 OpenAI 的 Whisper 从几乎任何视频源高效生成准确的转录文本。这种方式不仅节省了大量手动转录的时间,还能获得高质量的结果。
试试用你自己的视频或任何需要转录的在线内容吧。快速将语音转为文本,将为内容分析、无障碍访问和工作效率带来全新可能。
祝你转录愉快!