Руссификация озвучки Xiaomi Robot Vacuum
Приветствую!
Есть такая замечательная библиотека 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:
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=
3. Задел на будущее
В принципе, все вышеописанное есть в документации к библиотеке python-miio, но, надеюсь, данный мини-мануал все же кому-нибудь пригодится) Пользуясь случаем, хочу спросить: интересна ли будет еще одна статья по «умному» дому? Дело в том, что я уже достаточно долгое время выстраиваю домашнюю экосистему на основе девайсов от Xiaomi и Philips, но без фирменных приложений, всем рулит Home Assistant. Занятие это вполне себе бесконечное, однако на данный момент система пришла к более-менее стабильному виду.
С одной стороны, на Geektimes полно подобных статей, с другой — я бы хотел больший упор сделать на опыт эксплуатации, косяки и ошибки, с которыми столкнулся. Возможно мой опыт уберег бы кого-то от таких же граблей, или подкинул новых идей.