PuxVoice

Телесуфлёр со слежением за голосом. Речь распознаётся на телефоне, без интернета — на русском и английском.

  • Экран суфлёра во время чтения: крупный текст на чёрном фоне, строки у линии чтения яркие, остальные приглушены
    Суфлёр
  • Суфлёр на паузе: сверху кнопки зеркала, инверсии и кадрирования, снизу ползунки шрифта, ширины и скорости, кнопка «ИИ» и «Старт»
    Управление
  • Рамка рабочей области с ручками на сторонах поверх текста; поля вне рамки затенены, внизу размеры области и кнопки «Сбросить» и «Готово»
    Кадрирование
  • Текст сценария, отражённый по горизонтали для телесуфлёра со стеклом
    Зеркало
  • Список сценариев: название, начало текста, число слов и оценка длительности, справа кнопка запуска суфлёра
    Сценарии
  • Редактор сценария: название, текст, внизу число слов с длительностью и кнопка «Старт»
    Редактор

Что умеет

  • Слежение за голосом. Текст прокручивается за тем, что произнесено. Пока диктор молчит или отходит от текста, текст стоит; если фраза перечитана с начала — возвращается.
  • Распознавание на телефоне. Речь распознаётся на устройстве, без интернета. Языки — русский и английский, язык выбирается по тексту сценария.
  • Зеркало. Отражение по горизонтали и по вертикали — для телесуфлёров со стеклом.
  • Кадрирование рабочей области. Рамка поверх текста: стороны тянутся пальцем, текст перестраивается сразу. Нужна, когда корпус суфлёра закрывает часть экрана.
  • Профили оборудования. Зеркало, рабочая область и размер шрифта сохраняются под именем конкретного суфлёра.
  • Ручной режим. Прокрутка с постоянной скоростью в строках в минуту — на случай шума или чужого языка.
  • Импорт документов. Сценарий создаётся из файла txt, docx, doc, odt, rtf, pdf или html; файл можно открыть из другого приложения через «Открыть с помощью» и «Поделиться».
  • Чтение без рук. Кнопки громкости запускают, останавливают и отматывают текст; перед стартом идёт обратный отсчёт.

Дополнительно: инверсия цветов, подсветка зоны чтения, межстрочный интервал, выравнивание, верхний регистр, блокировка ориентации, оценка длительности чтения.

Как устроен

Android-приложение на Kotlin и Jetpack Compose, одна активити. Экран суфлёра — функция от набора настроек: зеркало, область, шрифт и инверсия — это преобразования отрисовки одного и того же текста, а не отдельные режимы. Текст ведёт один из двух источников позиции: постоянная скорость или голос.

Слежение за голосом состоит из двух независимых частей. Движок распознавания (Vosk, модели работают на телефоне) выдаёт поток гипотез — слова текущей фразы. Алгоритм сопоставления берёт шесть последних слов и ищет их в окне сценария от 25 слов назад до 40 вперёд методом локального выравнивания; слова сравниваются нечётко, чтобы падежные окончания и мелкие ошибки распознавания не останавливали текст. Продвижение на одно слово принимается сразу, скачок вперёд и возврат назад — только при трёх совпавших словах. Алгоритм описан спецификацией и не зависит от Android: он проверяется воспроизведением настоящих потоков распознавания.

Импорт документов сделан без офисных библиотек: docx и odt читаются как zip с XML, rtf и двоичный doc разбираются собственным кодом, для pdf используется PDFBox. Формат определяется по содержимому файла, а не по расширению. Для текстовых файлов кодировка подбирается из UTF-8, UTF-16, Windows-1251, KOI8-R и CP866; текст из любого формата приводится к одному виду — концы строк, пробелы, «й» и «ё», собранные из двух символов.

В версии 1.0.0 — 46 модульных тестов и проход по экранам на телефоне; импорт проверяется на документах, сохранённых Word во всех поддерживаемых форматах из одного текста.

Установка

  • Ставится из магазина приложений. Публикация готовится; отдельного установочного файла на сайте нет.
  • Нужен телефон с Android 8.0 или новее и около 300 МБ свободного места: голосовые модели входят в приложение и при первом включении слежения распаковываются.
  • Разрешение одно — микрофон, запрашивается при включении слежения за голосом. При отказе приложение работает в ручном режиме.
  • Интернет не нужен и не используется: разрешения на доступ в сеть у приложения нет.
  • Сценарии и настройки хранятся только на телефоне. После удаления приложения они удаляются вместе с ним.

Управление

Действие Что происходит
Нажатие на экран старт и пауза
Перетаскивание текста перемотка
Щипок размер шрифта
Громкость − старт и пауза
Громкость + назад на три строки
Кнопка «ИИ» слежение за голосом вместо постоянной скорости

Панель управления видна только на паузе.

Ограничения

  • Числа, записанные цифрами, и слова, которых нет в словаре модели (имена, термины, названия), не распознаются: на них текст замирает и догоняет диктора на следующих словах.
  • Языки распознавания — только русский и английский.
  • Из документа берётся только текст: оформление, картинки, колонтитулы и сноски отбрасываются. Сохранить правки обратно в docx, odt или pdf нельзя.
  • Из pdf с отсканированными страницами текст не извлекается. Абзацы в pdf восстанавливаются приблизительно.
  • При каждом запуске показывается экран со сведениями об авторе; кнопка «Пропустить» становится активной через пять секунд.
  • Версии для iOS пока нет.

Сторонние компоненты

Компонент Лицензия
Vosk (vosk-android) Apache 2.0
Голосовые модели vosk-model-small-ru и vosk-model-small-en-us (Alpha Cephei) Apache 2.0
PdfBox-Android (перенос Apache PDFBox) Apache 2.0
JNA Apache 2.0 / LGPL 2.1
AndroidX, Jetpack Compose, Room, DataStore Apache 2.0
Kotlin, kotlinx.coroutines Apache 2.0

Идея для «PuxVoice»

Чего не хватает или что мешает — напишите. Сообщения читает разработчик.