录视频没字幕?我用 Vibe Coding 一个周末造了一个免费字幕生成工具

AI工具28 次阅读13 分钟

录视频没字幕?我用 Vibe Coding 一个周末造了一个免费字幕生成工具

起因:一个真实的痛点

周末录制技术视频的时候,我遇到了一个看似简单但实际上相当恼人的问题——给视频配字幕

这件事说起来不难,但做起来处处是坑。

录完一段屏幕操作演示,我心想,字幕嘛,2026 年了,AI 都能写代码了,加个字幕还不是分分钟的事?

事实证明,我太天真了。

踩坑之旅:那些"差一点就好用"的方案

第一站:飞书妙记

我最先想到的是飞书。飞书妙记支持语音转文字,而且它的中文识别效果确实不错——短句拆分自然、口语过滤到位、几乎可以直接拿来当字幕用

飞书妙记字幕效果截图

但问题来了:

免费版只有 15 分钟。

飞书妙记语音转文字时长限制截图

我如果经常要做字幕生成功能的话。15 分钟根本不够用。

想要更多?升级 AI 会员,连续包月 ¥69/月,年付 ¥699。

飞书 AI 会员价格页截图

一个字幕功能,要我每年花 700 块?我就偶尔录个视频,用不了那么多。

第二站:剪映

网上很多人推荐剪映——把视频导入,自动识别字幕,再导出 SRT 文件替换。

这个方案有几个问题:

  1. 也有时长限制——免费版对视频长度有门槛

  2. 操作链路长——导入、识别、导出、再合并,折腾半天

  3. 我的场景是技术视频,里面大量英文术语、代码片段、产品名,剪映的识别准确率并不理想

第三站:通义听悟

阿里的通义听悟倒是支持语音转文字,但我实际试了之后发现:

  1. 同样有时间限制

  2. 百分比显示不对——我说的"百分之十",它给我转成了一种非常规的格式,不是日常习惯的 10%

通义听悟百分比异常截图

说白了,这些工具有一个共同特点:

免费版让你尝到甜头,但想真正用起来,得掏钱。

转折:为什么不自己造一个?

踩完一圈坑之后,我停下来想了想:

AI 现在这么强大,语音识别的 API 到处都是,Cloudflare 提供了几乎免费的基础设施——正好周末有时间,我为什么不用 Vibe Coding 的方式,自己造一个?

这不就是 Vibe Coding 最理想的场景吗?

  • ✅ 痛点真实——我自己每周都要用

  • ✅ 需求明确——上传视频 → 生成字幕 → 下载 SRT/ASS

  • ✅ 技术路径清晰——语音识别 API + 文件存储 + 简单前端

  • ✅ 部署成本接近零——Cloudflare 免费套餐基本够用

于是我决定:不是去找一个完美的工具,而是自己造一个刚好够用的工具。

这就是 Vibe Coding 的精神——与其等待,不如动手;与其凑合,不如精准解决自己的问题。

技术选型:为什么选 Cloudflare 全家桶?

在动手之前,我调研了一下常规的字幕生成实现方式:

方案一:本地跑 Whisper

OpenAI 的 Whisper 是目前最主流的开源语音识别模型。可以在本地跑,精度也不错。

但问题是:

  • 需要 GPU,我的 Mac 跑起来巨慢

  • 大文件(2-3 小时视频)内存开销惊人

  • 部署成服务需要一台 GPU 服务器,成本不低

方案二:云端 API

各大云厂商都有语音识别 API——Google、Azure、AWS、阿里、腾讯,这些当然也是可以的。

我的选择:Soniox + Cloudflare

最终我选了一个相对小众但非常适合这个场景的组合:

组件

作用

选择理由

Soniox

异步语音转写

专业 ASR,中英混合识别好,注册送 $200 额度,足够用很久

Cloudflare Pages

前端托管

免费,全球 CDN,自动 HTTPS

Cloudflare Workers

API 后端

免费 10 万次/天请求,Serverless

Cloudflare R2

文件存储

免费 10GB,无出口流量费

Cloudflare D1

任务数据库

免费 SQLite,足够存 job 元数据

DeepSeek

字幕文本润色(主力)

手上已有 API key,便宜好用

Google Gemini

字幕文本润色(备用)

免费额度充足,作为兜底方案

整套方案的运行成本:几乎为零。

Cloudflare 的免费套餐完全覆盖我的用量。Soniox 注册送的 $200 额度,按我的使用频率够用很长时间。DeepSeek 的 API 本身我就有在用,单价极低。Gemini 作为备用,免费额度也够。

这就是 Vibe Coding 的另一个核心理念:不是花最多的钱买最贵的方案,而是用最巧的方式组合出最适合自己的方案。

字幕工具年成本对比

架构设计:从上传到字幕的完整链路

整个系统的数据流是这样的:

字幕生成系统架构

具体步骤:

  1. 打开工具页面,用密码登录(私人工具,不开放注册)

  2. 上传视频文件,前端自动读取视频宽高

  3. 浏览器直传 R2——视频不经过 Worker,直接通过签名 URL 上传到对象存储,避免 Worker 体积限制

  4. Worker 创建任务,在 D1 记录 job 元数据,调用 Soniox 异步转写

  5. Soniox 后台处理,完成后通过 Webhook 回调 Worker

  6. Worker 生成初步字幕,把 Soniox 返回的 token 按时间分段

  7. LLM 润色字幕文本——这是最关键的一步

  8. 输出三种格式:SRT(通用字幕)、ASS(带样式字幕)、Transcript JSON(完整文稿)

一个 8分钟 的视频,从上传到字幕生成完成,大约 1-2 分钟。大部分时间花在 Soniox 的异步转写上,Worker 本身的处理几乎是瞬时的。实际效果非常 nice,Soniox 的中英文混合识别能力确实出色。

关键创新:LLM 字幕润色

这个项目最有意思的部分,不是语音识别本身,而是用 LLM 做字幕后处理

为什么需要 LLM?

原始的 ASR(语音识别)输出有几个典型问题:

  • 口语词太多——"呃"、"嗯"、"那个"、"就是说"满天飞

  • 重复表达——"这个这个"、"然后然后"

  • 英文断裂——D em o 被拆成三个词,A P I 被拆成三个字母

  • 数字格式混乱——"百分之十"到底是写成"10%"还是"百分之十"还是"百分之百10"?

这些问题,传统的文本处理规则很难覆盖。但 LLM 天然擅长——它理解上下文,知道什么该删、什么该留、什么该合并

设计原则

我给 LLM 定了几条硬规则:

  1. LLM 只处理文本,不碰时间码——时间轴的准确性由 Worker 保证

  2. LLM 输出必须引用原始片段 ID——不能凭空创造句子

  3. 可以合并相邻短句,不能删除信息

  4. 失败时自动回退原始字幕——宁可粗糙,不能丢内容

默认的润色风格对标飞书妙记

短句优先,8-18 个字一条。删口语词,修断裂英文,数字按场景处理。每条字幕开头结尾不留标点。

# 润色前(原始 ASR 输出)
"呃然后这地方可以设置这个预算超过百分之百10的一个处理方法"

# 润色后(LLM 处理)
"这里可以设置预算超过110%的处理方法"

一行字幕,从 28 个字压缩到 16 个字。信息量不变,阅读体验天差地别。

双 LLM 策略

为了稳定性,我采用了双 LLM 策略:

  • 主力:DeepSeek——我手上本来就有 API key,中文处理能力强,价格极低

  • 备用:Google Gemini——免费额度充足,DeepSeek 挂了自动切换

  • 兜底:如果两个都挂了,直接用原始字幕,任务照样完成

不会因为 LLM 的问题导致整个任务失败——这是工程思维,不是 demo 思维。

LLM 字幕润色前后对比

ASS 字幕样式:细节决定体验

很多字幕工具生成的 ASS 文件有一个常见 bug:不写入视频分辨率

这会导致 ffmpeg 在烧录字幕时,把分辨率回退到默认的 384×288,字幕直接被拉大到占满半个屏幕。

我的方案在前端上传时就读取视频的真实宽高,写入 ASS 的 PlayResX / PlayResY

样式项

设置

分辨率

真实视频宽高

字体

PingFang SC

字号(1080p)

44

位置

底部居中

底部间距

视频高度 × 4.5%

背景

半透明黑色底框

布局

单行优先

烧录出来的效果,和专业剪辑软件输出的字幕几乎无差别。

2026-05-17-vibe-coding-caption-tool-1778996348598.webp

开发过程:一个周末,从 0 到上线

整个开发过程,从有想法到生产上线,就用了一个周末。周末正好有录视频的需求,痛点摆在面前,索性直接动手。

周六上午:骨架搭建 + 首次部署

  • 初始化项目,搭建 Vite + React 前端

  • 编写 Worker API:登录、上传签名、任务管理、Soniox 集成

  • 配置 Cloudflare 全家桶:Pages、Worker、R2、D1

  • 踩了一堆 Cloudflare 部署的坑(Pages 和 Worker 配置冲突、R2 凭证混淆、DNS 生效等待……)

  • 首次部署成功,首页返回 200

周六下午 → 周日:LLM 润色 + 生产验证

  • 集成 LLM 字幕后处理模块

  • 接入我已有的 DeepSeek API 作为主力,Google Gemini 作为备用

  • 迭代字幕提示词,对标飞书妙记效果

  • 修复 ASS 样式问题(PlayResX/PlayResY、底部间距、字体)

  • 前端增加自定义提示词功能

  • 生产验证:7分钟 的视频,几分钟 完成,字幕质量达标

周日下午:开源发布

  • 拆分私有仓库和公开仓库

  • 脱敏处理:替换真实域名、Account ID、数据库 ID

  • 编写 export 脚本,保证后续同步安全

  • 配置 GitHub Actions CI、CodeQL、Dependabot

  • detect-secrets 扫描 0 发现

  • 正式开源:video-caption-generator

一个周末。从痛点到产品,从代码到开源。

这就是 Vibe Coding 的速度。不是因为代码量少,而是因为——你知道你要什么,AI 帮你写,Cloudflare 帮你跑,你只需要做决策。

一个周末从痛点到开源的开发时间线

Cloudflare 免费套餐:Pages 无限站点、Workers 10 万次/天、R2 免费 10GB、D1 免费 5GB。Soniox 注册送 $200 额度。

对于个人使用,这些额度远远够用。

可扩展性:不只是字幕

这个项目的架构天然支持扩展:

  • 多语言——Soniox 支持 40+ 语言,换个 model 参数就行

  • 实时字幕——Soniox 也有 realtime API,可以扩展为直播字幕

  • 批量处理——前端可以改为队列模式,一次上传多个视频

  • 团队使用——加个用户系统就能变成团队工具

  • 自定义 LLM——支持 LLM_BASE_URL 配置,可以接任何 OpenAI 兼容的模型

这也是我选择开源的原因——这个工具解决的不只是我一个人的问题。

每一个录视频的人,都会遇到字幕的烦恼。不是所有人都需要 Adobe Premiere 那样的全功能方案,有时候,一个够用、免费、可控的工具,就是最好的工具。

写在最后

回过头看这个项目,最让我感触的不是技术本身,而是一种做事的方式:

当你遇到一个真实的痛点,不要在现有工具里反复横跳,不要等待某个完美方案出现。用你手边的技术,用 AI 的能力,用 Vibe Coding 的方式——直接造一个。

一个周末,0 成本运行,解决了一个每周都会遇到的问题。

这不是什么了不起的技术壮举。这只是 2026 年,一个普通开发者应该具备的能力——看到问题,分析问题,用 AI 解决问题。

工具的最高境界,是为你量身定做的。


🔗 开源地址github.com/jason-create-cmd/video-caption-generator

🎬 操作演示:完整的操作视频和效果展示见评论区

如果这个项目对你有帮助,欢迎 Star ⭐ 和 Fork 🍴


继续阅读

基于全文检索与主题相似度