A macOS voice input tool with realtime dictation and LLM-assisted integrated dictation.
一款 macOS 语音输入工具,支持实时听写与大模型整合转写。
flowchart LR
User["User"] --> Key["Right Option Key"]
Key --> Keyboard["Keyboard Service<br/>short press / long press / Esc cancel"]
subgraph ElectronMain["Electron Main Process"]
Keyboard --> PTT["Push-to-Talk Service"]
PTT --> Perm["Permissions Service"]
PTT --> Sound["Sound Service"]
PTT --> Floating["Floating Window Manager"]
PTT --> Insert["Text Input Service"]
PTT --> ASR["ASR Service"]
ASR --> Volc["Volcengine WebSocket Client"]
PTT --> LLM["Doubao Formatter Service"]
end
subgraph Renderer["Renderer Process"]
Recorder["Audio Recorder<br/>getUserMedia + AudioContext"]
UI["Floating UI<br/>status + transcript"]
end
PTT -- "IPC: start/stop status" --> Recorder
Recorder -- "PCM audio chunks" --> ASR
ASR -- "status / interim / final result" --> UI
ASR --> VolcCloud["Volcengine Streaming ASR"]
LLM --> Ark["Doubao / Ark API"]
PTT --> Insert
Insert --> Target["Focused App Input Field"]
Open Typeless 是一个面向 macOS 的语音输入工具,围绕“尽量不打断工作流”来设计。
它提供两种输入模式:
听写模式:长按右侧Option键,实时转写,松手即输入整合模式:短按右侧Option键开始识别,再短按一次结束,随后使用豆包大模型进行整理、纠错和结构化输出
双模式语音输入:同时支持实时听写与整合转写流式 ASR:基于火山引擎流式语音识别大模型LLM 整理:去口癖、去重复、处理自我修正、优化表达结构化输出:自动分段,多事项时自动编号悬浮反馈:通过浮窗展示当前模式、状态和转写内容不抢焦点输入:识别完成后直接写入当前光标位置全局快捷键:后台运行,无需手动切换回应用
- macOS 12.0 或以上
- Node.js 22
pnpm
pnpm install复制 .env.example 到 .env:
cp .env.example .env填写以下配置:
# Volcengine ASR
VOLCENGINE_APP_ID=your_app_id
VOLCENGINE_ACCESS_TOKEN=your_access_token
VOLCENGINE_RESOURCE_ID=volc.bigasr.sauc.duration
# Doubao / Ark
DOUBAO_API_KEY=your_ark_api_key
DOUBAO_MODEL=your_doubao_model_or_endpoint_idpnpm start首次使用需要授权:
麦克风权限:用于录音辅助功能权限:用于文字插入输入监控权限:用于全局监听右侧Option键
你可以在「系统设置 -> 隐私与安全性」中完成授权。
- 长按右侧
Option - 浮窗顶部显示
听写模式 - 下方实时显示 ASR 转写内容
- 松开按键后,结果自动输入到当前光标位置
- 短按右侧
Option - 浮窗顶部显示
整合模式 - 下方实时显示 ASR 内容
- 再短按一次右侧
Option - 浮窗进入
Thinking - 豆包模型整理完成后,输出最终文本并自动输入
- 在听写或整合录音过程中按
Esc可取消本次输入
src/
├── main.ts
├── preload.ts
├── renderer.ts
├── main/
│ ├── ipc/
│ ├── services/
│ │ ├── asr/ # Volcengine ASR session and WebSocket client
│ │ ├── keyboard/ # Global right-Option gesture detection
│ │ ├── llm/ # Doubao transcript formatter
│ │ ├── permissions/ # macOS permission checks
│ │ ├── push-to-talk/ # Core dictation orchestration
│ │ ├── sound/ # Start/stop sound cues
│ │ └── text-input/ # Insert text into focused app
│ └── windows/ # Floating window lifecycle and sizing
├── renderer/
│ └── src/
│ ├── modules/asr/ # Audio recorder and floating UI
│ └── styles/ # Floating window styling
├── shared/ # Shared types and IPC channel constants
└── types/ # Global preload API typing
pnpm start
pnpm typecheck
pnpm lint
pnpm package
pnpm make首次使用时浏览器侧需要完成 getUserMedia 和 AudioContext 预热,因此第一次响应通常会略慢于后续使用。
当前实现会在 connecting 阶段就启动本地录音并缓存音频,等 ASR WebSocket 真正 ready 后再补发,尽量减少前几秒丢字。
当前默认键位是右侧 Option。可以在 keyboard.service.ts 中调整 triggerKey。
Open Typeless is a macOS voice input app designed around one principle: keep dictation fast, global, and interruption-free.
It supports two input flows:
Realtime Dictation: hold the rightOptionkey, speak, release to insertIntegrated Dictation: tap the rightOptionkey to start, tap again to stop, then use Doubao to rewrite and structure the text before insertion
Dual-mode voice inputfor direct dictation and LLM-assisted rewriteStreaming ASRpowered by Volcengine speech recognitionTranscript cleanupfor filler words, repetitions, and self-correctionsStructured outputwith paragraphing and conditional numberingFloating feedback windowfor mode, status, and transcript visibilityFocus-safe insertioninto the currently focused text fieldGlobal shortcut workflowthat works while the app stays in the background
- macOS 12.0+
- Node.js 22
pnpm
pnpm installcp .env.example .envThen fill in:
VOLCENGINE_APP_ID=your_app_id
VOLCENGINE_ACCESS_TOKEN=your_access_token
VOLCENGINE_RESOURCE_ID=volc.bigasr.sauc.duration
DOUBAO_API_KEY=your_ark_api_key
DOUBAO_MODEL=your_doubao_model_or_endpoint_idpnpm startThe app needs:
Microphonefor audio captureAccessibilityfor text insertionInput Monitoringfor listening to the global rightOptionshortcut
Grant them in System Settings -> Privacy & Security.
- Hold the right
Optionkey - The floating window shows
听写模式 - Live ASR text appears below
- Release the key to insert the final transcript
- Tap the right
Optionkey - The floating window shows
整合模式 - Live ASR transcript appears below
- Tap the right
Optionkey again - The floating window switches to
Thinking - The Doubao model rewrites the transcript and inserts the final output
- Press
Escduring dictation to cancel the current session
Push-to-Talk Service: coordinates keyboard gestures, ASR lifecycle, LLM rewrite, preview, and insertionASR Service: manages connection state, buffered audio, interim/final transcript handlingAudio Recorder: captures microphone input in the renderer and streams PCM chunksFloating Window: displays mode labels, transcript text, and processing feedbackText Input Service: writes the final text into the focused app
pnpm start
pnpm typecheck
pnpm lint
pnpm package
pnpm makeMIT