yap
- title
- yap
- type
- toolbox
- summary
- Диктовка из меню-бара для macOS без встроенной модели: вызывает локальный SpeechAnalyzer от Apple напрямую
- tags
- macos, swift, speech-to-text, privacy, watchlist
- language
- Swift
- license
- MIT
- created
- 2026-07-29
- updated
- 2026-09-01
- lang
- ru
- translation_of
- yap
- source_updated
- 2026-09-01
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Yap - приложение для диктовки из меню-бара для macOS. Нажимаете горячую клавишу (по умолчанию ⌘⇧D, можно переназначить, поддерживается даже одиночный модификатор вроде правого Shift), говорите, нажимаете снова - и расшифрованный текст вставляется в активное текстовое поле. Небольшое окно внизу экрана показывает живую осциллограмму и промежуточный текст прямо во время речи, поэтому неудачную попытку можно отменить двойным нажатием Escape ещё до того, как что-либо напечатается. История записей хранится локально с возможностью поиска, копирования и удаления. Приложение разработала компания Frigade и использует его внутри команды - в основном для запросов к кодинг-агентам и написания сообщений.
Архитектурное решение: никакой своей модели
Все остальные инструменты в этой категории скачивают веса. Модели Whisper весят сотни мегабайт, занимают оперативную память всё время, пока приложение открыто, а на старых Mac расшифровка одного абзаца может занимать от тридцати секунд до минуты. В macOS 26 ситуация изменилась с появлением двух API - SpeechAnalyzer и SpeechTranscriber, которые выполняют потоковое распознавание речи прямо на устройстве с помощью моделей, поставляемых и управляемых самой ОС. Yap не несёт собственных моделей, ничего не загружает в память до первого произнесённого слова, не требует API-ключа и не тратит деньги за каждую минуту аудио. В итоге получилось около трёх тысяч строк на Swift в приложении размером 4 МБ, которое в режиме ожидания потребляет около 60 МБ памяти и обходится без браузерного движка - этот контраст с приложениями для меню-бара на базе Electron подчёркивается в README напрямую.
Главный вопрос - достаточно ли хороша модель от Apple, и в README приводится внешний бенчмарк: 2.12% ошибок в словах (WER) на чистом аудио и 4.56% на зашумлённом против 3.74% и 7.95% у Whisper Small, причём примерно втрое быстрее (тестировалось на 5 559 фрагментах LibriSpeech). Это лишь одно стороннее измерение на начитанной дикторами речи, а не общее утверждение о точности диктовки.
Как это устроено
Аудиопоток захватывается со стандартного входа через AVAudioEngine и конвертируется в формат, который запрашивает анализатор. Захват начинается ещё до того, как стек распознавания речи завершит инициализацию, а буферы, записанные за это окно, удерживаются и сбрасываются в транскрибер сразу после его подключения, поэтому первое слово предложения никогда не обрезается. Транскрипция выполняется через SpeechAnalyzer с включёнными промежуточными результатами (volatile results), именно это и даёт живой предпросмотр. Пути отката нет: старый SFSpeechRecognizer может отправлять аудио на серверы Apple, если для текущей локали нет локальной модели, поэтому Yap его вообще не использует. Если SpeechAnalyzer не поддерживает ваш язык на устройстве, диктовка просто останавливается, не обращаясь к сети.
Вставка текста - наименее изящная часть, и в README об этом написано честно. Yap копирует текст в буфер обмена, нажимает ⌘V через System Events, а затем восстанавливает прежнее содержимое буфера - с задержкой перед восстановлением, поскольку приложения на базе Chromium читают буфер обмена асинхронно и не один раз, и слишком быстрое восстановление подсунет движку рендеринга старые данные. Эта задержка - как раз то, что отличает работу везде от работы только в нативных приложениях. Состояние хранится в единственном конечном автомате RecordingCoordinator, все зависимости которого закрыты протоколами, поэтому логику можно покрыть юнит-тестами без подключения микрофона.
При первом запуске запрашиваются четыре разрешения: микрофон, распознавание речи, универсальный доступ (Accessibility, чтобы понимать, в какое приложение вы вводите текст) и автоматизация (Automation, чтобы вставить в него текст). Доступ к Accessibility нужно выдать вручную в System Settings; в macOS нет программного способа получить его для программ, которые печатают от вашего имени.
brew install --cask frigadehq/tap/yap
Сборка из исходников выполняется командой git clone https://github.com/FrigadeHQ/yap.git && cd yap && ./install.sh, которая при необходимости ставит XcodeGen, собирает проект и кладёт приложение в /Applications. Проект Xcode генерируется из project.yml, а не хранится в репозитории, поэтому изменения конфигурации остаются читаемыми в diff. Локальные сборки подписываются ad-hoc, из-за чего macOS считает каждую пересборку новым приложением и молча сбрасывает выданные права - галочка в System Settings остаётся включённой, но вставка перестаёт работать. В настройках для этого есть кнопка "Reset and re-grant"; официальные релизы подписаны и нотаризованы как положено, и такой проблемы у них нет.
Ограничения
macOS 26 (Tahoe) или новее, только Apple Silicon. Процессоры Intel не поддерживаются, и отказ от них был осознанным: SpeechAnalyzer работает локально только на Apple Silicon, а вариантом для Intel был SFSpeechRecognizer, отправляющий аудио в Apple. Версия 0.1.4 и более ранние ещё работают на Intel и действительно делают эти вызовы API. Для сборки требуется Xcode 26. Планов по развитию практически нет, самое вероятное будущее добавление - переключатель языка, так как сейчас Yap просто берёт системную локаль.
Такое сочетание - одна платформа, одна версия ОС, API одного вендора и сайд-проект компании с заявленным отсутствием roadmap - отправляет его в watchlist. Техническая ставка разумна, но проект станет бесполезным, если Apple объявит SpeechAnalyzer устаревшим или изменит его, а всё преимущество пропадёт при появлении зрелой кроссплатформенной альтернативы. В moonshine сделан похожий компромисс в другую сторону: ставка целиком на Wayland, Vulkan и systemd ради функциональности, которая иначе потребовала бы гораздо больше кода. Проект kokoro делает аналогичную локальную ставку, но на синтез речи вместо распознавания (с моделью на 82M параметров), и за счёт собственных весов работает везде - ровно от этого свойства Yap и отказался.
github.com/FrigadeHQ/yap - 257 звёзд, MIT.