Эмодзи для eSpeak на Android

Эмодзи для 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, возможно будет нужно удалить старый.


Заключение

Теперь я могу спокойно задротствовать с телефона, ну и бонусом видеть / ставить реакции в телеге.

Report Page