Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 375|回复: 3

搭建AI 小智

[复制链接]

283

主题

414

帖子

2662

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2662
发表于 2025-4-15 14:52:25 | 显示全部楼层 |阅读模式
AI小智,人如其名,蛮好聊的。
现在搭建一个实时服务器,可以通过小智问他网上的任何问题了:
一、  购买小智, 建议闲鱼购买,货比三家,挑个好的。
小智使用说明
简易说明:

小智简易使用说明

小智简易使用说明


      使用过后,确实很好。接着就想增添小智实时上网,看这篇:
我的小智AI机器人已接入互联网,只需添加80行代码
下面我们来详细梳理一下接入方法:

二、复刻小智服务端:
虾哥开源的小智AI聊天机器人,确实被吃惊到了。那么下面,如果虾哥停服如何办?就需要搭建一个自己的小智服务端:
也就是说,首先要建立一个复刻的服务端:小智AI的服务端也复刻成功啦,而且开源(附:复刻教程)
下面具体说说:

1:服务端程序
01:开源地址:https://github.com/xinnan-tech/xiaozhi-esp32-server
    运行服务端的方法:
*  Docker快速部署
* 借助Docker环境运行部署:这个适合已经安装了docker。
* 本地源码运行:为了更高的定制性,我们采用本地源码运行

02:选择本地源码运行方法:
参考:https://github.com/xinnan-tech/x ... 1%E8%BF%90%E8%A1%8C几点注意事项:
001:  安装基础环境:
重要提示!windows 用户,可以通过安装Anaconda来管理环境。安装好Anaconda后,在开始那里搜索anaconda相关的关键词, 找到Anaconda Prpmpt,使用管理员身份运行它。输入如下内容:
  1. conda remove -n xiaozhi-esp32-server --all -y
  2. conda create -n xiaozhi-esp32-server python=3.10 -y    # 建立一个新的虚拟环境
  3. conda activate xiaozhi-esp32-server    # 激活该环境

  4. # 添加清华源通道
  5. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  6. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  7. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge

  8. conda install libopus -y
  9. conda install ffmpeg -y
复制代码
002:下载源码
  1. git clone https://github.com/xinnan-tech/xiaozhi-esp32-server.git
复制代码
下载后,如果项目的根文件夹不是xiaozhi-esp32-server, 更改为xiaozhi-esp32-server。

003: 安装本项目依赖:
  1. # 继续使用conda环境,这个环境其实在conda的安装目录里面,和venv大概差不多的意思
  2. conda activate xiaozhi-esp32-server
  3. # 进入到你的项目根目录,再进入main/xiaozhi-server
  4. cd main/xiaozhi-server
  5. pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
  6. pip install -r requirements.txt
复制代码

004:  下载语音识别模型文件:      这个文件较大,需要单独下载:https://pan.baidu.com/share/init ... tFnUT_A8Sg&pwd=qvna
下载后把model.pt 文件放在models/SenseVoiceSmall 目录下。

005:   配置项目配置文件:
      如果你的xiaozhi-server内,没有data目录,创建一个,如果data目录中没有.config.yaml, 把xiaozhi-server下的config.yaml拷贝到data下,然后改名为.config.yaml。
默认的LLM使用的是ChatGLMLLM, 该大模型分为免费和收费的,都需要到官网去注册一下。然后将获得的密钥写在配置文件里。具体见前面的参考。

006:  运行项目:
  1. # 确保在xiaozhi-server目录下执行
  2. conda activate xiaozhi-esp32-server
  3. python app.py
复制代码
运行成功的状态: ws://192.168.57.212:8001 地址(每个人不一样),在下面烧录硬件的时候需要用到
注意,
*如果运行app.py 提示没有avutil-58.dll等dll文件,将缺少的文件(从别的程序搜来或到专业网站下载)拷贝到:  c:\anaconda3\envs\xiaozhi-esp32-server\Library\bin\ 下然后重新运行app.py。
* 如果从github 上clone的源码无法在本地clone,要在clone后再pull一下,原地拉取( git pull home main),这样。


2:烧制小智客户端:

    01:小智硬件开源地址:https://github.com/78/xiaozhi-esp32

    02:烧录参考文档:https://github.com/xinnan-tech/x ... s/firmware-build.md
  1. idf.py  build
  2. idf.py build flash monitor
复制代码




三、更换模型
1、更换LLM模型为KIMI:   
    01: 将如下代码放入main/xiaozhi-server/core/providers/llm 这个目录下(KIMI模型):
      https://pan.baidu.com/s/1ZFeUINwifpmXjalnddYDuA?pwd=jsfv 提取码: jsfv
    02:将kimi.py 放在大模型的位置(llm/kimi/)
   
    03:  在前面做好的配置文件里更改配置:
    捕获.PNG

2、  重新运行,看看ws地址是否是一样的,不一样需要重新烧录小智客户端哦。

3、  OK!Have fun !



























回复

使用道具 举报

283

主题

414

帖子

2662

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2662
 楼主| 发表于 2025-4-17 23:18:23 | 显示全部楼层
今天真Tamara高兴!两个小智。这个不是重点。重点是调匀称了一个服务端的配置!这下爽到了
回复

使用道具 举报

283

主题

414

帖子

2662

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2662
 楼主| 发表于 2025-4-29 03:20:59 | 显示全部楼层
烧制小智固件详解:对xiaozhi-esp32/main/Kconfig.projbuild文件(配置文件):
调整OTA之前的地址:
  1. config OTA_URL
  2.     string "Default OTA URL"
  3.     default "https://api.tenclass.net/xiaozhi/ota/"
  4.     help
  5.         The application will access this URL to check for new firmwares and server address.
复制代码
调整OTA之后的地址:
  1. config OTA_URL
  2.     string "Default OTA URL"
  3.     default "http://192.168.1.25:8002/xiaozhi/ota/"
  4.     help
  5.         The application will access this URL to check for new firmwares and server address.
复制代码

测试端口:
  1. https://2662r3426b.vicp.fun/xiaozhi/ota/
复制代码

测试结果:
  1. OTA接口运行正常,websocket集群数量:1
复制代码

注意,这个服务端调好后,还要客户端ota配置一致:



回复

使用道具 举报

283

主题

414

帖子

2662

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2662
 楼主| 发表于 2025-5-19 12:52:14 | 显示全部楼层

小智xiaozhi-esp32-server配置OTA(本楼是人工智能回答,仅供参考。要以主楼内容为准,三楼内容正在更新中,更新完毕也是标准答案)
要为你的ESP32设备配置OTA(Over-The-Air)更新,你需要设置一个服务器来托管更新固件,并且需要在ESP32设备上编写代码以支持OTA更新。以下是详细的步骤和代码示例,帮助你完成这一过程。

步骤 1: 准备服务器
首先,你需要一个服务器来托管你的固件文件。你可以使用任何支持HTTP的服务器,例如Python的Flask框架。

安装Flask:

pip install flask

创建Flask应用:

创建一个Python文件(例如app.py),并添加以下代码:

from flask import Flask, send_from_directory
app = Flask(__name__, static_folder='firmware')

@app.route('/')
def index():
    return "Welcome to OTA Server!"

@app.route('/firmware/<path:path>')
def send_firmware(path):
    return send_from_directory('firmware', path)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

上传固件到服务器:

将你的.bin固件文件放到firmware文件夹中(如果没有该文件夹,请先创建)。

运行服务器:

python app.py

步骤 2: 配置ESP32设备
在ESP32设备上,你需要编写代码来连接到服务器并请求OTA更新。你可以使用ESPAsyncWebServer库来简化这个过程。首先,安装必要的库:

pip install esptool  # 用于上传固件到ESP32
pip install pyserial  # 用于串行通信(可选,取决于你的开发环境)
然后,编写ESP32的Arduino代码:

安装ESPAsyncWebServer库:在Arduino IDE中通过库管理器安装ESPAsyncWebServer和Update库。

编写代码:

#include <Arduino.h>
#include <ESPAsyncWebServer.h>
#include <Update.h>
#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "yourSSID";
const char* password = "yourPASSWORD";
const char* host = "your_server_ip"; // 或者服务器的域名和端口,例如 "http://your_server_ip:5000"
const char* firmwarePath = "/firmware/your_firmware.bin"; // 确保路径正确且文件名正确

AsyncWebServer server(80);

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  Serial.println("Connected to the WiFi network");

  server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/plain", "Update process started");
    startUpdate(); // 调用更新函数
  });
  
  server.begin();
}

void loop() {
  if(Update.hasError()) {
    Serial.println("Update failed");
    ESP.restart();
  }
}

void startUpdate() {
  HTTPClient http;    //Declare an object of class HTTPClient
  http.begin(host + firmwarePath); //Specify request destination
  int httpCode = http.GET();                                                                  //Send the request
  if (httpCode == HTTP_CODE_OK) {                                            //Check the returning code
    int len = http.getSize();
    Serial.printf("[HTTP] GET... code: %d\n", httpCode);
    if (Update.begin(UPDATE_SIZE_UNKNOWN)) {   //start with max available size
      Serial.printf("Begin OTA. Size: %d\n", len);
      const int maxBufferSize = 1024; // Adjust buffer size as needed
      uint8_t buff[maxBufferSize
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-6-7 01:24 , Processed in 0.017757 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表