行动不一定带来快乐,但无行动则决无快乐。——本杰明·富兰克林

Handy:离线、自由、可扩展的语音转写应用,让你的电脑“更懂你”

在语音交互逐步成为主流的今天,很多人却因为隐私、网络不稳定或商业限制无法安心使用语音转写。Handy 选择了一条简单直接又极具意义的路线:完全离线的开源语音转写应用。它不仅免费、开源,还强调可扩展与跨平台体验,是个人创作者、隐私敏感场景以及办公环境的一剂良方。

  • 项目地址:cjpais/Handy
  • 官网主页:https://handy.computer
  • 项目描述:A free, open source, and extensible speech-to-text application that works completely offline.
  • 主语言:TypeScript
  • License:MIT
  • Stars:8,299+
  • Forks:555+
  • 关键词:speech-to-text accessibility cross-platform tauri-v2

为什么是 Handy?

  • 完全离线:隐私不外流,内网/弱网环境也能稳定运行
  • 可扩展:插件或自定义模块化的能力,适配更多语言、模型与工作流
  • 跨平台:基于 Tauri v2 的跨平台桌面应用(Windows, macOS, Linux)
  • 友好设计:面向可访问性(Accessibility),更友好地服务不同用户群体

典型使用场景

  • 开会实时记录:本地转写,敏感内容不出办公室
  • 创作写作稿:口述生成文稿,离线快速反复
  • 课堂/讲座/访谈:离线记录,后期整理方便
  • 无障碍辅助:为需要辅助输入的用户提供高质量的语音输入体验

模型选择与扩展思路

在离线语音转写中,常见方案包括使用开源 ASR 模型(例如 Whisper 的本地运行、或其他轻量模型)。Handy的“可扩展”理念意味着你可以选择不同的后端模型,并在应用中切换或配置。

扩展思路:

  • 引入本地 ASR 推理引擎(如 whisper.cpp)
  • 多语言支持与自适应采样率
  • 结合热词与领域词典增强识别准确度
  • 输出到你的文稿系统或知识库

代码范例:一个可扩展的离线转写模块(概念示例)

以下 TypeScript 代码展示了一个“概念模块”,说明如何在 Handy 风格的应用中组织离线语音转写。具体 API 以项目实际代码/文档为准。

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
// 概念演示:离线语音转写模块接口
// 实际开发请参考 Handy 的插件/模块扩展文档与 Tauri v2 集成

type TranscriptionOptions = {
lang?: string; // 目标语言,如 'en', 'zh'
modelPath: string; // 本地模型路径
sampleRate?: number; // 采样率,如 16000
hotwords?: string[]; // 热词提升识别概率
};

type TranscriptionResult = {
text: string; // 识别文本
segments?: Array<{ start: number; end: number; text: string }>;
confidence?: number; // 置信度
};

export class OfflineTranscriber {
constructor(private opts: TranscriptionOptions) {}

async init(): Promise<void> {
// TODO: 加载本地模型,例如 whisper.cpp 或其他 ASR 引擎
console.log(`Loading model from ${this.opts.modelPath}...`);
}

async transcribeFromFile(audioPath: string): Promise<TranscriptionResult> {
// TODO: 调用本地 ASR 引擎进行识别
// 返回结构化结果(文本 + 分段)
return {
text: "示例结果:本段文本由离线模型识别。",
segments: [
{ start: 0.0, end: 3.2, text: "示例结果:" },
{ start: 3.2, end: 8.5, text: "本段文本由离线模型识别。" }
],
confidence: 0.92
};
}

async transcribeStream(chunk: Float32Array): Promise<string> {
// TODO: 进行流式识别,适合实时转写
return "实时识别片段...";
}
}

// 用法示例
(async () => {
const asr = new OfflineTranscriber({
modelPath: "/models/whisper/base.en.bin",
lang: "en",
sampleRate: 16000,
hotwords: ["Handy", "offline", "privacy"]
});
await asr.init();

const res = await asr.transcribeFromFile("/recordings/meeting.wav");
console.log(res.text);
})();

在真实项目中,你可以:

  • 将该模块接入 Tauri v2 的命令通道(Rust 后端 + TS 前端)
  • 在 UI 中提供模型选择、输入源选择(麦克风/文件)、热词配置
  • 通过插件化接口扩展更多模型与工作流(如一键导出到 Markdown、Notion、Obsidian 等)

工程实践建议

  • 麦克风与采样率:保证音频输入清晰稳定,匹配模型最佳采样率(如 16k)
  • 噪声处理:加入降噪与能量门限,提升准确度
  • 热词与词典:针对特定领域(公司名、技术词、专有名词)添加热词
  • 设备适配:在跨平台环境下测试麦克风权限与驱动兼容性
  • 数据隐私:离线确实更安全,但本地存储仍需做好权限与加密

与生产力工具的协同

Handy 的价值在于“可扩展”——这意味着你可以打造完整的工作流:

  • 语音 → 文稿(Markdown/富文本)
  • 文稿 → 校对/翻译 → 发布
  • 自动按时间分段并生成会议纪要模板
  • 与快捷键/全局热键结合,让转写更加顺手

总结

Handy 把“离线、自由、可扩展”的理念带到了语音转写场景。对于隐私敏感、网络不可控、或者追求更快迭代的用户与团队,这是一个值得收藏与投入的开源项目。基于 Tauri v2 的跨平台能力与 MIT 许可证,你可以放心地用它、改它、扩展它,打造真正属于自己的语音输入与转写工具。

项目主页:https://github.com/cjpais/Handy
官网入口:https://handy.computer

欢迎尝试,在你的电脑上解锁“更懂你”的语音体验!