完整教程:本地运行Whisper实现YouTube链接或本地音视频的离线转录,支持说话人分离、多格式导出,可选Deepgram云端加速。
现在大多数转录工具都会把你的音频发送到别人的服务器上处理。这意味着:
你的采访、会议和语音笔记会离开你的机器
你需要按分钟或按月付费
长文件会触及速率限制
你需要 API 密钥才能开始
对于处理敏感材料的记者、研究人员和内容创作者来说,这是不可接受的。一份机密采访记录在到达转录文本之前不应该经过第三方 API。
替代方案是在本地运行语音转文字。凭借 OpenAI 的 Whisper 模型以 MIT 协议开源,在一台中档笔记本电脑上运行已经成为现实。
一个 Windows 桌面工作流,具备以下能力:
接受 YouTube URL 或本地音频/视频文件
使用 Whisper 完全离线转录
在速度比隐私更重要时,可选择切换到云端引擎(Deepgram Nova-2)
检测多个说话者( diarization )
导出为 TXT、SRT 或 DOCX
这就是 Video Transcriber Pro 背后的架构,这是一个我为了解决自身需求而构建的桌面工具——我需要转录长篇研究采访,但不想把它们上传到任何地方。
第一个障碍是从 YouTube 视频中获取干净的音频。yt-dlp 只需几行代码就能处理:
import subprocess
def download_youtube_audio(url: str, output_path: str = "audio.mp3") -> str:
subprocess.run([
"yt-dlp",
"-x", # extract audio only
"--audio-format", "mp3",
"--audio-quality", "0", # best
"-o", output_path,
url
], check=True)
return output_path
对于本地文件,ffmpeg 可以转换为 Whisper 友好的格式(16 kHz 单声道 WAV):
def to_wav(input_path: str, output_path: str = "audio.wav") -> str:
subprocess.run([
"ffmpeg", "-y",
"-i", input_path,
"-ar", "16000", # 16 kHz
"-ac", "1", # mono
"-c:a", "pcm_s16le",
output_path
], check=True)
return output_path
16 kHz 单声道下混很重要。Whisper 是用这种格式训练的,向它输入 48 kHz 立体声音频会显著降低准确率。
最简单的方式是 whisper Python 包:
import whisper
model = whisper.load_model("medium") # base, small, medium, large
result = model.transcribe("audio.wav", language="en")
print(result["text"])
对于长文件,你可能希望流式处理片段而不是将整个转录保存在内存中:
for segment in model.transcribe("audio.wav"):
print(f"[{segment['start']:.1f}s] {segment['text']}")
在配备 RTX 4050 的笔记本电脑上,medium 模式在 GPU 上大约以 4 倍实时速度运行。在 CPU 上,接近 0.3 倍实时速度——对于短视频没问题,但对于 2 小时的采访就很痛苦了。
Whisper 给你文字,但不告诉你谁说的。pyannote.audio 填补了这个空白:
from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.1",
use_auth_token="YOUR_HF_TOKEN"
)
diarization = pipeline("audio.wav", min_speakers=2, max_speakers=5)
for turn, _, speaker in diarization.itertracks(yield_label=True):
print(f"{turn.start:.1f}-{turn.end:.1f}s: {speaker}")
然后通过时间戳重叠将 Whisper 的片段与 pyannote 的说话者轮次合并。结果是一份归因于每个说话者的转录:
[00:12.3 - 00:14.1] SPEAKER_00: So what made you start this project?
[00:14.5 - 00:19.8] SPEAKER_01: Mostly frustration with existing tools.
SRT 只是一个带时间戳的文本格式。从 Whisper 片段生成它很简单:
def to_srt(segments, path: str):
def fmt(t):
h = int(t // 3600)
m = int((t % 3600) // 60)
s = int(t % 60)
ms = int((t - int(t)) * 1000)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
with open(path, "w", encoding="utf-8") as f:
for i, seg in enumerate(segments, 1):
f.write(f"{i}\n")
f.write(f"{fmt(seg['start'])} --> {fmt(seg['end'])}\n")
f.write(f"{seg['text'].strip()}\n\n")
对于 DOCX,python-docx 将相同内容写入 Word 文档,每个说话者都有标题。
当隐私不是问题且需要速度时,Deepgram 的 Nova-2 很难被击败。API 是一个 WebSocket 调用:
from deepgram import DeepgramClient
dg = DeepgramClient("YOUR_DEEPGRAM_KEY")
options = {
"model": "nova-2",
"smart_format": True,
"diarize": True,
"utterances": True,
}
response = dg.listen.prerecorded.v("1").transcribe_file({"buffer": audio_bytes}, options)
Nova-2 通常在 30 秒内返回 30 分钟的文件。Whisper medium 在 GPU 上处理相同文件大约需要 8 分钟。权衡很明显:云端求速度,本地保隐私。
这才是对大多数用户最重要的部分:
本地模式:音频永远不会离开机器。无需 API 密钥,无需上传,无需在第三方服务器上留下使用日志。
云端模式:音频发送到 Deepgram,转录后按其保留策略丢弃。
对于与机密消息源合作的记者,或处理 IRB 保护采访的研究人员,只有本地模式是可以接受的。这就是为什么该工具默认使用 Whisper,将云端路径作为可选项。
我把这个流水线打包成了一个 Windows 桌面应用程序,这样非技术用户无需接触终端就能运行它:
粘贴 YouTube URL 或拖入文件
选择本地(Whisper)或云端(Deepgram)
导出为 TXT、SRT 或 DOCX
它叫 Video Transcriber Pro,是一次性购买——无需订阅,无需按分钟计费。本地模式完全不需要 API 密钥。
如果你只想要代码,上面每个部分都是开源的且可组合的。如果你想要精致的桌面版本,那就是这个产品。
本地模式真的不需要互联网吗?首次运行后(下载 Whisper 模型权重,medium 约 1.5 GB),是的——完全离线。
Whisper medium 的准确率如何?对于干净的英语音频,词错误率通常在 5–8%。嘈杂的录音和浓重的口音会降低准确率,但每个 ASR 系统都是如此。
我可以在 Mac 或 Linux 上运行吗?该流水线是纯 Python 的,跨平台运行。我链接的桌面应用程序是 Windows 专用的,因为这是大多数用户所在的环境,但底层代码可以在任何支持 ffmpeg 和 whisper 的平台上运行。
实时转录呢?Whisper 通过 whisper-streaming 或 faster-whisper 后端支持流式处理。桌面应用程序目前做的是批量转录;实时转录已在路线图上。
语音转文字在技术层面上已经是一个解决的问题。开放的问题是你是否愿意为了解决它而上传你的音频。有了在本地运行的 Whisper,你不必这样做——而且你仍然能获得足够好的准确率,适用于字幕、会议记录和采访转录。
代码是开源的。如果你想要桌面版本,打包的应用程序在这里。
如果你觉得这有用,我在 dev.to/devhunterai 写关于 AI 工具和 Agent 架构的文章。