プログラミング
Cloudflare AI を使用したオープンソースで無料枠対応の Whispr
Open Source, Free Tier Capable Whispr Using Cloudflare AI (github.com)
要約
VoiceBox は、音声を入力として受け取り、Whisper で文字起こしし、LLM で整形されたテキストを生成するデスクトップアプリケーションです。ホットキーを押して話すだけで、整形されたテキストがクリップボードにコピーされ、入力中のアプリケーションに自動的に貼り付けられます。バックエンドは Cloudflare Worker で動作し、Whisper STT と LLM フォーマッターを利用します。
全文翻訳
VoiceBox
音声からテキストへのツールで、音声をキャプチャし、Whisper 経由で文字起こしし、LLM で出力を整形します。ホットキーを押して話し、離すと、整形されたテキストがクリップボードに配置され、入力していたものに自動的に貼り付けられます。
仕組み
PCM チャンク → WebSocket → Cloudflare Worker (Durable Obj) → Whisper STT → LLM Formatter → クリップボード → 自動貼り付け
Ctrl+Cmd を長押しすると、フォーカスされているコンテキストがキャプチャされ、録音が開始され、オーバーレイが上部中央に表示されます。
マイクに向かって話します(音声レベルメーターが入力表示)。
Ctrl+Cmd を離すと、オーディオがクラウドにストリーミングされます。
Whisper が文字起こしし、LLM が整形し、結果がクリップボードにコピーされて、元のアプリケーションに自動貼り付けされます。
プロジェクト構造
voicebox/
├── main.go # Wails エントリーポイント、アプリメニュー
├── app.go # アプリのライフサイクル、ホットキーハンドラー、パイプラインオーケストレーション
├── window_darwin.go # macOS ウィンドウ管理(オーバーレイ、設定、ドッククリック)
├── window_other.go # macOS 以外のビルド用のスタブ
├── internal/
│ ├── audio/ # PCM オーディオキャプチャ (malgo/miniaudio)、RMS レベル
│ ├── pipeline/ # WebSocket クライアント、オーディオとフォーカスコンテキストをワーカーにストリーミング
│ ├── accessibility/ # macOS AX API: フォーカスされた要素のコンテキストと自動貼り付け (Cmd+V)
│ ├── config/ # TOML 設定の読み込みと保存
│ ├── hotkey/ # グローバルホットキー登録
│ ├── stt/ # STT プロバイダーインターフェース (スタブ)
│ └── formatter/ # LLM フォーマットプロバイダーインターフェース (スタブ)
├── frontend/ # React + Tailwind オーバーレイ UI (Vite)
│ └── src/
│ ├── App.tsx # 設定モードとオーバーレイモード間のルーティング
│ ├── components/
│ │ ├── settings-form.tsx # 設定エディター (react-hook-form + zod)
│ │ └── title-bar.tsx # フレームレスタイトルバーとドラッグ領域
│ └── hooks/
│ ├── use-voicebox.ts # voicebox:state / voicebox:mode / voicebox:level イベント
│ └── use-config.ts # GetConfig / SaveConfig / GetConfigPath バインディング
├── worker/ # Cloudflare Worker (TypeScript)
│ ├── src/
│ │ ├── index.ts # ルーター: /ws (WebSocket)、/health
│ │ ├── session.ts # Durable Object: オーディオ蓄積 + AI パイプライン
│ │ ├── prompt.ts # システムプロンプト + ユーザーメッセージビルダー
│ │ ├── wav.ts # PCM から WAV へのラッパー
│ │ └── types.ts # 共有型
│ ├── test/ # Vitest テスト
│ └── wrangler.jsonc # Worker 設定
├── go.mod
└── voicebox.toml # ユーザー設定 (gitignored)
セットアップ前提条件
Go 1.24+
Node.js + pnpm
Wails v2 CLI
Workers AI アクセス権を持つ Cloudflare アカウント
macOS (自動貼り付けにはアクセシビリティ許可が必要)
Worker のデプロイ
cd worker
pnpm install
wrangler secret put VOICEBOX_TOKEN # 共有シークレットを設定
pnpm deploy
デスクトップクライアントの設定
初回起動時に、VoiceBox は設定ウィンドウを開きます。設定は ~/.config/voicebox/voicebox.toml で手動で作成することもできます。
[provider]
mode = "cloud"
[cloud]
worker_url = "https://voicebox.<your-subdomain>.workers.dev"
token = "your-shared-secret"
[audio]
sample_rate = 16000
channels = 1
chunk_size = 4096
[hotkey]
record = "ctrl+cmd"
設定は、~/.config/voicebox/voicebox.toml、バイナリの隣、./voicebox.toml の順に読み込まれます。
macOS アクセシビリティ許可
自動貼り付けには macOS のアクセシビリティアクセスが必要です。初回使用時に macOS が許可を求めるプロンプトを表示するか、システム設定 → プライバシーとセキュリティ → アクセシビリティで手動で付与できます。
ビルドと実行
wails dev # ホットリロード付き開発モード
wails build # 本番用バイナリ
ウィンドウモード
設定 (700×450、中央揃え): 起動時、ドッククリック時、または録音メニューから開きます。ここで設定を編集します。
オーバーレイ (160×48、上部中央、フローティング): 録音中に表示されます。録音インジケーター、音声レベルメーター、処理中のスピナー、成功時のチェックマークを表示します。
WebSocket プロトコル
クライアントは GET /ws?token=<auth-token> に接続します。{