Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
danielk117 authored Jan 26, 2024
1 parent e3b7182 commit d37dfff
Showing 1 changed file with 8 additions and 164 deletions.
172 changes: 8 additions & 164 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,167 +1,11 @@
# Home Assistant Voice Satellite

![XiaoAi Speakers](research/speakers.jpg)
Voice Assist Satellite for Home Assistant using Xiaomi LX06. Based on [rhasspy/wyoming-satellite](https://github.com/rhasspy/wyoming-satellite) and [duhow/xiaoai-patch](https://github.com/duhow/xiaoai-patch).

------------
The [duhow/xiaoai-patch](https://github.com/duhow/xiaoai-patch) project supports more devices from Xiaomi/Xiaoai, but I'am focussing on the Xiaoai Speaker Pro alias LX06.

# Introduction

This repo contains custom scripts and patches, to make a custom rootfs image free of propietary software, and installing open source programs.
Patches and scripts can be tweaked, so if really want, you can keep the original functions of the Chinese XiaoAi assistant, and install new programs as well.

The main purpose of this toolset is to have your DIY Voice Assistant (Alexa-like) and Smart Speaker, with lots of integrations for music and automation.

By using [MPD], [Snapcast], [Shairport-Sync], [Upmpdcli] you can make your speaker a full media player compatible with multiple cast protocols,
and also have a voice assistant powered by [Porcupine] and [Whisper] that can interact with your [Home Assistant].
Everything powered by Open Source Software!

[MPD]: https://www.musicpd.org/
[Snapcast]: https://github.com/badaix/snapcast
[Shairport-Sync]: https://github.com/mikebrady/shairport-sync
[Upmpdcli]: https://www.lesbonscomptes.com/upmpdcli/
[Porcupine]: https://github.com/Picovoice/porcupine
[Whisper]: https://github.com/home-assistant/addons/tree/master/whisper
[Home Assistant]: https://www.home-assistant.io/

# Compatibility

| Model | Name | Target version (recommended) |
|-------|------|------------------------------|
| ![LX06 - supported][LX06] | Xiaoai Speaker Pro (black, infrared) | 1.74.10 |
| ![L06A - supported][L06A] | Xiaoai Speaker (white, no infrared) | 1.74.10 (build as LX06) |
| ![LX01 - supported][LX01] | Xiaomi Mi AI Speaker Mini | 1.32.6 |
| ![L09A - supported][L09A] | Xiaoai Speaker Art (China, white) | 1.76.4 |
| ![L09B - supported][L09B] | Xiaoai Speaker Art Battery (Black) | |
| ![L09G - not supported][L09G] | Xiaomi Mi Smart Speaker (Global, Google Assistant) | |
| ![LX05 - encrypted, supported][LX05] | Xiaoai Speaker Play | |
| ![L05B - not supported][L05B] | Xiaoai Speaker Play Enhanced Edition, no Clock LED (NuttX) - [details](https://github.com/duhow/xiaoai-patch/issues/19) | |
| ![L05C - not supported][L05C] | Xiaoai Speaker Play Enhanced Edition, with Clock LED (NuttX) | |
| ![L05G - not supported][L05G] | Xiaomi Smart Speaker IR Control (Global, Google Assistant) | |
| ![L15A - encrypted, not fully supported][L15A] | Xiaomi Mi AI Speaker 2 Gen | |
| ![L16A - not tested][L16A] | Xiaomi Sound by HARMAN AudioEFX | |
| ![L07A - not tested][L07A] | Redmi XiaoAI Speaker Play | |
| ![M03A - not tested][M03A] | Xiaomi Sound Move | |
| ![MDZ-25-DT - not tested][MDZ-25-DT] | Xiaomi Mi AI Speaker 1 Gen (?) - S12 | |
| ![XMYX01JY - not tested][XMYX01JY] | Xiaomi XiaoAI HD | |
| ![YLAI01YL - blocked (not tested)][YLAI01YL] | Yeelight Voice Control Assistant | |

[LX06]: https://img.shields.io/badge/LX06-green?style=for-the-badge
[L06A]: https://img.shields.io/badge/L06A-green?style=for-the-badge
[LX01]: https://img.shields.io/badge/LX01-green?style=for-the-badge
[L09A]: https://img.shields.io/badge/L09A-green?style=for-the-badge
[L09B]: https://img.shields.io/badge/L09B-green?style=for-the-badge
[L09G]: https://img.shields.io/badge/L09G-red?style=for-the-badge
[LX05]: https://img.shields.io/badge/LX05-yellowgreen?style=for-the-badge
[L05B]: https://img.shields.io/badge/L05B-red?style=for-the-badge
[L05C]: https://img.shields.io/badge/L05C-red?style=for-the-badge
[L05G]: https://img.shields.io/badge/L05G-red?style=for-the-badge
[L15A]: https://img.shields.io/badge/L15A-yellow?style=for-the-badge
[L16A]: https://img.shields.io/badge/L16A-lightgrey?style=for-the-badge
[L07A]: https://img.shields.io/badge/L07A-lightgrey?style=for-the-badge
[M03A]: https://img.shields.io/badge/M03A-lightgrey?style=for-the-badge
[MDZ-25-DT]: https://img.shields.io/badge/MDZ--25--DT-lightgrey?style=for-the-badge
[XMYX01JY]: https://img.shields.io/badge/XMYX01JY-lightgrey?style=for-the-badge
[YLAI01YL]: https://img.shields.io/badge/YLAI01YL-lightgrey?style=for-the-badge

> [!TIP]
> Target version is the recommended version to ensure all patches are working,
but other versions may be still supported and working.
> :wrench: This is still Work in Progress.
# :warning: Encrypted speaker partitions

Some new speakers or firmware upgrades change the rootfs partition and include a DER certificate to verify the system.
This **may block** any changes on non-signed squashfs. **Recommended to NOT flash**, you may have an invalid rootfs and potentially lock yourself!
You can check this by running `binwalk` if it contains a Certificate entry:

```
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 32240378 bytes,
2430 inodes, blocksize: 262144 bytes, created: 2021-04-28 06:34:34
32243716 0x1EC0004 Certificate in DER format (x509 v3), header length: 4, sequence length: 830
```


# Requirements

> [!WARNING]
> Supported and Tested setup is **Linux** OS with `amd64` arch.
Other hosts (Apple M1, Windows) are **not tested nor supported**.
Feel free to make a PR if you have a fix for this.

> [!IMPORTANT]
> If using WSL, be sure to enable `setCaseSensitiveInfo`.
You will also need the following tools:

- `squashfs-tools`, provides `unsquashfs` and `mksquashfs`
- `mtd-utils` (Only for model S12), provides utils for UBI images
- `make`
- `rsync`
- `shasum`
- Docker
- patience - package build takes more than 1 hour. :)

# Usage

Get a copy of your `rootfs` filesystem from your speaker. It can also be from a system upgrade file.
It should be something similar as this:

```bash
nc -vlp 8888 > $HOME/backup-image
# -----
dd if=/dev/mtd4 of=/tmp/image
nc $IP_ADDR 8888 < /tmp/image
```

Since the speakers filesystem is read-only format, we have to reflash it to add the new applications and patches.
There are three steps to perform this: **extract, patch, build**.

Optionally but recommended, prepare the packages you want to install by editing the [packages.sh] script.

[packages.sh]: https://github.com/duhow/xiaoai-patch/blob/master/packages.sh#L657

Build the docker image and run it to build all the packages. Probably it will take more than an hour.

> [!CAUTION]
> Run the **build packages.sh** process with Docker, since the package build performs some patching to the system, otherwise it could harm your GNU/Linux installation.
```bash
docker build -t xiaoai-patch packages
docker run -it -v $PWD:/xiaoai xiaoai-patch
```

You can now run the commands to prepare the new image.

```bash
sudo make clean
sudo make extract FILE=image-mtd4
sudo make patch MODEL=lx06
sudo make build MODEL=lx06

# or all at once :)
sudo make clean all FILE=image-mtd4 MODEL=lx06
```

> [!TIP]
> Ensure the image format is correct, by comparing the original and new images. Use `file` or other commands to check info.
After you have the new image ready, send it to the speaker, and **flash the not-in-use** `rootfs` partition, boot it and test.

# :warning: Unbricking

You should have some wires soldered to the board to perform TTL in case it is required.
As long as you perform steps as described and not flashing content in wrong partitions, you can reverse failed boot with Uboot safely.

In order to enable Uboot menu, check in the environment partition that you have the setting `bootdelay=3`.
If is set to `bootdelay=0` then Uboot will continue normal boot process and you won't be able to stop it unless you get into fastboot or recovery mode. (?)
In most cases, binary program is `fw_setenv` or `fw_env` and data is set into first partition as string.

Ensure you can access Uboot before writing changes, it is your rescue!

```
Hit any key to stop autoboot: 0
```

# DISCLAIMER
YOU are responsible for any use or damage this software may cause. This repo and its content is intended for educational purposes only. Use at your own risk.
Difference to [duhow/xiaoai-patch](https://github.com/duhow/xiaoai-patch):
- full python 3.9
- active echo cancelling using [aec_cmdline](https://github.com/dr-ni/aec_cmdline) and [alsa-aec](https://github.com/SaneBow/alsa-aec)
- removed packages, because not needed anymore or size optimization (python takes a lot of space)
- some modifications for volume, LED or MPD for better integration into HA

0 comments on commit d37dfff

Please sign in to comment.