Русификация озвучки Xiaomi Robot Vacuum +26


image

Приветствую!


Есть такая замечательная библиотека python-miio, позволяющая управлять многими гаджетами Xiaomi: пылесосом, очистителем/увлажнителем воздуха, лампами и тд. В процессе чтения документации я наткнулся на в целом бесполезную, но занятную возможность заменить стандартную озвучку робота-пылесоса на свою. А поскольку на Гиктаймс мне доселе ничего подобного не попадалось, и бытовые гаджеты Xiaomi пользуются популярностью, я решил, что возможно описание процесса окажется для кого-то полезным.

0. python-miio


Начинается все с библиотеки. Как минимум она хороша тем, что позволяет отказаться от проприетарного приложения Xiaomi и вообще закрыть IoT гаджетам доступ в интернет, ограничившись изолированной локалкой.

Помимо Python 3 для установки потребуются libffi-dev libssl-dev.

Выполняем:

pip3 install -U setuptools
pip3 install python-miio

На маке и Debian (Raspberry Pi) больше никаких зависимостей не потребовалось.

1. Токены устройств


Для общения с девайсами Xiaomi нужно получить токены устройств (в данном случае пылесоса), это, пожалуй, самая унылая часть. Возможно, ее получится избежать, выполнив

mirobo discover --handshake 1

, но у меня данный способ не сработал, поэтому ставим официальное приложение MiHome, регистрируемся, добавляем пылесос штатным образом, затем

в случае iOS:
  • делаем незашифрованный бэкап через iTunes
  • открываем бэкап с помощью iBackup Viewer (софтина платная, но нашим целям ограничения бесплатной версии не помешают), в нем выбираем просмотр файловой системы (raw files) и ищем приложение Xiaomi MiHome (com.xiaomi.mihome). Извлекаем один файл с названием <цифры>_mihome.sqlite
  • полученную БД открываем, например, DB Browser for SQLite. Оттуда можно извлечь параметры для всех устройств, в частности нужный нам токен (поле ZTOKEN).
  • далее открываем Терминал и выполняем
    echo '0: <извлеченный_токен>' | xxd -r -p | openssl enc -d -aes-128-ecb -nopad -nosalt -K 00000000000000000000000000000000


в случае Android:
Понадобится adb. Делаем бэкап базы

adb backup -noapk com.xiaomi.smarthome -f backup.ab

с помощью ADB Backup Extractor извлекаем содержимое

java -jar Android\ Backup\ Utilities/Android\ Backup\ Extractor/android-backup-extractor-20171005-bin/abe.jar unpack backup.ab unpacked.tar

и распаковываем

tar -xvf unpacked.tar

из полученной БД с помощью, например, DB Browser for SQLite извлекаем нужный нам токен (поле ZTOKEN).

Вместо просмотра полученных баз вручную, можно воспользоваться инструментом из библиотеки python-miio, должно работать с базами и с Android и с iOS:

miio-extract-tokens <файл_бд>

Самая скучная часть позади, впереди часть творческая.

2. Озвучка


Я воспользовался готовым скриптом. Клонируем к себе, понадобится только папка dustcloud/devices/xiaomi.vacuum/audio_generator. Отредактируем скрипт generate_audio.py. Я все проделывал на Маке и, соответственно, использовал его генератор речи, но понадобилось внести пару правок:

84.  os.system("say -v <голос> -o " + path + " --data-format=LEI16@22050 " + text)

С голосом все просто, выбираете тот, какой нравится (весь список можно посмотреть, набрав в Терминале)

say -v ?

Я поставил русский голос Milena. Обратите внимание на параметр --data-format, в оригинальном скрипте автор использует LEF32@22050, но у меня при таком атрибуте робот выдавал тишину. Глянув вывод ffmpeg, я увидел, что в оригинальной озвучке используется pcm_s16le, поэтому я сменил в скрипте параметр на LEI16, после чего все заработало. У меня первое поколение пылесоса, возможно на втором другой формат звуковых файлов, тем не менее, если робот молчит, рекомендую в первую очередь убедиться, что звуковые файлы имеют одинаковые параметры.

Поправив скрипт, идем в ./language, где хранятся списки фраз. Дублируем любую, переименовываем в audio_ru.csv и правим как душе угодно. После запускаем скрипт

./generate_audio.py

выбрав в интерактивном режиме наш файл с фразами (audio_ru.csv) и tts-движок. На выходе получим файл ru.pkg, который нужно залить на пылесос командой

mirobo install_sound ./ru.pkg

предварительно выполнив

export MIROBO_TOKEN=<токен>

и

export MIROBO_IP=<ip-адрес робота>

3. Задел на будущее


В принципе, все вышеописанное есть в документации к библиотеке python-miio, но, надеюсь, данный мини-мануал все же кому-нибудь пригодится) Пользуясь случаем, хочу спросить: интересна ли будет еще одна статья по «умному» дому? Дело в том, что я уже достаточно долгое время выстраиваю домашнюю экосистему на основе девайсов от Xiaomi и Philips, но без фирменных приложений, всем рулит Home Assistant. Занятие это вполне себе бесконечное, однако на данный момент система пришла к более-менее стабильному виду.

С одной стороны, на Geektimes полно подобных статей, с другой – я бы хотел больший упор сделать на опыт эксплуатации, косяки и ошибки, с которыми столкнулся. Возможно мой опыт уберег бы кого-то от таких же граблей, или подкинул новых идей.




К сожалению, не доступен сервер mySQL