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 и после перезагрузки исчезает.