Spaces:
Running
Running
update index.html
Browse files- index.html +77 -34
index.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
<head>
|
| 4 |
<meta charset="utf-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
-
<title>录匣 Offlisten
|
| 7 |
<style>
|
| 8 |
:root {
|
| 9 |
--bg: #23272c;
|
|
@@ -14,6 +14,7 @@
|
|
| 14 |
--accent: #f5c542;
|
| 15 |
}
|
| 16 |
* { box-sizing: border-box; }
|
|
|
|
| 17 |
body {
|
| 18 |
margin: 0;
|
| 19 |
background: var(--bg);
|
|
@@ -38,9 +39,9 @@
|
|
| 38 |
th { background: var(--panel); font-weight: 600; color: var(--dim); white-space: nowrap; }
|
| 39 |
tr:last-child td { border-bottom: 0; }
|
| 40 |
td.num { font-variant-numeric: tabular-nums; white-space: nowrap; }
|
| 41 |
-
td.out { font-size: 13px;
|
| 42 |
-
th .thsub { font-weight: 400; font-size:
|
| 43 |
-
td .rng { font-size:
|
| 44 |
video { width: 100%; border: 1px solid var(--line); border-radius: 8px; background: #000; display: block; }
|
| 45 |
.videohint {
|
| 46 |
border: 1px dashed var(--line); border-radius: 8px; padding: 28px 20px;
|
|
@@ -50,11 +51,18 @@
|
|
| 50 |
h3 { font-size: 15px; margin: 26px 0 10px; font-weight: 600; color: var(--dim); }
|
| 51 |
blockquote {
|
| 52 |
margin: 0 0 14px; padding: 10px 14px; border-left: 2px solid var(--accent);
|
| 53 |
-
background: var(--panel);
|
| 54 |
}
|
| 55 |
footer { margin-top: 56px; padding-top: 20px; border-top: 1px solid var(--line); color: var(--dim); font-size: 13px; }
|
| 56 |
ul { padding-left: 20px; margin: 0 0 14px; }
|
| 57 |
li { margin-bottom: 6px; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
</style>
|
| 59 |
</head>
|
| 60 |
<body>
|
|
@@ -66,13 +74,13 @@
|
|
| 66 |
</header>
|
| 67 |
|
| 68 |
<p class="lead">
|
| 69 |
-
|
| 70 |
<strong>没有账号,没有云端,拔掉网线它还在写。</strong>
|
| 71 |
</p>
|
| 72 |
|
| 73 |
<p>
|
| 74 |
-
这个页面不放可交互 demo:转写要在服务端
|
| 75 |
-
下面是同一份模型(SenseVoice int8,2 个 CPU 线程)的真实输出,
|
| 76 |
</p>
|
| 77 |
|
| 78 |
<h2>五个语种,同一份模型</h2>
|
|
@@ -93,15 +101,14 @@
|
|
| 93 |
</div>
|
| 94 |
|
| 95 |
<p class="note" style="margin-top:12px">
|
| 96 |
-
点语种名可以
|
| 97 |
<a href="https://huggingface.co/ToothpasteLake/offlisten-models/tree/main/test_wavs">模型仓库的 test_wavs/</a>,
|
| 98 |
-
和模型一样可下载。
|
| 99 |
<br>
|
| 100 |
-
|
| 101 |
-
|
| 102 |
<br>
|
| 103 |
-
|
| 104 |
-
我们把它留在表里,而不是挑一条好看的。
|
| 105 |
</p>
|
| 106 |
|
| 107 |
<h2>演示</h2>
|
|
@@ -110,41 +117,41 @@
|
|
| 110 |
<p class="videohint" id="demo-hint">演示视频加载中;若浏览器不支持 mp4,可直接<a href="./demo.mp4">下载观看</a>。</p>
|
| 111 |
|
| 112 |
<p class="note">
|
| 113 |
-
这 42 秒
|
| 114 |
-
界面是产品的本地文本页,以
|
| 115 |
-
视频里
|
| 116 |
</p>
|
| 117 |
|
| 118 |
<h2>接上本地的 AI</h2>
|
| 119 |
|
| 120 |
<p>
|
| 121 |
-
录匣只
|
| 122 |
-
下面这段 46 秒没有音轨,因为它要证明的是
|
| 123 |
</p>
|
| 124 |
|
| 125 |
<video controls preload="metadata" src="./use-with-browser-ai.mp4"></video>
|
| 126 |
|
| 127 |
<p class="note" style="margin-top:12px">
|
| 128 |
左边是录匣的本地文本页,右边是浏览器里的 Page Assist,接着一个跑在 Ollama 上的 <code>qwen2.5:0.5b</code>。
|
| 129 |
-
勾选 <b>Chat with current page</b> 之后,插件读的是这个页面本身
|
| 130 |
</p>
|
| 131 |
|
| 132 |
-
<h3>这
|
| 133 |
|
| 134 |
-
<p>
|
| 135 |
|
| 136 |
<blockquote>
|
| 137 |
文本来自本机离线 ASR,只在 127.0.0.1 上传输。本页不调用任何模型,也不持有 apikey。
|
| 138 |
要交给 AI 处理,就复制全文,或让你浏览器里已有的 AI 插件读取本页。
|
| 139 |
</blockquote>
|
| 140 |
|
| 141 |
-
<p>视频里三个部件都在同一台机器上,链路
|
| 142 |
|
| 143 |
<div class="tablewrap">
|
| 144 |
<table>
|
| 145 |
<thead><tr><th>部件</th><th>作用</th><th>跑在哪</th></tr></thead>
|
| 146 |
<tbody>
|
| 147 |
-
<tr><td>SenseVoice int8</td><td>声音
|
| 148 |
<tr><td>Page Assist</td><td>把当前页内容放进提示词</td><td class="out">浏览器扩展</td></tr>
|
| 149 |
<tr><td>Ollama + qwen2.5:0.5b</td><td>读文字,给回答</td><td class="out">本机进程,监听 127.0.0.1:11434</td></tr>
|
| 150 |
</tbody>
|
|
@@ -152,25 +159,61 @@
|
|
| 152 |
</div>
|
| 153 |
|
| 154 |
<p class="note" style="margin-top:12px">
|
| 155 |
-
两
|
| 156 |
-
二是视频里它用英文作答,因为页面上并排摆着中文原文和 Argos 译文,模型看到的是双语文本
|
| 157 |
-
想让回答更稳,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
</p>
|
| 159 |
|
| 160 |
-
<h2>
|
| 161 |
<ul>
|
| 162 |
-
<li><b>不上传</b>:音频不出本机。没有
|
| 163 |
<li><b>不用登录</b>:没有账号体系,也就没有订阅和额度。</li>
|
| 164 |
-
<li><b>断网可用</b>:模型随安装包
|
| 165 |
-
<li><b>能抓桌面客户端</b>:系统级音频采集,不
|
| 166 |
</ul>
|
| 167 |
|
| 168 |
<h2>模型</h2>
|
| 169 |
<p>
|
| 170 |
本页数字对应的权重公开在
|
| 171 |
<a href="https://huggingface.co/ToothpasteLake/offlisten-models">ToothpasteLake/offlisten-models</a>,
|
| 172 |
-
6 个文件共 229.07 MiB,逐文件 sha256
|
| 173 |
-
换成自己的机器复跑时,先核对哈希,再比数字。
|
| 174 |
</p>
|
| 175 |
|
| 176 |
<!-- 主仓库公开后取消注释:
|
|
@@ -191,7 +234,7 @@
|
|
| 191 |
hint.hidden = true;
|
| 192 |
});
|
| 193 |
v.addEventListener('error', function () {
|
| 194 |
-
hint.
|
| 195 |
});
|
| 196 |
})();
|
| 197 |
</script>
|
|
|
|
| 3 |
<head>
|
| 4 |
<meta charset="utf-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
+
<title>录匣 Offlisten · 离线会议转写</title>
|
| 7 |
<style>
|
| 8 |
:root {
|
| 9 |
--bg: #23272c;
|
|
|
|
| 14 |
--accent: #f5c542;
|
| 15 |
}
|
| 16 |
* { box-sizing: border-box; }
|
| 17 |
+
html { background: var(--bg); }
|
| 18 |
body {
|
| 19 |
margin: 0;
|
| 20 |
background: var(--bg);
|
|
|
|
| 39 |
th { background: var(--panel); font-weight: 600; color: var(--dim); white-space: nowrap; }
|
| 40 |
tr:last-child td { border-bottom: 0; }
|
| 41 |
td.num { font-variant-numeric: tabular-nums; white-space: nowrap; }
|
| 42 |
+
td.out { font-size: 13px; }
|
| 43 |
+
th .thsub { font-weight: 400; font-size: 13px; color: var(--dim); }
|
| 44 |
+
td .rng { font-size: 13px; color: var(--dim); }
|
| 45 |
video { width: 100%; border: 1px solid var(--line); border-radius: 8px; background: #000; display: block; }
|
| 46 |
.videohint {
|
| 47 |
border: 1px dashed var(--line); border-radius: 8px; padding: 28px 20px;
|
|
|
|
| 51 |
h3 { font-size: 15px; margin: 26px 0 10px; font-weight: 600; color: var(--dim); }
|
| 52 |
blockquote {
|
| 53 |
margin: 0 0 14px; padding: 10px 14px; border-left: 2px solid var(--accent);
|
| 54 |
+
background: var(--panel); font-size: 14px; line-height: 1.7;
|
| 55 |
}
|
| 56 |
footer { margin-top: 56px; padding-top: 20px; border-top: 1px solid var(--line); color: var(--dim); font-size: 13px; }
|
| 57 |
ul { padding-left: 20px; margin: 0 0 14px; }
|
| 58 |
li { margin-bottom: 6px; }
|
| 59 |
+
figure { margin: 0 0 10px; background: #fff; border-radius: 8px; padding: 10px; }
|
| 60 |
+
figure img { display: block; width: 100%; height: auto; }
|
| 61 |
+
figure a { display: block; border-bottom: 0; }
|
| 62 |
+
/* 矩阵图是 1000px 宽的信息图,正文栏只有 712px:宽屏时让它出血,字才看得清 */
|
| 63 |
+
@media (min-width: 960px) {
|
| 64 |
+
figure { margin-left: -90px; margin-right: -90px; }
|
| 65 |
+
}
|
| 66 |
</style>
|
| 67 |
</head>
|
| 68 |
<body>
|
|
|
|
| 74 |
</header>
|
| 75 |
|
| 76 |
<p class="lead">
|
| 77 |
+
录匣把你电脑上的声音转成文字,全部在本机完成。
|
| 78 |
<strong>没有账号,没有云端,拔掉网线它还在写。</strong>
|
| 79 |
</p>
|
| 80 |
|
| 81 |
<p>
|
| 82 |
+
这个页面不放可交互 demo:转写要在服务端加载 229 MiB 的模型,而它的主场是你自己的电脑。
|
| 83 |
+
下面是同一份模型(SenseVoice int8,2 个 CPU 线程)在五段公开音频上的真实输出,看完再决定要不要装。
|
| 84 |
</p>
|
| 85 |
|
| 86 |
<h2>五个语种,同一份模型</h2>
|
|
|
|
| 101 |
</div>
|
| 102 |
|
| 103 |
<p class="note" style="margin-top:12px">
|
| 104 |
+
点语种名可以听那段音频。五段都在
|
| 105 |
<a href="https://huggingface.co/ToothpasteLake/offlisten-models/tree/main/test_wavs">模型仓库的 test_wavs/</a>,
|
| 106 |
+
和模型一样可下载,可自己复跑。耗时是 2 个 CPU 线程跑五轮的中位数,括号里是极值。
|
| 107 |
<br>
|
| 108 |
+
同一段音频连跑五次,RTF 能落在 0.077–0.117 之间,所以这张表只支撑一个结论:速度大概是实时的十倍。
|
| 109 |
+
要当 benchmark 用,得固定机器、关掉后台、多跑几轮看分布。
|
| 110 |
<br>
|
| 111 |
+
中文那句在官方示例里是「开放时间」,int8 量化后这里是「开饭时间」。我们没有换成好看的那条。
|
|
|
|
| 112 |
</p>
|
| 113 |
|
| 114 |
<h2>演示</h2>
|
|
|
|
| 117 |
<p class="videohint" id="demo-hint">演示视频加载中;若浏览器不支持 mp4,可直接<a href="./demo.mp4">下载观看</a>。</p>
|
| 118 |
|
| 119 |
<p class="note">
|
| 120 |
+
这 42 秒是按真实时钟跑出来的:五段音频先被模型听完��字幕才依次出现,切段方式和产品里一样靠停顿。
|
| 121 |
+
界面是产品的本地文本页,以只读回放模式启动,所以控制区写着「只读文本页」;正常桌面运行时那里是开始/暂停。
|
| 122 |
+
视频里的数据只走过 <code>127.0.0.1</code>。
|
| 123 |
</p>
|
| 124 |
|
| 125 |
<h2>接上本地的 AI</h2>
|
| 126 |
|
| 127 |
<p>
|
| 128 |
+
录匣只把声音变成文字。总结、追问、翻译交给谁写由你决定,前提是那个模型也在这台机器上。
|
| 129 |
+
下面这段 46 秒没有音轨,因为它要证明的不是听感。
|
| 130 |
</p>
|
| 131 |
|
| 132 |
<video controls preload="metadata" src="./use-with-browser-ai.mp4"></video>
|
| 133 |
|
| 134 |
<p class="note" style="margin-top:12px">
|
| 135 |
左边是录匣的本地文本页,右边是浏览器里的 Page Assist,接着一个跑在 Ollama 上的 <code>qwen2.5:0.5b</code>。
|
| 136 |
+
勾选 <b>Chat with current page</b> 之后,插件读的是这个页面本身,走的不是云端接口,也不经过复制粘贴。
|
| 137 |
</p>
|
| 138 |
|
| 139 |
+
<h3>本地文本页本来就留了这个出口</h3>
|
| 140 |
|
| 141 |
+
<p>页面上那行提示是为这件事写的:</p>
|
| 142 |
|
| 143 |
<blockquote>
|
| 144 |
文本来自本机离线 ASR,只在 127.0.0.1 上传输。本页不调用任何模型,也不持有 apikey。
|
| 145 |
要交给 AI 处理,就复制全文,或让你浏览器里已有的 AI 插件读取本页。
|
| 146 |
</blockquote>
|
| 147 |
|
| 148 |
+
<p>视频里三个部件都在同一台机器上,链路没有一处出网:</p>
|
| 149 |
|
| 150 |
<div class="tablewrap">
|
| 151 |
<table>
|
| 152 |
<thead><tr><th>部件</th><th>作用</th><th>跑在哪</th></tr></thead>
|
| 153 |
<tbody>
|
| 154 |
+
<tr><td>SenseVoice int8</td><td>声音转成带标点的文字</td><td class="out">本机进程,229 MiB 随安装包落盘</td></tr>
|
| 155 |
<tr><td>Page Assist</td><td>把当前页内容放进提示词</td><td class="out">浏览器扩展</td></tr>
|
| 156 |
<tr><td>Ollama + qwen2.5:0.5b</td><td>读文字,给回答</td><td class="out">本机进程,监听 127.0.0.1:11434</td></tr>
|
| 157 |
</tbody>
|
|
|
|
| 159 |
</div>
|
| 160 |
|
| 161 |
<p class="note" style="margin-top:12px">
|
| 162 |
+
两点说明。一是 <code>0.5b</code> 只有五亿参数,回答质量按小模型的标准看,别拿它和云端大模型比。
|
| 163 |
+
二是视频里它用英文作答,因为页面上并排摆着中文原文和 Argos 译文,模型看到的是双语文本;
|
| 164 |
+
想让回答更稳,可以在插件里限定「只依据中文原文回答」。
|
| 165 |
+
</p>
|
| 166 |
+
|
| 167 |
+
<h2>造轮子之前,先看这 12 格</h2>
|
| 168 |
+
|
| 169 |
+
<p>
|
| 170 |
+
上面演示的是产品选中的那一格。选之前量过 4 个运行时 × 3 个平台,
|
| 171 |
+
能同时满足「CPU 能跑、流式、能装进别人的机器」的只有 2 格,其中 1 格有本机实测。
|
| 172 |
+
</p>
|
| 173 |
+
|
| 174 |
+
<figure>
|
| 175 |
+
<a href="./matrix-zh.png" title="点开看原尺寸 1000×780"><img src="./matrix-zh.png" alt="端侧 ASR 运行时可用性矩阵:4 个运行时 × 3 个平台,12 格里只有 2 格通过"></a>
|
| 176 |
+
</figure>
|
| 177 |
+
|
| 178 |
+
<p class="note">
|
| 179 |
+
颜色越深越可用。斜纹表示这一格不存在:不是慢,是没有这个选项。
|
| 180 |
+
英文版:<a href="./matrix-en.png">matrix-en.png</a>。
|
| 181 |
+
</p>
|
| 182 |
+
|
| 183 |
+
<p>
|
| 184 |
+
图上只放结论,依据分四级:5 格来自官方文档或包矩阵,1 格是本机实测(就是上面那张表),
|
| 185 |
+
1 格只验过模型、没跑过运行时,5 格是推断。推断的那 5 格标了 L3,只能当"值得试",不能当结论引用。
|
| 186 |
+
</p>
|
| 187 |
+
|
| 188 |
+
<h3>依据都能点开核</h3>
|
| 189 |
+
|
| 190 |
+
<ul>
|
| 191 |
+
<li><a href="https://arxiv.org/abs/2407.04051">FunAudioLLM 论文(arXiv:2407.04051)</a>:SenseVoice-Small 的结构、5 语言支持与低延迟声明。</li>
|
| 192 |
+
<li><a href="https://k2-fsa.github.io/sherpa/onnx/">sherpa-onnx 文档</a>:ONNX Runtime 下的 SenseVoice 用法与流式示例,产品走的就是这条。</li>
|
| 193 |
+
<li><a href="https://k2-fsa.github.io/sherpa/ncnn/sense-voice/">sherpa-ncnn 的 SenseVoice 章</a>:ncnn 侧有现成预训练包,也有麦克风实时识别一节。</li>
|
| 194 |
+
<li><a href="https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/backend/docs/backend_platform_support_matrix.html">Triton 后端支持矩阵</a>:TensorRT 在 x86 与 ARM-SBSA 上都是 GPU ✓ / CPU ✗。</li>
|
| 195 |
+
<li><a href="https://pypi.org/project/sherpa-ncnn/#files">PyPI 上 sherpa-ncnn 的 wheel 列表</a>:只有 win32 与 win_amd64,没有 win_arm64。</li>
|
| 196 |
+
<li><a href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall-GGUF">SenseVoiceSmall-GGUF 模型卡</a>:q8 体积,8 线程 8.01% CER(184 条普通话)。</li>
|
| 197 |
+
</ul>
|
| 198 |
+
|
| 199 |
+
<p class="note">
|
| 200 |
+
逐格原因、证据分级和「补一格」用的模板在仓库的 <code>docs/bench/README.md</code>。
|
| 201 |
+
这 12 格里我们只有 1 格是自己量的,其余 11 格缺的正是别人手上的数据。
|
| 202 |
</p>
|
| 203 |
|
| 204 |
+
<h2>和云端转写比</h2>
|
| 205 |
<ul>
|
| 206 |
+
<li><b>不上传</b>:音频不出本机。没有隐私政策需要读,因为没有服务器收它。</li>
|
| 207 |
<li><b>不用登录</b>:没有账号体系,也就没有订阅和额度。</li>
|
| 208 |
+
<li><b>断网可用</b>:模型随安装包落盘,拔掉网线照常写。</li>
|
| 209 |
+
<li><b>能抓桌面客户端</b>:系统级音频采集,不只限于浏览器标签页。</li>
|
| 210 |
</ul>
|
| 211 |
|
| 212 |
<h2>模型</h2>
|
| 213 |
<p>
|
| 214 |
本页数字对应的权重公开在
|
| 215 |
<a href="https://huggingface.co/ToothpasteLake/offlisten-models">ToothpasteLake/offlisten-models</a>,
|
| 216 |
+
6 个文件共 229.07 MiB,逐文件 sha256 登记在发行清单里。换成自己的机器复跑时,先核对哈希,再比数字。
|
|
|
|
| 217 |
</p>
|
| 218 |
|
| 219 |
<!-- 主仓库公开后取消注释:
|
|
|
|
| 234 |
hint.hidden = true;
|
| 235 |
});
|
| 236 |
v.addEventListener('error', function () {
|
| 237 |
+
hint.innerHTML = '演示视频加载失败,可直接<a href="./demo.mp4">下载观看</a>。';
|
| 238 |
});
|
| 239 |
})();
|
| 240 |
</script>
|