# xiaozhi-android-client: a Flutter client for xiaozhi-server voice chat

> The repository ships a Flutter app that talks to a xiaozhi-server over WebSocket or MQTT, with Android and iOS builds plus desktop and web targets. It is usable only if you already run the server side.

**TOM88812/xiaozhi-android-client** — 一个基于小智、xiaozhi-server的Android、IOS语音对话应用,支持实时语音交互和文字对话。现在是flutter版本，打通IOS、Android端。请同志们动动小手，点点小星星，予以鼓励。

- Repository: https://github.com/TOM88812/xiaozhi-android-client
- Website: https://jtai.lhht.cc
- Stars: 1,601 · Forks: 413
- Language: Dart
- License: Apache-2.0
- Published: 2026-09-14 · Updated: 2026-09-14 · Language: en
- Canonical page: https://hysenlabs.com/projects/tom88812-xiaozhi-android-client

## What xiaozhi-android-client actually is

This is the client half of a two-part system. The repository describes an application built on 小智 and xiaozhi-server that supports real-time voice interaction and text dialogue, and the README's own framing is that it is a client for a server you supply. Nothing in the repository bundles a speech recogniser, a text-to-speech engine or a language model. The app connects outward.

The intended audience is narrow and technical. You are expected to have a xiaozhi-server reachable from the device, and the README lists two product lines: a V1 native client for Android and HarmonyOS, described as included with a commercial edition, and a V3 cross-platform client built on Flutter. The Flutter line is what the top-level directories reflect: android/, ios/, linux/, macos/, web/, windows/ and a lib/ directory of Dart code, with pubspec.yaml at the root. The repository's primary language is Dart, and the licence is Apache-2.0.

If you want an assistant that works after you install an APK, this is the wrong shape of project. It is a front end. The value it adds is the interaction layer: streaming voice, interruption, multiple assistant endpoints in one chat list, and the account and device screens described in the README.

## How the Flutter client talks to xiaozhi-server

Two transports are named in the README: WS for WebSocket, and MQTT-UDP, described as an MQTT protocol service with a long connection. The distinction matters for deployment. A WebSocket connection is initiated by the app and is straightforward to route through a reverse proxy. The MQTT path is described as supporting server-initiated wake-up, which implies the client holds a persistent session that the server can push to. If your network blocks or reshapes long-lived connections, the MQTT path is the one that will fail first, and the README does not document a fallback.

The server side, according to the README's feature table, handles the heavy parts: streaming playback through 火山 (Volcano Engine), voiceprint recognition, voice cloning, function calling, and long-term memory extraction from conversations. That table is marked as commercial-edition server functionality, so it describes what the paired server can do rather than what the client repository contains.

On the client, the README lists a provider layer for OpenAI and compatible services, an OpenAI speed test, a thinking mode, web search through the OpenAI-compatible interface, HTML preview, an MCP client, video playback and Live2D model switching. Those are client-side surfaces over server or third-party APIs. The architecture is therefore a thin, wide client: many presentation features, with the protocol and model work pushed to the server.

## Building the app from source

The README does not give a step-by-step build guide. What it does give is the shape of the project and the platforms it targets, and the repository layout confirms a standard Flutter application with platform folders for Android, iOS, Linux, macOS, Web, Windows and an ohos entry for HarmonyOS. The documented way to obtain a runnable build is the releases page, and the README states you can package APK, iOS, WEB, PC and HarmonyOS HAP builds yourself.

The README does not list the commands to fetch dependencies or launch the app, so there is nothing to copy verbatim here. What the repository layout tells you is the entry point: pubspec.yaml and pubspec.lock at the root, Dart sources under lib/, and the platform folders beside them. Treat the Flutter toolchain as a prerequisite and read documents/ before assuming a build order.

For a distributable Android build, the README's packaging claim corresponds to the standard release target, but the exact invocation is not stated in the README and is not reproduced here.

The first real use is not a chat. It is adding a server. The README states the app supports adding multiple 小智 services so one person can hold several assistants, and that the client speaks to a xiaozhi-server over WS or MQTT. So the first screen that matters is the service configuration screen: you enter the address of a server you control, and only then does the voice loop have anything to talk to. The README does not document the field names or the exact URL format for that screen, so read documents/ in the repository before you assume a path.

## Where the client model breaks down

The hard dependency on a server is the main limitation, and the README is explicit that the richest server features sit in a commercial edition. Voice cloning, voiceprint recognition, streaming playback, long-term memory and the monitoring panel are all listed under server-side commercial functionality. A reader who clones this repository and builds an APK has a client with no backend. That is not a defect in the client; it is the boundary of what the repository contains.

The README also mixes product lines in a way that will confuse a first-time reader. It presents a V1 native client for Android and HarmonyOS as something granted with a commercial edition, then presents V3 as the Flutter cross-platform client. The repository name says android-client, the primary language is Dart, and the platform folders are Flutter's. If you are looking for the native Android or HarmonyOS sources, the README points at a purchase, not at a directory in this repository.

Finally, the release history is thin relative to the feature list. The most recent release named in the repository metadata is v2.1 from 2025-03-31, while the last push to main was on 2026-09-14. That gap means a good deal of current work is not reflected in a tagged release, and anyone pinning to a release is pinning to something older than the branch.

## xiaozhi-android-client compared with the official web client

The natural alternative is the browser client that ships with the xiaozhi ecosystem. The README lists XiaoZhi Web client as a related surface, and the difference is structural rather than cosmetic. A web client runs inside the browser's sandbox: microphone access goes through the browser permission model, audio playback goes through the browser's audio stack, and there is no persistent background connection when the tab is closed.

This Flutter client is a native binary on Android and iOS. That buys it the platform audio session, which is what makes the README's claim about echo cancellation on Flutter iOS and Android meaningful. Browser-based echo cancellation depends on the browser and the operating system, and it is not something the page can guarantee. It also buys background behaviour: the MQTT long connection described in the README is a mobile-app pattern, not a tab pattern.

The trade is distribution and reach. A web client needs no install and no store review. A Flutter client needs a build per platform, and for iOS that means the signing and distribution path Apple requires. If your users are already on a machine with a browser and a microphone, the web client is less work. If you are building toward a device that sits on a desk and should wake on a server push, the native client is the one that matches.

## Maintenance, licence and upgrade cost

The repository is not archived and the last push was on 2026-09-14, so the branch is moving. The tagged releases do not move at the same pace: v2.1 dates from 2025-03-31. If you build from a release tag you get a snapshot that predates a long stretch of commits, and the README's feature list describes the current state of the project rather than the state of any tag. Building from main is the way to get what the README advertises, at the cost of tracking a branch.

Upgrade cost is mostly a Flutter concern. pubspec.lock is committed, so a fresh clone resolves to pinned versions and the build is reproducible until you run an upgrade. The platform folders mean Flutter SDK upgrades can touch seven targets, and the HarmonyOS target adds a toolchain outside the standard Flutter set. Budget for that if you intend to ship on more than Android.

The licence is Apache-2.0, which permits commercial use and modification and requires that you preserve the licence and notice files and state significant changes. It also includes a patent grant. That is the repository's licence; the README separately describes commercial editions and a self-hosted server, and the terms for those are set by the vendor, not by the Apache-2.0 file. Read the two separately. This is not legal advice.

## Conclusion

Adopt it if you already run xiaozhi-server and want one Flutter codebase for Android, iOS and the desktop targets listed in the repository. Do not adopt it if you expect a self-contained assistant, because the README shows no bundled speech or model backend. Before building, verify which branch you are on, since the README describes a commercial V3 line while main carries the Flutter sources, and read documents/ for the server-side contract.

## FAQ

### What is Xiaozhi AI?

In this repository, 小智 refers to the assistant the app talks to, and xiaozhi-server is the backend it connects to over WS or MQTT. The client itself contains no model or speech engine.

### Is there an AI assistant for Android?

Yes, this repository targets Android among its platforms, and the README states you can package an APK yourself. The app still needs a reachable xiaozhi-server to hold a conversation.

### Where is my AI on my Android?

The README does not describe a system-level assistant integration or a launcher entry. The app is launched like any other Flutter application, and the assistant appears only after you add a 小智 service in the app.

## Sources

- [License: Apache-2.0](https://github.com/TOM88812/xiaozhi-android-client/blob/main/LICENSE)
- [Project website](https://jtai.lhht.cc)
- [README](https://github.com/TOM88812/xiaozhi-android-client/blob/main/README.md)
- [Releases](https://github.com/TOM88812/xiaozhi-android-client/releases)
- [TOM88812/xiaozhi-android-client on GitHub](https://github.com/TOM88812/xiaozhi-android-client)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/tom88812-xiaozhi-android-client
