- Дата публикации
VoiceBox: голос в отформатированный текст через Cloudflare AI и Whisper
Что нового
VoiceBox — десктопный инструмент для macOS, который превращает голос в уже отформатированный текст и сразу вставляет его туда, где вы печатали.
Ключевые изменения и возможности:
- Голос → текст через Whisper (
@cf/openai/whisper-large-v3-turbo) на Cloudflare Workers AI. - Сразу после распознавания текст прогоняется через LLM‑форматер (
@cf/qwen/qwen3-30b-a3b-fp8). - Горячая клавиша по умолчанию:
Ctrl+Cmd. Зажали — говорите, отпустили — результат уже в буфере и автоматически вставленCmd+Vв активное окно. - Работает поверх любой программы: VoiceBox считывает контекст активного элемента (название приложения, роль поля, плейсхолдер, текущий текст) и подстраивает форматирование под задачу.
- Клиент реализован на Go + Wails (React WebView), бэкенд — Cloudflare Worker с Durable Object.
- Поддерживает бесплатный уровень Cloudflare Workers AI, если вы укладываетесь в лимиты.
- Заявленные ограничения аудио: 16 кГц, моно, PCM 16‑бит LE, куски по ~4096 байт (~128 мс), максимум ~25 MiB записи (~13 минут).
- Заложен план «Фаза 2»: локальный бэкенд на faster‑whisper + Ollama, чтобы не зависеть от облака.
Как это работает
Общий сценарий
- Вы зажимаете
Ctrl+Cmd. - VoiceBox фиксирует контекст: какое приложение активно, какой элемент в фокусе, его заголовок, плейсхолдер, текущий текст.
- Начинается запись с микрофона, в верхней части экрана появляется компактный оверлей с индикатором уровня голоса.
- Вы говорите. Клиент режет звук на PCM‑чанки и по WebSocket шлёт их в Cloudflare Worker.
- При отпускании
Ctrl+Cmdклиент отправляет сигналaudio_end. - На Worker’е Durable Object собирает аудио, конвертирует PCM в WAV, передаёт в Whisper для STT.
- Далее Worker вызывает LLM‑форматер (
@cf/qwen/qwen3-30b-a3b-fp8), который с учётом контекста поля превращает расшифровку в оформленный текст. - Клиент получает результат, копирует его в буфер и автоматически жмёт
Cmd+Vв исходном приложении.
Архитектура клиента
Структура проекта:
voicebox/
├── main.go # Точка входа Wails, меню приложения
├── app.go # Жизненный цикл, обработка хоткеев, оркестрация пайплайна
├── window_darwin.go # Управление окнами на macOS (оверлей, настройки, клик по доку)
├── window_other.go # Заглушка для не‑macOS сборок
├── internal/
│ ├── audio/ # Захват PCM (malgo/miniaudio), расчёт уровня (RMS)
│ ├── pipeline/ # WebSocket‑клиент, стриминг аудио + контекста фокуса на Worker
│ ├── 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 / mode / 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 # Пользовательский конфиг (игнорируется Git)
Окна и интерфейс
- Settings: окно 700×450 по центру экрана. Открывается при первом запуске, по клику на иконку в Dock или через меню Recording. Здесь редактируется конфиг.
- Overlay: компактный оверлей 160×48 в верхнем центре. Появляется во время записи. Показывает индикатор записи и уровень голоса, спиннер во время обработки и галочку при успехе.
WebSocket‑протокол
Клиент подключается к GET /ws?token=<auth-token>.
После получения {"type":"ready"} клиент отправляет configure с параметрами аудио и контекстом фокуса, затем бинарные PCM‑чанки:
Client Server
│── connect /ws?token=... ──────▶│
│◀── {"type":"ready"} ──────────│
│── {"type":"configure", ...} ─▶│
│── [binary PCM chunk] ─────────▶│
│── [binary PCM chunk] ─────────▶│
│── {"type":"audio_end"} ─────▶│
│◀── {"type":"processing",...} ─│
│◀── {"type":"result",...} ─────│
В configure попадают:
- параметры аудио (частота, каналы, размер чанка),
- контекст активного элемента: имя приложения, bundle ID, роль элемента, заголовок, плейсхолдер, текущее значение.
LLM‑форматер использует эти данные, чтобы, например, писать короткий заголовок в поле title или развёрнутый текст в большом редакторе.
Облачный и локальный бэкенд
Сейчас (облако):
- STT:
@cf/openai/whisper-large-v3-turbo. - Форматер:
@cf/qwen/qwen3-30b-a3b-fp8.
Планируется локальный режим (Phase 2):
- STT: faster‑whisper.
- Форматер: Ollama.
Интерфейсы для локальных провайдеров уже есть в internal/stt/ и internal/formatter/.
Что это значит для вас
Когда VoiceBox полезен
- Быстрые заметки и письма. Надиктовали текст, получили уже структурированный абзац в почте, заметках или мессенджере.
- Заполнение форм. Контекст фокуса помогает LLM сделать ответ короче или длиннее в зависимости от поля.
- Черновики текстов. Можно проговаривать мысли и получать аккуратный текст, а не «стену» транскрипции.
- Работа в любых приложениях. VoiceBox не привязан к конкретному редактору — он просто вставляет текст в активное окно.
Ограничения и подводные камни
- Только macOS. Есть заглушка для других платформ, но рабочий функционал — под macOS.
- Нужен доступ к микрофону и Accessibility. Без прав на Accessibility автопаста работать не будет, придётся копировать вручную.
- Облако через Cloudflare Workers AI. Для полноценной работы нужен аккаунт Cloudflare с доступом к Workers AI. Бесплатный уровень есть, но лимиты зависят от вашего аккаунта.
- Ограничение длины записи. До ~25 MiB аудио, примерно 13 минут. Для длинных интервью или лекций придётся разбивать запись.
- Зависимость от интернета. Пока нет локального режима, без сети Whisper и LLM не запустятся.
Если вы работаете в России, Cloudflare Workers AI может потребовать VPN или обходные решения, в зависимости от вашей сети и провайдера. VoiceBox не решает эту проблему сам по себе.
Место на рынке
VoiceBox попадает в нишу «диктовка + форматирование текста» и конкурирует не только с обычными диктовками, но и с ассистентами в редакторах.
Отличия по подходу:
- В отличие от встроенной диктовки macOS, VoiceBox:
- использует Whisper на стороне Cloudflare, а не системный движок;
- сразу форматирует текст через LLM;
- подстраивает результат под контекст конкретного поля.
- В отличие от голосовых ассистентов внутри IDE или редакторов, VoiceBox:
- не привязан к одному приложению;
- работает везде, где есть текстовое поле и поддержка вставки из буфера.
Конкретных чисел по скорости против других решений автор не приводит. Но есть жёсткие параметры:
- частота дискретизации 16 кГц;
- моно, 16‑бит PCM LE;
- чанки ~4096 байт каждые ~128 мс;
- лимит записи ~13 минут.
По стоимости всё упирается в тариф Cloudflare Workers AI. VoiceBox сам по себе бесплатен и доступен на уровне исходников, но использование Whisper и Qwen через Workers AI расходует ваш лимит на стороне Cloudflare.
Установка
Предварительные требования
- Go 1.24+
- Node.js +
pnpm - Wails CLI v2
- Аккаунт Cloudflare с доступом к Workers AI
- macOS (для автопасты требуется доступ к Accessibility)
Деплой Cloudflare Worker
cd worker
pnpm install
wrangler secret put VOICEBOX_TOKEN # set a shared secret
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
Права Accessibility на macOS
Для автопасты VoiceBox нужен доступ к Accessibility. macOS запросит его при первом использовании. Можно выдать права вручную:
System Settings → Privacy & Security → Accessibility и включить VoiceBox.
Сборка и запуск
wails dev # режим разработки с hot reload
wails build # сборка продакшн-бинарника
После сборки вы получаете нативное приложение для macOS, которое можно запускать как обычную программу и вызывать запись через глобальный хоткей.