Git

Voxtype: что ломалось и как исправлено

Разбор ошибок голосового ввода, найденных при живой проверке. Как пользоваться голосовым вводом, написано на странице голосовой ввод. Здесь только причины и исправления: так следующий, кто столкнётся с похожим, не потратит время заново.

Используется форк Voxtype с движком GigaAM, ветка gigaam-engine.

Текст пропадал целиком после остановки записи#

Причина. Обработчик сигнала SIGUSR2 сразу обнулял потоковую сессию, а событие Final с распознанным текстом приходило позже. Сессии уже не было, и событие отбрасывалось.

Исправление. Убрать преждевременное обнуление в обработчиках SIGUSR2 и отпускания клавиши push-to-talk. Сессия остаётся живой до события Ended, которое приходит следом за Final и корректно всё чистит.

Обрывки текста, перемешанные с чужим#

Причина. Предпросмотр через preedit (призрак текста прямо в поле ввода по протоколу text-input-v3) всегда выбирался раньше экранной плашки, независимо от настроек. Фокус внутри приложения прыгал между полями: призрак писался в одно поле, а итоговый текст через ydotool вставлялся в другое.

Исправление. Собирать программу без функции preedit: cargo build --features gigaam,osd-gtk4. Живой предпросмотр идёт только на экранной плашке, а настоящий текст пишется один раз, в конце.

Горячие клавиши срабатывали вместо текста#

Симптом. После диктовки открывалось второе окно файлового менеджера или двигались окна.

Причина. Пока вы держите Mod, буквы синтетического ввода принимаются композитором за сочетания. В Voxtype есть защита modifier_guard: она ждёт отпускания модификаторов. Но в финальном коммите текста значение wait_for_modifier_release было зашито как false, и защита не работала. А пользователь обычно отпускает Mod уже после второго нажатия B, как раз во время вставки.

Исправление. Пробросить настройки wait_for_modifier_release и modifier_release_timeout_ms из конфигурации в функцию финального коммита. Печать во время записи оставлена без ожидания: при push-to-talk модификатор по задумке зажат.

Длинная кириллица обрывалась#

Причина. ydotool type печатает не-ASCII символы через временную перенастройку клавиш. У неё ограниченное число слотов, на длинной фразе с разными буквами слоты кончаются, и печать молча обрывается на случайном месте.

Исправление. Режим mode = "paste" вместо "type": текст кладётся в буфер и вставляется одним Ctrl+V.

Правило. Для кириллицы и любых не-ASCII символов всегда режим paste.

Тишина вместо текста#

Причина. После перезагрузки микрофон по умолчанию в PipeWire мог смениться на другое устройство, например на встроенный микрофон монитора. Voxtype честно распознаёт тишину в пустую строку, и это выглядит как поломка голосового ввода.

Проверка и исправление.

pactl get-default-source pactl set-default-source <имя_нужного_источника>

ydotool нужен в образе#

Программа ydotool должна быть в самом образе (src/resources/packages.yml). Установленный через apm system install пакет живёт во временном оверлее /usr и после перезагрузки исчезает.