From dcb6d0feab9e069f116a43214eea4ac03e8f4058 Mon Sep 17 00:00:00 2001 From: haotian Date: Sun, 13 Apr 2025 18:46:04 +0800 Subject: [PATCH 01/14] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96=E7=B3=BB?= =?UTF-8?q?=E7=BB=9Fprompt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/core/connection.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/main/xiaozhi-server/core/connection.py b/main/xiaozhi-server/core/connection.py index fc191b6f..1345879e 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -335,10 +335,8 @@ class ConnectionHandler: def change_system_prompt(self, prompt): self.prompt = prompt - # 找到原来的role==system,替换原来的系统提示 - for m in self.dialogue.dialogue: - if m.role == "system": - m.content = prompt + # 更新系统prompt至上下文 + self.dialogue.update_system_message(self.prompt) def chat(self, query): From 9176e9d255484a28e5bd3cad5f67bb8dd2db0698 Mon Sep 17 00:00:00 2001 From: expoli <31023767+expoli@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:00:31 +0800 Subject: [PATCH 02/14] Update Deployment_all.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新部分的安装配置文档,后续需要修改 docker-compose.yaml --- docs/Deployment_all.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/Deployment_all.md b/docs/Deployment_all.md index e4ac4ff9..49804a57 100644 --- a/docs/Deployment_all.md +++ b/docs/Deployment_all.md @@ -44,6 +44,8 @@ xiaozhi-server 在页面的右侧找到名称为`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.3.2 下载 config_from_api.yaml @@ -53,6 +55,8 @@ xiaozhi-server 在页面的右侧找到名称为`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`里面的文件如下所示: ``` From 0c855d4ba88c90aa4907275e219a21b9f9fcf085 Mon Sep 17 00:00:00 2001 From: expoli <31023767+expoli@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:06:30 +0800 Subject: [PATCH 03/14] Update docker-compose_all.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 直接提供全量的部署配置,包括 mysql 与 Redis 实现真正意义上的一键配置。 - 将 MySQL 的数据内容本地挂载存储,需要备份迁移的时候,直接打包复制文件夹即可。MySQL 容器删除的时候也不会出现数据丢失的问题。 --- main/xiaozhi-server/docker-compose_all.yml | 61 ++++++++++++++++------ 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/main/xiaozhi-server/docker-compose_all.yml b/main/xiaozhi-server/docker-compose_all.yml index 5b104470..e2f23bf1 100644 --- a/main/xiaozhi-server/docker-compose_all.yml +++ b/main/xiaozhi-server/docker-compose_all.yml @@ -1,25 +1,17 @@ # Docker安装全模块 -# 1、安装mysql -# |- 如果本机已经安装了MySQL,可以直接在数据库中创建名为`xiaozhi_esp32_server`的数据库。 -# |- 如果还没有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" -d mysql:latest -# |- 记得修改下方SPRING_DATASOURCE_DRUID_URL的IP,ip不能写127.0.0.1或localhost,否则容器无法访问,要写你电脑局域网ip - -# 2、安装redis -# |- 如果本机已经安装了Redis,看一下你安装的redis端口、密码,然后修改下方redis的地址和端口 -# |- 如果还没有Redis,你可以通过docker安装redis,执行以下一句话 -# |- docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis -# |- 记得修改SPRING_DATA_REDIS_HOST的IP,ip不能写127.0.0.1或localhost,否则容器无法访问,要写你电脑局域网ip - - version: '3' services: # Server模块 xiaozhi-esp32-server: image: ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest container_name: xiaozhi-esp32-server + depends_on: + - xiaozhi-esp32-server-db + - xiaozhi-esp32-server-redis restart: always + networks: + - default ports: # ws服务端 - "8000:8000" @@ -38,14 +30,53 @@ services: image: ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest container_name: xiaozhi-esp32-server-web restart: always + networks: + - default + depends_on: + - xiaozhi-esp32-server-db + - xiaozhi-esp32-server-redis ports: # 智控台 - "8002:8002" environment: - TZ=Asia/Shanghai ##记得改mysql和redis IP 密码 - - SPRING_DATASOURCE_DRUID_URL=jdbc:mysql://192.168.1.25:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + - SPRING_DATASOURCE_DRUID_URL=jdbc:mysql://xiaozhi-esp32-server-db:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai - SPRING_DATASOURCE_DRUID_USERNAME=root - SPRING_DATASOURCE_DRUID_PASSWORD=123456 - - SPRING_DATA_REDIS_HOST=192.168.1.25 + - SPRING_DATA_REDIS_HOST=xiaozhi-esp32-server-redis - SPRING_DATA_REDIS_PORT=6379 + xiaozhi-esp32-server-db: + image: mysql:latest + container_name: xiaozhi-esp32-server-db + healthcheck: + test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] + timeout: 45s + interval: 10s + retries: 10 + restart: always + networks: + - default + expose: + - 3306 + volumes: + - ./mysql/data:/var/lib/mysql + environment: + - TZ=Asia/Shanghai + - MYSQL_ROOT_PASSWORD=123456 + - MYSQL_DATABASE=xiaozhi_esp32_server + - MYSQL_INITDB_ARGS="--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci" + xiaozhi-esp32-server-redis: + image: redis + expose: + - 6379 + container_name: xiaozhi-esp32-server-redis + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 3 + networks: + - default +networks: + default: From ff9b3ed1a2162266b4e40c9cafc67215263c6dcf Mon Sep 17 00:00:00 2001 From: expoli <31023767+expoli@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:15:37 +0800 Subject: [PATCH 04/14] Update Deployment_all.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 docker compose 部署的时候,不应该每次更新的时候都把原来的 docker-compose 文件删除,再重新配置。 - 如果没有自己部署数据库需求的话,目前可以直接开箱即用,同步更新了 server 中的 Redis 与 MySQL 的镜像服务配置。 --- docs/Deployment_all.md | 44 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/docs/Deployment_all.md b/docs/Deployment_all.md index 49804a57..0550a71d 100644 --- a/docs/Deployment_all.md +++ b/docs/Deployment_all.md @@ -71,22 +71,16 @@ xiaozhi-server 如果你的文件目录结构也是上面的,就继续往下。如果不是,你就再仔细看看是不是漏操作了什么。 -## 2. 安装Mysql和Redis +## 2. 安装Mysql和Redis(可选) ### 2.1 安装Mysql数据库 -如果本机已经安装了MySQL,可以直接在数据库中创建名为`xiaozhi_esp32_server`的数据库。 +如果本机已经安装了MySQL,可以直接在数据库中创建名为`xiaozhi_esp32_server`的数据库。然后把 docker-compose.yml 文件中的 xiaozhi-esp32-server-db 部分注释或者删除掉,同时修改 `jdbc:mysql://xiaozhi-esp32-server-db:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai` xiaozhi-esp32-server-db 为自己的局域网 IP 地址。 ```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" -d mysql:latest -``` - -### 2.2 安装Redis +### 2.2 安装Redis(可选) 如果还没有Redis,你可以通过docker安装redis @@ -94,7 +88,7 @@ docker run --name xiaozhi-esp32-server-db -e MYSQL_ROOT_PASSWORD=123456 -p 3306: docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis ``` -## 3. 配置docker-compose_all.yml文件文件 +### 2.3 配置docker-compose_all.yml文件使用本地的 MySQL 与 Redis 在`xiaozhi-server`目录,打开docker-compose_all.yml, @@ -104,20 +98,12 @@ docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis 3、确认一下mysql的用户名`SPRING_DATASOURCE_DRUID_USERNAME`和密码`SPRING_DATASOURCE_DRUID_PASSWORD` +## 3 配置docker-compose_all.yml(可选) + +你可以修改配置文件中的数据库密码环境变量 `SPRING_DATASOURCE_DRUID_PASSWORD` 与 `MYSQL_ROOT_PASSWORD` 为强密码。 + ## 4. 运行程序 -确认mysql和redis是否运行正常,输入 -``` -docker ps -``` -如果你能看到`xiaozhi-esp32-server-redis`和`xiaozhi-esp32-server-db`信息,就可以继续往下,如果看不到,说明你的`mysql`和`redis`没有安装或没有启动。需要继续回到上面的教程,看看哪一步漏了。 - -``` -CONTAINER ID IMAGE COMMAND CREATED TATUS PORTS NAMES -xxx redis "xx" xxx xxx 0.0.0.0:6379->6379/tcp xiaozhi-esp32-server-redis -xxx mysql:latest "xx" xxx xxx 0.0.0.0:3306->3306/tcp, 33060/tcp xiaozhi-esp32-server-db -``` - 接下来打开命令行工具,使用`终端`或`命令行`工具 进入到你的`xiaozhi-server`,执行以下命令 ``` @@ -154,17 +140,15 @@ http://localhost:8002/xiaozhi/doc.html ``` manager-api: - url: http://127.0.0.1:8002/xiaozhi + url: http://xiaozhi-esp32-server-web:8002/xiaozhi secret: 你的server.secret值 ``` 1、把你刚才从`智控台`复制过来的`server.secret`的`参数值`复制到`.config.yaml`文件里的`secret`里。 -2、把`url`里的`127.0.0.1`改成你电脑局域网内的ip - 类似这样的效果 ``` manager-api: - url: http://192.168.1.25:8002/xiaozhi + url: http://xiaozhi-esp32-server-web/xiaozhi secret: 12345678-xxxx-xxxx-xxxx-123456789000 ``` @@ -215,15 +199,13 @@ ws://你电脑局域网的ip:8000/xiaozhi/v1/ 5.1、执行以下命令 ``` -docker-compose down +docker compose down 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 +docker compose pull +docker compose up -d ``` -5.2、删掉`docker-compose_all.yaml`文件 - -5.3、重新按1.1开始部署 - # 方式二:本地源码运行全模块 ## 1.安装MySQL数据库 From 91278b0b3dd732dd26d8b274a73ad8dd96a3d1e7 Mon Sep 17 00:00:00 2001 From: expoli <31023767+expoli@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:16:25 +0800 Subject: [PATCH 05/14] Update Deployment_all.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MySQL 与 Redis 的安装是可选的 --- docs/Deployment_all.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/Deployment_all.md b/docs/Deployment_all.md index 0550a71d..b4e59912 100644 --- a/docs/Deployment_all.md +++ b/docs/Deployment_all.md @@ -71,7 +71,7 @@ xiaozhi-server 如果你的文件目录结构也是上面的,就继续往下。如果不是,你就再仔细看看是不是漏操作了什么。 -## 2. 安装Mysql和Redis(可选) +## 2. 手动安装Mysql和Redis(可选) ### 2.1 安装Mysql数据库 如果本机已经安装了MySQL,可以直接在数据库中创建名为`xiaozhi_esp32_server`的数据库。然后把 docker-compose.yml 文件中的 xiaozhi-esp32-server-db 部分注释或者删除掉,同时修改 `jdbc:mysql://xiaozhi-esp32-server-db:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai` xiaozhi-esp32-server-db 为自己的局域网 IP 地址。 @@ -80,8 +80,7 @@ xiaozhi-server CREATE DATABASE xiaozhi_esp32_server CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` -### 2.2 安装Redis(可选) - +### 2.2 安装Redis 如果还没有Redis,你可以通过docker安装redis ``` From 6e4e9a002bacd0d3e2a10e68a44890b8725c5afb Mon Sep 17 00:00:00 2001 From: expoli <31023767+expoli@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:18:07 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=20docker=20=E7=9B=B4=E6=8E=A5=E9=9B=86?= =?UTF-8?q?=E6=88=90=E4=BA=86=20compose=20=E5=91=BD=E4=BB=A4=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E9=9C=80=E8=A6=81=E6=89=8B=E5=8A=A8=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E4=B8=8E=E6=89=A7=E8=A1=8C=20docker-compose=20=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E4=BA=86=EF=BC=8C=E6=8F=90=E9=AB=98=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Deployment_all.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Deployment_all.md b/docs/Deployment_all.md index b4e59912..24a2eb8b 100644 --- a/docs/Deployment_all.md +++ b/docs/Deployment_all.md @@ -106,7 +106,7 @@ docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis 接下来打开命令行工具,使用`终端`或`命令行`工具 进入到你的`xiaozhi-server`,执行以下命令 ``` -docker-compose -f docker-compose_all.yml up -d +docker compose -f docker-compose_all.yml up -d ``` 执行完后,再执行以下命令,查看日志信息。 From 703ecfae4007c645646cd8bbe113c370970d0a11 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Mon, 14 Apr 2025 18:30:58 +0800 Subject: [PATCH 07/14] =?UTF-8?q?fix:manager=E4=B8=8B=E5=8F=91=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=AD=97=E7=AC=A6=E8=BD=AC=E6=95=B0=E5=AD=97bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Deployment.md | 5 ++- docs/Deployment_all.md | 7 ++++ main/xiaozhi-server/core/connection.py | 4 +-- .../core/handle/receiveAudioHandle.py | 4 +-- .../core/providers/tts/fishspeech.py | 16 ++++----- .../core/providers/tts/gpt_sovits_v2.py | 36 +++++++++++-------- .../core/providers/tts/gpt_sovits_v3.py | 27 ++++++++------ .../core/providers/tts/openai.py | 2 +- .../core/providers/tts/siliconflow.py | 2 +- .../core/providers/tts/tencent.py | 2 +- .../core/providers/tts/ttson.py | 10 +++--- .../core/providers/vad/silero.py | 4 +-- main/xiaozhi-server/core/utils/util.py | 4 +-- 13 files changed, 72 insertions(+), 51 deletions(-) diff --git a/docs/Deployment.md b/docs/Deployment.md index 0bbe629d..097aea59 100644 --- a/docs/Deployment.md +++ b/docs/Deployment.md @@ -137,7 +137,10 @@ docker logs -f xiaozhi-esp32-server ``` 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方式部署 @@ -221,7 +224,7 @@ python app.py ## 配置项目 如果你的`xiaozhi-server`目录没有`data`,你需要创建`data`目录。 -如果你的`data`下面没有`.config.yaml`文件,你可以把源码目录下的`config.yaml`文件复制一份,重命名为`.config.yaml` +如果你的`data`下面没有`.config.yaml`文件,你可以把`xiaozhi-server`目录下的`config.yaml`文件复制到`data`,并重命名为`.config.yaml` 修改`xiaozhi-server`下`data`目录下的`.config.yaml`文件,配置本项目必须的一个配置。 diff --git a/docs/Deployment_all.md b/docs/Deployment_all.md index e4ac4ff9..e18d66e1 100644 --- a/docs/Deployment_all.md +++ b/docs/Deployment_all.md @@ -212,6 +212,10 @@ ws://你电脑局域网的ip:8000/xiaozhi/v1/ ``` docker-compose down +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 ``` @@ -388,6 +392,9 @@ pip install -r requirements.txt `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`文件。此刻你的配置文件内容应该是这样的: ``` diff --git a/main/xiaozhi-server/core/connection.py b/main/xiaozhi-server/core/connection.py index fc191b6f..3a69d096 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -204,7 +204,7 @@ class ConnectionHandler: self.headers.get("device-id", None), self.headers.get("client-id", None), ) - private_config["delete_audio"] = self.config["delete_audio"] + private_config["delete_audio"] = bool(self.config["delete_audio"], True) self.logger.bind(tag=TAG).info(f"获取差异化配置成功: {private_config}") except Exception as e: self.logger.bind(tag=TAG).error(f"获取差异化配置失败: {e}") @@ -702,7 +702,7 @@ class ConnectionHandler: opus_datas, text_index, tts_file = [], 0, None try: self.logger.bind(tag=TAG).debug("正在处理TTS任务...") - tts_timeout = self.config.get("tts_timeout", 10) + tts_timeout = int(self.config.get("tts_timeout", 10)) tts_file, text, text_index = future.result(timeout=tts_timeout) if text is None or len(text) <= 0: self.logger.bind(tag=TAG).error( diff --git a/main/xiaozhi-server/core/handle/receiveAudioHandle.py b/main/xiaozhi-server/core/handle/receiveAudioHandle.py index f798739a..c0ffa429 100644 --- a/main/xiaozhi-server/core/handle/receiveAudioHandle.py +++ b/main/xiaozhi-server/core/handle/receiveAudioHandle.py @@ -71,8 +71,8 @@ async def no_voice_close_connect(conn): conn.client_no_voice_last_time = time.time() * 1000 else: no_voice_time = time.time() * 1000 - conn.client_no_voice_last_time - close_connection_no_voice_time = conn.config.get( - "close_connection_no_voice_time", 120 + close_connection_no_voice_time = int( + conn.config.get("close_connection_no_voice_time", 120) ) if ( not conn.close_after_chat diff --git a/main/xiaozhi-server/core/providers/tts/fishspeech.py b/main/xiaozhi-server/core/providers/tts/fishspeech.py index 6d59243b..6456961d 100644 --- a/main/xiaozhi-server/core/providers/tts/fishspeech.py +++ b/main/xiaozhi-server/core/providers/tts/fishspeech.py @@ -89,19 +89,19 @@ class TTSProvider(TTSProviderBase): self.reference_audio = config.get("reference_audio", []) self.reference_text = config.get("reference_text", []) self.format = config.get("format", "wav") - self.channels = config.get("channels", 1) - self.rate = config.get("rate", 44100) + self.channels = int(config.get("channels", 1)) + self.rate = int(config.get("rate", 44100)) self.api_key = config.get("api_key", "YOUR_API_KEY") have_key = check_model_key("FishSpeech TTS", self.api_key) if not have_key: return self.normalize = config.get("normalize", True) - self.max_new_tokens = config.get("max_new_tokens", 1024) - self.chunk_length = config.get("chunk_length", 200) - self.top_p = config.get("top_p", 0.7) - self.repetition_penalty = config.get("repetition_penalty", 1.2) - self.temperature = config.get("temperature", 0.7) - self.streaming = config.get("streaming", False) + self.max_new_tokens = int(config.get("max_new_tokens", 1024)) + self.chunk_length = int(config.get("chunk_length", 200)) + self.top_p = float(config.get("top_p", 0.7)) + self.repetition_penalty = float(config.get("repetition_penalty", 1.2)) + self.temperature = float(config.get("temperature", 0.7)) + self.streaming = bool(config.get("streaming", False)) self.use_memory_cache = config.get("use_memory_cache", "on") self.seed = config.get("seed") self.api_url = config.get("api_url", "http://127.0.0.1:8080/v1/tts") diff --git a/main/xiaozhi-server/core/providers/tts/gpt_sovits_v2.py b/main/xiaozhi-server/core/providers/tts/gpt_sovits_v2.py index ae20beb6..311ef5b0 100644 --- a/main/xiaozhi-server/core/providers/tts/gpt_sovits_v2.py +++ b/main/xiaozhi-server/core/providers/tts/gpt_sovits_v2.py @@ -10,6 +10,7 @@ from core.providers.tts.base import TTSProviderBase TAG = __name__ logger = setup_logging() + class TTSProvider(TTSProviderBase): def __init__(self, config, delete_audio_file): super().__init__(config, delete_audio_file) @@ -18,23 +19,26 @@ class TTSProvider(TTSProviderBase): self.ref_audio_path = config.get("ref_audio_path") self.prompt_text = config.get("prompt_text") self.prompt_lang = config.get("prompt_lang", "zh") - self.top_k = config.get("top_k", 5) - self.top_p = config.get("top_p", 1) - self.temperature = config.get("temperature", 1) + self.top_k = int(config.get("top_k", 5)) + self.top_p = float(config.get("top_p", 1)) + self.temperature = float(config.get("temperature", 1)) self.text_split_method = config.get("text_split_method", "cut0") - self.batch_size = config.get("batch_size", 1) - self.batch_threshold = config.get("batch_threshold", 0.75) - self.split_bucket = config.get("split_bucket", True) - self.return_fragment = config.get("return_fragment", False) - self.speed_factor = config.get("speed_factor", 1.0) - self.streaming_mode = config.get("streaming_mode", False) - self.seed = config.get("seed", -1) - self.parallel_infer = config.get("parallel_infer", True) - self.repetition_penalty = config.get("repetition_penalty", 1.35) + self.batch_size = int(config.get("batch_size", 1)) + self.batch_threshold = float(config.get("batch_threshold", 0.75)) + self.split_bucket = bool(config.get("split_bucket", True)) + self.return_fragment = bool(config.get("return_fragment", False)) + self.speed_factor = float(config.get("speed_factor", 1.0)) + self.streaming_mode = bool(config.get("streaming_mode", False)) + self.seed = int(config.get("seed", -1)) + self.parallel_infer = bool(config.get("parallel_infer", True)) + self.repetition_penalty = float(config.get("repetition_penalty", 1.35)) self.aux_ref_audio_paths = config.get("aux_ref_audio_paths", []) def generate_filename(self, extension=".wav"): - return os.path.join(self.output_file, f"tts-{datetime.now().date()}@{uuid.uuid4().hex}{extension}") + return os.path.join( + self.output_file, + f"tts-{datetime.now().date()}@{uuid.uuid4().hex}{extension}", + ) async def text_to_speak(self, text, output_file): request_json = { @@ -56,7 +60,7 @@ class TTSProvider(TTSProviderBase): "streaming_mode": self.streaming_mode, "seed": self.seed, "parallel_infer": self.parallel_infer, - "repetition_penalty": self.repetition_penalty + "repetition_penalty": self.repetition_penalty, } resp = requests.post(self.url, json=request_json) @@ -64,4 +68,6 @@ class TTSProvider(TTSProviderBase): with open(output_file, "wb") as file: file.write(resp.content) else: - logger.bind(tag=TAG).error(f"GPT_SoVITS_V2 TTS请求失败: {resp.status_code} - {resp.text}") + logger.bind(tag=TAG).error( + f"GPT_SoVITS_V2 TTS请求失败: {resp.status_code} - {resp.text}" + ) diff --git a/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py b/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py index ebfb12f1..25c52b84 100644 --- a/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py +++ b/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py @@ -8,6 +8,7 @@ from core.providers.tts.base import TTSProviderBase TAG = __name__ logger = setup_logging() + class TTSProvider(TTSProviderBase): def __init__(self, config, delete_audio_file): super().__init__(config, delete_audio_file) @@ -16,18 +17,20 @@ class TTSProvider(TTSProviderBase): self.prompt_text = config.get("prompt_text") self.prompt_language = config.get("prompt_language") self.text_language = config.get("text_language", "audo") - self.top_k = config.get("top_k", 15) - self.top_p = config.get("top_p", 1.0) - self.temperature = config.get("temperature", 1.0) - self.cut_punc = config.get("cut_punc","") - self.speed = config.get("speed", 1.0) - self.inp_refs = config.get("inp_refs",[]) - self.sample_steps = config.get("sample_steps",32) - self.if_sr = config.get("if_sr",False) - + self.top_k = int(config.get("top_k", 15)) + self.top_p = float(config.get("top_p", 1.0)) + self.temperature = float(config.get("temperature", 1.0)) + self.cut_punc = config.get("cut_punc", "") + self.speed = float(config.get("speed", 1.0)) + self.inp_refs = config.get("inp_refs", []) + self.sample_steps = int(config.get("sample_steps", 32)) + self.if_sr = bool(config.get("if_sr", False)) def generate_filename(self, extension=".wav"): - return os.path.join(self.output_file, f"tts-{datetime.now().date()}@{uuid.uuid4().hex}{extension}") + return os.path.join( + self.output_file, + f"tts-{datetime.now().date()}@{uuid.uuid4().hex}{extension}", + ) async def text_to_speak(self, text, output_file): request_params = { @@ -51,4 +54,6 @@ class TTSProvider(TTSProviderBase): with open(output_file, "wb") as file: file.write(resp.content) else: - logger.bind(tag=TAG).error(f"GPT_SoVITS_V3 TTS请求失败: {resp.status_code} - {resp.text}") + logger.bind(tag=TAG).error( + f"GPT_SoVITS_V3 TTS请求失败: {resp.status_code} - {resp.text}" + ) diff --git a/main/xiaozhi-server/core/providers/tts/openai.py b/main/xiaozhi-server/core/providers/tts/openai.py index 18daf29b..a5d48057 100644 --- a/main/xiaozhi-server/core/providers/tts/openai.py +++ b/main/xiaozhi-server/core/providers/tts/openai.py @@ -21,7 +21,7 @@ class TTSProvider(TTSProviderBase): else: self.voice = config.get("voice", "alloy") self.response_format = "wav" - self.speed = config.get("speed", 1.0) + self.speed = float(config.get("speed", 1.0)) self.output_file = config.get("output_dir", "tmp/") check_model_key("TTS", self.api_key) diff --git a/main/xiaozhi-server/core/providers/tts/siliconflow.py b/main/xiaozhi-server/core/providers/tts/siliconflow.py index 76d131bb..be6b9e2a 100644 --- a/main/xiaozhi-server/core/providers/tts/siliconflow.py +++ b/main/xiaozhi-server/core/providers/tts/siliconflow.py @@ -16,7 +16,7 @@ class TTSProvider(TTSProviderBase): self.voice = config.get("voice") self.response_format = config.get("response_format") self.sample_rate = config.get("sample_rate") - self.speed = config.get("speed") + self.speed = float(config.get("speed")) self.gain = config.get("gain") self.host = "api.siliconflow.cn" diff --git a/main/xiaozhi-server/core/providers/tts/tencent.py b/main/xiaozhi-server/core/providers/tts/tencent.py index c05261fd..f2501e2f 100644 --- a/main/xiaozhi-server/core/providers/tts/tencent.py +++ b/main/xiaozhi-server/core/providers/tts/tencent.py @@ -19,7 +19,7 @@ class TTSProvider(TTSProviderBase): if config.get("private_voice"): self.voice = config.get("private_voice") else: - self.voice = config.get("voice") + self.voice = int(config.get("voice")) self.api_url = "https://tts.tencentcloudapi.com" # 正确的API端点 self.region = config.get("region") self.output_file = config.get("output_dir") diff --git a/main/xiaozhi-server/core/providers/tts/ttson.py b/main/xiaozhi-server/core/providers/tts/ttson.py index ba0a1222..a6401141 100644 --- a/main/xiaozhi-server/core/providers/tts/ttson.py +++ b/main/xiaozhi-server/core/providers/tts/ttson.py @@ -20,13 +20,13 @@ class TTSProvider(TTSProviderBase): self.voice_id = int(config.get("voice_id", 1695)) self.token = config.get("token") self.to_lang = config.get("to_lang") - self.volume_change_dB = config.get("volume_change_dB", 0) - self.speed_factor = config.get("speed_factor", 1) - self.stream = config.get("stream", False) + self.volume_change_dB = int(config.get("volume_change_dB", 0)) + self.speed_factor = int(config.get("speed_factor", 1)) + self.stream = bool(config.get("stream", False)) self.output_file = config.get("output_dir") - self.pitch_factor = config.get("pitch_factor", 0) + self.pitch_factor = int(config.get("pitch_factor", 0)) self.format = config.get("format", "mp3") - self.emotion = config.get("emotion", 1) + self.emotion = int(config.get("emotion", 1)) self.header = {"Content-Type": "application/json"} def generate_filename(self, extension=".mp3"): diff --git a/main/xiaozhi-server/core/providers/vad/silero.py b/main/xiaozhi-server/core/providers/vad/silero.py index df05cd6d..3332d9ac 100644 --- a/main/xiaozhi-server/core/providers/vad/silero.py +++ b/main/xiaozhi-server/core/providers/vad/silero.py @@ -21,8 +21,8 @@ class VADProvider(VADProviderBase): (get_speech_timestamps, _, _, _, _) = self.utils self.decoder = opuslib_next.Decoder(16000, 1) - self.vad_threshold = config.get("threshold") - self.silence_threshold_ms = config.get("min_silence_duration_ms") + self.vad_threshold = float(config.get("threshold", 0.5)) + self.silence_threshold_ms = int(config.get("min_silence_duration_ms", 1000)) def is_vad(self, conn, opus_packet): try: diff --git a/main/xiaozhi-server/core/utils/util.py b/main/xiaozhi-server/core/utils/util.py index 07a2c985..dd56f5ae 100644 --- a/main/xiaozhi-server/core/utils/util.py +++ b/main/xiaozhi-server/core/utils/util.py @@ -230,7 +230,7 @@ def initialize_modules( modules["tts"] = tts.create_instance( tts_type, config["TTS"][config["selected_module"]["TTS"]], - config["delete_audio"], + bool(config.get("delete_audio", True)), ) logger.bind(tag=TAG).info(f"初始化组件: tts成功") @@ -294,7 +294,7 @@ def initialize_modules( modules["asr"] = asr.create_instance( asr_type, config["ASR"][config["selected_module"]["ASR"]], - config["delete_audio"], + bool(config.get("delete_audio", True)), ) logger.bind(tag=TAG).info(f"初始化组件: asr成功") From c76f28824c4fbbe29b200435e1ab11f38955d6f7 Mon Sep 17 00:00:00 2001 From: haotian Date: Mon, 14 Apr 2025 18:49:24 +0800 Subject: [PATCH 08/14] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E6=A8=A1=E5=9D=97=E6=89=93=E5=8D=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/config/logger.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py index 5981822c..cc87807b 100644 --- a/main/xiaozhi-server/config/logger.py +++ b/main/xiaozhi-server/config/logger.py @@ -25,6 +25,12 @@ def build_module_string(selected_module): ) +def formatter(record): + """为没有 tag 的日志添加默认值""" + record["extra"].setdefault("tag", record["name"]) + return record["message"] + + def setup_logging(): """从配置文件中读取日志配置,并设置日志输出格式和级别""" config = load_config() @@ -56,9 +62,9 @@ def setup_logging(): logger.remove() # 输出到控制台 - logger.add(sys.stdout, format=log_format, level=log_level) + logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter) # 输出到文件 - logger.add(os.path.join(log_dir, log_file), format=log_format_file, level=log_level) + logger.add(os.path.join(log_dir, log_file), format=log_format_file, level=log_level, filter=formatter) return logger From 6284a74a6ec0b17bb39f70378b969c8f6af891be Mon Sep 17 00:00:00 2001 From: haotian Date: Mon, 14 Apr 2025 21:43:55 +0800 Subject: [PATCH 09/14] =?UTF-8?q?update:=20=E4=BF=AE=E5=A4=8DDify=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=E6=9C=AA=E8=BF=87=E6=BB=A4=E5=85=A8=E9=87=8F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/core/providers/llm/dify/dify.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/main/xiaozhi-server/core/providers/llm/dify/dify.py b/main/xiaozhi-server/core/providers/llm/dify/dify.py index 26bb48b7..030aba05 100644 --- a/main/xiaozhi-server/core/providers/llm/dify/dify.py +++ b/main/xiaozhi-server/core/providers/llm/dify/dify.py @@ -58,7 +58,8 @@ class LLMProvider(LLMProviderBase): self.session_conversation_map[session_id] = ( conversation_id # 更新映射 ) - if event.get("answer"): + # 过滤 message_replace 事件,此事件会全量推一次 + if event.get("event") != "message_replace" and event.get("answer"): yield event["answer"] elif self.mode == "workflows/run": for line in r.iter_lines(): @@ -73,7 +74,8 @@ class LLMProvider(LLMProviderBase): for line in r.iter_lines(): if line.startswith(b"data: "): event = json.loads(line[6:]) - if event.get("answer"): + # 过滤 message_replace 事件,此事件会全量推一次 + if event.get("event") != "message_replace" and event.get("answer"): yield event["answer"] except Exception as e: From 03d89d22ec1ac07824b5481094cc578bc3e6be63 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Mon, 14 Apr 2025 21:53:52 +0800 Subject: [PATCH 10/14] =?UTF-8?q?update:=E9=80=9A=E8=BF=87=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E8=BD=AC=E5=8F=91=E6=8E=A5=E5=8F=A3api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/.env.development | 5 +---- main/manager-web/vue.config.js | 4 ++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/main/manager-web/.env.development b/main/manager-web/.env.development index ced1a9e7..0a1de306 100644 --- a/main/manager-web/.env.development +++ b/main/manager-web/.env.development @@ -1,4 +1 @@ -# 暂时使用群主的接口 -# VUE_APP_API_BASE_URL=https://2662r3426b.vicp.fun/xiaozhi -# 如果本地开发,请使用以下接口 -VUE_APP_API_BASE_URL=http://localhost:8002/xiaozhi \ No newline at end of file +VUE_APP_API_BASE_URL=/xiaozhi \ No newline at end of file diff --git a/main/manager-web/vue.config.js b/main/manager-web/vue.config.js index e29c0de7..5df17711 100644 --- a/main/manager-web/vue.config.js +++ b/main/manager-web/vue.config.js @@ -15,6 +15,10 @@ module.exports = defineConfig({ devServer: { port: 8001, // 指定端口为 8001 proxy: { + '/xiaozhi': { + target: 'http://127.0.0.1:8002', + changeOrigin: true + } }, client: { overlay: false, // 不显示 webpack 错误覆盖层 From 25da9fe119998f7db260dc78ecec3e2eb569ada7 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Mon, 14 Apr 2025 22:09:18 +0800 Subject: [PATCH 11/14] =?UTF-8?q?fix=EF=BC=9Anumber=E7=86=9F=E7=9F=A5?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=B0=8F=E6=95=B0=E7=82=B9=E5=90=8E=E7=9A=84?= =?UTF-8?q?00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/config/service/impl/ConfigServiceImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java index 78a7b511..7be38a89 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java @@ -171,7 +171,13 @@ public class ConfigServiceImpl implements ConfigService { switch (param.getValueType().toLowerCase()) { case "number": try { - current.put(lastKey, Double.parseDouble(value)); + double doubleValue = Double.parseDouble(value); + // 如果数值是整数形式,则转换为Integer + if (doubleValue == (int) doubleValue) { + current.put(lastKey, (int) doubleValue); + } else { + current.put(lastKey, doubleValue); + } } catch (NumberFormatException e) { current.put(lastKey, value); } From 6cf6b0d6457f7998228c5a5fd98200f6aa4d9f75 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Tue, 15 Apr 2025 00:22:53 +0800 Subject: [PATCH 12/14] =?UTF-8?q?update:=E4=BC=98=E5=8C=96docker=E5=90=AF?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- docs/Deployment_all.md | 70 +++++++--------------- main/xiaozhi-server/docker-compose_all.yml | 10 ++-- 3 files changed, 31 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index 0a684e6a..57f377d3 100644 --- a/.gitignore +++ b/.gitignore @@ -158,4 +158,5 @@ my_wakeup_words.mp3 main/manager-api/.vscode # Ignore webpack cache directory -main/manager-web/.webpack_cache/ \ No newline at end of file +main/manager-web/.webpack_cache/ +main/xiaozhi-server/mysql diff --git a/docs/Deployment_all.md b/docs/Deployment_all.md index d48a1796..9223c7fc 100644 --- a/docs/Deployment_all.md +++ b/docs/Deployment_all.md @@ -71,39 +71,34 @@ xiaozhi-server 如果你的文件目录结构也是上面的,就继续往下。如果不是,你就再仔细看看是不是漏操作了什么。 -## 2. 手动安装Mysql和Redis(可选) +## 2. 备份数据 -### 2.1 安装Mysql数据库 -如果本机已经安装了MySQL,可以直接在数据库中创建名为`xiaozhi_esp32_server`的数据库。然后把 docker-compose.yml 文件中的 xiaozhi-esp32-server-db 部分注释或者删除掉,同时修改 `jdbc:mysql://xiaozhi-esp32-server-db:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai` xiaozhi-esp32-server-db 为自己的局域网 IP 地址。 +如果你之前已经成功运行智控台,如果上面保存有你的密钥信息,请先从智控台上拷贝重要数据下来。因为升级过程中,有可能会覆盖原来的数据。 -```sql -CREATE DATABASE xiaozhi_esp32_server CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -``` - -### 2.2 安装Redis -如果还没有Redis,你可以通过docker安装redis +## 3. 清除历史版本镜像和容器 +接下来打开命令行工具,使用`终端`或`命令行`工具 进入到你的`xiaozhi-server`,执行以下命令 ``` -docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis +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 ``` -### 2.3 配置docker-compose_all.yml文件使用本地的 MySQL 与 Redis - -在`xiaozhi-server`目录,打开docker-compose_all.yml, - -1、修改`SPRING_DATASOURCE_DRUID_URL`里,把`192.168.1.25`修改成部署mysql的电脑局域网ip,如果是你本地,你要查看一下你本机的局域网ip是什么 - -2、修改`SPRING_DATA_REDIS_HOST`里,把`192.168.1.25`修改成部署redis的电脑局域网ip,如果是你本地,你要查看一下你本机的局域网ip是什么 - -3、确认一下mysql的用户名`SPRING_DATASOURCE_DRUID_USERNAME`和密码`SPRING_DATASOURCE_DRUID_PASSWORD` - -## 3 配置docker-compose_all.yml(可选) - -你可以修改配置文件中的数据库密码环境变量 `SPRING_DATASOURCE_DRUID_PASSWORD` 与 `MYSQL_ROOT_PASSWORD` 为强密码。 - ## 4. 运行程序 - -接下来打开命令行工具,使用`终端`或`命令行`工具 进入到你的`xiaozhi-server`,执行以下命令 +执行以下命令启动新版本容器 ``` docker compose -f docker-compose_all.yml up -d @@ -139,10 +134,11 @@ http://localhost:8002/xiaozhi/doc.html ``` manager-api: - url: http://xiaozhi-esp32-server-web:8002/xiaozhi + url: http://127.0.0.1:8002/xiaozhi secret: 你的server.secret值 ``` 1、把你刚才从`智控台`复制过来的`server.secret`的`参数值`复制到`.config.yaml`文件里的`secret`里。 +2、注意,把`url`改成下面的`http://xiaozhi-esp32-server-web/xiaozhi` 类似这样的效果 ``` @@ -189,26 +185,6 @@ ws://你电脑局域网的ip:8000/xiaozhi/v1/ 接下来,你就可以开始 [编译esp32固件](firmware-build.md)了。 -## 6. 版本升级操作 - -如果后期想升级版本,先备份你的模型密钥。 - -进入`xiaozhi-server`目录 - -5.1、执行以下命令 - -``` -docker-compose down -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 -docker compose pull -docker compose up -d -``` - # 方式二:本地源码运行全模块 ## 1.安装MySQL数据库 diff --git a/main/xiaozhi-server/docker-compose_all.yml b/main/xiaozhi-server/docker-compose_all.yml index e2f23bf1..81b227b1 100644 --- a/main/xiaozhi-server/docker-compose_all.yml +++ b/main/xiaozhi-server/docker-compose_all.yml @@ -33,15 +33,17 @@ services: networks: - default depends_on: - - xiaozhi-esp32-server-db - - xiaozhi-esp32-server-redis + xiaozhi-esp32-server-db: + condition: service_healthy + xiaozhi-esp32-server-redis: + condition: service_healthy ports: # 智控台 - "8002:8002" environment: - TZ=Asia/Shanghai ##记得改mysql和redis IP 密码 - - SPRING_DATASOURCE_DRUID_URL=jdbc:mysql://xiaozhi-esp32-server-db:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + - SPRING_DATASOURCE_DRUID_URL=jdbc:mysql://xiaozhi-esp32-server-db:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&connectTimeout=30000&socketTimeout=30000&autoReconnect=true&failOverReadOnly=false&maxReconnects=10 - SPRING_DATASOURCE_DRUID_USERNAME=root - SPRING_DATASOURCE_DRUID_PASSWORD=123456 - SPRING_DATA_REDIS_HOST=xiaozhi-esp32-server-redis @@ -58,7 +60,7 @@ services: networks: - default expose: - - 3306 + - "3306:3306" volumes: - ./mysql/data:/var/lib/mysql environment: From 11c9915a703ab3e4e9ad707720bd13281f877fa2 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Tue, 15 Apr 2025 00:44:34 +0800 Subject: [PATCH 13/14] =?UTF-8?q?update:=E4=BC=98=E5=8C=96=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/core/connection.py | 2 +- main/xiaozhi-server/core/websocket_server.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main/xiaozhi-server/core/connection.py b/main/xiaozhi-server/core/connection.py index b86cc24f..146241ff 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -204,7 +204,7 @@ class ConnectionHandler: self.headers.get("device-id", None), self.headers.get("client-id", None), ) - private_config["delete_audio"] = bool(self.config["delete_audio"], True) + private_config["delete_audio"] = bool(self.config.get("delete_audio", True)) self.logger.bind(tag=TAG).info(f"获取差异化配置成功: {private_config}") except Exception as e: self.logger.bind(tag=TAG).error(f"获取差异化配置失败: {e}") diff --git a/main/xiaozhi-server/core/websocket_server.py b/main/xiaozhi-server/core/websocket_server.py index ed0b92ee..cb4dee08 100644 --- a/main/xiaozhi-server/core/websocket_server.py +++ b/main/xiaozhi-server/core/websocket_server.py @@ -25,7 +25,7 @@ class WebSocketServer: async def start(self): server_config = self.config["server"] host = server_config["ip"] - port = server_config["port"] + port = int(server_config.get("port", 8000)) self.logger.bind(tag=TAG).info( "Server is running at ws://{}:{}/xiaozhi/v1/", get_local_ip(), port From eaaea2b24c2847af0b290575b85389de719626e2 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Tue, 15 Apr 2025 01:46:36 +0800 Subject: [PATCH 14/14] =?UTF-8?q?update:=E6=99=BA=E6=8E=A7=E5=8F=B0?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=89=88=E6=9C=AC=E5=8F=B7=20(#793)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/security/config/ShiroConfig.java | 1 + .../security/controller/LoginController.java | 10 +++++ main/manager-web/src/apis/module/user.js | 18 +++++++- .../src/components/VersionFooter.vue | 39 ++++++++++++++++ .../src/views/DeviceManagement.vue | 25 ++++------- main/manager-web/src/views/ModelConfig.vue | 44 +++++-------------- .../src/views/ParamsManagement.vue | 16 ------- main/manager-web/src/views/UserManagement.vue | 18 +------- main/manager-web/src/views/home.vue | 9 ++-- main/manager-web/src/views/login.vue | 28 +++++++++--- main/manager-web/src/views/register.vue | 8 ++-- main/manager-web/src/views/roleConfig.vue | 3 -- main/xiaozhi-server/config/logger.py | 9 +++- 13 files changed, 126 insertions(+), 102 deletions(-) create mode 100644 main/manager-web/src/components/VersionFooter.vue diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java b/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java index 7bd356fc..fdcb62b2 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java @@ -76,6 +76,7 @@ public class ShiroConfig { filterMap.put("/favicon.ico", "anon"); filterMap.put("/user/captcha", "anon"); filterMap.put("/user/login", "anon"); + filterMap.put("/user/pub-config", "anon"); filterMap.put("/user/register", "anon"); filterMap.put("/config/server-base", "anon"); filterMap.put("/config/agent-models", "anon"); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java index 7db612b5..0ee6a1ce 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java @@ -1,6 +1,8 @@ package xiaozhi.modules.security.controller; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -111,4 +113,12 @@ public class LoginController { sysUserTokenService.changePassword(userId, passwordDTO); return new Result<>(); } + + @GetMapping("/pub-config") + @Operation(summary = "公共配置") + public Result> pubConfig() { + Map config = new HashMap<>(); + config.put("version", "0.3.3"); + return new Result>().ok(config); + } } \ No newline at end of file diff --git a/main/manager-web/src/apis/module/user.js b/main/manager-web/src/apis/module/user.js index 748867b2..84d5b7f9 100755 --- a/main/manager-web/src/apis/module/user.js +++ b/main/manager-web/src/apis/module/user.js @@ -106,7 +106,7 @@ export default { }, // 修改用户状态 changeUserStatus(status, userIds, successCallback) { - console.log(555,userIds) + console.log(555, userIds) RequestService.sendRequest() .url(`${getServiceUrl()}/admin/users/changeStatus/${status}`) .method('put') @@ -122,4 +122,20 @@ export default { }) }).send() }, + // 获取公共配置 + getPubConfig(callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/user/pub-config`) + .method('GET') + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .fail((err) => { + console.error('获取公共配置失败:', err); + RequestService.reAjaxFun(() => { + this.getPubConfig(callback); + }); + }).send(); + }, } diff --git a/main/manager-web/src/components/VersionFooter.vue b/main/manager-web/src/components/VersionFooter.vue new file mode 100644 index 00000000..8a8b76a0 --- /dev/null +++ b/main/manager-web/src/components/VersionFooter.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/main/manager-web/src/views/DeviceManagement.vue b/main/manager-web/src/views/DeviceManagement.vue index bffefb07..823bedc6 100644 --- a/main/manager-web/src/views/DeviceManagement.vue +++ b/main/manager-web/src/views/DeviceManagement.vue @@ -4,7 +4,8 @@

设备列表

- + @@ -40,22 +41,17 @@
- {{ isAllSelected ? '取消全选' : '全选' }} + {{ isAllSelected ? '取消全选' : '全选' }} - 新增 + 新增
- @@ -63,9 +59,6 @@
-
@@ -82,7 +75,7 @@ export default { data() { return { addDeviceDialogVisible: false, - selectedDevices: [], + selectedDevices: [], isAllSelected: false, currentAgentId: this.$route.query.agentId || '', currentPage: 1, @@ -99,7 +92,7 @@ export default { return this.deviceList.slice(start, end); }, pageCount() { - return Math.ceil(this.deviceList.length / this.pageSize); + return Math.ceil(this.deviceList.length / this.pageSize); }, visiblePages() { const pages = []; @@ -346,6 +339,4 @@ export default { color: white; } } - - diff --git a/main/manager-web/src/views/ModelConfig.vue b/main/manager-web/src/views/ModelConfig.vue index 343cb06f..2f5a5dae 100644 --- a/main/manager-web/src/views/ModelConfig.vue +++ b/main/manager-web/src/views/ModelConfig.vue @@ -3,21 +3,15 @@
-

{{ modelTypeText }}

+

{{ modelTypeText }}

-
- - - 搜索 - -
+
+ + + 搜索 + +
@@ -93,9 +87,9 @@ @@ -639,20 +629,6 @@ export default { gap: 8px; } -.copyright { - text-align: center; - color: #979db1; - font-size: 12px; - font-weight: 400; - margin-top: auto; - padding: 30px 0 20px; - position: absolute; - bottom: 0; - left: 50%; - transform: translateX(-50%); - width: 100%; -} - .title-wrapper { display: flex; align-items: center; diff --git a/main/manager-web/src/views/ParamsManagement.vue b/main/manager-web/src/views/ParamsManagement.vue index e9baa1e8..02f912a1 100644 --- a/main/manager-web/src/views/ParamsManagement.vue +++ b/main/manager-web/src/views/ParamsManagement.vue @@ -64,8 +64,6 @@ - - @@ -382,20 +380,6 @@ export default { } } -.copyright { - text-align: center; - color: #979db1; - font-size: 12px; - font-weight: 400; - margin-top: auto; - padding: 30px 0 20px; - position: absolute; - bottom: 0; - left: 50%; - transform: translateX(-50%); - width: 100%; -} - .custom-pagination { display: flex; align-items: center; diff --git a/main/manager-web/src/views/UserManagement.vue b/main/manager-web/src/views/UserManagement.vue index 45015d97..617ad04c 100644 --- a/main/manager-web/src/views/UserManagement.vue +++ b/main/manager-web/src/views/UserManagement.vue @@ -42,7 +42,7 @@
- {{ isAllSelected ? '取消全选' : '全选' }} + {{ isAllSelected ? '取消全选' : '全选' }} 启用
- - @@ -465,20 +463,6 @@ export default { color: black; } -.copyright { - text-align: center; - color: #979db1; - font-size: 12px; - font-weight: 400; - margin-top: auto; - padding: 30px 0 20px; - position: absolute; - bottom: 0; - left: 50%; - transform: translateX(-50%); - width: 100%; -} - .custom-pagination { display: flex; align-items: center; diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index 0e9fd32a..5f8115f3 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -35,11 +35,11 @@ @deviceManage="handleDeviceManage" @delete="handleDeleteAgent" /> - + + + @@ -49,10 +49,11 @@ import Api from '@/apis/api'; import AddWisdomBodyDialog from '@/components/AddWisdomBodyDialog.vue'; import DeviceItem from '@/components/DeviceItem.vue'; import HeaderBar from '@/components/HeaderBar.vue'; +import VersionFooter from '@/components/VersionFooter.vue'; export default { name: 'HomePage', - components: { DeviceItem, AddWisdomBodyDialog, HeaderBar }, + components: { DeviceItem, AddWisdomBodyDialog, HeaderBar, VersionFooter }, data() { return { addDeviceDialogVisible: false, diff --git a/main/manager-web/src/views/login.vue b/main/manager-web/src/views/login.vue index 23c8479e..af50bc1c 100644 --- a/main/manager-web/src/views/login.vue +++ b/main/manager-web/src/views/login.vue @@ -51,9 +51,7 @@ - + @@ -61,11 +59,14 @@