File size: 3,780 Bytes
bb454e2
2247396
a7d6ddd
2247396
 
 
bb454e2
8cea383
3ce50b8
bb454e2
 
2247396
bb454e2
2247396
bb454e2
3ce50b8
 
 
 
bb454e2
2247396
a7d6ddd
2247396
a7d6ddd
2247396
ecc5ae3
 
787c151
3ce50b8
2247396
3ce50b8
a7d6ddd
ecc5ae3
 
3ce50b8
ecc5ae3
 
3ce50b8
ecc5ae3
 
3ce50b8
ecc5ae3
787c151
 
 
 
 
 
3ce50b8
 
 
 
 
 
787c151
3ce50b8
 
787c151
3ce50b8
 
 
 
 
 
 
787c151
ecc5ae3
a7d6ddd
2247396
 
ecc5ae3
 
3ce50b8
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
---
title: Offlisten
emoji: 🎙️
colorFrom: gray
colorTo: yellow
sdk: static
pinned: false
license: mit
short_description: 100% offline ASR for meetings, local, no upload
---

# 录匣 Offlisten

100% 离线的会议 / 课堂转写。没有账号,没有云端,拔掉网线它还在写。

这个 Space 是静态证据页:五个语种的实测输出、两段演示视频,以及一张端侧 ASR 运行时选型矩阵。

不放可交互 demo,原因是免费档跑不了 Gradio 容器:`cpu-basic` 返回配额错误,`zero-a10g` 返回 402,
官方文档写明 Gradio / Docker Space 需要付费计划。转写本来也要在本地跑 229 MiB 的模型。

## 目录里有什么

| 文件 | 用途 |
|---|---|
| `index.html` | 实际展示的页面 |
| `demo.mp4` | 42 秒演示:五段音频真跑,听完才落字;`tools/record-demo.py` 生成 |
| `demo.mp4.json` | 那次录制的实测记录:每段文本、耗时、音频 sha256 |
| `use-with-browser-ai.mp4` | 46 秒,无音轨:本地文本页 + Page Assist + Ollama 的闭环实录 |
| `matrix-zh.png` / `matrix-en.png` | 选型矩阵,1000×780;源文件 `docs/bench/*.svg`,改文案后重出 PNG/PDF |
| `README.md` | 本文件,Space 卡片元数据 |
| `app.py`、`requirements.txt` | Gradio 版,本地跑通过;当前 `sdk: static` 不执行它 |

## 演示是怎么录的

不是手工录屏。`tools/record-demo.py` 做三件事,所以视频和页面上那张表不可能对不上:

1. 用同一份权重、同样 2 线程,真跑五段 `test_wavs`,拿到文本与耗时
2. 起本地 `web_live` 服务与无头 Edge,按真实时钟把每段结果推给页面,逐帧截图
3. 按同一时钟把五段音频混成音轨,ffmpeg 合成 H.264 + AAC

所以字幕出现的时刻,就是产品里一段话说完的时刻,音画不会漂。

## 接本地的 AI

`use-with-browser-ai.mp4` 记录的是另一条链路,46 秒,无音轨:

    本机 SenseVoice → 127.0.0.1 上的文本页 → 浏览器扩展 Page Assist 读当前页 → Ollama 上的 qwen2.5:0.5b 作答

三个部件都在同一台机器上,链路里没有一处需要出网。本地文本页上那行提示就是为这条路留的:
「要交给 AI 处理,就复制全文,或让你浏览器里已有的 AI 插件读取本页。」

源素材 14.8 MB,裁掉录屏工具条、去掉音轨后是 1.2 MB,1440×746。

## 选型矩阵

4 个运行时 × 3 个平台,12 格里只有 2 格同时满足「CPU 能跑 · 流式 · 能装进别人的机器」。
逐格依据分级:5 格来自官方文档或包矩阵,1 格本机实测,1 格只验过模型,5 格是推断。

页面上的链接都可以当场点开核:

- [FunAudioLLM 论文(arXiv:2407.04051)](https://arxiv.org/abs/2407.04051)
- [sherpa-onnx 文档](https://k2-fsa.github.io/sherpa/onnx/)
- [sherpa-ncnn 的 SenseVoice 章](https://k2-fsa.github.io/sherpa/ncnn/sense-voice/)
- [Triton 后端支持矩阵](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/backend/docs/backend_platform_support_matrix.html)
- [PyPI 上 sherpa-ncnn 的 wheel 列表](https://pypi.org/project/sherpa-ncnn/#files)

## 模型与音频

权重在 [ToothpasteLake/offlisten-models](https://huggingface.co/ToothpasteLake/offlisten-models),
6 个文件 229.07 MiB,逐文件 sha256 对应发行清单。
表里那五段音频在同一个仓库的 `test_wavs/` 下,点语种名可以直接听,也可以下载后自己复跑。

## 更新这个 Space

页面改动后跑一次,脚本会跳过 `_` 开头的本地临时文件,并在 `--verify` 下逐个核对线上字节数:

```bash
python tools/push-space.py --dry-run    # 只看会传什么
python tools/push-space.py --verify     # 传 + 核对
```