01
会议和通话
Zoom、Google Meet、Teams、Slack huddle、Discord 通话、浏览器标签页里的通话:说到底都只是从某个 app 里出来的音频,所以全都能配上字幕。没有机器人加入,没人会被告知,参与者列表里也不会多出什么。读一个只听到一半的词,比开口再问一遍快,而且不用打断任何人。
通话、视频、播客和课程,一边播放一边转写,画成始终在所有窗口之上的浮层。想要的话还能实时翻译。没有东西离开这台 Mac。
上线周:$5 而不是 $9,截止 8 月 22 日 · 14 天退款
切换 app,字幕还在:浮层位于所有窗口之上,并且让点击穿透过去。
点一下窗口就能把它切到前面。按住 ⇧ 拖动字幕就能挪动它们,和在 app 里一样。
把指针移到字幕上,字幕会在指针底下化开。按住 ⌥ 可以把最近几块重新叠回来。这两件事在这里的表现和 app 里完全一样。
Mac 能播放的 app,它都能配上字幕
使用场景
开会时,不管是不是第二语言,漏听一个词,接下来三个也跟着丢。Subtitles 给你的 Mac 正在播放的任何内容配字幕,就在播放它的那个 app 里,你跟得上,不用请任何人再说一遍。无论你是聋人或听障者、听得见却跟不上、在用第二语言听,还是只是待在一个吵闹的地方工作,有三种情况会一再出现。
01
Zoom、Google Meet、Teams、Slack huddle、Discord 通话、浏览器标签页里的通话:说到底都只是从某个 app 里出来的音频,所以全都能配上字幕。没有机器人加入,没人会被告知,参与者列表里也不会多出什么。读一个只听到一半的词,比开口再问一遍快,而且不用打断任何人。
02
切到你的备忘录、编辑器或者浏览器。浮层始终在所有窗口之上,而且点击穿透,所以你不盯着它,对话也照样往下走。像 Granola 这样的记事工具是在事后把会议写成纪要;而这一半的事,必须在会议还开着的时候完成。
03
一个没有字幕的视频,或者自动字幕烂到不如没有。一档播客,用的是你还在学的语言。一节录播或者直播的课、一场访谈、一部对白很轻的电影。只要在播,就一边播一边配上字幕,用它原本的语言,或者译成你的语言。
隐私
你之所以能把它对着一场工作通话用,是因为它不是一项服务。没有服务器,没有账号,没有转写文本,所以没有东西要发出去,中间也没有别人。详细版本也写下来了。源码是公开的,所以这些都不用你凭信任接受。
功能
实时音频没法暂停,没法重来,也不该被送出你的机器。这里的一切都是从这一点推出来的。
它在本地离线运行:没有账号,没有遥测,没有哪一次网络请求带着你的任何东西。音频从 process tap 直接进入识别器,然后被丢弃。它下载过的东西只有两样:模型,只下一次;还有更新,在你自己选择更新的时候。
实时率约 0.15:每一秒算力转写六秒语音。同一个模型放在 CPU 上,实测慢了大约 100 倍,根本跟不上实时的音频流。
默认情况下它听的是你的 Mac 播放的一切,所以不用先设置什么就能用。当两个东西同时在说话时,可以从菜单栏把它收窄到某一个 app:它会捕获那个 app 以及它派生的每一个辅助进程,而这正是它在浏览器和 Electron 应用里也能工作的原因,那些应用的音频从来不是从主进程出来的。
识别器前面有一个人声检测器,伴奏永远到不了它那里。没有它,音乐会把模型的上下文塞满,音乐之后的头几个词就丢了。
可以选择在换人说话时另起一块字幕,就像遇到停顿时那样。默认关闭:它需要在第一个模型旁边再跑一个模型。
默认模型会自己判断语种。英语另外还有七个专用 checkpoint,从 160 ms 起,在延迟和准确率之间取舍。
把指针靠近字幕块,它就会在指针底下淡开,于是你正在读的句子永远不会盖住你正在写的句子。淡掉多少、这个洞能铺多宽,都由你定。想让它保持不透明,按住 ⇧。
字幕块像电视字幕那样一页页翻:填满、清空、重新开始,所以你一移开视线,那一行就没了。按住 ⌥,结束了的字幕块会重新叠到正在进行的那一块上面,上一次停顿之后的每一块都在,更早的可以往回滚,还能用 ⌥F 搜索。松开手,它们又都不在了。什么都不会被写到任何地方。
在菜单里按 ⌘, 打开设置:一块字幕填满几行才清空、它有多实、指针底下的淡开能铺多远、⌥ 能回溯多久。每一个滑块都会在你拖动的同时作用到浮层上,所以这些东西是看着调的,而不是挑一个数字。
工作原理
一个只负责复制的实时音频线程,一个从不转写的可移植内核,还有一个模型,跑在它该跑的地方。
48 kHz 立体声,每 10.7 ms 一次回调。实时线程把数据复制进一个无锁环形缓冲区,别的什么都不做。
在工作线程上降到 16 kHz 单声道,跳过静音,并在语音之前多回放大约一秒,这样没有哪个词是冷启动开头的。
这是流式模型,不是 30 秒窗口的那种:区别就在于字幕是跟着音频走,还是晚好几秒才到。
三行一屏,像电视字幕那样清空再重来,在最后一次出现新文字的四秒后淡出,而不是在音频停下之后。
从环形缓冲区到模型边界之间的所有东西,都是可移植的 Rust,而且刻意不做转写:它只负责递出音频帧。process tap 和浮层是仅有的两个 Mac 专属部分。
对比
macOS 自带字幕功能,免费,每台 Apple silicon Mac 上都有,在系统设置 ▸ 辅助功能 ▸ 实时字幕里。如果它够用,那就用它。下面这些是它不再够用的地方;想看长版本的话,还有一份逐行对比。
| 对比项 | Subtitles | Apple 实时字幕 |
|---|---|---|
| 语言 | 十六种,自动识别语种,任意两种之间实时翻译 | 并非所有语言或地区都可用 |
| 浮层 | 点击穿透,在指针底下淡开,始终在所有窗口之上 | 一个要你去移动和缩放的窗口 |
| 听的是什么 | Mac 播放的一切,或者你指定的某一个 app | Mac 播放的一切 |
| 音乐 | 被人声检测器跳过,所以伴奏永远不会变成歌词 | 照样转成字幕 |
| 换人说话 | 可选:换人说话时另起一块字幕 | 没有对应功能 |
| 模型 | 七个英语 checkpoint,在延迟和准确率之间取舍,外加一个多语言模型 | 一个,不能换 |
| 价格 | 免费用 7 天,之后一次性 $9,包含日后所有更新 | 免费,系统自带 |
大家怎么说
So smooth, very useful during meetings on different apps (slack, zoom, google), so well integrated on the screen, doesn't block interacting with the other windows, love it!
Almost no setup, no tweaking around: you install it and it just works. Simple, useful and really effective.
Very handy! I love how it can be connected to any audio source on my laptop, which helps not only for meetings and videocalls, but also for all those streaming services that do not support subtitles, like news websites or even some YouTube videos. The model supports many languages, so it's also useful if you're learning a foreign language and need subtitles to help you understand what's being said.
我在一家美国公司上班,开会说的是英语。英语不是我的母语,对我大多数同事来说也不是。要紧的那句话说出口的时候,我往往正忙着别的事,等回过神来,它已经没了:某个词没听清,某种口音不习惯,或者两个人同时在说。请人再说一遍,所有人都要搭进去三十秒,正在说话的那个人也被打断了。
所以字幕必须在我干着别的事的时候也能读。这就是为什么它是一层压在所有窗口之上的浮层,而不是某一个 app 里的一块面板;为什么它不拦截点击;也为什么它会在指针底下淡开,而不是要你动手把它挪走。这个页面上的其他一切,都是在这之后才有的。
Mathieu Jouhet,做这个 app 的人。
价格
先免费用 7 天,不用绑卡,也不用注册账号。之后一次性 $9:不用买时长,不按席位收费,也不用续费,日后所有更新都包含在内,花的钱还不到任何一个转写订阅一个月的费用。
常见问题