ESP32调用本地部署的ChatTTS

1 本地部署ChatTTS

参考 windows10部署ChatTTS+Apifox调用

2 实现过程

部署好本地ChatTTS模型后,测试接口正常。让ESP32接入局域网络,发送post请求生成wav文件,ESP32通过远程获取文件来得到音频文件,并播放音频文件。

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

const char* ssid = "EzhanNet";
const char* password = "11111111";
const char* serverUrl = "http://192.168.0.121:9994/tts";

void sendPostTTSRequest() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(serverUrl);  // 目标URL
    String payload = "text=windows&voice=1111&top_p=0.7&top_k=20&temperature=0.3&custom_voice=3531&refine_max_new_token=384";
    http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // 设置请求头

    int httpResponseCode = http.POST(payload); // 发送 POST 请求

    if (httpResponseCode > 0) {
      String response = http.getString(); // 获取响应
      Serial.printf("Response code: %d\n", httpResponseCode);
      // Serial.println("Response: " + response);
      getWavFile(response);
    } else {
      Serial.println("发送 POST 时出错: " + String(httpResponseCode));
    }

    http.end(); // 结束请求
  } else {
    Serial.println("WiFi not connected");
  }
}

void getWavFile(String response) {
  // 解析 JSON 响应
      DynamicJsonDocument docJson(4096);
      DeserializationError error = deserializeJson(docJson, response);

      if (!error) {
        const char* response_info = docJson["url"];
        Serial.println("chattts speak file: " + String(response_info));
        HTTPClient http2;
        http2.begin(String(response_info));
        int httpCode = http2.GET();
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            Serial.printf("[HTTP] GET... code: %d\n", httpCode);
            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http2.getString();
                Serial.println(payload);
            }
        } else {
            Serial.printf("[HTTP] GET... failed, error: %s\n", http2.errorToString(httpCode).c_str());
        }
        http2.end();
      } else {
        Serial.println("解析 JSON 失败: " + String(error.c_str()));
      }
}

void setup() {
  Serial.begin(115200);

  // 连接到WiFi
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
  Serial.print("IP : ");
  Serial.println(WiFi.localIP());

  sendPostTTSRequest();
}

void loop() {
}

<think>好的,我现在需要帮助用户在ESP32调用DeepSeek的模型或接口。首先,我需要了解用户的需求。他们使用的是MicroPython环境,具体是ESP32-C3单片机。用户提到了参考文章,里面提到了在MicroPython中调用DeepSeek API的实践,所以可能需要参考那篇文章的方法。 接下来,我需要考虑ESP32的资源限制。ESP32的内存和计算能力有限,直接运行大型模型如DeepSeek可能不现实。因此,可能的解决方案是通过API调用云端服务,而不是在本地部署模型。用户可能希望发送请求到DeepSeek的API,然后处理返回的结果。 然后,我需要回顾如何在MicroPython中进行HTTP请求。通常使用urequests库,但需要确保固件支持。同时,需要处理网络连接,比如Wi-Fi的连接步骤。用户可能需要先连接Wi-Fi,然后构造API请求,包括正确的URL、headers和data。 认证也是一个关键点。调用API通常需要API key,用户需要在代码中安全地存储这个key,比如使用配置文件,避免硬编码。此外,可能需要处理JSON数据的解析,发送请求体并解析响应。 用户提到的参考文章[^1]可能已经提供了一些示例代码,我需要建议用户参考那篇文章的具体实现,比如如何设置HTTP头,如何处理返回的数据。同时,可能需要处理错误,比如网络连接问题或API返回的错误信息。 最后,需要提醒用户注意ESP32的资源限制,比如内存不足可能导致的问题,建议优化数据处理流程,或者分块处理数据。如果实时性要求高,可能需要考虑更高效的通信方式或简化数据处理步骤。 总结步骤应该是:连接Wi-Fi -> 构造API请求 -> 发送请求并处理响应 -> 解析结果。同时,需要确保代码的健壮性,处理可能的异常,并优化内存使用。</think>在 ESP32调用 DeepSeek 模型或接口需要结合物联网设备的特性与 API 调用技术,具体实现步骤如下: ### 一、硬件环境准备 1. 确保 ESP32-C3 已烧录支持网络通信的 MicroPython 固件 2. 配置 Wi-Fi 连接模块(需包含 `network` 库支持) 3. 预留至少 50KB 的可用内存用于数据处理 ### 二、API 调用实现 ```python import urequests import ujson import network def connect_wifi(ssid, pwd): sta = network.WLAN(network.STA_IF) sta.active(True) sta.connect(ssid, pwd) while not sta.isconnected(): pass print('IP:', sta.ifconfig()[0]) def call_deepseek(prompt): api_key = "your_api_key" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } data = ujson.dumps({ "model": "deepseek-chat", "messages": [{"role": "user", "content": prompt}] }) response = urequests.post( "https://api.deepseek.com/v1/chat/completions", headers=headers, data=data ) return response.json() ``` ### 三、关键注意事项 1. **内存优化**:建议使用数据流式处理,分块接收响应数据 2. **安全认证**:API key 应加密存储,推荐使用 ESP32 的安全存储区 3. **网络稳定性**:需实现重试机制(建议最多3次重试) 4. **功耗控制**:每次调用后应进入低功耗模式(需配置 `machine.deepsleep()`) ### 四、典型问题解决方案 - **内存不足**:可通过缩短请求文本长度,使用 `gc.collect()` 主动回收内存 - **证书验证失败**:需更新根证书到 MicroPython 环境 - **响应超时**:调整默认超时时间为 10-15 秒
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南山二毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值