Дата публикации
ai_products

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, чтобы не зависеть от облака.

Как это работает

Общий сценарий

  1. Вы зажимаете Ctrl+Cmd.
  2. VoiceBox фиксирует контекст: какое приложение активно, какой элемент в фокусе, его заголовок, плейсхолдер, текущий текст.
  3. Начинается запись с микрофона, в верхней части экрана появляется компактный оверлей с индикатором уровня голоса.
  4. Вы говорите. Клиент режет звук на PCM‑чанки и по WebSocket шлёт их в Cloudflare Worker.
  5. При отпускании Ctrl+Cmd клиент отправляет сигнал audio_end.
  6. На Worker’е Durable Object собирает аудио, конвертирует PCM в WAV, передаёт в Whisper для STT.
  7. Далее Worker вызывает LLM‑форматер (@cf/qwen/qwen3-30b-a3b-fp8), который с учётом контекста поля превращает расшифровку в оформленный текст.
  8. Клиент получает результат, копирует его в буфер и автоматически жмёт 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"

Порядок поиска конфига:

  1. ~/.config/voicebox/voicebox.toml
  2. рядом с бинарником
  3. ./voicebox.toml

Права Accessibility на macOS

Для автопасты VoiceBox нужен доступ к Accessibility. macOS запросит его при первом использовании. Можно выдать права вручную:

System Settings → Privacy & Security → Accessibility и включить VoiceBox.

Сборка и запуск

wails dev   # режим разработки с hot reload
wails build # сборка продакшн-бинарника

После сборки вы получаете нативное приложение для macOS, которое можно запускать как обычную программу и вызывать запись через глобальный хоткей.


Читайте также