STT
Бесплатная диктовка для Mac. Сочетание клавиш начинает запись, то же сочетание её заканчивает, и текст появляется там, где стоит курсор. Голос не покидает Mac.
- Скачать для MacDMG · 4,4 МБ
brew install geragarazagh/tap/ stt - Гитхабисходный код
Apple silicon, macOS 13 или новее. Интерфейс на английском, украинском и русском.
Для продвинутых пользователей и языковых моделей
Распознавание идёт на самом Mac, на открытой модели на выбор: Whisper, Parakeet или Qwen. Интернет нужен только, чтобы скачать эту модель и проверить обновления; язык, словарь, переключатель субтитров и настройка истории ещё и передаются через iCloud на другие Mac той же учётной записи. Каждая запись хранится вместе с текстом на самом Mac (История, ниже). Без логов, без своего аккаунта.
Аудио и видео: «Выбрать файл…» в настройках, «Файл» › «Распознать файл…» (Command-O), перетаскивание куда угодно на любое из окон или «Открыть в программе» → STT в Finder. Текст сохраняется рядом с файлом в .txt с тем же именем (из Interview.m4a выйдет Interview.txt; существующий файл не перезаписывается, новый будет Interview (2).txt) и копируется в буфер обмена; никуда не вставляется. Маленькое окно показывает ход работы и «Отменить», потом имя .txt: клик по нему показывает файл в Finder. Несколько файлов идут по очереди, у каждого свой .txt; диктовка в это время ждёт, пока файл закончится. Если включено «Сохранять субтитры (.srt)», рядом с .txt под тем же именем ложится .srt с таймкодами (Interview.srt), по субтитру на каждый отрезок речи, который отмечает модель. Файлы, открытые другой программой, а не Finder или Dock (open -a STT в Терминале, скрипт), сначала требуют подтверждения: их текст попадает в буфер обмена.
История
Каждая диктовка хранится вместе с аудио в ~/Library/Application Support/STT/History: одно хранилище с текстами и по файлу AAC на запись, около 256 КБ в минуту. «История» в настройках хранит всё, 30 дней (по умолчанию), 7 дней, последние 100 или ничего; выбор, который сотрёт записи, один раз спрашивает, сколько их. «Удалить» переносит запись в «Недавно удаленные» на 30 дней, где «Восстановить» возвращает её, а «Удалить навсегда» стирает вместе с аудио. «Распознать заново» прогоняет сохранённое аудио через любую скачанную модель и заменяет текст. Текст, который поле пароля не пустило в буфер обмена, тоже не хранится.
Как это устроено
- Движок: transcribe.cpp (MIT), один интерфейс для Whisper, Parakeet и Qwen; каждая модель это один файл
.gguf. - Модели скачиваются из репозиториев
handy-computerна Hugging Face фиксированной ревизии и сверяются с SHA-256, записанным в коде. - Микрофон записывается через
AVAudioEngineв память; когда текст готов, аудио сохраняется в историю (ниже), если в «Истории» не выбрано «Не хранить». Запись идёт ещё 0,3 с после остановки, чтобы последнее слово не обрезалось. Bluetooth-гарнитура не берётся микрофоном, потому что её звук тогда падает до телефонного: вместо неё берётся микрофон Mac, если есть другой. - Слова из «Словаря» идут первыми в подсказку Whisper, подогнанную под её 223 токена его же токенизатором, чтобы пример пунктуации и уже сказанный текст остались на месте, и в системное сообщение Qwen. На 199 настоящих диктовках слова, добавленные в «Словарь», стали писаться верно все, а не 0-54 %, и ничего выдуманного не появилось; встроенные пары подняли долю верно написанных названий с 78 до 92 % у Whisper и с 41 до 72 % у Parakeet.
- Перед распознаванием тишина вырезается, а длинная речь режется по паузам на куски до 30 с. Большинство моделей теряют точность после 30-40 с за раз.
- На тишине и в конце речи Whisper пишет строки, выученные из субтитров к фильмам, вроде «Субтитры сделал DimaTorzok» или «Продолжение следует...». Такие строки-титры убираются, если ими кончается кусок речи.
- Whisper Turbo иногда обрывается после пары слов (короткое «Vielen Dank.» на пятнадцать секунд выступления) или повторяет одну фразу по кругу. Такой кусок распознаётся заново без подсказки, а если снова коротко, то с температурой 0,2, и остаётся более полный текст. На выступлениях в Европарламенте ошибок в немецком стало 16,1 % вместо 22,9 %, в нидерландском 12,4 % вместо 22,8 %; хуже нигде не стало.
- Звуки-паразиты убираются после распознавания по постоянному шаблону: э-э, ммм, хм, uh, hmm, äh, euh, yyy и подобные, а um только в английском (в немецком и португальском это слово). Слова не меняются никогда.
- Текст вставляется в приложение на переднем плане имитацией Command-V, для этого и нужен универсальный доступ, и остаётся в буфере обмена на случай, если вставка промахнётся. Пока открыто поле пароля (Secure Input в macOS), текст не вставляется и не попадает в буфер.
- Option-Command-Space macOS держит за своим поиском, поэтому STT перехватывает его перехватчиком событий в начале сессии, ему тоже нужен универсальный доступ.
Модели
Модели в комплекте нет. Её выбирают в настройках, и она скачивается после согласия с размером, с проверкой SHA-256. Модели это обычные файлы .gguf в ~/Library/Application Support/STT/models. В меню модели есть «Показать в Finder» и «Удалить».
- Whisper: Whisper large-v3-turbo, 886 МБ, 100 языков, MIT.
- Parakeet: Parakeet Ultra, 740 МБ, 25 языков, определяет сам, выбрать нельзя, CC-BY-4.0.
- Qwen: Qwen3-ASR 1.7B, 2 185 МБ, 30 языков, Apache-2.0.
В Qwen нет украинского.
Вопросы
Голос уходит с Mac?
Нет. В сеть код ходит только за выбранной моделью и за проверкой обновлений, а iCloud переносит четыре настройки (ниже); записи и их тексты остаются на Mac.
Настройки синхронизируются между Mac?
Да, сами, без переключателя: язык, словарь (слова и замены), «Сохранять субтитры (.srt)» и «История» одинаковы на всех Mac с одной учётной записью iCloud, через хранилище ключей и значений iCloud; побеждает более позднее изменение. Модель, сочетания клавиш, остальные переключатели и сами записи у каждого Mac свои. Без iCloud всё работает так же, только на одном этом Mac.
Работает без интернета?
Да, когда модель скачана.
Зачем ему микрофон и универсальный доступ?
Микрофон, чтобы записывать. Универсальный доступ, чтобы вставлять текст и перехватывать Option-Command-Space: это сочетание macOS держит за собой. macOS спрашивает про каждое только после скачивания первой модели, по одному.
Какую модель выбрать?
Parakeet ошибался на чужой речи меньше всех во всех восьми измеренных языках и работает быстрее всех; язык всегда определяет сам. У Whisper больше всего языков, и один из них можно выбрать. Qwen самый большой и самый медленный, украинского в нём нет: украинскую речь он пишет смесью русских и польских слов. Каждую модель можно попробовать и удалить.
Убирает слова-паразиты?
Убирает звуки вроде «э-э», слова не трогает. Никакой ИИ текст не переписывает.
Умеет расшифровывать аудио и видео из файлов?
Да, без интернета, выбранной моделью: «Выбрать файл…» в настройках, «Файл» › «Распознать файл…», перетаскивание на окно или «Открыть в программе» → STT в Finder. Текст сохраняется рядом с файлом в .txt с тем же именем (а с включёнными субтитрами ещё и .srt с таймкодами) и копируется в буфер обмена. Несколько файлов сразу дают по .txt на каждый. Быстрые команды и командная строка stt-cli делают то же без окна.
Можно добавить свои слова и имена?
Да, в «Словаре» (кнопка «Изменить…» в настройках). Слова: названия и термины пишутся так, как их ввели; Return добавляет слово, Delete убирает, «Восстановить» возвращает 24 встроенных (ChatGPT, Claude, GitHub и другие). Их берут Whisper и Qwen; Parakeet список слов не берёт, и окно об этом пишет. Замены: что пишет модель и что писать вместо этого, для всех моделей, по готовому тексту; таблица начинается со 104 встроенных пар для названий, сказанных по-русски или по-украински (клод → Claude, ютуб → YouTube), а её «Восстановить» возвращает убранные. Command-V вставляет и туда, и туда; список строк «слышится, Tab, пишется», вставленный в таблицу, становится строками, а Delete удаляет выбранные.
Чем отличается от диктовки macOS?
Диктовка macOS идёт с системой, её модель выбрать нельзя. В STT модель открытая, на выбор, и лежит обычным файлом.
Обновления
Раз в день приложение читает ленту своего последнего релиза на GitHub (appcast.xml) через Sparkle. О самом Mac ничего не отправляется. Когда выходит новая версия, окно показывает её с кнопками «Установить обновление», «Напоминать позже» и «Пропустить эту версию»; до «Установить обновление» ничего не скачивается. «Проверить наличие обновлений» в меню STT и в настройках проверяет сразу.
Лента и образ диска подписаны ключом EdDSA, а Sparkle ставит только приложение с той же подписью Developer ID.
Настройки и удаление
Настройки (модель, язык, сочетания клавиш, переключатели, словарь) и время последней проверки обновлений лежат в defaults com.geragaraza.stt, модели в ~/Library/Application Support/STT/models, история в ~/Library/Application Support/STT/History. Четыре синхронизируемые настройки ещё хранит для учётной записи iCloud служба ключей и значений macOS; места в iCloud они не занимают.
Чтобы удалить STT: «Выйти» в настройках, удалить папку ~/Library/Application Support/STT (модели и история), STT.app в Корзину и defaults delete com.geragaraza.stt. Микрофон и универсальный доступ для него убираются в Системных настройках, «Конфиденциальность и безопасность».
Если ставили через Homebrew, brew uninstall --zap stt закрывает его и удаляет приложение, настройки, модели и историю; микрофон и универсальный доступ убираются в Системных настройках.
Быстрые команды
STT добавляет в приложение «Быстрые команды» четыре действия: «Запись» работает как одно нажатие сочетания клавиш (начинает запись или останавливает её и передаёт текст следующему действию); «Начать запись» и «Остановить запись» работают как сочетание клавиш (текст вставляется как обычно, а «Остановить запись» ещё и передаёт его следующему действию), «Распознать файл» передаёт следующему действию текст аудио- или видеофайла, без .txt. Быструю команду из них можно повесить на клавишу, расписание или автоматизацию.
Командная строка
Homebrew ставит команду stt-cli; с образом диска её даёт ln -s /Applications/STT.app/Contents/MacOS/STT /usr/local/bin/stt-cli. Она берёт модель, язык и словарь, выбранные в настройках.
stt-cli Interview.m4a печатает текст файла, stt-cli --srt Interview.m4a его субтитры, stt-cli --toggle начинает или останавливает запись.
Файлы читаются с правами программы, которая запускает команду, а не приложения. --toggle управляет запущенным приложением, как его сочетание клавиш, и только для программы, у которой у самой есть доступ к микрофону (Терминал спросит один раз). Запущенная как приложение или задание launchd, а не из терминала или скрипта, команда не работает: иначе она действовала бы с разрешениями самого STT.
Подробности
- Версия: 0.8.
- Идентификатор:
com.geragaraza.stt. - Загрузка:
STT.dmg, 4,4 МБ. - Модели: скачиваются отдельно, от 740 до 2 185 МБ каждая.
- Нужно: Apple silicon, macOS 13 или новее.
- Разрешения: микрофон, универсальный доступ. Сеть: чтобы скачать модель и проверить обновления; iCloud для четырёх настроек.
- Подписано Developer ID и нотаризовано Apple.
- Интерфейс: английский, украинский, русский, по языку macOS.
- Код: Swift, AppKit, SwiftUI и Core Data, около 3 400 строк, фреймворк transcribe.cpp и Sparkle для обновлений.
- Лицензия: MIT.
English Українська Русский