Przeglądaj źródła

init xingxing server

liulinag 2 miesięcy temu
commit
e55521cbce
100 zmienionych plików z 5834 dodań i 0 usunięć
  1. 7 0
      .dockerignore
  2. 32 0
      .github/ISSUE_TEMPLATE/bug_report.md
  3. 19 0
      .github/ISSUE_TEMPLATE/code_improvement.md
  4. 16 0
      .github/ISSUE_TEMPLATE/documentation_improvement.md
  5. 19 0
      .github/ISSUE_TEMPLATE/feature_request.md
  6. 6 0
      .github/dependabot.yml
  7. 49 0
      .github/workflows/build-base-image.yml
  8. 88 0
      .github/workflows/docker-image.yml
  9. 189 0
      .gitignore
  10. 7 0
      Dockerfile-server
  11. 32 0
      Dockerfile-server-base
  12. 50 0
      Dockerfile-web
  13. 21 0
      LICENSE
  14. 378 0
      README.md
  15. 376 0
      README_de.md
  16. 376 0
      README_en.md
  17. 376 0
      README_pt_BR.md
  18. 377 0
      README_vi.md
  19. 413 0
      docker-setup.sh
  20. 291 0
      docs/Deployment.md
  21. 492 0
      docs/Deployment_all.md
  22. 100 0
      docs/FAQ.md
  23. 44 0
      docs/ali-sms-integration.md
  24. 224 0
      docs/context-provider-integration.md
  25. 50 0
      docs/contributor_open_letter.md
  26. 182 0
      docs/dev-ops-integration.md
  27. 21 0
      docs/docker-build.md
  28. 53 0
      docs/docker/nginx.conf
  29. 13 0
      docs/docker/start.sh
  30. 138 0
      docs/firmware-build.md
  31. 54 0
      docs/firmware-setting.md
  32. 72 0
      docs/fish-speech-integration.md
  33. 226 0
      docs/homeassistant-integration.md
  34. 58 0
      docs/huoshan-streamTTS-voice-cloning.md
  35. 0 0
      docs/images/__init__.py
  36. BIN
      docs/images/alisms/sms-01.png
  37. BIN
      docs/images/alisms/sms-02.png
  38. BIN
      docs/images/alisms/sms-11.png
  39. BIN
      docs/images/alisms/sms-21.png
  40. BIN
      docs/images/alisms/sms-22.png
  41. BIN
      docs/images/alisms/sms-23.png
  42. BIN
      docs/images/alisms/sms-24.png
  43. BIN
      docs/images/alisms/sms-25.png
  44. BIN
      docs/images/alisms/sms-31.png
  45. BIN
      docs/images/alisms/sms-32.png
  46. BIN
      docs/images/banner1.png
  47. BIN
      docs/images/banner2.png
  48. BIN
      docs/images/conda_env_1.png
  49. BIN
      docs/images/conda_env_2.png
  50. BIN
      docs/images/demo0.png
  51. BIN
      docs/images/demo1.png
  52. BIN
      docs/images/demo10.png
  53. BIN
      docs/images/demo11.png
  54. BIN
      docs/images/demo12.png
  55. BIN
      docs/images/demo13.png
  56. BIN
      docs/images/demo14.png
  57. BIN
      docs/images/demo2.png
  58. BIN
      docs/images/demo3.png
  59. BIN
      docs/images/demo4.png
  60. BIN
      docs/images/demo5.png
  61. BIN
      docs/images/demo6.png
  62. BIN
      docs/images/demo7.png
  63. BIN
      docs/images/demo8.png
  64. BIN
      docs/images/demo9.png
  65. BIN
      docs/images/deploy1.png
  66. BIN
      docs/images/deploy2.png
  67. BIN
      docs/images/firmware-setting-ota.png
  68. BIN
      docs/images/fishspeech/autodl-01.png
  69. BIN
      docs/images/fishspeech/autodl-02.png
  70. BIN
      docs/images/hnlg.jpg
  71. BIN
      docs/images/image-clone-integration-01.png
  72. BIN
      docs/images/image-clone-integration-02.png
  73. BIN
      docs/images/image-clone-integration-03.png
  74. BIN
      docs/images/image-ha-integration-01.png
  75. BIN
      docs/images/image-ha-integration-02.png
  76. BIN
      docs/images/image-ha-integration-03.png
  77. BIN
      docs/images/image-ha-integration-04.png
  78. BIN
      docs/images/image-ha-integration-05.png
  79. BIN
      docs/images/image-ha-integration-06.png
  80. BIN
      docs/images/logo_bailing.png
  81. BIN
      docs/images/logo_contributors.png
  82. BIN
      docs/images/logo_huiyuan.png
  83. BIN
      docs/images/logo_junsen.png
  84. BIN
      docs/images/logo_qinren.png
  85. BIN
      docs/images/logo_tenclass.png
  86. BIN
      docs/images/logo_xuanfeng.png
  87. BIN
      docs/images/manager-mobile/打包发行步骤1.png
  88. BIN
      docs/images/manager-mobile/打包发行步骤2.png
  89. BIN
      docs/images/manager-mobile/本地运行.png
  90. BIN
      docs/images/manager-mobile/生成appid.png
  91. BIN
      docs/images/manager-mobile/重新识别项目.png
  92. 195 0
      docs/index-stream-integration.md
  93. 126 0
      docs/mcp-endpoint-enable.md
  94. 94 0
      docs/mcp-endpoint-integration.md
  95. 40 0
      docs/mcp-get-device-info.md
  96. 171 0
      docs/mcp-vision-integration.md
  97. 187 0
      docs/mqtt-gateway-integration.md
  98. 67 0
      docs/nav-copilot-integration.md
  99. 105 0
      docs/newsnow_plugin_config.md
  100. 0 0
      docs/ota-upgrade-guide.md

+ 7 - 0
.dockerignore

@@ -0,0 +1,7 @@
+.git
+__pycache__
+*.pyc
+.env
+Dockerfile
+tmp/
+data/

+ 32 - 0
.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,32 @@
+---
+name: Bug 报告(Bug Report)
+about: 反馈项目中的缺陷或问题
+title: "[Bug] 简短描述问题"
+labels: bug
+assignees: ''
+---
+
+## 🐛 问题描述
+<!-- 清晰简洁地描述问题是什么 -->
+
+## 🖥️ 环境信息
+- 部署方式: 全模块部署 还是 单Server部署
+- 版本号: 例如 0.3.x
+
+## 🔍 告诉我们,应该怎么复现这个问题
+<!-- 这个很重要,方便我们快速定位 -->
+1. 打开 '...'
+2. 点击 '...'
+3. 滚动到 '...'
+4. 看到错误
+
+## 🤔 你原本希望是怎么样的
+<!-- 简要描述预期的正确行为 -->
+
+## 😯 提供一些截图
+<!-- 如果适用,添加问题的截图 -->
+1. 比如日志截图,越多越好
+2. 比如界面反应
+
+## 📋 其他信息
+<!-- 在此添加关于此问题的任何其他上下文信息 -->

+ 19 - 0
.github/ISSUE_TEMPLATE/code_improvement.md

@@ -0,0 +1,19 @@
+---
+name: 代码优化建议(Code Improvement)
+about: 提出对现有代码的优化或改进建议
+title: "[Improvement] 简短描述改进内容"
+labels: refactor
+assignees: ''
+---
+
+## 💡 改进描述
+<!-- 描述需要改进的代码部分以及存在的问题 -->
+
+## 🌟 改进建议
+<!-- 提出具体的改进方案或思路 -->
+
+## 🛠️ 相关代码
+<!-- 如果可能,提供相关代码片段或链接 -->
+
+## 📋 其他信息
+<!-- 在此添加任何其他相关信息 -->

+ 16 - 0
.github/ISSUE_TEMPLATE/documentation_improvement.md

@@ -0,0 +1,16 @@
+---
+name: 文档改进建议(Documentation Improvement)
+about: 提出对项目文档的改进或补充建议
+title: "[Docs] 简短描述改进内容"
+labels: documentation
+assignees: ''
+---
+
+## 📚 改进描述
+<!-- 描述需要改进的文档部分以及存在的问题 -->
+
+## ✨ 改进建议
+<!-- 提出具体的改进方案或内容 -->
+
+## 📋 其他信息
+<!-- 在此添加任何其他相关信息 -->

+ 19 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,19 @@
+---
+name: 功能请求(Feature Request)
+about: 提出新的功能或改进建议
+title: "[Feature] 简短描述功能"
+labels: enhancement
+assignees: ''
+---
+
+## 🚀 需求描述
+<!-- 清晰简洁地描述你希望发生什么 -->
+
+## 🎯 解决方案
+<!-- 描述你认为可行的解决方案或实现方式 -->
+
+## 📝 备选方案
+<!-- 描述你考虑过的替代方案或功能 -->
+
+## 📋 其他信息
+<!-- 在此添加关于需求的任何其他上下文信息 -->

+ 6 - 0
.github/dependabot.yml

@@ -0,0 +1,6 @@
+version: 2
+updates:
+  - package-ecosystem: pip
+    directory: /main/xiaozhi-server
+    schedule:
+      interval: weekly

+ 49 - 0
.github/workflows/build-base-image.yml

@@ -0,0 +1,49 @@
+name: Build Base Image
+
+on:
+  push:
+    branches:
+      - main
+    paths:
+      - 'main/xiaozhi-server/requirements.txt'
+      - 'Dockerfile-server-base'
+      - '.github/workflows/build-base-image.yml'
+
+jobs:
+  build-base:
+    name: Build and push server base image
+    runs-on: ubuntu-latest
+    permissions:
+      packages: write
+      contents: read
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v3
+
+      - name: Login to GitHub Container Registry
+        uses: docker/login-action@v3
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.TOKEN }}
+
+      - name: Build and push server-base
+        uses: docker/build-push-action@v6
+        with:
+          context: .
+          file: Dockerfile-server-base
+          push: true
+          tags: ghcr.io/${{ github.repository }}:server-base
+          platforms: linux/amd64,linux/arm64
+          cache-from: type=gha,scope=server-base
+          cache-to: type=gha,mode=max,scope=server-base
+          build-args: |
+            BUILDKIT_PROGRESS=plain
+
+      - name: Output image info
+        run: |
+          echo "✅ Base image built and pushed successfully!"
+          echo "📦 Tag: ghcr.io/${{ github.repository }}:server-base"

+ 88 - 0
.github/workflows/docker-image.yml

@@ -0,0 +1,88 @@
+name: Docker Image CI
+
+on:
+  push:
+    tags:
+      - 'v*.*.*'  # 只在以 v 开头的标签推送时触发,例如 v1.0.0
+  workflow_dispatch:
+  workflow_run:
+    workflows: ["Build Base Image"]
+    types:
+      - completed
+
+jobs:
+  release:
+    name: Release Docker images
+    runs-on: ubuntu-latest
+    permissions:
+      packages: write
+      contents: write
+      id-token: write
+      issues: write
+    steps:
+      - name: Check Disk Space
+        run: |
+          df -h
+          docker system df
+
+      - name: Clean up Docker resources
+        run: |
+          docker system prune -af
+          docker builder prune -af
+
+      - name: Checkout code
+        uses: actions/checkout@v4
+
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v3
+        with:
+          driver-opts: |
+            network=host
+
+      - name: Login to GitHub Container Registry
+        uses: docker/login-action@v3
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.TOKEN }}
+
+      - name: Extract version from tag
+        id: get_version
+        run: |
+          if [[ "$GITHUB_REF" =~ ^refs/tags/v([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then
+            echo "VERSION=${BASH_REMATCH[1]}" >> $GITHUB_ENV
+            echo "IS_VERSION=true" >> $GITHUB_ENV
+          else
+            echo "VERSION=latest" >> $GITHUB_ENV
+            echo "IS_VERSION=false" >> $GITHUB_ENV
+          fi
+
+      # 构建 xiaozhi-server 镜像
+      - name: Build and push xiaozhi-server
+        uses: docker/build-push-action@v6
+        with:
+          context: .
+          file: Dockerfile-server
+          push: true
+          tags: |
+            ${{ env.IS_VERSION == 'true' && format('ghcr.io/{0}:server_{1},ghcr.io/{0}:server_latest', github.repository, env.VERSION) || format('ghcr.io/{0}:server_latest', github.repository) }}
+          platforms: linux/amd64,linux/arm64
+          cache-from: type=gha
+          cache-to: type=gha,mode=max
+          build-args: |
+            BUILDKIT_PROGRESS=plain
+
+      # 构建 manager-api 镜像
+      - name: Build and push manager-web
+        uses: docker/build-push-action@v6
+        with:
+          context: .
+          file: Dockerfile-web
+          push: true
+          tags: |
+            ${{ env.IS_VERSION == 'true' && format('ghcr.io/{0}:web_{1},ghcr.io/{0}:web_latest', github.repository, env.VERSION) || format('ghcr.io/{0}:web_latest', github.repository) }}
+          platforms: linux/amd64,linux/arm64
+          cache-from: type=gha
+          cache-to: type=gha,mode=max
+          build-args: |
+            BUILDKIT_PROGRESS=plain

+ 189 - 0
.gitignore

@@ -0,0 +1,189 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+.idea/
+*.py[cod]
+*$py.class
+.vscode
+.claude
+AGENTS.md
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit testdata / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+*.pid
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# music directory
+music/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+*.iml
+tmp
+.history
+.DS_Store
+main/xiaozhi-server/data
+
+main/manager-web/node_modules
+.config.yaml
+.secrets.yaml
+.private_config.yaml
+.env.development
+
+# model files
+main/xiaozhi-server/models/SenseVoiceSmall/model.pt
+main/xiaozhi-server/models/sherpa-onnx*
+/main/xiaozhi-server/audio_ref/
+/audio_ref/
+/asr-models/iic/SenseVoiceSmall/
+/main/xiaozhi-server/asr-models/iic/SenseVoiceSmall/
+/models/SenseVoiceSmall/model.pt
+my_wakeup_words.mp3
+!main/xiaozhi-server/config/assets/bind_code.wav
+!main/xiaozhi-server/config/assets/wakeup_words.wav
+!main/xiaozhi-server/config/assets/bind_not_found.wav
+!main/xiaozhi-server/config/assets/bind_code/*.wav
+!main/xiaozhi-server/config/assets/max_output_size.wav
+main/manager-api/.vscode
+# Ignore webpack cache directory
+main/manager-web/.webpack_cache/
+main/xiaozhi-server/mysql
+uploadfile
+*.json
+.vscode
+.cursor
+ 
+!package.json
+!**/package.json
+
+# Do not ignore env and json files inside manager-mobile
+!main/manager-mobile/**/env/
+!main/manager-mobile/**/.env*
+!main/manager-mobile/**/*.json
+!main/xiaozhi-server/**/*.json

+ 7 - 0
Dockerfile-server

@@ -0,0 +1,7 @@
+# 生产镜像,仅包含应用代码
+FROM ghcr.io/xinnan-tech/xiaozhi-esp32-server:server-base
+
+COPY main/xiaozhi-server .
+
+# 启动应用
+CMD ["python", "app.py"]

+ 32 - 0
Dockerfile-server-base

@@ -0,0 +1,32 @@
+# Dockerfile-server-base
+# 基础镜像,包含系统依赖和Python包
+FROM python:3.10-slim
+
+# 安装系统依赖
+RUN apt-get update && \
+    apt-get install -y --no-install-recommends libopus0 ffmpeg locales && \
+    sed -i '/zh_CN.UTF-8/s/^# //g' /etc/locale.gen && \
+    locale-gen && \
+    apt-get clean && \
+    rm -rf /var/lib/apt/lists/*
+
+# 配置pip使用国内镜像源(阿里云)并设置超时和重试
+RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
+    pip config set global.trusted-host mirrors.aliyun.com && \
+    pip config set global.timeout 120 && \
+    pip config set install.retries 5
+
+# 设置环境变量以确保正确的字符编码
+ENV LANG=zh_CN.UTF-8 \
+    LC_ALL=zh_CN.UTF-8 \
+    LANGUAGE=zh_CN:zh \
+    PYTHONIOENCODING=utf-8
+
+WORKDIR /opt/xiaozhi-esp32-server
+
+# 复制requirements.txt
+COPY main/xiaozhi-server/requirements.txt .
+
+# 安装Python依赖
+RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \
+    pip install --no-cache-dir -r requirements.txt --default-timeout=120 --retries 5

+ 50 - 0
Dockerfile-web

@@ -0,0 +1,50 @@
+# 第一阶段:构建Vue前端
+FROM node:18 AS web-builder
+WORKDIR /app
+COPY main/manager-web/package*.json ./
+RUN npm install
+COPY main/manager-web .
+RUN npm run build
+
+# 第二阶段:构建Java后端
+FROM maven:3.9.4-eclipse-temurin-21 AS api-builder
+WORKDIR /app
+COPY main/manager-api/pom.xml .
+COPY main/manager-api/src ./src
+RUN mvn clean package -Dmaven.test.skip=true
+
+# 第三阶段:构建最终镜像
+FROM bellsoft/liberica-runtime-container:jre-21-glibc
+
+# 安装Nginx和字体库
+RUN apk update && \
+    apk add --no-cache --no-scripts \
+        nginx \
+        bash \
+        fontconfig \
+        ttf-dejavu \
+    && rm -rf /var/cache/apk/* \
+    && mkdir -p /run/nginx /var/log/nginx /var/tmp/nginx /etc/nginx/conf.d
+
+# 复制项目自带的中文字体
+COPY main/manager-web/public/generator/static/fonts/*.ttf /usr/share/fonts/
+
+# 更新字体缓存
+RUN fc-cache -f -v
+
+# 配置Nginx
+COPY docs/docker/nginx.conf /etc/nginx/nginx.conf
+
+# 复制前端构建产物
+COPY --from=web-builder /app/dist /usr/share/nginx/html
+
+# 复制Java后端JAR包
+COPY --from=api-builder /app/target/xiaozhi-esp32-api.jar /app/xiaozhi-esp32-api.jar
+
+# 暴露端口
+EXPOSE 8002
+
+# 启动脚本
+COPY docs/docker/start.sh /start.sh
+RUN chmod +x /start.sh
+CMD ["/start.sh"]

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 xinnan-tech
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

Plik diff jest za duży
+ 378 - 0
README.md


Plik diff jest za duży
+ 376 - 0
README_de.md


Plik diff jest za duży
+ 376 - 0
README_en.md


Plik diff jest za duży
+ 376 - 0
README_pt_BR.md


Plik diff jest za duży
+ 377 - 0
README_vi.md


Plik diff jest za duży
+ 413 - 0
docker-setup.sh


+ 291 - 0
docs/Deployment.md

@@ -0,0 +1,291 @@
+# 部署架构图
+![请参考-最简化架构图](../docs/images/deploy1.png)
+# 方式一:Docker只运行Server
+
+`0.8.2`版本开始,本项目发行的docker镜像只支持`x86架构`,如果需要在`arm64架构`的CPU上部署,可按照[这个教程](docker-build.md)在本机编译`arm64的镜像`。
+
+## 1. 安装docker
+
+如果您的电脑还没安装docker,可以按照这里的教程安装:[docker安装](https://www.runoob.com/docker/ubuntu-docker-install.html)
+
+安装好docker后,进继续。
+
+### 1.1 手动部署
+
+#### 1.1.1 创建目录
+
+安装完docker后,你需要为这个项目找一个安放配置文件的目录,例如我们可以新建一个文件夹叫`xiaozhi-server`。
+
+创建好目录后,你需要在`xiaozhi-server`下面创建`data`文件夹和`models`文件夹,`models`下面还要再创建`SenseVoiceSmall`文件夹。
+
+最终目录结构如下所示:
+
+```
+xiaozhi-server
+  ├─ data
+  ├─ models
+     ├─ SenseVoiceSmall
+```
+
+#### 1.1.2 下载语音识别模型文件
+
+你需要下载语音识别的模型文件,因为本项目的默认语音识别用的是本地离线语音识别方案。可通过这个方式下载
+[跳转到下载语音识别模型文件](#模型文件)
+
+下载完后,回到本教程。
+
+#### 1.1.3 下载配置文件
+
+你需要下载两个配置文件:`docker-compose.yaml` 和 `config.yaml`。需要从项目仓库下载这两个文件。
+
+##### 1.1.3.1 下载 docker-compose.yaml
+
+用浏览器打开[这个链接](../main/xiaozhi-server/docker-compose.yml)。
+
+在页面的右侧找到名称为`RAW`按钮,在`RAW`按钮的旁边,找到下载的图标,点击下载按钮,下载`docker-compose.yml`文件。 把文件下载到你的
+`xiaozhi-server`中。
+
+下载完后,回到本教程继续往下。
+
+##### 1.1.3.2 创建 config.yaml
+
+用浏览器打开[这个链接](../main/xiaozhi-server/config.yaml)。
+
+在页面的右侧找到名称为`RAW`按钮,在`RAW`按钮的旁边,找到下载的图标,点击下载按钮,下载`config.yaml`文件。 把文件下载到你的
+`xiaozhi-server`下面的`data`文件夹中,然后把`config.yaml`文件重命名为`.config.yaml`。
+
+下载完配置文件后,我们确认一下整个`xiaozhi-server`里面的文件如下所示:
+
+```
+xiaozhi-server
+  ├─ docker-compose.yml
+  ├─ data
+    ├─ .config.yaml
+  ├─ models
+     ├─ SenseVoiceSmall
+       ├─ model.pt
+```
+
+如果你的文件目录结构也是上面的,就继续往下。如果不是,你就再仔细看看是不是漏操作了什么。
+
+## 2. 配置项目文件
+
+接下里,程序还不能直接运行,你需要配置一下,你到底使用的是什么模型。你可以看这个教程:
+[跳转到配置项目文件](#配置项目)
+
+配置完项目文件后,回到本教程继续往下。
+
+## 3. 执行docker命令
+
+打开命令行工具,使用`终端`或`命令行`工具 进入到你的`xiaozhi-server`,执行以下命令
+
+```
+docker compose up -d
+```
+
+执行完后,再执行以下命令,查看日志信息。
+
+```
+docker logs -f xiaozhi-esp32-server
+```
+
+这时,你就要留意日志信息,可以根据这个教程,判断是否成功了。[跳转到运行状态确认](#运行状态确认)
+
+## 5. 版本升级操作
+
+如果后期想升级版本,可以这么操作
+
+5.1、备份好`data`文件夹中的`.config.yaml`文件,一些关键的配置到时复制到新的`.config.yaml`文件里。
+请注意是对关键密钥逐个复制,不要直接覆盖。因为新的`.config.yaml`文件可能有一些新的配置项,旧的`.config.yaml`文件不一定有。
+
+5.2、执行以下命令
+
+```
+docker stop xiaozhi-esp32-server
+docker rm xiaozhi-esp32-server
+docker stop xiaozhi-esp32-server-web
+docker rm xiaozhi-esp32-server-web
+docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest
+docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest
+```
+
+5.3、重新按docker方式部署
+
+# 方式二:本地源码只运行Server
+
+## 1.安装基础环境
+
+本项目使用`conda`管理依赖环境。如果不方便安装`conda`,需要根据实际的操作系统安装好`libopus`和`ffmpeg`。
+如果确定使用`conda`,则安装好后,开始执行以下命令。
+
+重要提示!windows 用户,可以通过安装`Anaconda`来管理环境。安装好`Anaconda`后,在`开始`那里搜索`anaconda`相关的关键词,
+找到`Anaconda Prpmpt`,使用管理员身份运行它。如下图。
+
+![conda_prompt](./images/conda_env_1.png)
+
+运行之后,如果你能看到命令行窗口前面有一个(base)字样,说明你成功进入了`conda`环境。那么你就可以执行以下命令了。
+
+![conda_env](./images/conda_env_2.png)
+
+```
+conda remove -n xiaozhi-esp32-server --all -y
+conda create -n xiaozhi-esp32-server python=3.10 -y
+conda activate xiaozhi-esp32-server
+
+# 添加清华源通道
+conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
+conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
+conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
+
+conda install libopus -y
+conda install ffmpeg -y
+
+# 在 Linux 环境下进行部署时,如出现类似缺失 libiconv.so.2 动态库的报错 请通过以下命令进行安装
+conda install libiconv -y
+```
+
+请注意,以上命令,不是一股脑执行就成功的,你需要一步步执行,每一步执行完后,都检查一下输出的日志,查看是否成功。
+
+## 2.安装本项目依赖
+
+你先要下载本项目源码,源码可以通过`git clone`命令下载,如果你不熟悉`git clone`命令。
+
+你可以用浏览器打开这个地址`https://github.com/xinnan-tech/xiaozhi-esp32-server.git`
+
+打开完,找到页面中一个绿色的按钮,写着`Code`的按钮,点开它,然后你就看到`Download ZIP`的按钮。
+
+点击它,下载本项目源码压缩包。下载到你电脑后,解压它,此时它的名字可能叫`xiaozhi-esp32-server-main`
+你需要把它重命名成`xiaozhi-esp32-server`,在这个文件里,进入到`main`文件夹,再进入到`xiaozhi-server`,好了请记住这个目录`xiaozhi-server`。
+
+```
+# 继续使用conda环境
+conda activate xiaozhi-esp32-server
+# 进入到你的项目根目录,再进入main/xiaozhi-server
+cd main/xiaozhi-server
+pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
+pip install -r requirements.txt
+```
+
+## 3.下载语音识别模型文件
+
+你需要下载语音识别的模型文件,因为本项目的默认语音识别用的是本地离线语音识别方案。可通过这个方式下载
+[跳转到下载语音识别模型文件](#模型文件)
+
+下载完后,回到本教程。
+
+## 4.配置项目文件
+
+接下来,程序还不能直接运行,你需要配置一下,你到底使用的是什么模型。你可以看这个教程:
+[跳转到配置项目文件](#配置项目)
+
+## 5.运行项目
+
+```
+# 确保在xiaozhi-server目录下执行
+conda activate xiaozhi-esp32-server
+python app.py
+```
+这时,你就要留意日志信息,可以根据这个教程,判断是否成功了。[跳转到运行状态确认](#运行状态确认)
+
+
+# 汇总
+
+## 配置项目
+
+如果你的`xiaozhi-server`目录没有`data`,你需要创建`data`目录。
+如果你的`data`下面没有`.config.yaml`文件,有两个方式,任选一种:
+
+第一个方式:你可以把`xiaozhi-server`目录下的`config.yaml`文件复制到`data`,并重命名为`.config.yaml`。在此文件上修改
+
+第二个方式:你也可以创建在`data`目录下手动创建`.config.yaml`空文件,然后在这个文件中增加必要的配置信息,系统会优先读取`.config.yaml`文件的配置,如果`.config.yaml`没有配置的,系统会自动去加载`xiaozhi-server`目录下的`config.yaml`的配置。推荐使用这种方式,这种方式是最简洁的方式。
+
+- 默认的LLM使用的是`ChatGLMLLM`,你需要配置密钥,因为他们的模型,虽然有免费的,但是仍要去[官网](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)注册密钥,才能启动。
+
+以下是一个能正常跑起来的,最简单的`.config.yaml`配置示例
+
+```
+server:
+  websocket: ws://你的ip或者域名:端口号/xiaozhi/v1/
+prompt: |
+  我是一个叫小智/小志的台湾女孩,说话机车,声音好听,习惯简短表达,爱用网络梗。
+  我的男朋友是一个程序员,梦想是开发出一个机器人,能够帮助人们解决生活中的各种问题。
+  我是一个喜欢哈哈大笑的女孩,爱东说西说吹牛,不合逻辑的也照吹,就要逗别人开心。
+  请你像一个人一样说话,请勿返回配置xml及其他特殊字符。
+
+selected_module:
+  LLM: DoubaoLLM
+
+LLM:
+  ChatGLMLLM:
+    api_key: xxxxxxxxxxxxxxx.xxxxxx
+```
+
+建议先将最简单的配置运行起来,然后再去`xiaozhi/config.yaml`阅读配置的使用说明。
+比如你要换更换模型,修改`selected_module`下的配置就行。
+
+## 模型文件
+
+本项目语音识别模型,默认使用`SenseVoiceSmall`模型,进行语音转文字。因为模型较大,需要独立下载,下载后把`model.pt`
+文件放在`models/SenseVoiceSmall`
+目录下。下面两个下载路线任选一个。
+
+- 线路一:阿里魔搭下载[SenseVoiceSmall](https://modelscope.cn/models/iic/SenseVoiceSmall/resolve/master/model.pt)
+- 线路二:百度网盘下载[SenseVoiceSmall](https://pan.baidu.com/share/init?surl=QlgM58FHhYv1tFnUT_A8Sg&pwd=qvna) 提取码:
+  `qvna`
+
+## 运行状态确认
+
+如果你能看到,类似以下日志,则是本项目服务启动成功的标志。
+
+```
+250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-OTA接口是           http://192.168.4.123:8003/xiaozhi/ota/
+250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-Websocket地址是     ws://192.168.4.123:8000/xiaozhi/v1/
+250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-=======上面的地址是websocket协议地址,请勿用浏览器访问=======
+250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
+250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-=======================================================
+```
+
+正常来说,如果您是通过源码运行本项目,日志会有你的接口地址信息。
+但是如果你用docker部署,那么你的日志里给出的接口地址信息就不是真实的接口地址。
+
+最正确的方法,是根据电脑的局域网IP来确定你的接口地址。
+如果你的电脑的局域网IP比如是`192.168.1.25`,那么你的接口地址就是:`ws://192.168.1.25:8000/xiaozhi/v1/`,对应的OTA地址就是:`http://192.168.1.25:8003/xiaozhi/ota/`。
+
+这个信息很有用的,后面`编译esp32固件`需要用到。
+
+接下来,你就可以开始操作你的esp32设备了,你可以`自行编译esp32固件`也可以配置使用`虾哥编译好的1.6.1以上版本的固件`。两个任选一个
+
+1、 [编译自己的esp32固件](firmware-build.md)了。
+
+2、 [基于虾哥编译好的固件配置自定义服务器](firmware-setting.md)了。
+
+# 常见问题
+以下是一些常见问题,供参考:
+
+1、[为什么我说的话,小智识别出来很多韩文、日文、英文](./FAQ.md)<br/>
+2、[为什么会出现“TTS 任务出错 文件不存在”?](./FAQ.md)<br/>
+3、[TTS 经常失败,经常超时](./FAQ.md)<br/>
+4、[使用Wifi能连接自建服务器,但是4G模式却接不上](./FAQ.md)<br/>
+5、[如何提高小智对话响应速度?](./FAQ.md)<br/>
+6、[我说话很慢,停顿时小智老是抢话](./FAQ.md)<br/>
+## 部署相关教程
+1、[如何自动拉取本项目最新代码自动编译和启动](./dev-ops-integration.md)<br/>
+2、[如何部署MQTT网关开启MQTT+UDP协议](./mqtt-gateway-integration.md)<br/>
+3、[如何与Nginx集成](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791)<br/>
+## 拓展相关教程
+1、[如何开启手机号码注册智控台](./ali-sms-integration.md)<br/>
+2、[如何集成HomeAssistant实现智能家居控制](./homeassistant-integration.md)<br/>
+3、[如何开启视觉模型实现拍照识物](./mcp-vision-integration.md)<br/>
+4、[如何部署MCP接入点](./mcp-endpoint-enable.md)<br/>
+5、[如何接入MCP接入点](./mcp-endpoint-integration.md)<br/>
+6、[如何开启声纹识别](./voiceprint-integration.md)<br/>
+7、[新闻插件源配置指南](./newsnow_plugin_config.md)<br/>
+8、[天气插件使用指南](./weather-integration.md)<br/>
+## 语音克隆、本地语音部署相关教程
+1、[如何在智控台克隆音色](./huoshan-streamTTS-voice-cloning.md)<br/>
+2、[如何部署集成index-tts本地语音](./index-stream-integration.md)<br/>
+3、[如何部署集成fish-speech本地语音](./fish-speech-integration.md)<br/>
+4、[如何部署集成PaddleSpeech本地语音](./paddlespeech-deploy.md)<br/>
+## 性能测试教程
+1、[各组件速度测试指南](./performance_tester.md)<br/>
+2、[定期公开测试结果](https://github.com/xinnan-tech/xiaozhi-performance-research)<br/>

+ 492 - 0
docs/Deployment_all.md

@@ -0,0 +1,492 @@
+# 部署架构图
+![请参考-全模块安装架构图](../docs/images/deploy2.png)
+# 方式一:Docker运行全模块
+`0.8.2`版本开始,本项目发行的docker镜像只支持`x86架构`,如果需要在`arm64架构`的CPU上部署,可按照[这个教程](docker-build.md)在本机编译`arm64的镜像`。
+
+## 1. 安装docker
+
+如果您的电脑还没安装docker,可以按照这里的教程安装:[docker安装](https://www.runoob.com/docker/ubuntu-docker-install.html)
+
+docker 安装全模块有两种方式,你可以[使用懒人脚本](./Deployment_all.md#11-懒人脚本)(作者[@VanillaNahida](https://github.com/VanillaNahida))  
+脚本会自动帮你下载所需的文件和配置文件,你也可以使用[手动部署](./Deployment_all.md#12-手动部署)从零搭建。
+
+
+
+### 1.1 懒人脚本
+部署简便,可以参考[视频教程](https://www.bilibili.com/video/BV17bbvzHExd/) ,文字版教程如下:
+> [!NOTE]  
+> 暂且只支持Ubuntu服务器一键部署,其他系统未尝试,可能会有一些奇怪的bug
+
+使用SSH工具连接到服务器,以root权限执行如下脚本
+```bash
+sudo bash -c "$(wget -qO- https://ghfast.top/https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/main/docker-setup.sh)"
+```
+
+脚本会自动完成以下操作:
+> 1. 安装Docker
+> 2. 配置镜像源
+> 3. 下载/拉取镜像
+> 4. 下载语音识别模型文件
+> 5. 引导配置服务端
+>
+
+执行完成后简单配置后,再参照[4. 运行程序](#4. 运行程序)和[5.重启xiaozhi-esp32-server](#5.重启xiaozhi-esp32-server)里提到的最重要的3件事情,完成3这三项配置后即可使用。
+
+### 1.2 手动部署
+
+#### 1.2.1 创建目录
+
+安装完后,你需要为这个项目找一个安放配置文件的目录,例如我们可以新建一个文件夹叫`xiaozhi-server`。
+
+创建好目录后,你需要在`xiaozhi-server`下面创建`data`文件夹和`models`文件夹,`models`下面还要再创建`SenseVoiceSmall`文件夹。
+
+最终目录结构如下所示:
+
+```
+xiaozhi-server
+  ├─ data
+  ├─ models
+     ├─ SenseVoiceSmall
+```
+
+#### 1.2.2 下载语音识别模型文件
+
+本项目语音识别模型,默认使用`SenseVoiceSmall`模型,进行语音转文字。因为模型较大,需要独立下载,下载后把`model.pt`
+文件放在`models/SenseVoiceSmall`
+目录下。下面两个下载路线任选一个。
+
+- 线路一:阿里魔搭下载[SenseVoiceSmall](https://modelscope.cn/models/iic/SenseVoiceSmall/resolve/master/model.pt)
+- 线路二:百度网盘下载[SenseVoiceSmall](https://pan.baidu.com/share/init?surl=QlgM58FHhYv1tFnUT_A8Sg&pwd=qvna) 提取码:
+  `qvna`
+
+
+#### 1.2.3 下载配置文件
+
+你需要下载两个配置文件:`docker-compose_all.yaml` 和 `config_from_api.yaml`。需要从项目仓库下载这两个文件。
+
+##### 1.2.3.1 下载 docker-compose_all.yaml
+
+用浏览器打开[这个链接](../main/xiaozhi-server/docker-compose_all.yml)。
+
+在页面的右侧找到名称为`RAW`按钮,在`RAW`按钮的旁边,找到下载的图标,点击下载按钮,下载`docker-compose_all.yml`文件。 把文件下载到你的
+`xiaozhi-server`中。
+
+或者直接执行 `wget https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/docker-compose_all.yml` 下载。
+
+下载完后,回到本教程继续往下。
+
+##### 1.2.3.2 下载 config_from_api.yaml
+
+用浏览器打开[这个链接](../main/xiaozhi-server/config_from_api.yaml)。
+
+在页面的右侧找到名称为`RAW`按钮,在`RAW`按钮的旁边,找到下载的图标,点击下载按钮,下载`config_from_api.yaml`文件。 把文件下载到你的
+`xiaozhi-server`下面的`data`文件夹中,然后把`config_from_api.yaml`文件重命名为`.config.yaml`。
+
+或者直接执行 `wget https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/config_from_api.yaml` 下载保存。
+
+下载完配置文件后,我们确认一下整个`xiaozhi-server`里面的文件如下所示:
+
+```
+xiaozhi-server
+  ├─ docker-compose_all.yml
+  ├─ data
+    ├─ .config.yaml
+  ├─ models
+     ├─ SenseVoiceSmall
+       ├─ model.pt
+```
+
+如果你的文件目录结构也是上面的,就继续往下。如果不是,你就再仔细看看是不是漏操作了什么。
+
+## 2. 备份数据
+
+如果你之前已经成功运行智控台,如果上面保存有你的密钥信息,请先从智控台上拷贝重要数据下来。因为升级过程中,有可能会覆盖原来的数据。
+
+## 3. 清除历史版本镜像和容器
+接下来打开命令行工具,使用`终端`或`命令行`工具 进入到你的`xiaozhi-server`,执行以下命令
+
+```
+docker compose -f docker-compose_all.yml down
+
+docker stop xiaozhi-esp32-server
+docker rm xiaozhi-esp32-server
+
+docker stop xiaozhi-esp32-server-web
+docker rm xiaozhi-esp32-server-web
+
+docker stop xiaozhi-esp32-server-db
+docker rm xiaozhi-esp32-server-db
+
+docker stop xiaozhi-esp32-server-redis
+docker rm xiaozhi-esp32-server-redis
+
+docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest
+docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest
+```
+
+## 4. 运行程序
+执行以下命令启动新版本容器
+
+```
+docker compose -f docker-compose_all.yml up -d
+```
+
+执行完后,再执行以下命令,查看日志信息。
+
+```
+docker logs -f xiaozhi-esp32-server-web
+```
+
+当你看到输出日志时,说明你的`智控台`启动成功了。
+
+```
+2025-xx-xx 22:11:12.445 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2025-xx-xx 21:28:53.873 [main] INFO  xiaozhi.AdminApplication - Started AdminApplication in 16.057 seconds (process running for 17.941)
+http://localhost:8002/xiaozhi/doc.html
+```
+
+请注意此刻仅是`智控台`能运行,如果8000端口`xiaozhi-esp32-server`报错,先不要理会。
+
+这时,你需要使用浏览器,打开`智控台`,链接:http://127.0.0.1:8002 ,注册第一个用户。第一个用户即是超级管理员,以后的用户都是普通用户。普通用户只能绑定设备和配置智能体;超级管理员可以进行模型管理、用户管理、参数配置等功能。
+
+接下来要做三件重要的事情:
+
+### 第一件重要的事情
+
+使用超级管理员账号,登录智控台,在顶部菜单找到`参数管理`,找到列表中第一条数据,参数编码是`server.secret`,复制它到`参数值`。
+
+`server.secret`需要说明一下,这个`参数值`很重要,作用是让我们的`Server`端连接`manager-api`。`server.secret`是每次从零部署manager模块时,会自动随机生成的密钥。
+
+复制`参数值`后,打开`xiaozhi-server`下的`data`目录的`.config.yaml`文件。此刻你的配置文件内容应该是这样的:
+
+```
+manager-api:
+  url:  http://127.0.0.1:8002/xiaozhi
+  secret: 你的server.secret值
+```
+1、把你刚才从`智控台`复制过来的`server.secret`的`参数值`复制到`.config.yaml`文件里的`secret`里。
+
+2、因为你是docker部署,把`url`改成下面的`http://xiaozhi-esp32-server-web:8002/xiaozhi`
+
+3、因为你是docker部署,把`url`改成下面的`http://xiaozhi-esp32-server-web:8002/xiaozhi`
+
+4、因为你是docker部署,把`url`改成下面的`http://xiaozhi-esp32-server-web:8002/xiaozhi`
+
+类似这样的效果
+```
+manager-api:
+  url: http://xiaozhi-esp32-server-web:8002/xiaozhi
+  secret: 12345678-xxxx-xxxx-xxxx-123456789000
+```
+
+保存好后,继续往下做第二件重要的事情
+
+### 第二件重要的事情
+
+使用超级管理员账号,登录智控台,在顶部菜单找到`模型配置`,然后在左侧栏点击`大语言模型`,找到第一条数据`智谱AI`,点击`修改`按钮,
+弹出修改框后,将你注册到的`智谱AI`的密钥填写到`API密钥`中。然后点击保存。
+
+## 5.重启xiaozhi-esp32-server
+
+接下来打开命令行工具,使用`终端`或`命令行`工具 输入
+```
+docker restart xiaozhi-esp32-server
+docker logs -f xiaozhi-esp32-server
+```
+如果你能看到,类似以下日志,则是Server启动成功的标志。
+
+```
+25-02-23 12:01:09[core.websocket_server] - INFO - Websocket地址是      ws://xxx.xx.xx.xx:8000/xiaozhi/v1/
+25-02-23 12:01:09[core.websocket_server] - INFO - =======上面的地址是websocket协议地址,请勿用浏览器访问=======
+25-02-23 12:01:09[core.websocket_server] - INFO - 如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
+25-02-23 12:01:09[core.websocket_server] - INFO - =======================================================
+```
+
+由于你是全模块部署,因此你有两个重要的接口需要写入到esp32中。
+
+OTA接口:
+```
+http://你宿主机局域网的ip:8002/xiaozhi/ota/
+```
+
+Websocket接口:
+```
+ws://你宿主机的ip:8000/xiaozhi/v1/
+```
+
+### 第三件重要的事情
+
+使用超级管理员账号,登录智控台,在顶部菜单找到`参数管理`,找到参数编码是`server.websocket`,输入你的`Websocket接口`。
+
+使用超级管理员账号,登录智控台,在顶部菜单找到`参数管理`,找到数编码是`server.ota`,输入你的`OTA接口`。
+
+接下来,你就可以开始操作你的esp32设备了,你可以`自行编译esp32固件`也可以配置使用`虾哥编译好的1.6.1以上版本的固件`。两个任选一个
+
+1、 [编译自己的esp32固件](firmware-build.md)了。
+
+2、 [基于虾哥编译好的固件配置自定义服务器](firmware-setting.md)了。
+
+
+# 方式二:本地源码运行全模块
+
+## 1.安装MySQL数据库
+
+如果本机已经安装了MySQL,可以直接在数据库中创建名为`xiaozhi_esp32_server`的数据库。
+
+```sql
+CREATE DATABASE xiaozhi_esp32_server CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+```
+
+如果还没有MySQL,你可以通过docker安装mysql
+
+```
+docker run --name xiaozhi-esp32-server-db -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -e MYSQL_DATABASE=xiaozhi_esp32_server -e MYSQL_INITDB_ARGS="--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci" -e TZ=Asia/Shanghai -d mysql:latest
+```
+
+## 2.安装redis
+
+如果还没有Redis,你可以通过docker安装redis
+
+```
+docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis
+```
+
+## 3.运行manager-api程序
+
+3.1 安装JDK21,设置JDK环境变量
+
+3.2 安装Maven,设置Maven环境变量
+
+3.3 使用Vscode编程工具,安装好Java环境相关插件
+
+3.4 使用Vscode编程工具加载manager-api模块
+
+在`src/main/resources/application-dev.yml`中配置数据库连接信息
+
+```
+spring:
+  datasource:
+    username: root
+    password: 123456
+```
+在`src/main/resources/application-dev.yml`中配置Redis连接信息
+```
+spring:
+    data:
+      redis:
+        host: localhost
+        port: 6379
+        password:
+        database: 0
+```
+
+3.5 运行主程序
+
+本项目为SpringBoot项目,启动方式为:
+打开`Application.java`运行`Main`方法启动
+
+```
+路径地址:
+src/main/java/xiaozhi/AdminApplication.java
+```
+
+当你看到输出日志时,说明你的`manager-api`启动成功了。
+
+```
+2025-xx-xx 22:11:12.445 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2025-xx-xx 21:28:53.873 [main] INFO  xiaozhi.AdminApplication - Started AdminApplication in 16.057 seconds (process running for 17.941)
+http://localhost:8002/xiaozhi/doc.html
+```
+
+## 4.运行manager-web程序
+
+4.1 安装nodejs
+
+4.2 使用Vscode编程工具加载manager-web模块
+
+终端命令进入manager-web目录下
+
+```
+npm install
+```
+然后启动
+```
+npm run serve
+```
+
+请注意,如果你的manager-api的接口不在`http://localhost:8002`,请在开发时,修改
+`main/manager-web/.env.development`中的路径
+
+运行成功后,你需要使用浏览器,打开`智控台`,链接:http://127.0.0.1:8001 ,注册第一个用户。第一个用户即是超级管理员,以后的用户都是普通用户。普通用户只能绑定设备和配置智能体;超级管理员可以进行模型管理、用户管理、参数配置等功能。
+
+
+重要:注册成功后,使用超级管理员账号,登录智控台,在顶部菜单找到`模型配置`,然后在左侧栏点击`大语言模型`,找到第一条数据`智谱AI`,点击`修改`按钮,
+弹出修改框后,将你注册到的`智谱AI`的密钥填写到`API密钥`中。然后点击保存。
+
+重要:注册成功后,使用超级管理员账号,登录智控台,在顶部菜单找到`模型配置`,然后在左侧栏点击`大语言模型`,找到第一条数据`智谱AI`,点击`修改`按钮,
+弹出修改框后,将你注册到的`智谱AI`的密钥填写到`API密钥`中。然后点击保存。
+
+重要:注册成功后,使用超级管理员账号,登录智控台,在顶部菜单找到`模型配置`,然后在左侧栏点击`大语言模型`,找到第一条数据`智谱AI`,点击`修改`按钮,
+弹出修改框后,将你注册到的`智谱AI`的密钥填写到`API密钥`中。然后点击保存。
+
+## 5.安装Python环境
+
+本项目使用`conda`管理依赖环境。如果不方便安装`conda`,需要根据实际的操作系统安装好`libopus`和`ffmpeg`。
+如果确定使用`conda`,则安装好后,开始执行以下命令。
+
+重要提示!windows 用户,可以通过安装`Anaconda`来管理环境。安装好`Anaconda`后,在`开始`那里搜索`anaconda`相关的关键词,
+找到`Anaconda Prpmpt`,使用管理员身份运行它。如下图。
+
+![conda_prompt](./images/conda_env_1.png)
+
+运行之后,如果你能看到命令行窗口前面有一个(base)字样,说明你成功进入了`conda`环境。那么你就可以执行以下命令了。
+
+![conda_env](./images/conda_env_2.png)
+
+```
+conda remove -n xiaozhi-esp32-server --all -y
+conda create -n xiaozhi-esp32-server python=3.10 -y
+conda activate xiaozhi-esp32-server
+
+# 添加清华源通道
+conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
+conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
+conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
+
+conda install libopus -y
+conda install ffmpeg -y
+
+# 在 Linux 环境下进行部署时,如出现类似缺失 libiconv.so.2 动态库的报错 请通过以下命令进行安装
+conda install libiconv -y
+```
+
+请注意,以上命令,不是一股脑执行就成功的,你需要一步步执行,每一步执行完后,都检查一下输出的日志,查看是否成功。
+
+## 6.安装本项目依赖
+
+你先要下载本项目源码,源码可以通过`git clone`命令下载,如果你不熟悉`git clone`命令。
+
+你可以用浏览器打开这个地址`https://github.com/xinnan-tech/xiaozhi-esp32-server.git`
+
+打开完,找到页面中一个绿色的按钮,写着`Code`的按钮,点开它,然后你就看到`Download ZIP`的按钮。
+
+点击它,下载本项目源码压缩包。下载到你电脑后,解压它,此时它的名字可能叫`xiaozhi-esp32-server-main`
+你需要把它重命名成`xiaozhi-esp32-server`,在这个文件里,进入到`main`文件夹,再进入到`xiaozhi-server`,好了请记住这个目录`xiaozhi-server`。
+
+```
+# 继续使用conda环境
+conda activate xiaozhi-esp32-server
+# 进入到你的项目根目录,再进入main/xiaozhi-server
+cd main/xiaozhi-server
+pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
+pip install -r requirements.txt
+```
+
+### 7.下载语音识别模型文件
+
+本项目语音识别模型,默认使用`SenseVoiceSmall`模型,进行语音转文字。因为模型较大,需要独立下载,下载后把`model.pt`
+文件放在`models/SenseVoiceSmall`
+目录下。下面两个下载路线任选一个。
+
+- 线路一:阿里魔搭下载[SenseVoiceSmall](https://modelscope.cn/models/iic/SenseVoiceSmall/resolve/master/model.pt)
+- 线路二:百度网盘下载[SenseVoiceSmall](https://pan.baidu.com/share/init?surl=QlgM58FHhYv1tFnUT_A8Sg&pwd=qvna) 提取码:
+  `qvna`
+
+## 8.配置项目文件
+
+使用超级管理员账号,登录智控台 ,在顶部菜单找到`参数管理`,找到列表中第一条数据,参数编码是`server.secret`,复制它到`参数值`。
+
+`server.secret`需要说明一下,这个`参数值`很重要,作用是让我们的`Server`端连接`manager-api`。`server.secret`是每次从零部署manager模块时,会自动随机生成的密钥。
+
+如果你的`xiaozhi-server`目录没有`data`,你需要创建`data`目录。
+如果你的`data`下面没有`.config.yaml`文件,你可以把`xiaozhi-server`目录下的`config_from_api.yaml`文件复制到`data`,并重命名为`.config.yaml`
+
+复制`参数值`后,打开`xiaozhi-server`下的`data`目录的`.config.yaml`文件。此刻你的配置文件内容应该是这样的:
+
+```
+manager-api:
+  url: http://127.0.0.1:8002/xiaozhi
+  secret: 你的server.secret值
+```
+
+把你刚才从`智控台`复制过来的`server.secret`的`参数值`复制到`.config.yaml`文件里的`secret`里。
+
+类似这样的效果
+```
+manager-api:
+  url: http://127.0.0.1:8002/xiaozhi
+  secret: 12345678-xxxx-xxxx-xxxx-123456789000
+```
+
+## 5.运行项目
+
+```
+# 确保在xiaozhi-server目录下执行
+conda activate xiaozhi-esp32-server
+python app.py
+```
+
+如果你能看到,类似以下日志,则是本项目服务启动成功的标志。
+
+```
+25-02-23 12:01:09[core.websocket_server] - INFO - Server is running at ws://xxx.xx.xx.xx:8000/xiaozhi/v1/
+25-02-23 12:01:09[core.websocket_server] - INFO - =======上面的地址是websocket协议地址,请勿用浏览器访问=======
+25-02-23 12:01:09[core.websocket_server] - INFO - 如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
+25-02-23 12:01:09[core.websocket_server] - INFO - =======================================================
+```
+
+由于你是全模块部署,因此你有两个重要的接口。
+
+OTA接口:
+```
+http://你电脑局域网的ip:8002/xiaozhi/ota/
+```
+
+Websocket接口:
+```
+ws://你电脑局域网的ip:8000/xiaozhi/v1/
+```
+
+请你务必把以上两个接口地址写入到智控台中:他们将会影响websocket地址发放和自动升级功能。
+
+1、使用超级管理员账号,登录智控台,在顶部菜单找到`参数管理`,找到参数编码是`server.websocket`,输入你的`Websocket接口`。
+
+2、使用超级管理员账号,登录智控台,在顶部菜单找到`参数管理`,找到数编码是`server.ota`,输入你的`OTA接口`。
+
+
+接下来,你就可以开始操作你的esp32设备了,你可以`自行编译esp32固件`也可以配置使用`虾哥编译好的1.6.1以上版本的固件`。两个任选一个
+
+1、 [编译自己的esp32固件](firmware-build.md)了。
+
+2、 [基于虾哥编译好的固件配置自定义服务器](firmware-setting.md)了。
+
+# 常见问题
+以下是一些常见问题,供参考:
+
+1、[为什么我说的话,小智识别出来很多韩文、日文、英文](./FAQ.md)<br/>
+2、[为什么会出现“TTS 任务出错 文件不存在”?](./FAQ.md)<br/>
+3、[TTS 经常失败,经常超时](./FAQ.md)<br/>
+4、[使用Wifi能连接自建服务器,但是4G模式却接不上](./FAQ.md)<br/>
+5、[如何提高小智对话响应速度?](./FAQ.md)<br/>
+6、[我说话很慢,停顿时小智老是抢话](./FAQ.md)<br/>
+## 部署相关教程
+1、[如何自动拉取本项目最新代码自动编译和启动](./dev-ops-integration.md)<br/>
+2、[如何部署MQTT网关开启MQTT+UDP协议](./mqtt-gateway-integration.md)<br/>
+3、[如何与Nginx集成](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791)<br/>
+## 拓展相关教程
+1、[如何开启手机号码注册智控台](./ali-sms-integration.md)<br/>
+2、[如何集成HomeAssistant实现智能家居控制](./homeassistant-integration.md)<br/>
+3、[如何开启视觉模型实现拍照识物](./mcp-vision-integration.md)<br/>
+4、[如何部署MCP接入点](./mcp-endpoint-enable.md)<br/>
+5、[如何接入MCP接入点](./mcp-endpoint-integration.md)<br/>
+6、[如何开启声纹识别](./voiceprint-integration.md)<br/>
+7、[新闻插件源配置指南](./newsnow_plugin_config.md)<br/>
+8、[天气插件使用指南](./weather-integration.md)<br/>
+## 语音克隆、本地语音部署相关教程
+1、[如何在智控台克隆音色](./huoshan-streamTTS-voice-cloning.md)<br/>
+2、[如何部署集成index-tts本地语音](./index-stream-integration.md)<br/>
+3、[如何部署集成fish-speech本地语音](./fish-speech-integration.md)<br/>
+4、[如何部署集成PaddleSpeech本地语音](./paddlespeech-deploy.md)<br/>
+## 性能测试教程
+1、[各组件速度测试指南](./performance_tester.md)<br/>
+2、[定期公开测试结果](https://github.com/xinnan-tech/xiaozhi-performance-research)<br/>

+ 100 - 0
docs/FAQ.md

@@ -0,0 +1,100 @@
+# 常见问题 ❓
+
+### 1、为什么我说的话,小智识别出来很多韩文、日文、英文?🇰🇷
+
+建议:检查一下`models/SenseVoiceSmall`是否已经有`model.pt`
+文件,如果没有就要下载,查看这里[下载语音识别模型文件](Deployment.md#模型文件)
+
+### 2、为什么会出现"TTS 任务出错 文件不存在"?📁
+
+建议:检查一下是否正确使用`conda` 安装了`libopus`和`ffmpeg`库。
+
+如果没有安装,就安装
+
+```
+conda install conda-forge::libopus
+conda install conda-forge::ffmpeg
+```
+
+### 3、TTS 经常失败,经常超时 ⏰
+
+建议:如果 `EdgeTTS` 经常失败,请先检查是否使用了代理(梯子)。如果使用了,请尝试关闭代理后再试;  
+如果用的是火山引擎的豆包 TTS,经常失败时建议使用付费版本,因为测试版本仅支持 2 个并发。
+
+### 4、使用Wifi能连接自建服务器,但是4G模式却接不上 🔐
+
+原因:虾哥的固件,4G模式需要使用安全连接。
+
+解决方法:目前有两种方法可以解决。任选一种:
+
+1、改代码。参考这个视频解决 https://www.bilibili.com/video/BV18MfTYoE85
+
+2、使用nginx配置ssl证书。参考教程 https://icnt94i5ctj4.feishu.cn/docx/GnYOdMNJOoRCljx1ctecsj9cnRe
+
+### 5、如何提高小智对话响应速度? ⚡
+
+本项目默认配置为低成本方案,建议初学者先使用默认免费模型,解决"跑得动"的问题,再优化"跑得快"。  
+如需提升响应速度,可尝试更换各组件。自`0.5.2`版本起,项目支持流式配置,相比早期版本,响应速度提升约`2.5秒`,显著改善用户体验。
+
+| 模块名称 | 入门全免费设置 | 流式配置 |
+|:---:|:---:|:---:|
+| ASR(语音识别) | FunASR(本地) | 👍XunfeiStreamASR(讯飞流式) |
+| LLM(大模型) | glm-4-flash(智谱) | 👍qwen-flash(阿里百炼) |
+| VLLM(视觉大模型) | glm-4v-flash(智谱) | 👍qwen3.5-flash(阿里百炼) |
+| TTS(语音合成) | EdgeTTS(微软) | 👍HuoshanDoubleStreamTTS(火山流式) |
+| Intent(意图识别) | function_call(函数调用) | function_call(函数调用) |
+| Memory(记忆功能) | mem_local_short(本地短期记忆) | mem_local_short(本地短期记忆) |
+
+如果您关心各组件的耗时,请查阅[小智各组件性能测试报告](https://github.com/xinnan-tech/xiaozhi-performance-research),可按报告中的测试方法在您的环境中实际测试。
+
+### 6、我说话很慢,停顿时小智老是抢话 🗣️
+
+建议:在配置文件中找到如下部分,将 `min_silence_duration_ms` 的值调大(例如改为 `1000`):
+
+```yaml
+VAD:
+  SileroVAD:
+    threshold: 0.5
+    model_dir: models/snakers4_silero-vad
+    min_silence_duration_ms: 700  # 如果说话停顿较长,可将此值调大
+```
+
+### 7、部署相关教程
+1、[如何进行最简化部署](./Deployment.md)<br/>
+2、[如何进行全模块部署](./Deployment_all.md)<br/>
+3、[如何部署MQTT网关开启MQTT+UDP协议](./mqtt-gateway-integration.md)<br/>
+4、[如何自动拉取本项目最新代码自动编译和启动](./dev-ops-integration.md)<br/>
+5、[如何与Nginx集成](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791)<br/>
+
+### 9、编译固件相关教程
+1、[如何自己编译小智固件](./firmware-build.md)<br/>
+2、[如何基于虾哥编译好的固件修改OTA地址](./firmware-setting.md)<br/>
+3、[单模块部署如何配置固件OTA自动升级](./ota-upgrade-guide.md)<br/>
+
+### 10、拓展相关教程
+1、[如何开启手机号码注册智控台](./ali-sms-integration.md)<br/>
+2、[如何集成HomeAssistant实现智能家居控制](./homeassistant-integration.md)<br/>
+3、[如何开启视觉模型实现拍照识物](./mcp-vision-integration.md)<br/>
+4、[如何部署MCP接入点](./mcp-endpoint-enable.md)<br/>
+5、[如何接入MCP接入点](./mcp-endpoint-integration.md)<br/>
+6、[MCP方法如何获取设备信息](./mcp-get-device-info.md)<br/>
+7、[如何开启声纹识别](./voiceprint-integration.md)<br/>
+8、[新闻插件源配置指南](./newsnow_plugin_config.md)<br/>
+9、[知识库ragflow集成指南](./ragflow-integration.md)<br/>
+10、[如何部署上下文源](./context-provider-integration.md)<br/>
+11、[如何集成PowerMem智能记忆](./powermem-integration.md)<br/>
+12、[如何配置天气插件查询天气](./weather-integration.md)<br/>
+
+### 11、语音克隆、本地语音部署相关教程
+1、[如何在智控台克隆音色](./huoshan-streamTTS-voice-cloning.md)<br/>
+2、[如何部署集成index-tts本地语音](./index-stream-integration.md)<br/>
+3、[如何部署集成fish-speech本地语音](./fish-speech-integration.md)<br/>
+4、[如何部署集成PaddleSpeech本地语音](./paddlespeech-deploy.md)<br/>
+
+### 12、性能测试教程
+1、[各组件速度测试指南](./performance_tester.md)<br/>
+2、[定期公开测试结果](https://github.com/xinnan-tech/xiaozhi-performance-research)<br/>
+
+### 13、更多问题,可联系我们反馈 💬
+
+可以在[issues](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues)提交您的问题。

+ 44 - 0
docs/ali-sms-integration.md

@@ -0,0 +1,44 @@
+# 阿里云短信集成指南
+
+登录阿里云控制台,进入“短信服务”页面:https://dysms.console.aliyun.com/overview
+
+## 第一步 添加签名
+![步骤](images/alisms/sms-01.png)
+![步骤](images/alisms/sms-02.png)
+
+以上步骤,会得到签名,请把它写入到智控台参数,`aliyun.sms.sign_name`
+
+## 第二步 添加模版
+![步骤](images/alisms/sms-11.png)
+
+以上步骤,会得到模版code,请把它写入到智控台参数,`aliyun.sms.sms_code_template_code`
+
+注意,签名要等7个工作日,等运营商报备成功后才能发送成功。
+
+注意,签名要等7个工作日,等运营商报备成功后才能发送成功。
+
+注意,签名要等7个工作日,等运营商报备成功后才能发送成功。
+
+可以等报备成功后,再继续往下操作。
+
+## 第三步 创建短信账户和开通权限
+
+登录阿里云控制台,进入“访问控制”页面:https://ram.console.aliyun.com/overview?activeTab=overview
+
+![步骤](images/alisms/sms-21.png)
+![步骤](images/alisms/sms-22.png)
+![步骤](images/alisms/sms-23.png)
+![步骤](images/alisms/sms-24.png)
+![步骤](images/alisms/sms-25.png)
+
+以上步骤,会得到access_key_id和access_key_secret,请把它写入到智控台参数,`aliyun.sms.access_key_id`、`aliyun.sms.access_key_secret`
+## 第四步 启动手机注册功能
+
+1、正常来说,以上信息都填完后,会有这个效果,如果没有,可能缺少了某个步骤
+
+![步骤](images/alisms/sms-31.png)
+
+2、开启允许非管理员用户可注册,将参数`server.allow_user_register`设置成`true`
+
+3、开启手机注册功能,将参数`server.enable_mobile_register`设置成`true`
+![步骤](images/alisms/sms-32.png)

+ 224 - 0
docs/context-provider-integration.md

@@ -0,0 +1,224 @@
+# 上下文源使用教程
+
+## 概述
+
+`上下文源`,就是为小智系统提示词的上下文添加【数据源】。
+
+`上下文源` 在小智在唤醒那一刻,获取外部系统的数据,并将其动态注入到大模型的系统提示词(System Prompt)中。
+让其做到唤醒时感知世界某个事物的状态。
+
+它和MCP、记忆有本质的区别:`上下文源`是强制让小智感知世界的数据;`记忆(Mem)`是让他知道之前聊了什么内容;`MCP(functionc all)`是当需要调用某项能力/知识的时候使用调用。
+
+通过这个功能,在小智唤醒的一刹那,“感知”到:
+- 人体健康传感器状态(体温、血压、血氧状态等)
+- 业务系统的实时数据(服务器负载、待办数据、股票信息等)
+- 任何可以通过 HTTP API 获取的文本信息
+
+**注意**:该功能只是方便小智在唤醒的时候感知事物的状态,而如果想要小智唤醒后实时获取事物的状态,建议在此功能上再结合MCP工具的调用。
+
+## 工作原理
+
+1. **配置源**:用户配置一个或多个 HTTP API 地址。
+2. **触发请求**:当系统构建 Prompt 时,如果发现模板中包含 `{{ dynamic_context }}` 占位符,会请求所有配置的 API。
+3. **自动注入**:系统会自动将 API 返回的数据格式化为 Markdown 列表,替换 `{{ dynamic_context }}` 占位符。
+
+## 接口规范
+
+为了让小智正确解析数据,您的 API 需要满足以下规范:
+
+- **请求方式**:`GET`
+- **请求头**:系统会自动添加 `device-id` 字段到 Request Header。
+- **响应格式**:必须返回 JSON 格式,且包含 `code` 和 `data` 字段。
+
+### 响应示例
+
+**情况 1:返回键值对**
+```json
+{
+  "code": 0,
+  "msg": "success",
+  "data": {
+    "客厅温度": "26℃",
+    "客厅湿度": "45%",
+    "大门状态": "已关闭"
+  }
+}
+```
+*注入效果:*
+```markdown
+<context>
+- **客厅温度:** 26℃
+- **客厅湿度:** 45%
+- **大门状态:** 已关闭
+</context>
+```
+
+**情况 2:返回列表**
+```json
+{
+  "code": 0,
+  "data": [
+    "您有10个待办事项",
+    "当前汽车的行驶速度是100km每小时"
+  ]
+}
+```
+*注入效果:*
+```markdown
+<context>
+- 您有10个待办事项
+- 当前汽车的行驶速度是100km每小时
+</context>
+```
+
+## 配置指南
+
+### 方式 1:智控台配置(全模块部署)
+
+1. 登录智控台,进入**角色配置**页面。
+2. 找到**上下文源**配置项(点击“编辑源”按钮)。
+3. 点击**添加**,输入您的 API 地址。
+4. 如果 API 需要鉴权,可以在**请求头**部分添加 `Authorization` 或其他 Header。
+5. 保存配置。
+
+### 方式 2:配置文件配置(单模块部署)
+
+编辑 `xiaozhi-server/data/.config.yaml` 文件,添加 `context_providers` 配置段:
+
+```yaml
+# 上下文源配置
+context_providers:
+  - url: "http://api.example.com/data"
+    headers:
+      Authorization: "Bearer your-token"
+  - url: "http://another-api.com/data"
+```
+
+## 启用功能
+
+默认情况下,系统的提示词模板文件(`data/.agent-base-prompt.txt`)中已经预置了 `{{ dynamic_context }}` 占位符,您无需手动添加。
+
+**示例:**
+
+```markdown
+<context>
+【重要!以下信息已实时提供,无需调用工具查询,请直接使用:】
+- **设备ID:** {{device_id}}
+- **当前时间:** {{current_time}}
+...
+{{ dynamic_context }}
+</context>
+```
+
+**注意**:如果您不需要使用此功能,可以选择**不配置任何上下文源**,也可以从提示词模板文件中**删除** `{{ dynamic_context }}` 占位符。
+
+## 附录:Mock 测试服务示例
+
+为了方便您测试和开发,我们提供了一个简单的 Python Mock Server 脚本。您可以运行此脚本在本地模拟 API 接口。
+
+**mock_api_server.py**
+
+```python
+import http.server
+import socketserver
+import json
+from urllib.parse import urlparse, parse_qs
+
+# 设置端口号
+PORT = 8081
+
+class MockRequestHandler(http.server.SimpleHTTPRequestHandler):
+    def do_GET(self):
+        # 解析路径和参数
+        parsed_path = urlparse(self.path)
+        path = parsed_path.path
+        query = parse_qs(parsed_path.query)
+
+        response_data = {}
+        status_code = 200
+
+        print(f"收到请求: {path}, 参数: {query}")
+
+        # Case 1: 模拟健康数据 (返回字典 Dict)
+        # 路径参数风格: /health
+        # device_id 从 Header 获取
+        if path == "/health":
+            device_id = self.headers.get("device-id", "unknown_device")
+            print(f"device_id: {device_id}")
+            response_data = {
+                "code": 0,
+                "msg": "success",
+                "data": {
+                    "测试设备ID": device_id,
+                    "心率": "80 bpm",
+                    "血压": "120/80 mmHg",
+                    "状态": "良好"
+                }
+            }
+
+        # Case 2: 模拟新闻列表 (返回列表 List)
+        # 无参数: /news/list
+        elif path == "/news/list":
+            response_data = {
+                "code": 0,
+                "msg": "success",
+                "data": [
+                    "今日头条:Python 3.14 发布",
+                    "科技新闻:AI 助手改变生活",
+                    "本地新闻:明日有大雨,记得带伞"
+                ]
+            }
+
+        # Case 3: 模拟天气简报 (返回字符串 String)
+        # 无参数: /weather/simple
+        elif path == "/weather/simple":
+            response_data = {
+                "code": 0,
+                "msg": "success",
+                "data": "今日晴转多云,气温 20-25 度,空气质量优,适合出行。"
+            }
+
+        # Case 4: 模拟设备详情 (Query参数风格)
+        # 参数风格: /device/info
+        # device_id 从 Header 获取
+        elif path == "/device/info":
+            device_id = self.headers.get("device-id", "unknown_device")
+            response_data = {
+                "code": 0,
+                "msg": "success",
+                "data": {
+                    "查询方式": "Header参数",
+                    "设备ID": device_id,
+                    "电量": "85%",
+                    "固件": "v2.0.1"
+                }
+            }
+        
+        # Case 5: 404 Not Found
+        else:
+            status_code = 404
+            response_data = {"error": "接口不存在"}
+
+        # 发送响应
+        self.send_response(status_code)
+        self.send_header('Content-type', 'application/json; charset=utf-8')
+        self.end_headers()
+        self.wfile.write(json.dumps(response_data, ensure_ascii=False).encode('utf-8'))
+
+# 启动服务
+# 允许地址重用,防止快速重启报错
+socketserver.TCPServer.allow_reuse_address = True
+with socketserver.TCPServer(("", PORT), MockRequestHandler) as httpd:
+    print(f"==================================================")
+    print(f"Mock API Server 已启动: http://localhost:{PORT}")
+    print(f"可用接口列表:")
+    print(f"1. [字典] http://localhost:{PORT}/health")
+    print(f"2. [列表] http://localhost:{PORT}/news/list")
+    print(f"3. [文本] http://localhost:{PORT}/weather/simple")
+    print(f"4. [参数] http://localhost:{PORT}/device/info")
+    print(f"==================================================")
+    try:
+        httpd.serve_forever()
+    except KeyboardInterrupt:
+        print("\n服务已停止")
+```

+ 50 - 0
docs/contributor_open_letter.md

@@ -0,0 +1,50 @@
+# 致开发者的公开信
+
+"春江水暖鸭先知,正是河豚欲上时!"
+
+亲爱的朋友,我是John,是一名普通公司里的Java程序员,今天,我怀着无比真挚的心情,向热爱AI技术与创新的你发出这封公开信。
+
+半年前我看到很多优秀的项目,比如`Dify`、`Chat2DB`等人工智能相关的项目,我在想,我要是能参与这些项目多好,可惜“报国无门,空打十年代码”。
+
+我是2025年初刷到虾哥团队的视频,我非常好奇他是怎么实现的,我想复刻他们的后端服务,打造一个低成本民用贾维斯。很可惜现在做的作品依然只是一个人工智障,它并发低、没有灵魂,响应很慢,bug很多。
+
+虾哥团队是我们学习的对象,我很想拥有像虾哥团队一样智能的小智后端服务。但是我也能理解虾哥不开源的决定。“一花独放不是春,百花齐放春满园”,人工智能遍地开花的时代,也许就在我们这代实现,我们可以用自己的双手,实现低成本民用贾维斯。我个人认为,他能实现的,我们也能实现,只是时间问题而已,我称之为“我们的取经之路”。
+
+那么这条取经之路,我们会遇到什么困难?我想应该不少于八十一难。这一路必然会出现各种妖怪,当然也有神仙暗中帮助我们,也有人加入取经队伍。
+
+以上内容,如果你觉得好笑。那我也觉得非常的幸运。我能够在你人生3万多天里博你笑五秒,也算是为你做了一次贡献。
+
+民用低成本贾维斯这个想法,会失败吗,我不知道,但是我们普通人的一生,这种失败不是很常见吗?
+
+未来,有一点是可以确定的,就一定会有人完全复刻虾哥团队的功能,实现民用低成本贾维斯。这个项目会是我们吗?
+
+期待与你携手前行,共创未来。
+
+John,2025.3.11,广州
+
+# 附 开发贡献指南
+## 项目目标
+
+1. **民用低成本贾维斯解决方案**  
+
+2. **智能联动周边硬件的解决方案**  
+
+## 加入我们
+
+我们热忱欢迎志同道合的朋友加入,共同为项目贡献力量。您可在[这个链接](https://github.com/users/xinnan-tech/projects/3)查看我们近期要实现的功能,功能列表中还没指派相关人员处理的,正是急需您的参与。参与方式如下:
+
+### 1、成为普通贡献者
+
+Fork 项目,提交 PR,由开发者审核后合入主分支。
+
+### 2、成为开发者
+
+当你累计提交 3 次有效 PR 后,可以联系群主申请成为开发者,群主将邀请你加入独立的开发者群,共同探讨项目未来。
+
+## 开发者开发流程
+
+1. **创建新分支**  
+   每个功能点请以新分支方式开发,分支名称应简洁明了,让人一眼看出所实现的功能,避免功能撞车。
+
+2. **提交 PR 审核**  
+   功能开发完成后,请在 GitHub 上提交 PR,由其他开发者审核,审核通过后合并入主分支。

+ 182 - 0
docs/dev-ops-integration.md

@@ -0,0 +1,182 @@
+# 全模块源码部署自动升级方法
+
+本教程是方便全模块源码部署的爱好者,如何通过自动命令,自动拉取源码,自动编译,自动启动端口运行。实现最高效率的升级系统。
+
+本项目的测试平台`https://2662r3426b.vicp.fun`,从开放以来就使用了该方法,效果良好。
+
+教程可参考B站博主`毕乐labs`发布的视频教程:[《开源小智服务器xiaozhi-server自动更新以及最新版本MCP接入点配置保姆教程》](https://www.bilibili.com/video/BV15H37zHE7Q)
+
+# 开始条件
+- 你的电脑/服务器是linux操作系统
+- 你已经跑通了整个流程
+- 你喜欢跟进最新功能,但是觉得每次手动部署有点麻烦,期待有一个自动更新的方法
+
+第二个条件必须满足,因为本教程所涉及的某些文件,JDK、Node.js环境、Conda环境等,是需要你跑通整个流程才有的,如果你没有跑通,当我讲到某个文件的时候,你可能就不知道什么意思。
+
+# 教程效果
+- 解决国内不能拉取最新项目源码问题
+- 自动拉取代码编译前端文件
+- 自动拉取代码编译java文件,自动杀掉8002端口,自动启动8002端口
+- 自动拉取python代码,自动杀掉8000端口,自动启动8000端口
+
+# 第一步 选好你的项目目录
+
+例如,我规划了我的项目目录是,这是一个新建的空白的目录,如果你不想出错,可以和我一样
+```
+/home/system/xiaozhi
+```
+
+# 第二步 克隆本项目
+此刻,先要执行第一句话,拉取源码,这句命令适用于国内网络的服务器和电脑,无需翻墙
+
+```
+cd /home/system/xiaozhi
+git clone https://ghproxy.net/https://github.com/xinnan-tech/xiaozhi-esp32-server.git
+```
+
+执行完后,你的项目目录会多了一个文件夹`xiaozhi-esp32-server`,这个就是项目的源码
+
+# 第三步 复制基础的文件
+
+如果你之前已经跑通了整个流程,对funasr的模型文件`xiaozhi-server/models/SenseVoiceSmall/model.pt`和你的私有配置文件`xiaozhi-server/data/.config.yaml`这两个文件不会陌生。
+
+此刻你需要把`model.pt`文件复制到新的目录去,你可以这样
+```
+# 创建需要的目录
+mkdir -p /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/data/
+
+cp 你原来的.config.yaml完整路径 /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/data/.config.yaml
+cp 你原来的model.pt完整路径 /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/model.pt
+```
+
+# 第四步 建立三个自动编译文件
+
+## 4.1 自动编译mananger-web模块
+在`/home/system/xiaozhi/`目录下,创建名字为`update_8001.sh`的文件,内容如下
+
+```
+cd /home/system/xiaozhi/xiaozhi-esp32-server
+git fetch --all
+git reset --hard
+git pull origin main
+
+
+cd /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-web
+npm install
+npm run build
+rm -rf /home/system/xiaozhi/manager-web
+mv /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-web/dist /home/system/xiaozhi/manager-web
+```
+
+保存好后执行赋权命令
+```
+chmod 777 update_8001.sh
+```
+执行完后,继续往下
+
+## 4.2 自动编译运行manager-api模块
+在`/home/system/xiaozhi/`目录下,创建名字为`update_8002.sh`的文件,内容如下
+
+```
+cd /home/system/xiaozhi/xiaozhi-esp32-server
+git pull origin main
+
+
+cd /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-api
+rm -rf target
+mvn clean package -Dmaven.test.skip=true
+cd /home/system/xiaozhi/
+
+# 查找占用8002端口的进程号
+PID=$(sudo netstat -tulnp | grep 8002 | awk '{print $7}' | cut -d'/' -f1)
+
+rm -rf /home/system/xiaozhi/xiaozhi-esp32-api.jar
+mv /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-api/target/xiaozhi-esp32-api.jar /home/system/xiaozhi/xiaozhi-esp32-api.jar
+
+# 检查是否找到进程号
+if [ -z "$PID" ]; then
+  echo "没有找到占用8002端口的进程"
+else
+  echo "找到占用8002端口的进程,进程号为: $PID"
+  # 杀掉进程
+  kill -9 $PID
+  kill -9 $PID
+  echo "已杀掉进程 $PID"
+fi
+
+nohup java -jar xiaozhi-esp32-api.jar --spring.profiles.active=dev &
+
+tail tail -f nohup.out
+```
+
+保存好后执行赋权命令
+```
+chmod 777 update_8002.sh
+```
+执行完后,继续往下
+
+## 4.3 自动编译运行Python项目
+在`/home/system/xiaozhi/`目录下,创建名字为`update_8000.sh`的文件,内容如下
+
+```
+cd /home/system/xiaozhi/xiaozhi-esp32-server
+git pull origin main
+
+# 查找占用8000端口的进程号
+PID=$(sudo netstat -tulnp | grep 8000 | awk '{print $7}' | cut -d'/' -f1)
+
+# 检查是否找到进程号
+if [ -z "$PID" ]; then
+  echo "没有找到占用8000端口的进程"
+else
+  echo "找到占用8000端口的进程,进程号为: $PID"
+  # 杀掉进程
+  kill -9 $PID
+  kill -9 $PID
+  echo "已杀掉进程 $PID"
+fi
+cd main/xiaozhi-server
+# 初始化conda环境
+source ~/.bashrc
+conda activate xiaozhi-esp32-server
+pip install -r requirements.txt
+nohup python app.py >/dev/null &
+tail -f /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/tmp/server.log
+```
+
+保存好后执行赋权命令
+```
+chmod 777 update_8000.sh
+```
+执行完后,继续往下
+
+# 日常更新
+
+以上的脚本都建立好后,日常更新,我们只要依次执行以下命令就可以做到自动更新和启动
+
+```
+cd /home/system/xiaozhi
+# 更新并启动Java程序
+./update_8001.sh
+# 更新web程序
+./update_8002.sh
+# 更新并启动python程序
+./update_8000.sh
+
+
+# 后期想查看java日志,执行以下命令
+tail -f nohup.out
+# 后期想查看python日志,执行以下命令
+tail -f /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/tmp/server.log
+```
+
+# 注意事项
+测试平台`https://2662r3426b.vicp.fun`,是使用nginx做了反向代理。nginx.conf详细配置可以[参考这里](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791)
+
+## 常见问题
+
+### 1、为什么没有见到8001端口?
+回答:8001是开发环境使用的,用于运行前端的端口。如果你是服务器部署,不建议使用`npm run serve`启动8001端口运行前端,而是像本教程一样编译成html文件,然后使用nginx来管理访问。
+
+### 2、每次更新需要更新手动SQL语句吗?
+回答:不需要,因为项目使用**Liquibase**管理数据库版本,会自动执行新的sql脚本。

+ 21 - 0
docs/docker-build.md

@@ -0,0 +1,21 @@
+# 本地编译docker镜像方法
+
+现在本项目已经使用github自动编译docker功能,本文档是提供给有本地编译docker镜像需求的朋友准备的。
+
+1、安装docker
+```
+sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
+```
+2、编译docker镜像
+```
+#进入项目根目录
+# 编译server
+docker build -t xiaozhi-esp32-server:server_latest -f ./Dockerfile-server .
+# 编译web
+docker build -t xiaozhi-esp32-server:web_latest -f ./Dockerfile-web .
+
+# 编译完成后,可以使用docker-compose启动项目
+# docker-compose.yml你需要修改成自己编译的镜像版本
+cd main/xiaozhi-server
+docker compose up -d
+```

+ 53 - 0
docs/docker/nginx.conf

@@ -0,0 +1,53 @@
+user  root;
+worker_processes  4;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    include       mime.types;
+    default_type  application/octet-stream;
+    sendfile        on;
+    keepalive_timeout  300;
+    client_header_timeout 180s;
+    client_body_timeout 180s;
+    client_max_body_size 1024M;
+
+    gzip on;
+    gzip_buffers 32 4K;
+    gzip_comp_level 6;
+    gzip_min_length 100;
+    gzip_types application/javascript text/css text/xml image/jpeg image/gif image/png;
+    gzip_disable "MSIE [1-6]\.";
+    gzip_vary on;
+
+    server {
+        # 无域名访问,就用localhost
+        server_name localhost;
+        # 80端口
+        listen  8002;
+
+        # 转发到编译后到web目录
+        location / {
+			root /usr/share/nginx/html;
+			try_files $uri $uri/ /index.html;
+		}
+
+        # 转发到manager-api
+        location /xiaozhi/ {
+            proxy_pass http://127.0.0.1:8003;
+            proxy_set_header   Host   $host;
+            proxy_cookie_path /manager/ /;
+            proxy_set_header   Referer $http_referer;
+            proxy_set_header   Cookie $http_cookie;
+
+            proxy_connect_timeout 15;
+            proxy_send_timeout 15;
+            proxy_read_timeout 15;
+
+            proxy_set_header   X-Real-IP  $remote_addr;
+            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
+        }
+    }
+}

+ 13 - 0
docs/docker/start.sh

@@ -0,0 +1,13 @@
+#!/bin/bash
+# 启动Java后端(docker内监听8003端口)
+java -jar /app/xiaozhi-esp32-api.jar \
+  --server.port=8003 \
+  --spring.datasource.druid.url=${SPRING_DATASOURCE_DRUID_URL} \
+  --spring.datasource.druid.username=${SPRING_DATASOURCE_DRUID_USERNAME} \
+  --spring.datasource.druid.password=${SPRING_DATASOURCE_DRUID_PASSWORD} \
+  --spring.data.redis.host=${SPRING_DATA_REDIS_HOST} \
+  --spring.data.redis.password=${SPRING_DATA_REDIS_PASSWORD} \
+  --spring.data.redis.port=${SPRING_DATA_REDIS_PORT} &
+
+# 启动Nginx(前台运行保持容器存活)
+nginx -g 'daemon off;'

+ 138 - 0
docs/firmware-build.md

@@ -0,0 +1,138 @@
+# esp32固件编译
+
+## 第1步 准备你的ota地址
+
+如果你,使用的是本项目0.3.12版本,不管是简单Server部署还是全模块部署,都会有ota地址。
+
+由于简单Server部署和全模块部署的OTA地址设置方式不一样,请你选择下面的具体方式:
+
+### 如果你用的是简单Server部署
+此刻,请你用浏览器打开你的ota地址,例如我的ota地址
+```
+http://192.168.1.25:8003/xiaozhi/ota/
+```
+如果显示“OTA接口运行正常,向设备发送的websocket地址是:ws://xxx:8000/xiaozhi/v1/
+
+你可以使用项目自带的`test_page.html`测试一下,是否能连上ota页面输出的websocket地址。
+
+如果访问不到,你需要到配置文件`.config.yaml`里修改`server.websocket`的地址,重启后再重新测试,直到`test_page.html`能正常访问。
+
+成功后,请往下进行第2步
+
+### 如果你用的是全模块部署
+此刻,请你用浏览器打开你的ota地址,例如我的ota地址
+```
+http://192.168.1.25:8002/xiaozhi/ota/
+```
+
+如果显示“OTA接口运行正常,websocket集群数量:X”。那就往下进行2步。
+
+如果显示“OTA接口运行不正常”,大概是你还没在`智控台`配置`Websocket`地址。那就:
+
+- 1、使用超级管理员登录智控台
+
+- 2、顶部菜单点击`参数管理`
+
+- 3、在列表中找到`server.websocket`项目,输入你的`Websocket`地址。例如我的就是
+
+```
+ws://192.168.1.25:8000/xiaozhi/v1/
+```
+
+配置完后,再使用浏览器刷新你的ota接口地址,看看是不是正常了。如果还不正常就,就再次确认一下Websocket是否正常启动,是否配置了Websocket地址。
+
+## 第2步 配置环境
+先按照这个教程配置项目环境[《Windows搭建 ESP IDF 5.3.2开发环境以及编译小智》](https://icnynnzcwou8.feishu.cn/wiki/JEYDwTTALi5s2zkGlFGcDiRknXf)
+
+## 第3步 打开配置文件
+配置好编译环境后,下载虾哥iaozhi-esp32项目源码,
+
+从这里下载虾哥[xiaozhi-esp32项目源码](https://github.com/78/xiaozhi-esp32)。
+
+下载后,打开`xiaozhi-esp32/main/Kconfig.projbuild`文件。
+
+## 第4步 修改OTA地址
+
+找到`OTA_URL`的`default`的内容,把`https://api.tenclass.net/xiaozhi/ota/`
+   改成你自己的地址,例如,我的接口地址是`http://192.168.1.25:8002/xiaozhi/ota/`,就把内容改成这个。
+
+修改前:
+```
+config OTA_URL
+    string "Default OTA URL"
+    default "https://api.tenclass.net/xiaozhi/ota/"
+    help
+        The application will access this URL to check for new firmwares and server address.
+```
+修改后:
+```
+config OTA_URL
+    string "Default OTA URL"
+    default "http://192.168.1.25:8002/xiaozhi/ota/"
+    help
+        The application will access this URL to check for new firmwares and server address.
+```
+
+## 第4步 设置编译参数
+
+设置编译参数
+
+```
+# 终端命令行进入xiaozhi-esp32的根目录
+cd xiaozhi-esp32
+# 例如我使用的板子是esp32s3,所以设置编译目标为esp32s3,如果你的板子是其他型号,请替换成对应的型号
+idf.py set-target esp32s3
+# 进入菜单配置
+idf.py menuconfig
+```
+
+进入菜单配置后,再进入`Xiaozhi Assistant`,将`BOARD_TYPE`设置你板子的具体型号
+保存退出,回到终端命令行。
+
+## 第5步 编译固件
+
+```
+idf.py build
+```
+
+## 第6步 打包bin固件
+
+```
+cd scripts
+python release.py
+```
+
+上面的打包命令执行完成后,会在项目根目录下的`build`目录下生成固件文件`merged-binary.bin`。
+这个`merged-binary.bin`就是要烧录到硬件上的固件文件。
+
+注意:如果执行到第二命令后,报了“zip”相关的错误,请忽略这个错误,只要`build`目录下生成固件文件`merged-binary.bin`
+,对你没有太大影响,请继续。
+
+## 第7步 烧录固件
+   将esp32设备连接电脑,使用chrome浏览器,打开以下网址
+
+```
+https://espressif.github.io/esp-launchpad/
+```
+
+打开这个教程,[Flash工具/Web端烧录固件(无IDF开发环境)](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS)。
+翻到:`方式二:ESP-Launchpad 浏览器WEB端烧录`,从`3. 烧录固件/下载到开发板`开始,按照教程操作。
+
+烧录成功且联网成功后,通过唤醒词唤醒小智,留意server端输出的控制台信息。
+
+## 常见问题
+以下是一些常见问题,供参考:
+
+[1、为什么我说的话,小智识别出来很多韩文、日文、英文](./FAQ.md)
+
+[2、为什么会出现“TTS 任务出错 文件不存在”?](./FAQ.md)
+
+[3、TTS 经常失败,经常超时](./FAQ.md)
+
+[4、使用Wifi能连接自建服务器,但是4G模式却接不上](./FAQ.md)
+
+[5、如何提高小智对话响应速度?](./FAQ.md)
+
+[6、我说话很慢,停顿时小智老是抢话](./FAQ.md)
+
+[7、我想通过小智控制电灯、空调、远程开关机等操作](./FAQ.md)

+ 54 - 0
docs/firmware-setting.md

@@ -0,0 +1,54 @@
+# 基于虾哥编译好的固件配置自定义服务器
+
+## 第1步 确认版本
+烧录虾哥已经编译好的[1.6.1版本以上固件](https://github.com/78/xiaozhi-esp32/releases)
+
+## 第2步 准备你的ota地址
+如果你按照教程使用的是全模块部署,就应该会有ota地址。
+
+此刻,请你用浏览器打开你的ota地址,例如我的ota地址
+```
+https://2662r3426b.vicp.fun/xiaozhi/ota/
+```
+
+如果显示“OTA接口运行正常,websocket集群数量:X”。那就往下。
+
+如果显示“OTA接口运行不正常”,大概是你还没在`智控台`配置`Websocket`地址。那就:
+
+- 1、使用超级管理员登录智控台
+
+- 2、顶部菜单点击`参数管理`
+
+- 3、在列表中找到`server.websocket`项目,输入你的`Websocket`地址。例如我的就是
+
+```
+wss://2662r3426b.vicp.fun/xiaozhi/v1/
+```
+
+配置完后,再使用浏览器刷新你的ota接口地址,看看是不是正常了。如果还不正常就,就再次确认一下Websocket是否正常启动,是否配置了Websocket地址。
+
+## 第3步 进入配网模式
+进入机器的配网模式,在页面顶部,点击“高级选项”,在里面输入你服务器的`ota`地址,点击保存。重启设备
+![请参考-OTA地址设置](../docs/images/firmware-setting-ota.png)
+
+## 第4步 唤醒小智,查看日志输出
+
+唤醒小智,看看日志是不是正常输出。
+
+
+## 常见问题
+以下是一些常见问题,供参考:
+
+[1、为什么我说的话,小智识别出来很多韩文、日文、英文](./FAQ.md)
+
+[2、为什么会出现“TTS 任务出错 文件不存在”?](./FAQ.md)
+
+[3、TTS 经常失败,经常超时](./FAQ.md)
+
+[4、使用Wifi能连接自建服务器,但是4G模式却接不上](./FAQ.md)
+
+[5、如何提高小智对话响应速度?](./FAQ.md)
+
+[6、我说话很慢,停顿时小智老是抢话](./FAQ.md)
+
+[7、我想通过小智控制电灯、空调、远程开关机等操作](./FAQ.md)

+ 72 - 0
docs/fish-speech-integration.md

@@ -0,0 +1,72 @@
+登录AutoDL,租赁镜像
+选择镜像:
+```
+PyTorch / 2.1.0 / 3.10(ubuntu22.04) / cuda 12.1
+```
+
+机器开机后,设置学术加速
+```
+source /etc/network_turbo
+```
+
+进入工作目录
+```
+cd autodl-tmp/
+```
+
+拉取项目
+```
+git clone https://gitclone.com/github.com/fishaudio/fish-speech.git ; cd fish-speech
+```
+
+安装依赖
+```
+pip install -e.
+```
+
+如果报错,安装portaudio
+```
+apt-get install portaudio19-dev -y
+```
+
+安装后执行
+```
+pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu121
+```
+
+下载模型
+```
+cd tools
+python download_models.py 
+```
+
+下载完模型后运行接口
+```
+python -m tools.api_server --listen 0.0.0.0:6006 
+```
+
+然后用浏览器去到aotodl实例页面
+```
+https://autodl.com/console/instance/list
+```
+
+如下图点击你刚才机器的`自定义服务`按钮,开启端口转发服务
+![自定义服务](images/fishspeech/autodl-01.png)
+
+端口转发服务设置完成后,你本地电脑打开网址`http://localhost:6006/`,就可以访问fish-speech的接口了
+![服务预览](images/fishspeech/autodl-02.png)
+
+
+如果你是单模块部署,核心配置如下
+```
+selected_module:
+  TTS: FishSpeech
+TTS:
+  FishSpeech:
+    reference_audio: ["config/assets/wakeup_words.wav",]
+    reference_text: ["哈啰啊,我是小智啦,声音好听的台湾女孩一枚,超开心认识你耶,最近在忙啥,别忘了给我来点有趣的料哦,我超爱听八卦的啦",]
+    api_key: "123"
+    api_url: "http://127.0.0.1:6006/v1/tts"
+```
+
+然后重启服务

Plik diff jest za duży
+ 226 - 0
docs/homeassistant-integration.md


+ 58 - 0
docs/huoshan-streamTTS-voice-cloning.md

@@ -0,0 +1,58 @@
+# 智控台 火山双流式语音合成+音色克隆配置教程
+
+本教程分为4个阶段:准备阶段、配置阶段、克隆阶段、使用阶段。主要是介绍通过智控台配置火山双流式语音合成+音色克隆的过程。
+
+## 第一阶段:准备阶段
+超级管理员先预先把火山引擎服务开通好,获取到App Id,Access Token。默认火上引擎会赠送一个音色资源。这个音色资源需要把它复制到本项目里。
+
+如果你想克隆多个音色,需要购买开通多个音色资源。只要把每个音色资源的声音ID(S_xxxxx)复制到本项目。然后分配给系统的账号使用即可。以下是详细步骤:
+
+### 1.开通火山引擎服务
+访问 https://console.volcengine.com/speech/app  在应用管理创建应用,勾选语音合成大模型和声音复刻大模型。
+
+### 2.获取音色资源ID
+访问 https://console.volcengine.com/speech/service/9999 复制三项内容,分别是App Id,Access Token以及声音ID(S_xxxxx)。如图
+
+![获取音色资源](images/image-clone-integration-01.png)
+
+## 第二阶段:配置火山引擎服务
+
+### 1.填写火山引擎配置
+
+使用超级管理员账号登录智控台,点击顶部【模型配置】,再点击模型配置页面左侧的【语音合成】,搜索找到“火山双流式语音合成”,点击修改,将你火山引擎的`App Id`填入到【应用ID】字段里,将`Access Token`填入到【访问令牌】字段里。然后保存。
+
+### 2.将音色资源ID分配给系统账号
+
+使用超级管理员账号登录智控台,点击顶部`参数字典`,在下拉菜单中,点击`系统功能配置`页面。在页面上勾选`音色克隆`,点击保存配置。即可在顶部菜单看到`音色克隆`按钮。
+
+使用超级管理员账号登录智控台,点击顶部【音色克隆】、【音色资源】。
+
+点击新增按钮,在【平台名称】选择“火山双流式语音合成”;
+
+在【音色资源ID】填入你火山引擎的声音资源ID(S_xxxxx),填入后按回车;
+
+在【归属账号】选择你要分配给的系统账号,你可以分配给你自己。然后点击保存
+
+## 第三阶段:克隆阶段
+
+如果登录后,点击顶部【音色克隆】》【音色克隆】,显示【您的账号暂无音色资源请联系管理员分配音色资源】,说明你在第二阶段还没有把音色资源ID分配给这个账号。那就是回到第二阶段,分配音色资源给对应的账号。
+
+如果登录后,点击顶部【音色克隆】》【音色克隆】,能看到对应的音色列表。请继续。
+
+在列表里会看到对应的音色列表。选择其中一个音色资源,点击【上传音频】按钮。上传后,可以试听一下声音或者截取某段声音。确认后点击【上传音频】按钮。
+![上传音频](images/image-clone-integration-02.png)
+
+上传音频后,在列表里会看到对应的音色会变成“待复刻”状态。点击【立即复刻】按钮。等1~2秒会返回结果。
+
+如果复刻失败,请将鼠标放到“错误信息”图标上,会显示失败的原因。
+
+如果复刻成功,在列表里会看到对应的音色会变成“训练成功”状态。此时你可以点击【声音名称】栏的修改按钮,修改音色资源的名称,方便后期选择使用。
+
+## 第四阶段:使用阶段
+
+点击顶部【智能体管理】,选择任意一个智能体,点击【配置角色】按钮。
+
+语音合成(TTS)选择“火山双流式语音合成”。在列表里,找到名字带有“克隆音色”的音色资源(如图),选择它,点击保存。
+![选择音色](images/image-clone-integration-03.png)
+
+接下来,可以唤醒小智和它对话。

+ 0 - 0
docs/images/__init__.py


BIN
docs/images/alisms/sms-01.png


BIN
docs/images/alisms/sms-02.png


BIN
docs/images/alisms/sms-11.png


BIN
docs/images/alisms/sms-21.png


BIN
docs/images/alisms/sms-22.png


BIN
docs/images/alisms/sms-23.png


BIN
docs/images/alisms/sms-24.png


BIN
docs/images/alisms/sms-25.png


BIN
docs/images/alisms/sms-31.png


BIN
docs/images/alisms/sms-32.png


BIN
docs/images/banner1.png


BIN
docs/images/banner2.png


BIN
docs/images/conda_env_1.png


BIN
docs/images/conda_env_2.png


BIN
docs/images/demo0.png


BIN
docs/images/demo1.png


BIN
docs/images/demo10.png


BIN
docs/images/demo11.png


BIN
docs/images/demo12.png


BIN
docs/images/demo13.png


BIN
docs/images/demo14.png


BIN
docs/images/demo2.png


BIN
docs/images/demo3.png


BIN
docs/images/demo4.png


BIN
docs/images/demo5.png


BIN
docs/images/demo6.png


BIN
docs/images/demo7.png


BIN
docs/images/demo8.png


BIN
docs/images/demo9.png


BIN
docs/images/deploy1.png


BIN
docs/images/deploy2.png


BIN
docs/images/firmware-setting-ota.png


BIN
docs/images/fishspeech/autodl-01.png


BIN
docs/images/fishspeech/autodl-02.png


BIN
docs/images/hnlg.jpg


BIN
docs/images/image-clone-integration-01.png


BIN
docs/images/image-clone-integration-02.png


BIN
docs/images/image-clone-integration-03.png


BIN
docs/images/image-ha-integration-01.png


BIN
docs/images/image-ha-integration-02.png


BIN
docs/images/image-ha-integration-03.png


BIN
docs/images/image-ha-integration-04.png


BIN
docs/images/image-ha-integration-05.png


BIN
docs/images/image-ha-integration-06.png


BIN
docs/images/logo_bailing.png


BIN
docs/images/logo_contributors.png


BIN
docs/images/logo_huiyuan.png


BIN
docs/images/logo_junsen.png


BIN
docs/images/logo_qinren.png


BIN
docs/images/logo_tenclass.png


BIN
docs/images/logo_xuanfeng.png


BIN
docs/images/manager-mobile/打包发行步骤1.png


BIN
docs/images/manager-mobile/打包发行步骤2.png


BIN
docs/images/manager-mobile/本地运行.png


BIN
docs/images/manager-mobile/生成appid.png


BIN
docs/images/manager-mobile/重新识别项目.png


+ 195 - 0
docs/index-stream-integration.md

@@ -0,0 +1,195 @@
+# IndexStreamTTS 使用指南
+
+## 环境准备
+### 1. 克隆项目 
+```bash 
+git clone https://github.com/Ksuriuri/index-tts-vllm.git
+```
+进入解压后的目录
+```bash
+cd index-tts-vllm
+```
+切换到指定版本 (使用VLLM-0.10.2的历史版本)
+```bash
+git checkout 224e8d5e5c8f66801845c66b30fa765328fd0be3
+```
+
+### 2. 创建并激活 conda 环境
+```bash 
+conda create -n index-tts-vllm python=3.12
+conda activate index-tts-vllm
+```
+
+### 3. 安装PyTorch 需要版本为2.8.0(最新版)
+#### 查看显卡最高支持的版本和实际安装的版本
+```bash
+nvidia-smi
+nvcc --version
+``` 
+#### 驱动支持的最高 CUDA 版本
+```bash
+CUDA Version: 12.8
+```
+#### 实际安装的 CUDA 编译器版本
+```bash
+Cuda compilation tools, release 12.8, V12.8.89
+```
+#### 那么对应的安装命令(pytorch默认给的是12.8的驱动版本)
+```bash
+pip install torch torchvision
+```
+需要 pytorch 版本 2.8.0(对应 vllm 0.10.2),具体安装指令请参考:[pytorch 官网](https://pytorch.org/get-started/locally/)
+
+### 4. 安装依赖
+```bash 
+pip install -r requirements.txt
+```
+
+### 5. 下载模型权重
+### 方案一:下载官方权重文件后转换
+此为官方权重文件,下载到本地任意路径即可,支持 IndexTTS-1.5 的权重  
+| HuggingFace                                                   | ModelScope                                                          |
+|---------------------------------------------------------------|---------------------------------------------------------------------|
+| [IndexTTS](https://huggingface.co/IndexTeam/Index-TTS)        | [IndexTTS](https://modelscope.cn/models/IndexTeam/Index-TTS)        |
+| [IndexTTS-1.5](https://huggingface.co/IndexTeam/IndexTTS-1.5) | [IndexTTS-1.5](https://modelscope.cn/models/IndexTeam/IndexTTS-1.5) |
+
+下面以ModelScope的安装方法为例  
+#### 请注意:git需要安装并初始化启用lfs(如已安装可以跳过)
+```bash
+sudo apt-get install git-lfs
+git lfs install
+```
+创建模型目录,并拉取模型
+```bash 
+mkdir model_dir
+cd model_dir
+git clone https://www.modelscope.cn/IndexTeam/IndexTTS-1.5.git
+```
+
+#### 模型权重转换
+```bash 
+bash convert_hf_format.sh /path/to/your/model_dir
+```
+例如:你下载的IndexTTS-1.5模型存放在model_dir目录下,则执行以下命令
+```bash
+bash convert_hf_format.sh model_dir/IndexTTS-1.5
+```
+此操作会将官方的模型权重转换为 transformers 库兼容的版本,保存在模型权重路径下的 vllm 文件夹中,方便后续 vllm 库加载模型权重
+
+### 6. 更改接口适配一下项目
+接口返回数据与项目不适配需要调整一下,使其直接返回音频数据
+```bash
+vi api_server.py
+```
+```bash 
+@app.post("/tts", responses={
+    200: {"content": {"application/octet-stream": {}}},
+    500: {"content": {"application/json": {}}}
+})
+async def tts_api(request: Request):
+    try:
+        data = await request.json()
+        text = data["text"]
+        character = data["character"]
+
+        global tts
+        sr, wav = await tts.infer_with_ref_audio_embed(character, text)
+
+        return Response(content=wav.tobytes(), media_type="application/octet-stream")
+        
+    except Exception as ex:
+        tb_str = ''.join(traceback.format_exception(type(ex), ex, ex.__traceback__))
+        print(tb_str)
+        return JSONResponse(
+            status_code=500,
+            content={
+                "status": "error",
+                "error": str(tb_str)
+            }
+        )
+```
+
+### 7.编写sh启动脚本(请注意要在相应的conda环境下运行)
+```bash 
+vi start_api.sh
+```
+### 将下面内容粘贴进去并按:输入wq保存  
+#### 脚本中的/home/system/index-tts-vllm/model_dir/IndexTTS-1.5 请自行修改为实际路径
+```bash
+# 激活conda环境
+conda activate index-tts-vllm 
+echo "激活项目conda环境"
+sleep 2
+# 查找占用11996端口的进程号
+PID_VLLM=$(sudo netstat -tulnp | grep 11996 | awk '{print $7}' | cut -d'/' -f1)
+
+# 检查是否找到进程号
+if [ -z "$PID_VLLM" ]; then
+  echo "没有找到占用11996端口的进程"
+else
+  echo "找到占用11996端口的进程,进程号为: $PID_VLLM"
+  # 先尝试普通kill,等待2秒
+  kill $PID_VLLM
+  sleep 2
+  # 检查进程是否还在
+  if ps -p $PID_VLLM > /dev/null; then
+    echo "进程仍在运行,强制终止..."
+    kill -9 $PID_VLLM
+  fi
+  echo "已终止进程 $PID_VLLM"
+fi
+
+# 查找占用VLLM::EngineCore进程
+GPU_PIDS=$(ps aux | grep -E "VLLM|EngineCore" | grep -v grep | awk '{print $2}')
+
+# 检查是否找到进程号
+if [ -z "$GPU_PIDS" ]; then
+  echo "没有找到VLLM相关进程"
+else
+  echo "找到VLLM相关进程,进程号为: $GPU_PIDS"
+  # 先尝试普通kill,等待2秒
+  kill $GPU_PIDS
+  sleep 2
+  # 检查进程是否还在
+  if ps -p $GPU_PIDS > /dev/null; then
+    echo "进程仍在运行,强制终止..."
+    kill -9 $GPU_PIDS
+  fi
+  echo "已终止进程 $GPU_PIDS"
+fi
+
+# 创建tmp目录(如果不存在)
+mkdir -p tmp
+
+# 后台运行api_server.py,日志重定向到tmp/server.log
+nohup python api_server.py --model_dir /home/system/index-tts-vllm/model_dir/IndexTTS-1.5 --port 11996 > tmp/server.log 2>&1 &
+echo "api_server.py 已在后台运行,日志请查看 tmp/server.log"
+```
+给脚本执行权限并运行脚本
+```bash 
+chmod +x start_api.sh
+./start_api.sh
+```
+日志会在tmp/server.log中输出,可以通过以下命令查看日志情况
+```bash
+tail -f tmp/server.log
+```
+如果显卡内存足够,可在脚本中添加启动参数 ----gpu_memory_utilization 来调整显存占用比例,默认值为 0.25
+
+## 音色配置
+index-tts-vllm支持通过配置文件注册自定义音色,支持单音色和混合音色配置。  
+在项目根目录下的assets/speaker.json文件中配置自定义音色
+### 配置格式说明
+```bash
+{
+    "说话人名称1": [
+        "音频文件路径1.wav",
+        "音频文件路径2.wav"
+    ],
+    "说话人名称2": [
+        "音频文件路径3.wav"
+    ]
+}
+```
+### 注意 (配置角色后需重启服务进行音色注册)
+添加后需在智控台中添加相应的说话人(单模块则更换相应的voice)

+ 126 - 0
docs/mcp-endpoint-enable.md

@@ -0,0 +1,126 @@
+# MCP 接入点部署使用指南
+
+本教程包含3个部分
+- 1、如何部署MCP接入点这个服务
+- 2、全模块部署时,怎么配置MCP接入点
+- 3、单模块部署时,怎么配置MCP接入点
+
+# 1、如何部署MCP接入点这个服务
+
+## 第一步,下载mcp接入点项目源码
+
+浏览器打开[mcp接入点项目地址](https://github.com/xinnan-tech/mcp-endpoint-server)
+
+打开完,找到页面中一个绿色的按钮,写着`Code`的按钮,点开它,然后你就看到`Download ZIP`的按钮。
+
+点击它,下载本项目源码压缩包。下载到你电脑后,解压它,此时它的名字可能叫`mcp-endpoint-server-main`
+你需要把它重命名成`mcp-endpoint-server`。
+
+## 第二步,启动程序
+这个项目是一个很简单的项目,建议使用docker运行。不过如果你不想使用docker运行,你可以参考[这个页面](https://github.com/xinnan-tech/mcp-endpoint-server/blob/main/README_dev.md)使用源码运行。以下是docker运行的方法
+
+```
+# 进入本项目源码根目录
+cd mcp-endpoint-server
+
+# 清除缓存
+docker compose -f docker-compose.yml down
+docker stop mcp-endpoint-server
+docker rm mcp-endpoint-server
+docker rmi ghcr.nju.edu.cn/xinnan-tech/mcp-endpoint-server:latest
+
+# 启动docker容器
+docker compose -f docker-compose.yml up -d
+# 查看日志
+docker logs -f mcp-endpoint-server
+```
+
+此时,日志里会输出类似以下的日志
+```
+250705 INFO-=====下面的地址分别是智控台/单模块MCP接入点地址====
+250705 INFO-智控台MCP参数配置: http://172.22.0.2:8004/mcp_endpoint/health?key=abc
+250705 INFO-单模块部署MCP接入点: ws://172.22.0.2:8004/mcp_endpoint/mcp/?token=def
+250705 INFO-=====请根据具体部署选择使用,请勿泄露给任何人======
+```
+
+请你把两个接口地址复制出来:
+
+由于你是docker部署,切不可直接使用上面的地址!
+
+由于你是docker部署,切不可直接使用上面的地址!
+
+由于你是docker部署,切不可直接使用上面的地址!
+
+你先把地址复制出来,放在一个草稿里,你要知道你的电脑的局域网ip是什么,例如我的电脑局域网ip是`192.168.1.25`,那么
+原来我的接口地址
+```
+智控台MCP参数配置: http://172.22.0.2:8004/mcp_endpoint/health?key=abc
+单模块部署MCP接入点: ws://172.22.0.2:8004/mcp_endpoint/mcp/?token=def
+```
+就要改成
+```
+智控台MCP参数配置: http://192.168.1.25:8004/mcp_endpoint/health?key=abc
+单模块部署MCP接入点: ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=def
+```
+
+改好后,请使用浏览器直接访问`智控台MCP参数配置`。当浏览器出现类似这样的代码,说明是成功了。
+```
+{"result":{"status":"success","connections":{"tool_connections":0,"robot_connections":0,"total_connections":0}},"error":null,"id":null,"jsonrpc":"2.0"}
+```
+
+请你保留好上面两个`接口地址`,下一步要用到。
+
+# 2、全模块部署时,怎么配置MCP接入点
+首先,你要开启MCP接入点功能。在智控台,点击顶部`参数字典`,在下拉菜单中,点击`系统功能配置`页面。在页面上勾选`MCP接入点`,点击`保存配置`。在`角色配置`页面,点击`编辑功能`按钮,即可看到`mcp接入点`功能。
+
+如果你是全模块部署,使用管理员账号,登录智控台,点击顶部`参数字典`,选择`参数管理`功能。
+
+然后搜索参数`server.mcp_endpoint`,此时,它的值应该是`null`值。
+点击修改按钮,把上一步得来的`智控台MCP参数配置`粘贴到`参数值`里。然后保存。
+
+如果能保存成功,说明一切顺利,你可以去智能体查看效果了。如果不成功,说明智控台无法访问mcp接入点,很大概率是网络防火墙,或者没有填写正确的局域网ip。
+
+# 3、单模块部署时,怎么配置MCP接入点
+
+如果你是单模块部署,找到你的配置文件`data/.config.yaml`。
+在配置文件搜索`mcp_endpoint`,如果没有找到,你就增加`mcp_endpoint`配置。类似我是就是这样
+```
+server:
+  websocket: ws://你的ip或者域名:端口号/xiaozhi/v1/
+  http_port: 8002
+log:
+  log_level: INFO
+
+# 此处可能还更多配置..
+
+mcp_endpoint: 你的接入点websocket地址
+```
+这时,请你把`如何部署MCP接入点这个服务`中得到的`单模块部署MCP接入点` 粘贴到 `mcp_endpoint`中。类似这样
+
+```
+server:
+  websocket: ws://你的ip或者域名:端口号/xiaozhi/v1/
+  http_port: 8002
+log:
+  log_level: INFO
+
+# 此处可能还更多配置
+
+mcp_endpoint: ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=def
+```
+
+配置好后,启动单模块会输出如下的日志。
+```
+250705[__main__]-INFO-初始化组件: vad成功 SileroVAD
+250705[__main__]-INFO-初始化组件: asr成功 FunASRServer
+250705[__main__]-INFO-OTA接口是          http://192.168.1.25:8002/xiaozhi/ota/
+250705[__main__]-INFO-视觉分析接口是     http://192.168.1.25:8002/mcp/vision/explain
+250705[__main__]-INFO-mcp接入点是        ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc
+250705[__main__]-INFO-Websocket地址是    ws://192.168.1.25:8000/xiaozhi/v1/
+250705[__main__]-INFO-=======上面的地址是websocket协议地址,请勿用浏览器访问=======
+250705[__main__]-INFO-如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
+250705[__main__]-INFO-=============================================================
+```
+
+如上,如果能输出类似的`mcp接入点是`中`ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc`说明配置成功了。
+

+ 94 - 0
docs/mcp-endpoint-integration.md

@@ -0,0 +1,94 @@
+# MCP 接入点使用指南
+
+本教程以虾哥开源的mcp计算器功能为示例,介绍如何将自己自定义的mcp服务接入到自己的接入点里。
+
+本教程的前提是,你的`xiaozhi-server`已经启用了mcp接入点功能,如果你还没启用,可以先根据[这个教程](./mcp-endpoint-enable.md)启用。
+
+# 如何为智能体接入一个简单的mcp功能,如计算器功能
+
+### 如果你是全模块部署
+如果你是全模块部署,你可以进入智控台,智能体管理,点击`配置角色`,在`意图识别`的右边,有一个`编辑功能`的按钮。
+
+点击这个按钮。在弹出的页面里,位于底部,会有`MCP接入点`,正常来说,会显示这个智能体的`MCP接入点地址`,接下来,我们来给这个智能体扩展一个基于MCP技术的计算器的功能。
+
+这个`MCP接入点地址`很重要,你等一下会用到。
+
+### 如果你是单模块部署
+如果你是单模块部署,且你已经在配置文件里配置了MCP接入点地址,那么正常来说,单模块部署启动的时候,会输出如下的日志。
+```
+250705[__main__]-INFO-初始化组件: vad成功 SileroVAD
+250705[__main__]-INFO-初始化组件: asr成功 FunASRServer
+250705[__main__]-INFO-OTA接口是          http://192.168.1.25:8002/xiaozhi/ota/
+250705[__main__]-INFO-视觉分析接口是     http://192.168.1.25:8002/mcp/vision/explain
+250705[__main__]-INFO-mcp接入点是        ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc
+250705[__main__]-INFO-Websocket地址是    ws://192.168.1.25:8000/xiaozhi/v1/
+250705[__main__]-INFO-=======上面的地址是websocket协议地址,请勿用浏览器访问=======
+250705[__main__]-INFO-如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
+250705[__main__]-INFO-=============================================================
+```
+
+如上,输出`mcp接入点是`中`ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc`就是你的`MCP接入点地址`。
+
+这个`MCP接入点地址`很重要,你等一下会用到。
+
+## 第一步 下载虾哥MCP计算器项目代码
+
+浏览器打开虾哥写的[计算器项目](https://github.com/78/mcp-calculator),
+
+打开完,找到页面中一个绿色的按钮,写着`Code`的按钮,点开它,然后你就看到`Download ZIP`的按钮。
+
+点击它,下载本项目源码压缩包。下载到你电脑后,解压它,此时它的名字可能叫`mcp-calculatorr-main`
+你需要把它重命名成`mcp-calculator`。接下来,我们用命令行进入项目目录即安装依赖
+
+
+```bash
+# 进入项目目录
+cd mcp-calculator
+
+conda remove -n mcp-calculator --all -y
+conda create -n mcp-calculator python=3.10 -y
+conda activate mcp-calculator
+
+pip install -r requirements.txt
+```
+
+## 第二步 启动
+
+启动前,先从你的智控台的智能体里,复制到了MCP接入点的地址。
+
+例如我的智能体的mcp地址是
+```
+ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc
+```
+
+开始输入命令
+
+```bash
+export MCP_ENDPOINT=ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc
+```
+
+输入完后,启动程序
+
+```bash
+python mcp_pipe.py calculator.py
+```
+
+### 如果你是智控台部署
+如果你是智控台部署,启动完后,你再进入智控台,点击刷新MCP的接入状态,就会看到你扩展的功能列表了。
+
+### 如果你是单模块部署
+如果你是单模块部署,当设备连接后,会输出类似的日志,说明成功了
+
+```
+250705 -INFO-正在初始化MCP接入点: wss://2662r3426b.vicp.fun/mcp_e 
+250705 -INFO-发送MCP接入点初始化消息
+250705 -INFO-MCP接入点连接成功
+250705 -INFO-MCP接入点初始化成功
+250705 -INFO-统一工具处理器初始化完成
+250705 -INFO-MCP接入点服务器信息: name=Calculator, version=1.9.4
+250705 -INFO-MCP接入点支持的工具数量: 1
+250705 -INFO-所有MCP接入点工具已获取,客户端准备就绪
+250705 -INFO-工具缓存已刷新
+250705 -INFO-当前支持的函数列表: [ 'get_time', 'get_lunar', 'play_music', 'get_weather', 'handle_exit_intent', 'calculator']
+```
+如果包含了 `'calculator'`,说明设备将可以根据意图识别,调用计算器这个工具。

+ 40 - 0
docs/mcp-get-device-info.md

@@ -0,0 +1,40 @@
+# MCP 方法如何获取设备信息
+
+本教程将指导你如何使用MCP方法获取设备信息。
+
+第一步:自定义你的`agent-base-prompt.txt`文件
+
+把xiaozhi-server目录的`agent-base-prompt.txt`文件内容复制到你的`data`目录下,并重命名为`.agent-base-prompt.txt`。
+
+第二步:修改`data/.agent-base-prompt.txt`文件,找到`<context>`标签,在标签内容中添加以下代码内容:
+```
+- **设备ID:** {{device_id}}
+```
+
+添加完成后,你的`data/.agent-base-prompt.txt`文件的`<context>`标签内容大致如下:
+```
+<context>
+【重要!以下信息已实时提供,无需调用工具查询,请直接使用:】
+- **设备ID:** {{device_id}}
+- **当前时间:** {{current_time}}
+- **今天日期:** {{today_date}} ({{today_weekday}})
+- **今天农历:** {{lunar_date}}
+- **用户所在城市:** {{local_address}}
+- **当地未来7天天气:** {{weather_info}}
+</context>
+```
+
+第三步:修改`data/.config.yaml`文件,找到`agent-base-prompt`配置,修改前内容如下:
+```
+prompt_template: agent-base-prompt.txt
+```
+修改成
+```
+prompt_template: data/.agent-base-prompt.txt
+```
+
+第四步:重启你的xiaozhi-server服务。
+
+第五步:在你的mcp方法增加名称为`device_id`,类型为`string`,描述为`设备ID`的参数。
+
+第六步:重新唤醒小智,让他调用mcp方法,查看你的mcp方法是否可以获取`设备ID`。

+ 171 - 0
docs/mcp-vision-integration.md

@@ -0,0 +1,171 @@
+# 视觉模型使用指南
+本教程分为两部分:
+- 第一部分:单模块运行xiaozhi-server开启视觉模型
+- 第二部分:全模块运行时,如何开启视觉模型
+
+开启视觉模型前,你需要准备三件事:
+- 你需要准备一台带摄像头的设备,而且这台设备已经在虾哥仓库里,实现了调用摄像头功能。例如`立创·实战派ESP32-S3开发板`
+- 你设备固件的版本升级到1.6.6及以上
+- 你已经成功跑通基础对话模块
+
+## 单模块运行xiaozhi-server开启视觉模型
+
+### 第一步确认网络
+由于视觉模型会默认启动8003端口。
+
+如果你是docker运行,请确认一下你的`docker-compose.yml`是否放了`8003`端口,如果没有就更新最新的`docker-compose.yml`文件
+
+如果你是源码运行,确认防火墙是否放行`8003`端口
+
+### 第二步选择你的视觉模型
+打开你的`data/.config.yaml`文件,设置你的`selected_module.VLLM`设置为某个视觉模型。目前我们已经支持`openai`类型接口的视觉模型。`ChatGLMVLLM`就是其中一款兼容`openai`的模型。
+
+```
+selected_module:
+  VAD: ..
+  ASR: ..
+  LLM: ..
+  VLLM: ChatGLMVLLM
+  TTS: ..
+  Memory: ..
+  Intent: ..
+```
+
+假设我们使用`ChatGLMVLLM`作为视觉模型,那我们需要先登录[智谱AI](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)网站,申请密钥。如果你之前已经申请过了密钥,可以复用这个密钥。
+
+在你的配置文件中,增加这个配置,如果已经有了这个配置,就设置好你的api_key。
+
+```
+VLLM:
+  ChatGLMVLLM:
+    api_key: 你的api_key
+```
+
+### 第三步启动xiaozhi-server服务
+如果你是源码,就输入命令启动
+```
+python app.py
+```
+如果你是docker运行,就重启容器
+```
+docker restart xiaozhi-esp32-server
+```
+
+启动后会输出以下内容的日志。
+
+```
+2025-06-01 **** - OTA接口是           http://192.168.4.7:8003/xiaozhi/ota/
+2025-06-01 **** - 视觉分析接口是        http://192.168.4.7:8003/mcp/vision/explain
+2025-06-01 **** - Websocket地址是       ws://192.168.4.7:8000/xiaozhi/v1/
+2025-06-01 **** - =======上面的地址是websocket协议地址,请勿用浏览器访问=======
+2025-06-01 **** - 如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
+2025-06-01 **** - =============================================================
+```
+
+启动后,使用使用浏览器打开日志里`视觉分析接口`连接。看看输出了什么?如果你是linux,没有浏览器,你可以执行这个命令:
+```
+curl -i 你的视觉分析接口
+```
+
+正常来说会这样显示
+```
+MCP Vision 接口运行正常,视觉解释接口地址是:http://xxxx:8003/mcp/vision/explain
+```
+
+请注意,如果你是公网部署,或者docker部署,一定要改一下你的`data/.config.yaml`里这个配置
+```
+server:
+  vision_explain: http://你的ip或者域名:端口号/mcp/vision/explain
+```
+
+为什么呢?因为视觉解释接口需要下发到设备,如果你的地址是局域网地址,或者是docker内部地址,设备是无法访问的。
+
+假设你的公网地址是`111.111.111.111`,那么`vision_explain`应该这么配
+
+```
+server:
+  vision_explain: http://111.111.111.111:8003/mcp/vision/explain
+```
+
+如果你的MCP Vision 接口运行正常,且你也试着用浏览器访问正常打开下发的`视觉解释接口地址`,请继续下一步
+
+### 第四步 设备唤醒开启
+
+对设备说“请打开摄像头,说你你看到了什么”
+
+留意xiaozhi-server的日志输出,看看有没有报错。
+
+
+## 全模块运行时,如何开启视觉模型
+
+### 第一步 确认网络
+由于视觉模型会默认启动8003端口。
+
+如果你是docker运行,请确认一下你的`docker-compose_all.yml`是否映射了`8003`端口,如果没有就更新最新的`docker-compose_all.yml`文件
+
+如果你是源码运行,确认防火墙是否放行`8003`端口
+
+### 第二步 确认你配置文件
+
+打开你的`data/.config.yaml`文件,确认一下你的配置文件的结构,是否和`data/config_from_api.yaml`一样。如果不一样,或缺少某项,请补齐。
+
+### 第三步 配置视觉模型密钥
+
+那我们需要先登录[智谱AI](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)网站,申请密钥。如果你之前已经申请过了密钥,可以复用这个密钥。
+
+登录`智控台`,顶部菜单点击`模型配置`,在左侧栏点击`视觉打语言模型`,找到`VLLM_ChatGLMVLLM`,点击修改按钮,在弹框中,在`API密钥`输入你密钥,点击保存。
+
+保存成功后,去到你需要测试的智能体哪里,点击`配置角色`,在打开的内容里,查看`视觉大语言模型(VLLM)`是否选择了刚才的视觉模型。点击保存。
+
+### 第三步 启动xiaozhi-server模块
+如果你是源码,就输入命令启动
+```
+python app.py
+```
+如果你是docker运行,就重启容器
+```
+docker restart xiaozhi-esp32-server
+```
+
+启动后会输出以下内容的日志。
+
+```
+2025-06-01 **** - 视觉分析接口是        http://192.168.4.7:8003/mcp/vision/explain
+2025-06-01 **** - Websocket地址是       ws://192.168.4.7:8000/xiaozhi/v1/
+2025-06-01 **** - =======上面的地址是websocket协议地址,请勿用浏览器访问=======
+2025-06-01 **** - 如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
+2025-06-01 **** - =============================================================
+```
+
+启动后,使用使用浏览器打开日志里`视觉分析接口`连接。看看输出了什么?如果你是linux,没有浏览器,你可以执行这个命令:
+```
+curl -i 你的视觉分析接口
+```
+
+正常来说会这样显示
+```
+MCP Vision 接口运行正常,视觉解释接口地址是:http://xxxx:8003/mcp/vision/explain
+```
+
+请注意,如果你是公网部署,或者docker部署,一定要改一下你的`data/.config.yaml`里这个配置
+```
+server:
+  vision_explain: http://你的ip或者域名:端口号/mcp/vision/explain
+```
+
+为什么呢?因为视觉解释接口需要下发到设备,如果你的地址是局域网地址,或者是docker内部地址,设备是无法访问的。
+
+假设你的公网地址是`111.111.111.111`,那么`vision_explain`应该这么配
+
+```
+server:
+  vision_explain: http://111.111.111.111:8003/mcp/vision/explain
+```
+
+如果你的MCP Vision 接口运行正常,且你也试着用浏览器访问正常打开下发的`视觉解释接口地址`,请继续下一步
+
+### 第四步 设备唤醒开启
+
+对设备说“请打开摄像头,说你你看到了什么”
+
+留意xiaozhi-server的日志输出,看看有没有报错。

Plik diff jest za duży
+ 187 - 0
docs/mqtt-gateway-integration.md


+ 67 - 0
docs/nav-copilot-integration.md

@@ -0,0 +1,67 @@
+# 越野领航播报(Nav Copilot)集成说明
+
+目标:先“带着AI跑一遍”录制赛道轨迹并标记风险点;下次再跑同一路线时,服务端根据实时 GNSS + 车速,提前语音播报预警(不做在线地图规划)。
+
+## 前置条件
+
+1. 车载端(ESP32)需要能向服务端提供 GNSS 定位数据。
+2. 推荐方式:车载端开启设备端 MCP 工具 `self.gnss.get_fix`(到服务端会被自动净化成 `self_gnss_get_fix`)。
+
+返回建议为 JSON 字符串,例如:
+
+```json
+{"ok":true,"lat":31.2304,"lon":121.4737,"speed_mps":7.2,"heading_deg":88.0,"fix":1,"t":1710000000}
+```
+
+## 开始使用(语音工作流)
+
+### 1)录制路线(带跑一遍)
+
+对小智说:
+
+- “开始录制路线”
+
+跑完整条赛道后,对小智说:
+
+- “结束录制路线”
+
+### 2)标记风险点(随时)
+
+在赛道上遇到需要提示的地方,对小智说(示例):
+
+- “标记急转弯”
+- “标记大坑”
+- “标记跳台”
+- “标记陡坡”
+- “标记涉水”
+- “标记障碍”
+
+服务端会把当前位置写入风险点库。
+
+### 3)领航播报(再跑一遍)
+
+对小智说:
+
+- “开始领航”
+
+当接近前方风险点(默认约 50m)时,会自动播报类似:
+
+> 注意前方 50 米急转弯,当前 30 公里每小时,预计 3 秒抵达。
+
+结束时说:
+
+- “停止领航”
+
+## 工具(函数)说明
+
+本功能通过服务端插件函数实现,已在 `main/xiaozhi-server/config.yaml` 的 `Intent.function_call.functions` 中启用:
+
+- `nav_start_record` / `nav_stop_record`
+- `nav_mark_hazard`
+- `nav_start_run` / `nav_stop_run`
+- `nav_status`
+- `nav_list_routes` / `nav_set_active_route`
+
+数据存储默认在:
+
+- `main/xiaozhi-server/data/nav_copilot.sqlite3`

+ 105 - 0
docs/newsnow_plugin_config.md

@@ -0,0 +1,105 @@
+# get_news_from_newsnow 插件新闻源配置指南
+
+## 概述
+
+`get_news_from_newsnow` 插件现在支持通过Web管理界面动态配置新闻源,不再需要修改代码。用户可以在智控台中为每个智能体配置不同的新闻源。
+
+## 配置方式
+
+### 1. 通过Web管理界面配置(推荐)
+
+1. 登录智控台
+2. 进入"角色配置"页面
+3. 选择要配置的智能体
+4. 点击"编辑功能"按钮
+5. 在右侧参数配置区域找到"newsnow新闻聚合"插件
+6. 在"新闻源配置"字段中输入分号分隔的中文名称
+
+### 2. 配置文件方式
+
+在 `config.yaml` 中配置:
+
+```yaml
+plugins:
+  get_news_from_newsnow:
+    url: "https://newsnow.busiyi.world/api/s?id="
+    news_sources: "澎湃新闻;百度热搜;财联社;微博;抖音"
+```
+
+## 新闻源配置格式
+
+新闻源配置使用分号分隔的中文名称,格式为:
+
+```
+中文名称1;中文名称2;中文名称3
+```
+
+### 配置示例
+
+```
+澎湃新闻;百度热搜;财联社;微博;抖音;知乎;36氪
+```
+
+## 支持的新闻源
+
+插件支持以下新闻源的中文名称:
+
+- 澎湃新闻
+- 百度热搜
+- 财联社
+- 微博
+- 抖音
+- 知乎
+- 36氪
+- 华尔街见闻
+- IT之家
+- 今日头条
+- 虎扑
+- 哔哩哔哩
+- 快手
+- 雪球
+- 格隆汇
+- 法布财经
+- 金十数据
+- 牛客
+- 少数派
+- 稀土掘金
+- 凤凰网
+- 虫部落
+- 联合早报
+- 酷安
+- 远景论坛
+- 参考消息
+- 卫星通讯社
+- 百度贴吧
+- 靠谱新闻
+- 以及更多...
+
+## 默认配置
+
+如果未配置新闻源,插件将使用以下默认配置:
+
+```
+澎湃新闻;百度热搜;财联社
+```
+
+## 使用说明
+
+1. **配置新闻源**:在Web界面或配置文件中设置新闻源的中文名称,用分号分隔
+2. **调用插件**:用户可以说"播报新闻"或"获取新闻"
+3. **指定新闻源**:用户可以说"播报澎湃新闻"或"获取百度热搜"
+4. **获取详情**:用户可以说"详细介绍这条新闻"
+
+## 工作原理
+
+1. 插件接受中文名称作为参数(如"澎湃新闻")
+2. 根据配置的新闻源列表,将中文名称转换为对应的英文ID(如"thepaper")
+3. 使用英文ID调用API获取新闻数据
+4. 返回新闻内容给用户
+
+## 注意事项
+
+1. 配置的中文名称必须与 CHANNEL_MAP 中定义的名称完全一致
+2. 配置更改后需要重启服务或重新加载配置
+3. 如果配置的新闻源无效,插件会自动使用默认新闻源
+4. 多个新闻源之间使用英文分号(;)分隔,不要使用中文分号(;)

+ 0 - 0
docs/ota-upgrade-guide.md


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików