Реклама умеет раздражать. Но иногда именно раздражение становится двигателем прогресса. Один разработчик настолько устал видеть рекламу Wispr Flow — платного инструмента для голосового ввода текста — что решил не платить подписку, а просто создать собственный аналог. За несколько часов. И опубликовал всё в open source.

Эта история гуляет по Reddit и Hacker News, собирая тысячи апвоутов. Давайте разберём, что такое Wispr Flow, почему его open-source клон вообще возможен, и как при желании повторить это самостоятельно.

Что такое Wispr Flow и почему за него просят деньги

Wispr Flow — это macOS-приложение, которое позволяет диктовать текст в любое поле ввода на компьютере. Нажал горячую клавишу, продиктовал, отпустил — текст появился там, где стоял курсор. Никакого копирования, никаких переключений между окнами.

Продукт действительно удобный. Wispr Flow использует Whisper от OpenAI под капотом (или собственные модели), добавляет постобработку через LLM для исправления пунктуации и грамматики, интегрируется на системном уровне в macOS. Стоимость — около $15 в месяц или $120 в год.

ℹ Что умеет Wispr Flow
  • Голосовой ввод в любое поле macOS
  • Автокоррекция пунктуации через LLM
  • Работа в фоне, горячие клавиши
  • Поддержка нескольких языков
  • Режим «вставить в буфер» и «вставить напрямую»

Проблема в том, что технологии, лежащие в основе, — открытые. Whisper от OpenAI опубликован на GitHub под лицензией MIT. API OpenAI доступен всем. Системные API macOS для вставки текста — документированы. По сути, за что платит пользователь Wispr Flow — это за удобную обёртку и отсутствие необходимости самостоятельно всё собирать.

Платная подписка на инструмент — это часто плата за чужое время и труд по интеграции. Вопрос лишь в том, сколько стоит ваше собственное время.

Архитектура: как работает DIY-аналог

Разработчик, опубликовавший свой проект, использовал стек, который доступен любому Python-разработчику:


flowchart TD
    A[Горячая клавиша нажата] --> B[Запись аудио с микрофона]
    B --> C[Отпускание клавиши]
    C --> D[Отправка аудио в Whisper API]
    D --> E[Получение транскрипции]
    E --> F{Нужна постобработка?}
    F -->|Да| G[GPT-4o-mini: исправление текста]
    F -->|Нет| H[Вставка в буфер обмена]
    G --> H
    H --> I[pbpaste / xdotool / pyperclip]
    I --> J[Текст появляется в активном окне]

Ключевые компоненты:

1. Захват горячей клавиши — библиотека pynput или keyboard для Python. Отслеживает нажатие и отпускание выбранной кнопки (например, правый Shift).

2. Запись аудиоsounddevice или pyaudio. Запись начинается при нажатии клавиши, заканчивается при отпускании. Результат — WAV-файл в памяти.

3. Транскрипция — Whisper API OpenAI (whisper-1) или локальная модель через faster-whisper. Локальный вариант полностью бесплатен и не отправляет данные в интернет.

4. Постобработка (опционально) — отправка текста в gpt-4o-mini с промптом «исправь пунктуацию, не меняй смысл». Стоит копейки — примерно $0.001 за типичный запрос.

5. Вставка текста — на macOS через pbcopy + симуляция Cmd+V, на Linux через xdotool, на Windows через pyperclip + pyautogui.

Код: минимально рабочая версия

Вот упрощённая версия того, что написал автор проекта. Около 80 строк Python:

import sounddevice as sd
import numpy as np
import scipy.io.wavfile as wav
import openai
import pyperclip
import pyautogui
import tempfile
import os
from pynput import keyboard

client = openai.OpenAI()  # Берёт OPENAI_API_KEY из env

RECORDING = False
audio_chunks = []
SAMPLE_RATE = 16000

def on_press(key):
    global RECORDING, audio_chunks
    if key == keyboard.Key.shift_r and not RECORDING:
        RECORDING = True
        audio_chunks = []
        print("🔴 Запись...")

def on_release(key):
    global RECORDING
    if key == keyboard.Key.shift_r and RECORDING:
        RECORDING = False
        print("⏹ Обработка...")
        process_audio()

def audio_callback(indata, frames, time, status):
    if RECORDING:
        audio_chunks.append(indata.copy())

def process_audio():
    if not audio_chunks:
        return
    
    audio_data = np.concatenate(audio_chunks, axis=0)
    
    # Сохраняем во временный файл
    with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as f:
        wav.write(f.name, SAMPLE_RATE, audio_data)
        tmp_path = f.name
    
    # Транскрипция через Whisper API
    with open(tmp_path, 'rb') as audio_file:
        transcript = client.audio.transcriptions.create(
            model="whisper-1",
            file=audio_file,
            language="ru"  # или убери для автоопределения
        )
    
    os.unlink(tmp_path)
    text = transcript.text.strip()
    
    if text:
        # Вставляем текст
        pyperclip.copy(text)
        pyautogui.hotkey('ctrl', 'v')  # cmd+v для macOS
        print(f"✅ Вставлено: {text}")

# Запуск
with sd.InputStream(samplerate=SAMPLE_RATE, channels=1, 
                    callback=audio_callback, dtype='float32'):
    with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
        print("🎤 Держи правый Shift для записи")
        listener.join()
⚠ Требования

Для работы нужен OPENAI_API_KEY в переменных среды. Установка зависимостей: pip install sounddevice numpy scipy openai pyperclip pyautogui pynput

На macOS потребуется разрешение на доступ к микрофону и Accessibility в System Settings.

Сравнение: Wispr Flow vs DIY-решение

ПараметрWispr FlowDIY (Whisper API)DIY (локальный Whisper)
Цена$15/мес~$1-3/месБесплатно
Настройка5 минут30-60 минут1-2 часа
КонфиденциальностьДанные в облакеAPI OpenAI100% локально
КачествоВысокоеВысокоеСреднее–высокое
Интеграция в ОСИдеальнаяХорошаяХорошая
ПоддержкаЕстьСамостоятельноСамостоятельно
Открытый кодНетЧастичноДа
КастомизацияМинимальнаяПолнаяПолная
💡 Когда стоит выбрать DIY
Если вы диктуете конфиденциальные данные (медицина, юриспруденция, бизнес), локальная версия на базе faster-whisper или whisper.cpp — единственный разумный выбор. Данные не покидают ваш компьютер.

Как поднять локальную версию без API

Если вы не хотите платить даже копейки за API, есть путь полной автономии. Проект faster-whisper — это оптимизированная версия Whisper от OpenAI, работающая локально и значительно быстрее оригинала благодаря CTranslate2.

# Установка
pip install faster-whisper

# Доступные модели:
# tiny, base, small, medium, large-v2, large-v3
# Рекомендуется small или medium для баланса скорость/качество
from faster_whisper import WhisperModel

# Загрузится автоматически при первом запуске (~500MB для small)
model = WhisperModel("small", device="cpu", compute_type="int8")

def transcribe_local(audio_path):
    segments, info = model.transcribe(audio_path, language="ru")
    return " ".join([seg.text for seg in segments])

На современном MacBook Pro транскрипция 10 секунд речи занимает около 2-3 секунд на модели small. На base — меньше секунды, но качество чуть хуже.

Ещё один вариант — whisper.cpp, C++ реализация, которая на Apple Silicon работает через Metal и выдаёт скорость, сравнимую с GPU на Windows.

📝 Реальные цифры
Автор исходного поста сообщил, что за первый месяц использования собственного инструмента потратил около $0.80 на Whisper API при активном использовании (~2 часа диктовки в день). При переходе на локальную модель — $0.

Почему это важнее, чем просто «сэкономить $15»

История с DIY-аналогом Wispr Flow поднимает несколько важных вопросов об экосистеме AI-инструментов.

Commoditization AI. Базовые возможности — распознавание речи, генерация текста, классификация — становятся commodity. Это значит, что большинство SaaS-продуктов «на базе AI», которые появились в 2023–2024 годах, уязвимы к такой же «атаке выходного дня». Их ценность всё больше определяется не технологией, а UX, интеграциями и брендом.

Данные и конфиденциальность. Когда вы диктуете текст в Wispr Flow, ваш голос уходит на серверы компании. Политика конфиденциальности есть, но всё же. DIY-решение с локальным Whisper — это нулевая утечка данных по определению.

Образовательная ценность. Построить такой инструмент за вечер — это отличный способ понять, как работают современные AI-системы изнутри. Не как магия, а как вполне конкретные API-вызовы и системные хуки.

Лучший способ понять инструмент — разобрать его на части и собрать заново. Даже если результат менее полированный, зато ваш.

Опасность vendor lock-in. Wispr Flow сейчас стоит $15/мес. Что мешает поднять цену до $30? Ваши данные о привычках использования уже у них, переключиться психологически сложнее. Open-source альтернатива — это страховка.

Что можно улучшить в типичной DIY-реализации

Базовая версия работает, но у коммерческого продукта есть причины, по которым люди всё равно платят. Вот что обычно «допиливают» в более зрелых open-source реализациях:

  1. Индикатор записи — маленькое окошко или иконка в трее, чтобы было видно, что идёт запись
  2. Шумоподавление — предобработка аудио через noisereduce перед отправкой в Whisper
  3. Автоопределение языка — убрать параметр language, Whisper сам справится
  4. Постобработка через LLM — «Исправь пунктуацию в тексте, сохрани смысл и стиль»
  5. История диктовки — простой лог в SQLite, чтобы можно было найти то, что продиктовал час назад
  6. Конфигурационный файл — YAML или TOML для настройки горячих клавиш, модели, языка

Полноценные open-source проекты, выросшие из таких прототипов, можно найти на GitHub по запросам whisper dictation, voice typing linux, openai whisper hotkey.

Заключение

История «устал от рекламы — написал сам» — это не про экономию $15. Это про то, что современный стек AI-инструментов достаточно прост и доступен, чтобы разработчик средней руки мог за вечер воспроизвести продукт, который стартап продаёт по подписке.

Wispr Flow — хороший продукт с хорошим UX. Если вы не программист, $15 в месяц — разумная плата за то, чтобы не разбираться в Python-скриптах и системных API. Но если вы умеете читать код, open-source альтернатива даёт полный контроль, нулевую абонентскую плату и — что немаловажно — отсутствие утечки голосовых данных.

Главный урок: прежде чем платить за AI-обёртку, стоит спросить себя — а что именно внутри? Если внутри публичные API с открытой документацией, возможно, вечер с Python стоит дороже, чем год подписки.