Эмодзи для eSpeak на Android
DanstivДолгое время на Android я использую eSpeak 1.48.15, который не умеет читать эмодзи.
В NVDA эта проблема решается средствами самой NVDA, также вроде сделано и в Jieshuo, но в Talkback эту фичу не завезли.
"Ну не читаются, да и фиг с ними", думал я, года 4 так и жил.
Но недавно я начал играть в Idle bank (см. пост выше), где интерфейс содержит большое количество значащих эмодзи.
Мне казалось, что я буду играть с компа, а с мобилы делать какие-то простые действия, где игнорируемые eSpeak-ом эмодзи не критичны, но фиг там!
Вот сижу я на кухне, пью чаёк под видосик, и пришло время инвестировать.
Инвестировать хочется в компанию другой фракции, чтобы собрать линию и получить бонусные блоки.
А компании можно различить, правильно, посмотрев на эмодзи, которые с моей конфигурацией не читаются!
Вот так я и пришёл к идее модификации eSpeak.
Я знал, что для языка существует файл правил с некими паттернами, которые применяются к тексту, и eSpeak разговаривает соблюдая фонетику языка.
А также есть лист, в котором задаются исключения, которые в правила вписать сложно / невозможно.
Большая часть листа для русского языка - это таблица ударений для различных слов, т.е. на строке написано слово, и после него с соблюдением синтаксиса файла листа задан ударный слог.
Но помимо этого, в листе можно задавать и замены, т.е. заменить одно слово на другое.
Проблема этого способа в том, что работает он именно со словами, а нам нужны эмодзи, часто состоящие из нескольких слов.
Если просто написать эмодзи, а затем его название, при чтении eSpeak проговорит только первое слово.
Если писать, например, через дефисы или подчёркивания, eSpeak будет озвучивать эти символы.
Может быть и можно было подобрать не озвучиваемый разделитель, но я пошёл по другому пути.
Помимо замены слова на другое слова можно задать фонемное произношение, и в этом случае для разделения слов уже используются не пробелы, а две вертикальные черты.
То есть всё корректно парсится и озвучивается, но появляется другая проблема: я не знаю фонемы, да если бы и знал, не вручную же конвертировать тысячи наименований!
И у этой проблемы нашлось простое решение: eSpeak умеет отдавать фонемную репрезентацию, если ему передать ключ -x.
Эта фича была добавлена, вероятно, в целях отладки написанных правил, если на слух какие-то фонемы расслышать может трудно, то их текстовое отображение снимет все вопросы.
Выглядит это дело примерно так:
C:\Users\Danstiv>echo тестирование | espeak -v ru -x
t;E#s;t;'irVvVnijI
Страшно, не правда ли? 🙂
Людям, незнакомым с данным форматом (типа меня) тут на самом деле многое не ясно.
Но главное, что есть способ преобразовать исходный чистый текст в набор фонем, который можно будет запихнуть в лист.
В конечном итоге, я сделал следующее:
1. Вытащил из русской локали NVDA эмодзи и их описания.
2. Обработал их питоном (скрипт предоставить не могу, так как шаманил сразу в интерпретаторе).
В процессе выяснилось, что NVDA достаёт описания символов из нескольких мест, и один словарь перекрывает другой, а так как мне хотелось сохранить привычные описания, пришлось немного поплясать вокруг словарей (кажется их там всего два, с эмодзи и с символами, но в символьном дублируются некоторые эмодзи).
В итоге получил очищенный набор из эмодзи и их описаний, кажется, из 3600 с чем-то элементов.
3. Написал адски быстрый (нет) скрипт, который на вход получает текст, скармливает его eSpeak-у с ключами -q (выключает генерацию речи) и -x (включает вывод фонем).
Да, работает именно так, поднимается процесс через subprocess с нужными ключиками, в stdin пишется текст, потом из stdout вытаскивается результат, от него откусываются пробельные символы по краям, потом пробелы заменяются на две вертикальные черты и полученная строка возвращается.
4. Запустил цикл, проходящий по всему набору, и добавляющий к нему фонемную репрезентацию.
Сколько эта шайтан-машина крутилась я не знаю, потому что открыл что-то в youtube и минут 30 залипал, но когда я вернулся в консоль, всё уже было готово.
5. Смерджил эмодзи с фонемными описаниями и докинул в лист.
6. Скомпилировал словарь и по варварски, средствами root, подсунул eSpeak-у.
И оно завелось!
Как этот словарь получить вам?
Всё довольно просто, в eSpeak встроена замечательная функция импорта словаря, с помощью которой у вас нифига не получится сделать, потому что она не работает в последних версиях android.
Поэтому единственное, что могу предложить, это установить мою сборку eSpeak, которая была опять же по варварски подпатчена с использованием "BatchApkTool".
Правда это даже две сборки:
1. eSpeak.v.1.48.15_with_ru_emoji - обычный eSpeak, в русский словарь которого добавлены эмодзи.
2. eSpeak.v.1.48.15_only_ru_with_emoji - тоже с поддержкой эмодзи, и с выпиленными голосами (кроме русского), что не даёт eSpeak-у переключаться на другие языки (ему просто некуда 😉) в некоторых приложениях, где на самом деле русский интерфейс.
Не знаю, как он встанет на уже установленный eSpeak, возможно будет нужно удалить старый.
Заключение
Теперь я могу спокойно задротствовать с телефона, ну и бонусом видеть / ставить реакции в телеге.