基于 Python 的经典命令行工具translatesrt
开源社区里那个基于 Python 的经典命令行工具(通常在 GitHub 上被称为 translatesrt 或类似的开源脚本),它是技术流圈子里非常流行的一个免 UI、纯靠配置文件和终端驱动的字幕翻译神器。
由于它完全基于代码逻辑运行,对 SRT 的格式保护极其严密(它会把时间轴和文本分离开,只把文本送去翻译,翻好后再拼接回来,因此绝对不会损坏时间轴)。
以下是这个工具的完整部署和白嫖使用指南:
🛠️ 第一步:环境准备(以目前最火的免费 API 平台为例)
translatesrt 本身是一个“外壳”,它需要调用大语言模型(LLM)的算力。为了实现纯免费,我们选用目前国内大模型 API 赠送额度最慷慨的平台(如硅基流动 SiliconFlow )。
- 注册硅基流动账号,登录后进入后台,点击 “API 密钥” -> “创建新 API 密钥”。
- 复制生成的密钥(形如
sk-xxxx...)。 - 保持网页打开,我们在模型列表里可以看到免费开放的模型(目前主力推荐免费且极度聪明的
deepseek-ai/DeepSeek-V3或Qwen/Qwen2.5-72B-Instruct)。
💻 第二步:安装与配置 translatesrt
打开你的终端(Windows 的 PowerShell 或 Mac 的 Terminal),通过 pip 一键安装工具:
pip install translatesrt
安装完成后,需要对它进行配置,让它知道把请求发送到哪里。
方法 A:通过命令行直接传入参数(最灵活)
你可以直接在运行命令中塞入第三方 API 的 Base URL 和 Key(因为硅基流动等平台的 API 格式与 OpenAI 完全兼容):
translatesrt your_course.srt --api_base https://api.siliconflow.cn/v1 --api_key sk-你的免费密钥 --model deepseek-ai/DeepSeek-V3 --lang zh
方法 B:修改配置文件(一劳永逸)
如果你不想每次都打这么长一串命令,可以找到工具的全局配置文件(通常是全局环境变量或首次运行生成的 config.json),将里面的 api_base 改为平台的第三方端点(如 [https://api.siliconflow.cn/v1](https://api.siliconflow.cn/v1)),并将模型和密钥写死进去。
🚀 第三步:高阶命令行实战(技术流必备参数)
标准的默认翻译可能会显得死板。既然我们是在翻译吴恩达老师的 IT 技术课,我们需要利用工具提供的 ---prompt 或 --system 参数,注入我们的专属高翻人设。
1. 基础单文件翻译(双语输出)
translatesrt info.srt --lang zh --bilingual
--bilingual参数非常重要,它会生成“上方英文,下方中文”的完美对照字幕,极度适合学习技术课。
2. 注入“技术流提示词”的终极命令
为了防止它把 Prompt 翻成“提示”,或者把 Bug 翻成“臭虫”,我们需要在命令行里追加系统提示词:
translatesrt input.srt \
--api_base "https://api.siliconflow.cn/v1" \
--api_key "sk-xxxxxx" \
--model "deepseek-ai/DeepSeek-V3" \
--lang "zh" \
--bilingual \
--prompt "You are a senior IT professor. Translate this software engineering course subtitle into idiomatic IT Chinese. Keep standard terms like Prompt, Bug, HTML, UI unchanged. Do not translate code fragments."
3. 批量翻译一个文件夹下的所有视频字幕
技术流怎么能一个一个文件去敲命令?如果吴恩达老师这门课有 20 个独立视频的 .srt,在终端里用一个简单的 Shell 循环 就能全部自动化处理:
- Mac / Linux 终端:
for f in *.srt; do translatesrt "$f" --api_base https://api.siliconflow.cn/v1 --api_key sk-xxxx --model deepseek-ai/DeepSeek-V3 --lang zh --bilingual; done
- Windows PowerShell:
Get-ChildItem *.srt | ForEach-Object { translatesrt $_.FullName --api_base https://api.siliconflow.cn/v1 --api_key sk-xxxx --model deepseek-ai/DeepSeek-V3 --lang zh --bilingual }
🚨 技术流排错:如果运行报错怎么办?
- 报错
Authentication Error或401:
- 原因: 密钥没对齐,或者 Base URL 少写了
/v1。 - 解决: 检查
[https://api.siliconflow.cn/v1](https://api.siliconflow.cn/v1)结尾是否有空格,确保 Key 已经复制完整。
- 翻译出来一堆乱码或者中断(
Context Window Overlap):
- 原因: 一次性塞给大模型的字幕段落太多,超出了它的单次单输出限制。
- 解决:
translatesrt工具通常带有一个--chunk_size(分块大小)或--max_lines参数。建议将其显式限制在--chunk_size 50。这样它会把字幕 50 行 50 行地打包发送,既保证了有上下文,又绝对不会卡死大模型。
异常
1.translatesrt: error: unrecognized arguments
usage: translatesrt [-h] [-S SRC_LANGUAGE] [-D DST_LANGUAGE] [-ll] [-F FORMAT] [-lf]
[-C CONCURRENCY] [-v]
[subtitle_file_path ...]
translatesrt: error: unrecognized arguments: --api_base https://api.siliconflow.cn/v1 --api_key sk-xxx --model deepseek-ai/DeepSeek-V3
终端直接报错 unrecognized arguments(无法识别的参数),这意味着你安装的这个 translate-srt 版本原生只支持它内置的翻译引擎(如 Google/Bing 等官方翻译接口),它的命令行参数里根本没有 --api_base、--api_key 和 --model 这三个选项。
既然你正在使用 pytorch_env 虚拟环境,并且想要用最硬核、最高可控的“技术流”方式白嫖 SiliconFlow 的 DeepSeek-V3 来翻吴恩达老师的课,最快、最稳妥的解决方案就是花 1 分钟自己写一个 Python 脚本。
大模型翻译 SRT 最核心的秘诀是:不能逐行翻(会丢上下文),也不能整篇翻(格式会崩),而是要按“段落(Chunk)”切片喂给大模型。
请直接在你的 BuildYourOwnAppInJust30Minutes 目录下新建一个名为 translate_course.py 的文件,把下面这段专门为你调优的技术流代码粘贴进去:
🛠️ 1. 极客流纯手搓脚本 (translate_course.py)
首先在终端安装官方的 OpenAI 库(用于对接 SiliconFlow):
pip install openai
然后将以下代码写入 translate_course.py:
import os
import re
from openai import OpenAI
# 1. 配置 SiliconFlow 密钥与模型
client = OpenAI(
api_key="sk-xxx",
base_url="https://api.siliconflow.cn/v1"
)
MODEL_NAME = "deepseek-ai/DeepSeek-V3"
INPUT_SRT = "Build Your Own App In Just 30 Minutes! Full Course with Andrew Ng [ff3j4olCUig].srt"
OUTPUT_SRT = "Build Your Own App In Just 30 Minutes! Full Course with Andrew Ng [双语].srt"
# 2. 注入吴恩达老师课程专属的 IT 技术流提示词
SYSTEM_PROMPT = (
"You are an expert IT professor and translator. Your task is to translate English SRT subtitles into Simplified Chinese.\n"
"CRITICAL RULES:\n"
"1. You MUST generate BILINGUAL subtitles. For every segment, keep the original English line on top, and place the translated Chinese line immediately below it.\n"
"2. Keep all SRT index numbers and timestamps (e.g., 00:01:20,000 --> 00:01:23,150) exactly as they are. Do not alter any symbols.\n"
"3. Keep standard tech industry terms in English (e.g., Prompt, Bug, HTML, UI, App, Chatbot). Do not overly translate them into awkward Chinese.\n"
"4. Ensure the translation matches the original context seamlessly."
)
def translate_chunk(chunk_text):
"""将切割好的字幕块发送给 DeepSeek"""
try:
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": chunk_text}
],
temperature=0.2, # 低温度确保大模型老老实实遵守SRT格式,不瞎编
)
return response.choices[0].message.content
except Exception as e:
print(f"\n[Error] 请求大模型失败: {e}")
return None
def main():
print(f"🚀 开始加载字幕文件: {INPUT_SRT}")
with open(INPUT_SRT, 'r', encoding='utf-8') as f:
content = f.read()
# 技术点:根据标准 SRT 的双换行符将整篇字幕切分成独立段落
blocks = content.strip().split('\n\n')
print(f"📊 成功解析出 {len(blocks)} 个字幕时间段。")
# 为了防止单次请求过长或丢失上下文,每 30 个时间段(约 120 行)打包成一个 Chunk 发送
chunk_size = 30
translated_blocks = []
print("⏳ DeepSeek-V3 正在疯狂全自动翻译中,请稍候...")
for i in range(0, len(blocks), chunk_size):
chunk = blocks[i:i+chunk_size]
chunk_text = '\n\n'.join(chunk)
print(f" [进度] 正在翻译第 {i} 到 {min(i+chunk_size, len(blocks))} 段...", end="", flush=True)
translated_chunk_text = translate_chunk(chunk_text)
if translated_chunk_text:
translated_blocks.append(translated_chunk_text.strip())
print(" ✅ 成功")
else:
print(" ❌ 失败,跳过该块")
# 如果失败,保留原有英文块防止整屏字幕错位
translated_blocks.append(chunk_text)
# 3. 将翻译好的双语 Chunk 重新拼接并保存
final_output = '\n\n'.join(translated_blocks)
with open(OUTPUT_SRT, 'w', encoding='utf-8') as f:
f.write(final_output)
print(f"\n🎉 恭喜!完美双语字幕已生成在当前目录下:\n👉 {OUTPUT_SRT}")
if __name__ == "__main__":
main()
🚀 2. 运行它
在你的终端里直接执行这个脚本:
python translate_course.py
💡 为什么这个脚本比你刚才的命令行更靠谱?
- 格式物理隔离: 脚本采用
blocks = content.strip().split('\n\n'),大模型收到的是一段段标准的结构体,它返回时也会严格遵守这个结构。 - 完美双语支持: 我们在
SYSTEM_PROMPT里下了死命令,让它在原有的英文下面直接追加中文,出来的就是完美的英中双语对照字幕。 - 专业术语锁死: 针对刚才几轮校对发现的翻车点,我们提前在提示词里把
Prompt、Bug、HTML锁死为英文,DeepSeek 翻译出来的成品质量绝对惊艳。
2.[Error] 请求大模型失败: Error code: 401 - Api key is invalid
报 401 错误 Api key is invalid 说明 SiliconFlow 平台拒绝了这次身份验证,大模型根本还没有收到你的翻译请求。
出现这个错误通常有以下 3 个排查方向(其中第 1 个是 SiliconFlow 最常见的坑):
1. 检查 API Key 是否带了多余的空格或隐藏字符(最常见 🚨)
你在终端贴出来的 Key 是:sk-jvefbgrbqoanixviwlaayapdulsnpmjjviwgpigjlvfbgnro。
请去你的 translate_course.py 脚本里看一下,这一行赋值的前后有没有不小心多复制了空格、换行符,或者多打了一个引号。
另外,请登录 SiliconFlow 后台确认一下,你目前使用的这个 Key 是不是已经被你在后台删除或者禁用了。如果拿不准,直接在后台点击 “创建新 API 密钥” 重新生成一个,然后替换到代码里。
2. 检查账户余额(硅基流动平台的机制)
硅基流动虽然注册就送 14 元(大约几千万 Token),但他们的系统有一个安全机制:如果你的账户里赠送的余额完全用光了,或者额度过期了,它的 API 就会直接失效并返回 401 错误,而不是返回额度不足。
- 解决办法: 登录 SiliconFlow 官网后台,看一眼首页的“账户余额”或者“代金券”,确认里面还有免费额度。
3. 代码微调:尝试去掉 Base URL 结尾的 /v1
有些版本的 openai Python 库在处理自定义 API 转发地址时,会自动在结尾拼接 /v1。如果你在代码里写了 https://api.siliconflow.cn/v1,它在实际发送请求时可能会变成 .../v1/v1,从而导致鉴权失败报 401。
请把脚本里的 client 初始化部分改成这样,测试一下:
# 尝试把 base_url 最后的 /v1 去掉,让库自己去拼接
client = OpenAI(
api_key="你的sk-密钥",
base_url="https://api.siliconflow.cn"
)
💡 终极排错小建议:
先在后台重新生成一个全新的 sk-... 密钥,确保余额充足,然后小心翼翼地粘进代码里,再次运行 python translate_course.py,这一次绝对就能顺畅跑通了!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)