英语流利说那一套,一个开源的实时 ASR 模型加一个开源的判词模型就能平替 —— 而且可以整套跑在你自己的显卡上,不联网、不上传、不按分钟计费。
念的时候字是一个个亮起来的,念错的当场标红,念完点一下出总分。 一台 12GB 的卡就够。
R2T2 负责听。 它是真流式,最低 160ms 的步长往外吐词,还有个叫
stable prefix 的机制:已经提交的文本只增不改。传统流式 ASR 会来回改词,
I want to book 变成 I want to look 再变回来 —— 给人看字幕还行,可下游要是
接了另一个模型,它就得跟着反复撤销自己刚做的判断。正因为有这一层,屏幕上划过的
线不会闪、判过的分不用重判,漏读多读也能直接拿识别结果算。
Jev 负责判。 它只在你事先声明好的空间里回答:是否、选一个、1–5 打分, 并且给概率。所以这里只问它文本层面的事 —— 念的是不是原文那个词、错法属于哪一类、 整段意思有没有走样。选它的理由很直接:快,一次判决几十到几百毫秒,几乎不花钱。
麦克风 → R2T2(流式转写,只增不改 + 时间戳) → 对齐 → Jev(封闭问题判决) → 本机算术 → 划线 + 总分
对齐这一步挑出对不上的那几个词,只有它们值得问模型;剩下的全是算术,留在本机。
| 评什么 | 谁算 |
|---|---|
| 读对没读对(逐词「是不是同一个词」) | Jev noul + 概率 |
| 错误属于哪一类(替换 / ASR 拼写变体 / 自我纠正) | Jev choice |
| 听到的还是不是同一句话 | Jev score(1–5 级) |
| 漏读、多读、完整度 | 对齐,算术 |
| 语速与停顿 | R2T2 时间戳,算术 |
| 总分 | 本机加权(lib/score.js 的 WEIGHTS) |
| 发音、重音、口音 | 不出分 — Jev 只读文本,判不了声学,要评得另接音素级发音评测模型 |
不用显卡也能先看效果 —— ASR_PROVIDER=mock 不碰麦克风,按 160ms 的节奏吐词并
预埋三类真实错误,整条判分链路照样跑通。
npm install
npm run dev # http://localhost:3000(被占用会自动换端口)
npm test # 对齐 / mock / 节奏算术的单测,不联网.env.local(不要提交):
JEV_API_KEY=sk-ai-v1-... # ZenMux 的 key
JEV_ENDPOINT=https://zenmux.ai/api/v1/systemone # Jev 走自己的 System One 接口,不是 chat/completions
JEV_MODEL=typesafe/jev-1.13
ASR_PROVIDER=r2t2 # mock = 不用麦克风,按节奏吐词并预埋三类错误
R2T2_WS_URL=wss://... # 见下
R2T2_LANGUAGE=English变量叫
JEV_API_KEY而不是ZENMUX_API_KEY:机器 shell 里可能已有别的项目的ZENMUX_API_KEY,而 shell 变量在 Next 里盖得过.env.local。 开了 Clash 之类代理时,Node 的全局fetch不认https_proxy(curl 认),lib/jev.js检测到代理会改用 undiciProxyAgent并显式带上 SNI。
模型:netease-youdao/Confucius4-R2T2 (Qwen3-ASR 微调,~2B,真流式,最小 160ms 步长)· GitHub
想马上试:用有道线上 demo 的中继(r2t2.youdao.com/demo
页面里就有 token),单次会话 30 秒上限,填进 R2T2_WS_URL 即可。
想要自己的:有张 NVIDIA 的卡就行,12GB 够用(Ampere 以上)。跑起来之后音频不出本机, 也没有时长限制。
自部署要 CUDA(Mac 跑不了,infer_mode 绑死 vLLM),步骤与七八个会咬人的坑
——language 传错会让流式退化成整句、显存参数按大卡写死、服务默认 0.0.0.0 + 写死的
secret_key、浏览器采音与离线跑 wav 的两处差异——都在 docs/deploy-r2t2.md。
别设 R2T2_SYSTEM_PROMPT 塞原文 —— LLM 解码器会顺着提示把念错的词改回去,分就假了。
app/page.js 待读 → 朗读中 → 判词中 → 读完(总分钮 → 明细面板)
app/api/ asr:mock 的 SSE 流 / r2t2 的中继地址 · score:一次判分
lib/align.js 词级对齐 —— 决定哪些词值得问 Jev
lib/jev.js ZenMux System One 客户端(含代理兜底)
lib/score.js 问题构造、判决解析、四项子分与总分
lib/asr.js provider:mock / r2t2(WebSocket + PCM16)
lib/mic.js 浏览器采音与重采样 · lib/speak.js 范读与逐词高亮