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.