Skip to content

Latest commit

 

History

History
337 lines (250 loc) · 23.4 KB

File metadata and controls

337 lines (250 loc) · 23.4 KB

Golos — голосовая диктовка, которая работает без интернета

Зажали клавишу — говорите. Отпустили — текст уже в буфере обмена, вставляйте через Ctrl+V куда угодно: в письмо, в мессенджер, в документ.

Страница проекта · In English · Краткая справка Markdown · llms.txt

Проверки Лицензия MIT

Что такое Golos

Golos — бесплатная программа с открытым исходным кодом для голосового ввода текста на русском языке в Linux/X11. Зажмите правый Ctrl, скажите фразу и отпустите клавишу: GigaAM v3 локально распознает речь, поставит знаки препинания и положит текст в буфер обмена. После однократного скачивания модели интернет, видеокарта, регистрация и подписка не нужны. Аудио и распознанный текст на диск не записываются.

Для чего русская диктовка по удержанию клавиши на компьютере с Linux
Система Linux/X11; установщик для Debian, Ubuntu, Mint и родственных систем
Распознавание GigaAM v3 e2e-rnnt, ONNX int8, только русский
Измеренная скорость RTF 0.31 на двухъядерном i7-2640M 2011 года
Ресурсы 217 МБ на диске; ~65 МБ в ожидании / ~304 МБ с моделью
Приватность локально; ноль соединений во время диктовки; аудио и текст не сохраняются
Цена и лицензия бесплатно, MIT

Установка

Один раз откройте терминал (Ctrl+Alt+T), скопируйте туда эти три строчки все сразу и нажмите Enter:

git clone https://github.com/geft1310-hue/golos.git
cd golos
./install.sh

Установщик сам проверит, чего не хватает, и скажет, что делает. Он может один раз спросить пароль от компьютера — тот же, которым вы входите в систему; это нужно только если каких-то системных компонентов не окажется.

Скачается около 217 МБ — это сама модель распознавания. Один раз.

В конце спросит, запускать ли Golos автоматически при включении компьютера. Ответить можно и потом — этот переключатель есть в настройках программы.

Запустить сразу после установки:

./run.sh

Возле часов появится значок микрофона — значит, всё готово.


Что нужно, и одно честное ограничение

Нужен Linux с графическим сервером X11, микрофон и примерно гигабайт свободной памяти. Установщик рассчитан на Ubuntu, Mint, Debian и их родню (там, где команда apt).

Текущая версия на Wayland не работает.

Golos использует X11-механизм XGrabKey, чтобы узко захватить одну удерживаемую клавишу. Универсального равноценного способа сделать тот же сценарий во всех окружениях Wayland сейчас нет. Golos определяет Wayland при запуске и честно об этом говорит, вместо того чтобы запуститься и молчать в ответ на нажатия.

Ubuntu, Fedora и многие свежие сборки GNOME и KDE по умолчанию используют Wayland. Выйдите из системы, на экране входа нажмите шестерёнку, выберите сеанс Xorg и войдите снова.


Как пользоваться

  1. Поставьте курсор туда, куда хотите написать текст.
  2. Зажмите правый Ctrl (тот, что справа от пробела) и не отпускайте.
  3. Внизу экрана появится окошко: ● Запись, бегущие полоски и таймер.
  4. Говорите.
  5. Отпустите клавишу. Окошко покажет Распознаю…, потом ✓ Скопировано.
  6. Нажмите Ctrl+V.

Полоски в окошке — не украшение. Это проверка, что микрофон вас слышит. Если он молчит, надпись честно поменяется на ● Не слышу — значит, дело в микрофоне, а не в распознавании.

Говорить можно сколько угодно: длинная речь автоматически режется по паузам между фразами и склеивается обратно, ничего не теряется. При долгой диктовке в углу окошка появится счётчик вида 2/3 — это куски, а не ошибка.

Короткое случайное касание клавиши (меньше трети секунды) игнорируется, чтобы программа не дёргалась зря.


Значок возле часов

Пункт меню Что делает
Скопировать последний текст Вернуть в буфер то, что распознали до этого
Настройки… См. ниже
Пауза (не слушать клавишу) Отпускает горячую клавишу, чтобы она снова работала как обычная
Выход Закрыть программу

Во время записи значок меняется — видно, что микрофон включён.

Настройки

  • Клавиша для диктовки — нажмите «Назначить» и нажмите желаемую клавишу. Лучше выбирать клавишу, которая сама по себе ничего не делает: правый Ctrl, правый Alt, клавиша с меню. Обычные буквы назначать не стоит — вы не сможете их печатать.
  • Микрофон — если их несколько.
  • Распознавание — три варианта: «точнее, со знаками препинания» (по умолчанию), «быстрее, тоже со знаками препинания» и «самая быстрая, без знаков препинания». Разница между первыми двумя — примерно полсекунды на каждые десять секунд речи и чуть больше ошибок у быстрого. Менять стоит, только если ждать действительно долго. Каждый вариант при первом выборе один раз скачивается (около 215 МБ), программа спросит согласия и покажет, сколько качать.
  • Освобождать память после простоя — через сколько минут выгружать модель из памяти. По умолчанию 5 минут. Выключать не рекомендуется: модель занимает около 270 МБ, а при следующем нажатии клавиши она подгружается заранее, пока вы говорите, так что задержки вы не заметите.
  • Очищать буфер обмена через N секунд — по умолчанию выключено. Полезно, если диктуете что-то, чему не место в буфере надолго. Чужой скопированный текст программа не тронет — очищается только то, что положила она сама.
  • Запускать при входе в систему.

Приватность: что программа видит и чего не делает

Написано честно, включая неудобное.

Не делает

  • Не выходит в интернет. Проверено на работающей программе: сетевых соединений ноль, открыты только внутренние каналы к экрану, звуку и панели задач. Распознавание целиком локальное. Единственное исключение — разовое скачивание модели, и его делает отдельная программа (tools/fetch_models.py): её запускает установщик, а потом — только вы сами, если смените вариант распознавания в настройках. В самой диктовке кода для работы с сетью нет вообще, поэтому «ноль соединений» — проверяемый факт, а не обещание.
  • Не пишет вашу речь на диск. Звук живёт только в памяти и обнуляется сразу после распознавания. Файлов записи не остаётся.
  • Не сохраняет распознанный текст. История последних 20 фраз (для пункта «скопировать последний текст») держится в памяти и стирается при выходе. Проверено поиском по диску: продиктованная фраза-маркер не находится нигде.
  • Не отдаёт текст менеджеру буфера обмена «на хранение». В Linux программа может попросить систему запомнить скопированное так, чтобы оно пережило её закрытие — и тогда продиктованное осело бы в истории буфера, то есть на диске. Golos такой запрос не делает намеренно.
  • Не пишет ваш текст в журнал. В логи попадает только длина распознанного («распознано символов: 43»), а не сам текст.

Видит — и это важно понимать

Программе нужна одна клавиша на всю систему, и она берёт её самым узким способом, какой есть в X11: просит у системы конкретно эту клавишу, а не поток всех нажатий (как делают многие подобные программы через библиотеку pynput — те видят вообще всё, что вы печатаете, включая пароли).

Но полной изоляции здесь не бывает, и вот что показал эксперимент на этой машине:

Пока горячая клавиша удерживается, остальные нажатия достаются Golos и до активного окна не доходят. В проверке из трёх синтезированных нажатий в поле ввода не дошло ни одного, а перехватчик увидел все три.

Что это означает на практике:

  • Пока вы держите правый Ctrl, печатать не получится — буквы не появятся в окне, куда вы печатаете. Это не поломка, а свойство того, как X11 устроен. Отпустите клавишу — всё сразу работает как обычно.
  • Формально в этот момент программа видит нажатия. Поэтому в коде чужие нажатия отбрасываются первой же строкой обработчика: не сохраняются, не разбираются, не логируются ни на каком уровне. Смотреть на них нечему и негде.
  • Окно диктовки при этом ничего не перехватывает — важно, что запись идёт в момент, когда вы говорите, а не печатаете.

Так устроена любая программа с глобальной горячей клавишей под X11 — просто про это обычно не пишут. Под Wayland такое в принципе невозможно.

Откуда взята модель

Файлы модели скачиваются с Hugging Face один раз, из репозитория с зафиксированным номером версии. При каждом запуске программа сверяет контрольные суммы файлов и сообщит, если что-то изменилось.

Формат ONNX выбран сознательно: это описание вычислений, а не программа — из него ничего не запускается. Официальный способ загрузки GigaAM выполнял бы скачанный python-код на вашем компьютере; здесь этого не происходит.

Папки ~/.config/golos и ~/.local/share/golos создаются с правами, при которых их не видит никто, кроме вас.


Если что-то не работает

Значок не появился, в терминале ругань про клавишу. Правый Ctrl уже занят другой программой. Откройте настройки и назначьте другую клавишу — например, правый Alt.

Окошко появляется, но полоски не двигаются и написано «Не слышу». Дело в микрофоне, не в программе. Проверьте в системных настройках звука, что выбран нужный микрофон и он не выключен. В настройках Golos можно выбрать конкретное устройство.

Первое распознавание после долгого перерыва идёт чуть дольше. Так и задумано: модель освобождает память, когда не используется, и подгружается обратно. Загрузка идёт одновременно с вашей речью, поэтому обычно вы её не замечаете — но если сказать одно короткое слово, задержка будет заметна.

Написано «Ничего не распознано». Либо было слишком тихо, либо клавишу отпустили раньше, чем начали говорить.

Хочу временно вернуть обычный правый Ctrl. Значок возле часов → «Пауза». Программа физически отпускает клавишу, а не делает вид.

Совсем убрать из автозапуска. Настройки → снять «Запускать при входе в систему». Или удалить файл ~/.config/autostart/golos.desktop.


Как это работает и сколько стоит по ресурсам

Замерено на этой машине (i7-2640M 2011 года, 2 ядра, 8 ГБ памяти — то есть на слабом железе; на более новом будет быстрее).

Что Сколько
Память, когда программа ждёт ~65 МБ
Память, когда модель загружена ~304 МБ
Возвращается системе при выгрузке 238 из 273 МБ
Загрузка модели с диска 1.7–1.9 с (успевает, пока вы говорите)
Скорость распознавания ~0.31 — то есть 10 секунд речи распознаются за 3.1 с
Место на диске 217 МБ на модель
Сетевой обмен во время работы ноль

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

Из чего собрано

golos/
├── __main__.py    связывает всё вместе, главный цикл окон
├── hotkey.py      перехват клавиши (X11 XGrabKey)
├── audio.py       микрофон и данные для полосок
├── asr.py         распознавание, ленивая загрузка, нарезка длинной речи
├── clipboard.py   буфер обмена и история в памяти
├── config.py      настройки в ~/.config/golos/config.json
└── ui/            окошко с эквалайзером, значок, настройки

Тяжёлая работа вынесена в отдельные потоки, окно рисуется отдельно — поэтому интерфейс не подвисает во время распознавания.

Проверки

В папке bench/ лежат скрипты, которыми всё вышеперечисленное измерялось — их можно перезапустить в любой момент:

Скрипт Что проверяет
benchmark.py скорость и память на разных настройках
test_asr.py что распознавание работает и длинная речь режется по паузам без потерь
test_memory.py что память действительно возвращается системе
test_privacy.py что продиктованное не оседает на диске
test_grab_exposure.py куда уходят нажатия во время удержания клавиши
test_hotkey.py что удержание даёт ровно одно нажатие, без автоповтора
test_audio.py что микрофон слышит и полоски считаются верно
test_overlay.py что окошко не ворует фокус
test_platform.py что X11, Wayland и запуск без экрана различаются верно

Запускать так: .venv/bin/python bench/test_privacy.py


Короткие ответы

Нужна ли видеокарта для голосового ввода?

Нет. Golos работает на процессоре. Замер RTF 0.31 получен на двухъядерном ноутбучном процессоре 2011 года.

Речь отправляется в интернет или сохраняется?

Нет. Распознавание локальное, PCM-буфер обнуляется после обработки, распознанный текст живёт только в RAM. Отдельная программа один раз выходит в сеть, чтобы скачать модель.

Чем Golos отличается от Wispr Flow и Superwhisper?

Wispr Flow требует интернет и всегда распознаёт речь в облаке, а Linux не поддерживает. Superwhisper умеет работать локально, но официальной версии для Linux у него тоже нет. Golos бесплатен, локален и сделан для Linux/X11, зато понимает только русский и имеет меньше функций. Ссылки на первоисточники есть в полном сравнении.

Почему GigaAM, а не Whisper?

Для интерактивной русской диктовки на процессоре GigaAM намного быстрее в указанном независимом замере. Whisper разумнее для множества языков, видеокарты и некоторых шумных записей.

Для автоматических помощников: русская Markdown-справка · llms.txt · расширенный контекст.


Что дальше

🐧 Linux (X11) работает, это и есть текущая версия
🪟 Windows с установщиком в работе
🤖 Android — голосовой клавиатурой в работе. Заменит кнопку микрофона Google в любом поле ввода, но со знаками препинания
🌊 Wayland невозможно, пока не появится соответствующая возможность в самом Wayland

Если попробовали и что-то не заработало — напишите об этом в Issues. Такие сообщения полезнее всего.


Модель GigaAM v3 — SberDevices, лицензия MIT. Запуск без PyTorch — onnx-asr, лицензия MIT. Сам Golos — тоже MIT: берите, копируйте, переделывайте.