Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
ed42537
docs: add xiaozhi linux websocket audio design
flyingcys Apr 4, 2026
3c86c95
chore: ignore local worktree directory
flyingcys Apr 4, 2026
cf16701
feat: add websocket binary audio hooks
flyingcys Apr 4, 2026
41a0553
feat: add websocket binary audio hooks
flyingcys Apr 4, 2026
7e5fccc
feat: add linux audio runtime skeleton
flyingcys Apr 4, 2026
dc7e670
fix: return OPRT_OK in linux audio runtime stub
flyingcys Apr 4, 2026
3549508
test: expand pcm accumulator contract
flyingcys Apr 4, 2026
060013f
docs: document accumulator initialization requirement
flyingcys Apr 4, 2026
25b11a8
feat: add linux alsa opus audio runtime
flyingcys Apr 4, 2026
9ea48a0
fix: add linux alsa fallback registration
flyingcys Apr 4, 2026
56f605e
feat: wire linux audio into xiaozhi app state
flyingcys Apr 4, 2026
8ad32fe
feat: wire linux audio into xiaozhi app state
flyingcys Apr 4, 2026
fa71cab
feat: wire linux audio into xiaozhi app state
flyingcys Apr 4, 2026
6a8035f
docs: describe linux websocket audio usage
flyingcys Apr 4, 2026
08adf88
docs: describe linux websocket audio usage
flyingcys Apr 4, 2026
b75b58c
docs: describe linux websocket audio usage
flyingcys Apr 4, 2026
7a1f7ab
docs: describe linux websocket audio usage
flyingcys Apr 4, 2026
7e39896
docs: describe linux websocket audio usage
flyingcys Apr 4, 2026
b1ffa99
fix: decouple uplink audio send and preserve tts tail
flyingcys Apr 4, 2026
7de358e
feat: add xiaozhi app baseline
flyingcys Apr 4, 2026
a1d985f
Merge branch 'feat/xiaozhi-linux-ws-audio' into master
flyingcys Apr 4, 2026
e241b2c
add xiaozhi
flyingcys Apr 6, 2026
1fb5ea0
Add Snowboy wakeword design spec
flyingcys Apr 6, 2026
252a7cc
add docs
flyingcys Apr 6, 2026
9530037
add docs
flyingcys May 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ compile_commands.json
/.venv
/tmp
/.cache
/.worktree
/cache
/output
/build
Expand Down
6 changes: 6 additions & 0 deletions 1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
apps/xiaozhi 项目当前可以通过mqtt和 websocket连接服务器,但是需要验证,你先帮我获取到验证码,然后我加入服务器。可以正常连接服务器后,你需要帮我打通语音上行和下行通道,语音之前使用 alsa效果不好,我现在想使用 portaudio,然后唤醒使用 snowboy,这2个可以参考 /home/share/samba/Demo4Echo 下的适配,可以使用 c/C++ 混合编程

要求,可以正常 在当前 ubuntu上编译运行。

在 /home/share/samba/tuyaopen/apps/xiaozhi 目录下运行 tos.py build 编译

76 changes: 76 additions & 0 deletions apps/xiaozhi/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
##
# @file CMakeLists.txt
# @brief
#/

# APP_PATH
set(APP_PATH ${CMAKE_CURRENT_LIST_DIR})

# APP_NAME
get_filename_component(APP_NAME ${APP_PATH} NAME)

# APP_SRCS
set(APP_SRCS
${APP_PATH}/src/tuya_main.c
${APP_PATH}/src/cli_cmd.c
${APP_PATH}/src/xiaozhi_identity.c
${APP_PATH}/src/xiaozhi_settings.c
${APP_PATH}/src/xiaozhi_system.c
${APP_PATH}/src/xiaozhi_protocol.c
${APP_PATH}/src/xiaozhi_mcp.c
${APP_PATH}/src/xiaozhi_ota.c
${APP_PATH}/src/xiaozhi_upgrade.c
${APP_PATH}/../../src/peripherals/audio_codecs/tdl_audio/src/tdl_audio_manage.c
${APP_PATH}/src/xiaozhi_ws.c
${APP_PATH}/src/xiaozhi_ws_handshake.c
${APP_PATH}/src/audio/xz_portaudio_device.c
${APP_PATH}/src/audio/xz_audio_opus_bridge.c
${APP_PATH}/src/wakeword/xz_snowboy_runner.cc
${APP_PATH}/src/third_party/snowboy_wrapper/snowboy-detect-c-wrapper.cc
${APP_PATH}/src/xiaozhi_audio_linux.c
${APP_PATH}/src/xiaozhi_state.c
${APP_PATH}/src/xiaozhi_mqtt_udp.c
${APP_PATH}/src/xiaozhi_app.c
)

# APP_INC
set(APP_INC
${APP_PATH}/src
${APP_PATH}/../../src/peripherals/audio_codecs/tdl_audio/include
${APP_PATH}/src/third_party/snowboy_wrapper
${APP_PATH}/src/third_party/snowboy_wrapper/include
)

########################################
# Target Configure
########################################
add_library(${EXAMPLE_LIB})

target_sources(${EXAMPLE_LIB}
PRIVATE
${APP_SRCS}
)

target_include_directories(${EXAMPLE_LIB}
PRIVATE
${APP_INC}
)

if(TOS_PROJECT_PLATFORM STREQUAL "LINUX")
find_package(PkgConfig REQUIRED)
pkg_check_modules(PORTAUDIO REQUIRED portaudio-2.0)
find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)

target_include_directories(${EXAMPLE_LIB}
PRIVATE
${PORTAUDIO_INCLUDE_DIRS}
)
target_compile_definitions(${EXAMPLE_LIB}
PRIVATE
_GLIBCXX_USE_CXX11_ABI=0
)

set(SNOWBOY_STATIC_LIB ${APP_PATH}/src/third_party/snowboy_wrapper/lib/ubuntu64/libsnowboy-detect.a)
set(PLATFORM_NEED_LIBS "${PLATFORM_NEED_LIBS} opus portaudio blas lapack ${SNOWBOY_STATIC_LIB}")
endif()
123 changes: 123 additions & 0 deletions apps/xiaozhi/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# xiaozhi (TuyaOpen)

`apps/xiaozhi` 是基于 TuyaOpen 重新实现的 xiaozhi 应用,协议行为对齐 `xiaozhi-esp32`:
- WebSocket 控制通道:`hello/listen/abort/mcp`
- MQTT+UDP 混合通道:MQTT 控制 + UDP 音频(AES-CTR 包结构)

## 目录

```text
apps/xiaozhi
├── app_default.config
├── config/
│ ├── Linux.config
│ └── T5AI.config
└── src/
├── tuya_main.c
├── cli_cmd.c
├── xiaozhi_app.c
├── xiaozhi_ws.c
├── xiaozhi_mqtt_udp.c
├── xiaozhi_protocol.c
├── xiaozhi_system.c
└── xiaozhi_settings.c
```

## 构建

在 TuyaOpen 根目录执行:

```bash
. ./export.sh
cd apps/xiaozhi
tos.py build
```

## Linux 快速启动

Linux 目标默认走有线网络(wired)。

### OTA 拉取默认配置(与 xiaozhi-esp32 流程一致)

```bash
xz_ota check
# 或设置自定义 OTA 地址
xz_ota url https://api.tenclass.net/xiaozhi/ota/
```

### WebSocket 示例

```bash
xz_ws url wss://your.server/ws
xz_ws token your_token
xz_ws version 1
xz_proto websocket
xz_reconnect
xz_status
```

### Linux 语音链路(WebSocket)

Linux 版本目前只支持 WebSocket 语音通道。默认采集与回放设备都绑定到 ALSA 的 `default`,运行时不会再通过环境变量覆盖。若默认设备不存在或 ALSA 配置错误,应用会在启动阶段失败并返回非零。若需更换设备,务必在 Linux 音频配置中完成后重新构建并部署,确保构建产物的配置与目标设备一致。收到 `listen` 请求后,客户端会上传麦克风流,等待服务端返回 `tts start`/`binary`/`tts stop`,并播放返回的音频。

### Linux WebSocket 可执行物运行

1. `. ./export.sh`
2. `cd apps/xiaozhi`
3. `tos.py build`
4. 设置环境变量:
- `XZ_WS_URL`(WebSocket 服务地址)
- `XZ_WS_TOKEN`(身份令牌)
- `XZ_PROTOCOL=websocket`
5. 启动生成的可执行文件:`./dist/xiaozhi_1.0.0/xiaozhi_1.0.0.elf`

### 手动语音链路验证

1. 运行 `xz_status` 确认网络连接正常。
2. 使用 `xz_listen start manual` 进入手动听写模式。
3. 讲话期间客户端会把麦克风数据上传到服务端。
4. 服务端应依序返回 `tts start`、`binary`、`tts stop`,客户端播放这些数据即可听到返回的音频。
5. 完成后执行 `xz_listen stop` 退出语音会话。

### MQTT+UDP 示例

```bash
xz_mqtt endpoint your.mqtt.server:8883
xz_mqtt client_id your_client_id
xz_mqtt username your_user
xz_mqtt password your_pass
xz_mqtt publish_topic your/topic
xz_mqtt subscribe_topic your/topic
xz_mqtt keepalive 240
xz_proto mqtt-udp
xz_reconnect
xz_status
```

### 激活参数配置

当目标板没有可直接使用的序列号或需要手动注入激活密钥时,可通过 CLI 持久化配置:

```bash
xz_sys serial_number your_serial_number
xz_sys activation_secret your_hmac_secret
xz_sys show
```

## CLI 主要命令

- `xz_start` / `xz_stop` / `xz_reconnect` / `xz_status`
- `xz_proto <websocket|mqtt-udp>`
- `xz_ws <url|token|version|show> [value]`
- `xz_mqtt <endpoint|client_id|username|password|publish_topic|subscribe_topic|keepalive|show> [value]`
- `xz_sys <device_id|client_id|serial_number|activation_secret|show> [value]`
- `xz_wifi <ssid|password|ota_url|apply|show> [value]`
- `xz_listen <start|stop|detect> [mode] [text]`
- `xz_abort [reason]`
- `xz_mcp <json_payload>`
- `xz_ota [check] | xz_ota url <url>`

## 协议参考

- `xiaozhi-esp32/docs/websocket.md`
- `xiaozhi-esp32/docs/mqtt-udp.md`
123 changes: 123 additions & 0 deletions apps/xiaozhi/README_CN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# xiaozhi (TuyaOpen)

`apps/xiaozhi` 是基于 TuyaOpen 重新实现的 xiaozhi 应用,协议行为对齐 `xiaozhi-esp32`:
- WebSocket 控制通道:`hello/listen/abort/mcp`
- MQTT+UDP 混合通道:MQTT 控制 + UDP 音频(AES-CTR 包结构)

## 目录

```text
apps/xiaozhi
├── app_default.config
├── config/
│ ├── Linux.config
│ └── T5AI.config
└── src/
├── tuya_main.c
├── cli_cmd.c
├── xiaozhi_app.c
├── xiaozhi_ws.c
├── xiaozhi_mqtt_udp.c
├── xiaozhi_protocol.c
├── xiaozhi_system.c
└── xiaozhi_settings.c
```

## 构建

在 TuyaOpen 根目录执行:

```bash
. ./export.sh
cd apps/xiaozhi
tos.py build
```

## Linux 快速启动

Linux 目标默认走有线网络(wired)。

### OTA 拉取默认配置(与 xiaozhi-esp32 流程一致)

```bash
xz_ota check
# 或设置自定义 OTA 地址
xz_ota url https://api.tenclass.net/xiaozhi/ota/
```

### WebSocket 示例

```bash
xz_ws url wss://your.server/ws
xz_ws token your_token
xz_ws version 1
xz_proto websocket
xz_reconnect
xz_status
```

### Linux 语音链路(WebSocket)

Linux 版本目前只支持 WebSocket 语音通道。默认采集与回放设备都绑定到 ALSA 的 `default`,运行时不会再通过环境变量覆盖。若默认设备不存在或 ALSA 配置错误,应用会在启动阶段失败并返回非零。若需更换设备,务必在 Linux 音频配置中完成后重新构建并部署,确保构建产物的配置与目标设备一致。收到 `listen` 请求后,客户端会上传麦克风流,等待服务端返回 `tts start`/`binary`/`tts stop`,并播放返回的音频。

### Linux WebSocket 可执行物运行

1. `. ./export.sh`
2. `cd apps/xiaozhi`
3. `tos.py build`
4. 设置环境变量:
- `XZ_WS_URL`(WebSocket 服务地址)
- `XZ_WS_TOKEN`(身份令牌)
- `XZ_PROTOCOL=websocket`
5. 启动生成的可执行文件:`./dist/xiaozhi_1.0.0/xiaozhi_1.0.0.elf`

### 手动语音链路验证

1. 运行 `xz_status` 确认网络连接正常。
2. 使用 `xz_listen start manual` 进入手动听写模式。
3. 讲话期间客户端会把麦克风数据上传到服务端。
4. 服务端应依序返回 `tts start`、`binary`、`tts stop`,客户端播放这些数据即可听到返回的音频。
5. 完成后执行 `xz_listen stop` 退出语音会话。

### MQTT+UDP 示例

```bash
xz_mqtt endpoint your.mqtt.server:8883
xz_mqtt client_id your_client_id
xz_mqtt username your_user
xz_mqtt password your_pass
xz_mqtt publish_topic your/topic
xz_mqtt subscribe_topic your/topic
xz_mqtt keepalive 240
xz_proto mqtt-udp
xz_reconnect
xz_status
```

### 激活参数配置

当目标板没有可直接使用的序列号或需要手动注入激活密钥时,可通过 CLI 持久化配置:

```bash
xz_sys serial_number your_serial_number
xz_sys activation_secret your_hmac_secret
xz_sys show
```

## CLI 主要命令

- `xz_start` / `xz_stop` / `xz_reconnect` / `xz_status`
- `xz_proto <websocket|mqtt-udp>`
- `xz_ws <url|token|version|show> [value]`
- `xz_mqtt <endpoint|client_id|username|password|publish_topic|subscribe_topic|keepalive|show> [value]`
- `xz_sys <device_id|client_id|serial_number|activation_secret|show> [value]`
- `xz_wifi <ssid|password|ota_url|apply|show> [value]`
- `xz_listen <start|stop|detect> [mode] [text]`
- `xz_abort [reason]`
- `xz_mcp <json_payload>`
- `xz_ota [check] | xz_ota url <url>`

## 协议参考

- `xiaozhi-esp32/docs/websocket.md`
- `xiaozhi-esp32/docs/mqtt-udp.md`
12 changes: 12 additions & 0 deletions apps/xiaozhi/app_default.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
CONFIG_ENABLE_CUSTOM_CONFIG=y
CONFIG_ENABLE_AUDIO_ALSA=y
CONFIG_AUDIO_CODEC_NAME="alsa_audio"
CONFIG_ALSA_DEVICE_CAPTURE="default"
CONFIG_ALSA_DEVICE_PLAYBACK="default"
CONFIG_ENABLE_MBEDTLS_SHA512_C=y
CONFIG_ENABLE_MBEDTLS_SHA384_C=y
CONFIG_ENABLE_MBEDTLS_SSL_MAX_FRAGMENT_LENGTH=y
CONFIG_ENABLE_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
CONFIG_ENABLE_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK=y
CONFIG_ENABLE_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
CONFIG_ENABLE_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
12 changes: 12 additions & 0 deletions apps/xiaozhi/config/Linux.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
CONFIG_ENABLE_CUSTOM_CONFIG=y
CONFIG_ENABLE_AUDIO_ALSA=y
CONFIG_AUDIO_CODEC_NAME="alsa_audio"
CONFIG_ALSA_DEVICE_CAPTURE="default"
CONFIG_ALSA_DEVICE_PLAYBACK="default"
CONFIG_ENABLE_MBEDTLS_SHA512_C=y
CONFIG_ENABLE_MBEDTLS_SHA384_C=y
CONFIG_ENABLE_MBEDTLS_SSL_MAX_FRAGMENT_LENGTH=y
CONFIG_ENABLE_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
CONFIG_ENABLE_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK=y
CONFIG_ENABLE_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
CONFIG_ENABLE_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
11 changes: 11 additions & 0 deletions apps/xiaozhi/config/T5AI.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CONFIG_BOARD_CHOICE_T5AI=y
CONFIG_TUYA_T5AI_BOARD_EX_MODULE_NONE=y
CONFIG_ENABLE_CUSTOM_CONFIG=y
CONFIG_ENABLE_MBEDTLS_SHA512_C=y
CONFIG_ENABLE_MBEDTLS_SHA384_C=y
CONFIG_ENABLE_MBEDTLS_SSL_MAX_FRAGMENT_LENGTH=y
CONFIG_ENABLE_MBEDTLS_SSL_MAX_CONTENT_LEN=4096
CONFIG_ENABLE_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
CONFIG_ENABLE_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK=y
CONFIG_ENABLE_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
CONFIG_ENABLE_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
20 changes: 20 additions & 0 deletions apps/xiaozhi/docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# apps/xiaozhi 文档中心

本文档目录用于管理 `apps/xiaozhi` 的版本化说明文档。

## 文档组织规则

- 顶层 `README.md` 作为总入口,只负责版本导航。
- 每个版本使用一个独立目录管理模块化文档。
- 版本目录内的 `README.md` 负责该版本的总览与模块索引。

## 版本列表

- [v1.0.0](./v1.0.0/README.md)

## 补充资料

以下文档用于补充协议对齐与审计背景:

- [功能对齐审计](./compatibility-audit.md)
- [协议 JSON 字段检查清单](./protocol-json-field-checklist.md)
Loading