这是描述信息

无线wifi芯片模组乐鑫大中华区代理商ESP-BOX和OpenAI ChatGPT的结合

无线wifi芯片模组乐鑫大中华区代理商ESP-BOX和OpenAI ChatGPT的结合

无线wifi芯片模组乐鑫大中华区代理商ESP-BOX和OpenAI ChatGPT的结合

无线wifi芯片模组乐鑫大中华区代理商ESP-BOX和OpenAI ChatGPT的结合

无线wifi芯片模组乐鑫大中华区代理商ESP-BOX和OpenAI

无线wifi芯片模组乐鑫大中华区代理商ESP-BOX和OpenAI ChatGPT的结合

目前,我们正在目睹一场技术革命,并且OpenAI正站在这场变革的前沿。其中令人兴奋的创新之一是ChatGPT,它利用自然语言处理的能力为用户打造了更具吸引力和直观的体验。而将OpenAI的API与物联网设备结合在一起,为我们打开了无限的可能性。

本文将探讨无线wifi芯片模组乐鑫大中华区代理商ChatGPT和ESP-BOX的潜力,这个强大的结合可以将物联网设备提升到一个全新的水平。


这篇文章主要分为三个部分,详细介绍了本项目的主要内容:

在第一部分中,无线wifi芯片模组乐鑫大中华区代理商将详细介绍ESP-BOX,并解释其功能和特点。

第二部分是案例研究,旨在阐述从零开始如何逐步构建项目。

总结部分为提供相关资料来源,以帮助您加深对本项目的了解和理解。您可以通过这些资料巩固所学知识。


ESP-BOX是一款智能家居设备,具有多种功能和应用。它可以与智能手机连接,通过手机上的应用程序控制家中的各种设备,如电视、空调、灯光等。ESP-BOX还具有语音控制功能,用户只需语言操作即可控制家电设备开关。除此之外,无线wifi芯片模组乐鑫大中华区代理商ESP-BOX还可以监控家中的安全状况,如门窗的开关状态、烟雾和火灾报警等。用户只需在手机上查看相关信息即可。ESP-BOX的设计简约而时尚,方便安装和使用。它为用户提供了更加智能、便捷和安全的家居生活体验。


ESP-BOX是一款全新的AIoT开发平台,其包含ESP32-S3-BOX和ESP32-S3-BOX-Lite两款开发板。这两款开发板都搭载ESP32-S3Wi-Fi+Bluetooth5(LE)SoC芯片,为AIoT应用提供了灵活、可定制的解决方案,方便开发者们快速集成多种传感器、控制器以及网关设备。

ESP32-S3-BOX是一款功能强大的设备。

ESP-BOX具备多种功能,使其成为理想的AIoT开发平台。现在无线wifi芯片模组乐鑫大中华区代理商为您逐一介绍其中一些关键功能:


1.远场语音互动采用了双麦克风的设计

ESP-BOX拥有双麦克风远场语音交互功能,支持与设备进行远距离交互。

2.离线中英文语音指令识别具有高识别率

ESP-BOX提供离线语音指令识别系统,可以识别中文和英文,并具有高度准确的识别率。使用ESP-BOX可以方便地开发支持语音操作的设备。

3.可以重新配置的指令达到200+条,支持中英文语音输入。

开发者可以根据需要简易地配置超过两百个中英文语音指令。

4.不断识别和激活中断

E无线wifi芯片模组乐鑫大中华区代理商SP-BOX能够持续识别并唤醒中断,以确保设备随时准备好接收语音指令。

5.可重复使用且灵活的图形用户界面框架

ESP-BOX提供了一个灵活且可复用的GUI框架,使开发人员能够为应用程序设计定制化的用户界面。

6.ESP-RainMaker是一款从端到端的AIoT开发框架。

ESP-BOX是基于ESP-RainMaker的一款端到端的AIoT开发框架,专为开发人员提供创建高效智能设备所需的工具。

7.支持外设模块扩展,并兼容Pmod™接口。


ESP-BOX带有兼容Pmod™接口,能够便捷地扩展设备功能,与多种外设模块无障碍地交互。
案例研究


这个案例展示了如何利用ESP-BOX和OpenAIAPI开发一个能够通过语音进行控制的聊天机器人。

介绍

这个案例将介绍如何使用无线wifi芯片模组乐鑫大中华区代理商ESP-BOX和OpenAIAPI来开发一款语音控制的聊天机器人。该系统可以接收用户的语音指令并将其显示在屏幕上,然后调用OpenAIAPI进行处理,并生成相应的回复。回复将显示在ESP-BOX屏幕上,并通过喇叭播放出来。我们将按照下文中的开发流程,逐步深入了解如何巧妙地融合这些技术,打造出高效的语音控制聊天机器人。

案例研究的开发流程可以分为以下几个步骤:首先,确定研究目标和问题。要对研究的目标进行明确的定义,并明确要解决的问题,从而为后续研究工作的进行提供方向。

其次,收集案例研究所需的信息和数据。这包括采集和整理相关文献、统计数据、实地调查等,确保研究所需的信息全面准确。

接下来,要进行案例的选择和筛选。根据研究问题和目标,从众多案例中挑选出符合条件的案例,确保案例具有代表性和可比性。

然后,进行案例的分析和解读。通过对案例进行系统性的分析,包括对案例的背景、数据和相关因素的综合研究,从而得出结论和解读案例的意义。

进行案例研究的总结和撰写。根据研究的目标和结果,对整个研究过程进行总结,并将研究成果以适当的格式撰写成报告或论文。

总之,案例研究的开发流程包括确定研究目标、收集信息、选择案例、分析解读和总结撰写等多个步骤,这些步骤相互关联,在开展案例研究时必须全面考虑和落实。


环境设置

为了防止出现错误,必须创建适当的环境并安装正确的软件版本。

ESP-IDF(EspressifIoTDevelopmentFramework)是适用于Espressif芯片的官方开发框架。这个框架提供了一套完整的工具链和库,帮助开发者在芯片上开发和调试应用程序。无线wifi芯片模组乐鑫大中华区代理商ESP-IDF支持多种编程语言,包括C和C++,并提供了丰富的API和示例代码,方便开发者快速搭建和部署物联网项目。该框架还提供了强大的WiFi和蓝牙功能,可以方便地连接和控制各种外部设备。ESP-IDF是一个强大且灵活的工具,使得Espressif芯片的开发更加高效和便捷。

在这个例子中,我们将使用ESP-IDF5.0版本的主分支。如果你需要设置ESP-IDF的指导,请参考官方的《ESP-IDF编程指南》以获取更多信息。

*目前为止,本文撰写时的IDF提交头为df9310ada2。

ChatGPTAPI是OpenAI提供的自然语言处理接口,使开发者可以直接与ChatGPT进行交互。该API提供了对话生成模型的访问,可以用于构建聊天机器人、自动客服等应用。使用ChatGPTAPI,开发者可以通过向模型发送用户的消息并接收模型的回复来实现自然语言对话的功能。API提供了简单易用的接口,使开发者能够轻松集成ChatGPT的强大功能到自己的应用中。无论是进行智能问答、对话场景模拟还是其他应用,ChatGPTAPI都是一个强大的工具。

ChatGPT是一个基于GPT-3.5架构的强大语言模型。要使用ChatGPT,您需要先在OpenAI平台上创建一个账户,并获取免费或付费的API密钥。通过API密钥,您可以获得许多功能和能力,比如自然语言处理与生成、文本补全和对话建模。您还可以根据自己的需求来定义这些功能。如需了解更多信息,请访问官方API参考页面。

请务必确保API密钥的保密性和安全性,以防止未经授权访问您的账户和数据。


为离线语音识别提供能力提升

无线wifi芯片模组乐鑫大中华区代理商ESP-SR是一种创新的语音识别框架,可以使设备在无需依赖外部云服务的情况下识别口语词汇和短语,非常适合离线语音识别应用。

ESP-SR框架由多个模块组成,包括音频前端(AFE)、唤醒词引擎(WakeNet)、语音指令词识别(MultiNet)和语音合成(目前仅支持中文)。欲了解更多信息,请参阅ESP-SR官方文档。


将OpenAIAPI集成进来

OpenAIAPI提供了多种功能,开发者可以利用这些功能来增强其应用程序。我们的项目使用了音频转文本API和补全API,并采用了基于ESP-IDF的C语言代码。以下简要介绍我们所使用的代码。

音频转文本

我们采用HTTPS和OpenAI音频API来提取音频中的文本信息,以下是我们实现的代码。

esp_err_t create_whisper_request_from_record(uint8_t *audio, int audio_len)
{
    // Set the authorization headers
    char url[128] = "https://api.openai.com/v1/audio/transcriptions";
    char headers[256];
    snprintf(headers, sizeof(headers), "Bearer %s", OPENAI_API_KEY);
    // Configure the HTTP client
    esp_http_client_config_t config = {
        .url = url,
        .method = HTTP_METHOD_POST,
        .event_handler = response_handler,
        .buffer_size = MAX_HTTP_RECV_BUFFER,
        .timeout_ms = 60000,
        .crt_bundle_attach = esp_crt_bundle_attach,
    };

    // Initialize the HTTP client
    esp_http_client_handle_t client = esp_http_client_init(&config);

    // Set the headers
    esp_http_client_set_header(client, "Authorization", headers);

    // Set the content type and the boundary string
    char boundary[] = "boundary1234567890";
    char content_type[64];
    snprintf(content_type, sizeof(content_type), "multipart/form-data; boundary=%s", boundary);
    esp_http_client_set_header(client, "Content-Type", content_type);

    // Set the file data and size
    char *file_data = NULL;
    size_t file_size;
    file_data = (char *)audio;
    file_size = audio_len;

    // Build the multipart/form-data request
    char *form_data = (char *)malloc(MAX_HTTP_RECV_BUFFER);
    assert(form_data);
    ESP_LOGI(TAG, "Size of form_data buffer: %zu bytes", sizeof(*form_data) * MAX_HTTP_RECV_BUFFER);
    int form_data_len = 0;
    form_data_len += snprintf(form_data + form_data_len, MAX_HTTP_RECV_BUFFER - form_data_len,
                              "--%s\r\n"
                              "Content-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\n"
                              "Content-Type: application/octet-stream\r\n"
                              "\r\n", boundary, get_file_format(file_type));
    ESP_LOGI(TAG, "form_data_len %d", form_data_len);
    ESP_LOGI(TAG, "form_data %s\n", form_data);

    // Append the audio file contents
    memcpy(form_data + form_data_len, file_data, file_size);
    form_data_len += file_size;
    ESP_LOGI(TAG, "Size of form_data: %zu", form_data_len);

    // Append the rest of the form-data
    form_data_len += snprintf(form_data + form_data_len, MAX_HTTP_RECV_BUFFER - form_data_len,
                              "\r\n"
                              "--%s\r\n"
                              "Content-Disposition: form-data; name=\"model\"\r\n"
                              "\r\n"
                              "whisper-1\r\n"
                              "--%s--\r\n", boundary, boundary);

    // Set the headers and post field
    esp_http_client_set_post_field(client, form_data, form_data_len);

    // Send the request
    esp_err_t err = esp_http_client_perform(client);
    if (err != ESP_OK) {
        ESP_LOGW(TAG, "HTTP POST request failed: %s\n", esp_err_to_name(err));
    }

    // Clean up client
    esp_http_client_cleanup(client);

    // Return error code
    return err;
}
这段代码是一个名为 whisper_from_record 的函数,它接受一个指向包含音频数据的缓冲区的指针和一个表示音频数据长度的整数 audio_len。该函数向 OpenAI API 端点发送一个 POST 请求,对给定的音频数据进行转录。


该函数首先初始化 OpenAI API 的 URL,并使用持有者令牌 (bearer token) 的OPENAI_API_KEY 设置授权头。然后,配置并初始化 HTTP 客户端,包括配置 URL、HTTP 方法、事件处理程序、缓冲区大小、超时和 SSL 证书等。


接下来,将内容类型 (content type) 和多部分表单数据 (multipart/form_data) 请求的边界字符串设置为 HTTP 客户端的头部,还设置了文件数据和文件大小,并构建了一个多部分表单数据请求。使用 malloc() 函数分配 form_data 缓冲区,并添加必要的信息,包括音频文件的文件名、内容类型、文件内容以及将用于转录的模型名称。


一旦构建了 form_data,它就被设置为 HTTP 客户端的 POST 字段,并且客户端将 POST 请求发送到 OpenAI API 端点。如果请求过程中出现错误,该函数会记录错误消息。清理 HTTP 客户端,并释放为 form_data 分配的资源。


该函数返回一个 esp_err_t 错误代码,指示 HTTP 请求是否成功。

聊天补全
我们使用 OpenAI 聊天补全 (Chat Completion) API 发送 HTTPS 请求来进行聊天补全。这个过程使用 create_chatgpt_request 函数,该函数接受一个表示输入文本的 content 参数,并将参数内容输入 GPT-3.5 模型。

esp_err_t create_chatgpt_request(const char *content)
{
    char url[128] = "https://api.openai.com/v1/chat/completions";
    char model[16] = "gpt-3.5-turbo";
    char headers[256];
    snprintf(headers, sizeof(headers), "Bearer %s", OPENAI_API_KEY);

    esp_http_client_config_t config = {
        .url = url,
        .method = HTTP_METHOD_POST,
        .event_handler = response_handler,
        .buffer_size = MAX_HTTP_RECV_BUFFER,
        .timeout_ms = 30000,
        .cert_pem = esp_crt_bundle_attach,
    };

    // Set the headers
    esp_http_client_handle_t client = esp_http_client_init(&config);
    esp_http_client_set_header(client, "Content-Type", "application/json");
    esp_http_client_set_header(client, "Authorization", headers);

    // Create JSON payload with model, max tokens, and content
    snprintf(json_payload, sizeof(json_payload), json_fmt, model, MAX_RESPONSE_TOKEN, content);
    esp_http_client_set_post_field(client, json_payload, strlen(json_payload));

    // Send the request
    esp_err_t err = esp_http_client_perform(client);
    if (err != ESP_OK) {
        ESP_LOGW(TAG, "HTTP POST request failed: %s\n", esp_err_to_name(err));
    }

    // Clean up client
    esp_http_client_cleanup(client);

    // Return error code
    return err;
}
该函数首先设置了用于 HTTP POST 请求的 URL、模型和头部信息,然后创建一个包含模型、大 token 数和内容的 JSON 负载。

接下来,函数设置了 HTTP 请求的头部信息,并将 JSON 负载设置为请求的 POST 字段。

使用 esp_http_client_perform() 发送 HTTP POST 请求,如果请求失败,将记录错误消息。

清理 HTTP 客户端并返回错误代码。

处理响应
ESP-IDF HTTP 客户端库使用回调函数 response_handler 来处理在 HTTP 请求/响应交换过程中发生的事件。

esp_err_t response_handler(esp_http_client_event_t *evt)
{
    static char *data = NULL; // Initialize data to NULL
    static int data_len = 0; // Initialize data to NULL

    switch (evt->event_id) {
    case HTTP_EVENT_ERROR:
        ESP_LOGI(TAG, "HTTP_EVENT_ERROR");
        break;

    case HTTP_EVENT_ON_CONNECTED:
        ESP_LOGI(TAG, "HTTP_EVENT_ON_CONNECTED");
        break;

    case HTTP_EVENT_HEADER_SENT:
        ESP_LOGI(TAG, "HTTP_EVENT_HEADER_SENT");
        break;

    case HTTP_EVENT_ON_HEADER:
        if (evt->data_len) {
            ESP_LOGI(TAG, "HTTP_EVENT_ON_HEADER");
            ESP_LOGI(TAG, "%.*s", evt->data_len, (char *)evt->data);
        }
        break;

    case HTTP_EVENT_ON_DATA:
        ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA (%d +)%d\n", data_len, evt->data_len);
        ESP_LOGI(TAG, "Raw Response: data length: (%d +)%d: %.*s\n", data_len, evt->data_len, evt->data_len, (char *)evt->data);
        
        // Allocate memory for the incoming data        
        data = heap_caps_realloc(data, data_len + evt->data_len + 1,  MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
        if (data == NULL) {
            ESP_LOGE(TAG, "data realloc failed");
            free(data);
            data = NULL;
            break;
        }
        memcpy(data + data_len, (char *)evt->data, evt->data_len);
        data_len += evt->data_len;
        data[data_len] = '\0';
        break;

    case HTTP_EVENT_ON_FINISH:
        ESP_LOGI(TAG, "HTTP_EVENT_ON_FINISH");
        if (data != NULL) {
            // Process the raw data
            parsing_data(data, strlen(data));
            // Free memory
            free(data); 
            data = NULL;
            data_len = 0;
        }
        break;

    case HTTP_EVENT_DISCONNECTED:
        ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED");
        break;

    default:
        break;
    }
    return ESP_OK;
}
在 HTTP_EVENT_ON_DATA 事件发生时,该函数为接收到的数据分配内存空间,将数据复制到缓冲区,并相应地增加 data_len 变量的值。这样做是为了累积响应数据。

在 HTTP_EVENT_ON_FINISH 事件发生时,该函数打印一条消息,指示 HTTP 交换已完成,然后调用 parsing_data 函数来处理累积的原始数据,释放内存并将数据和 data_len 变量重置为零,释放分配的内存并将缓冲区及其长度重置为零。


该函数返回 ESP_OK,表示操作成功。


解析原始数据
我们使用 JSON 解析器组件解析从 ChatGPT API 和 Whisper AI API 获取的 HTTPS 原始响应。为了完成这个任务,我们使用一个调用解析器组件的函数。有关该工具的更多细节,请参考 GitHub。

void parse_response (const char *data, int len)
{
    jparse_ctx_t jctx;
    int ret = json_parse_start(&jctx, data, len);
    if (ret != OS_SUCCESS) {
        ESP_LOGE(TAG, "Parser failed");
        return;
    }
    printf("\n");
    int num_choices;

    /* Parsing Chat GPT response*/
    if (json_obj_get_array(&jctx, "choices", &num_choices) == OS_SUCCESS) {
        for (int i = 0; i < num_choices; i++) {
            if (json_arr_get_object(&jctx, i) == OS_SUCCESS && json_obj_get_object(&jctx, "message") == OS_SUCCESS &&
                    json_obj_get_string(&jctx, "content", message_content, sizeof(message_content)) == OS_SUCCESS) {
                ESP_LOGI(TAG, "ChatGPT message_content: %s\n", message_content);
            }
            json_arr_leave_object(&jctx);
        }
        json_obj_leave_array(&jctx);
    }

    /* Parsing Whisper AI response*/
    else if (json_obj_get_string(&jctx, "text", message_content, sizeof(message_content)) == OS_SUCCESS) {
        ESP_LOGI(TAG, "Whisper message_content: %s\n", message_content);
    } else if (json_obj_get_object(&jctx, "error") == OS_SUCCESS) {
        if (json_obj_get_string(&jctx, "type", message_content, sizeof(message_content)) == OS_SUCCESS) {
            ESP_LOGE(TAG, "API returns an error: %s", message_content);
        }
    }
}
集成 TTS API
目前,OpenAI 并未公开提供其文本转语音 (TTS) API 的访问权限。然而,市面上有多种其他的 TTS API 可供选择,包括 Voicerss、TTSmaker 和会话精灵 (TalkingGenie)。这些 API 可以根据文本输入生成语音,你可以在它们的网站上找到更多相关信息。

本教程使用的是 TalkingGenie API,它是目前可用的佳选择之一,可以生成高质量、自然流畅的英文和中文语音。TalkingGenie 的一个特点是它能够无缝地将混合语言文本(如中文和英文)转化为语音。这对于面向全球受众的内容创作来说是一个宝贵的工具。下面的代码将 ChatGPT 生成的文本响应发送给 TalkingGenie API,然后通过 ESP-BOX 播放生成的语音。

esp_err_t text_to_speech_request(const char *message, AUDIO_CODECS_FORMAT code_format)
{
    int j = 0;
    size_t message_len = strlen(message);
    char *encoded_message;
    char *language_format_str, *voice_format_str, *codec_format_str;

    // Encode the message for URL transmission
    encoded_message = heap_caps_malloc((3 * message_len + 1), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
    url_encode(message, encoded_message);

    // Determine the audio codec format
    if (AUDIO_CODECS_MP3 == code_format) {
        codec_format_str = "MP3";
    } else {
        codec_format_str = "WAV";
    }

    // Determine the required size of the URL bu
    int url_size = snprintf(NULL, 0, "https://dds.dui.ai/runtime/v1/synthesize?voiceId=%s&text=%s&speed=1&volume=%d&audiotype=%s", \
                            VOICE_ID, \
                            encoded_message, \
                            VOLUME, \
                            codec_format_str);

    // Allocate memory for the URL buffer
    char *url = heap_caps_malloc((url_size + 1), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
    if (url == NULL) {
        ESP_LOGE(TAG, "Failed to allocate memory for URL");
        return ESP_ERR_NO_MEM;
    }

    // Format the URL string
    snprintf(url, url_size + 1, "https://dds.dui.ai/runtime/v1/synthesize?voiceId=%s&text=%s&speed=1&volume=%d&audiotype=%s", \
             VOICE_ID, \
             encoded_message, \
             VOLUME, \
             codec_format_str);

    // Configure the HTTP client
    esp_http_client_config_t config = {
        .url = url,
        .method = HTTP_METHOD_GET,
        .event_handler = http_event_handler,
        .buffer_size = MAX_FILE_SIZE,
        .buffer_size_tx = 4000,
        .timeout_ms = 30000,
        .crt_bundle_attach = esp_crt_bundle_attach,
    };

    // Initialize and perform the HTTP request
    esp_http_client_handle_t client = esp_http_client_init(&config);
    esp_err_t err = esp_http_client_perform(client);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));
    }

    // Free allocated memory and clean up the HT
    heap_caps_free(url);
    heap_caps_free(encoded_message);
    esp_http_client_cleanup(client);

    // Return the result of the function call
    return err;
}
函数 text_to_speech 接受一个消息字符串和 AUDIO_CODECS_FORMAT 参数作为输入。消息字符串是将被合成为语音的文本,而 AUDIO_CODECS_FORMAT 参数指定语音应该以 MP3 还是 WAV 格式进行编码。


该函数首先使用 url_encode 函数对消息字符串进行编码,将一些非有效字符替换为相应的 ASCII 代码,然后将该代码转换为两位十六进制格式。接下来为生成的编码字符串分配内存,检查 AUDIO_CODECS_FORMAT 参数,并设置适当的编解码器格式字符串,用于 url。


然后,函数确定 TalkingGenie API 的 GET 请求需要多大的 url 缓冲区,并分配相应的内存给 url 缓冲区。然后,将适当的参数写入 url 字符串,包括 voiceId(指定要使用的语音)、编码的文本、语音的速度和音量以及音频类型 (MP3 或 WAV)。


接下来,函数使用 url 和其他配置参数设置 esp_http_client_config_t 结构体,并使用该结构体初始化 esp_http_client_handle_t,然后使用 esp_http_client_perform 向 TalkingGenie API 发送 GET 请求。如果请求成功,函数返回 ESP_OK,否则返回错误代码。


函数释放为 url 缓冲区和编码消息分配的内存,清理 esp_http_client_handle_t,并返回错误代码。


处理 TTS 响应
类似地,回调函数 http_event_handler 可用于处理在 HTTP 请求/响应交换过程中发生的事件。

static esp_err_t http_event_handler(esp_http_client_event_t *evt)
{
    switch (evt->event_id) {
    // Handle errors that occur during the HTTP request
    case HTTP_EVENT_ERROR:
        ESP_LOGE(TAG, "HTTP_EVENT_ERROR");
        break;

    // Handle when the HTTP client is connected
    case HTTP_EVENT_ON_CONNECTED:
        ESP_LOGI(TAG, "HTTP_EVENT_ON_CONNECTED");
        break;

    // Handle when the header of the HTTP request is sent
    case HTTP_EVENT_HEADER_SENT:
        ESP_LOGI(TAG, "HTTP_EVENT_HEADER_SENT");
        break;

    // Handle when the header of the HTTP response is received
    case HTTP_EVENT_ON_HEADER:
        ESP_LOGI(TAG, "HTTP_EVENT_ON_HEADER");
        file_total_len = 0;
        break;

    // Handle when data is received in the HTTP response
    case HTTP_EVENT_ON_DATA:
        ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
        if ((file_total_len + evt->data_len) < MAX_FILE_SIZE) {
            memcpy(record_audio_buffer + file_total_len, (char *)evt->data, evt->data_len);
            file_total_len += evt->data_len;
        }
        break;

    // Handle when the HTTP request finishes
    case HTTP_EVENT_ON_FINISH:
        ESP_LOGI(TAG, "HTTP_EVENT_ON_FINISH:%d, %d K", file_total_len, file_total_len / 1024);
        audio_player_play(record_audio_buffer, file_total_len);
        break;

    // Handle when the HTTP client is disconnected
    case HTTP_EVENT_DISCONNECTED:
        ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED");
        break;

    // Handle when a redirection occurs in the HTTP request
    case HTTP_EVENT_REDIRECT:
        ESP_LOGI(TAG, "HTTP_EVENT_REDIRECT");
        break;
    }
    return ESP_OK;
}  
HTTP_EVENT_ON_DATA 事件用于处理从服务器接收到的音频数据。音频数据存储在名为 record_audio_buffer 的缓冲区中,接收到的音频数据的总长度存储在名为 file_total_len 的变量中。如果接收到的音频数据的总长度小于预定义的 MAX_FILE_SIZE,则将数据复制到 record_audio_buffer 中。

HTTP_EVENT_ON_FINISH 事件用于处理 HTTP 响应的结束。在这种情况下,将 record_audio_buffer 传递给名为 audio_player_play 的函数,用于播放音频。


显示

我们采用LVGL来实现显示功能。LVGL是一个开源的嵌入式图形库,因为具备强大且视觉吸引力的特点以及低内存占用而受到越来越多的欢迎。LVGL同时也发布了一个名为SquareLineStudio的可视化拖放式UI编辑器。它是一个强大的工具,能够轻松地为应用程序创建出美观的图形界面。

您可以使用无线wifi芯片模组乐鑫大中华区代理商提供的官方软件包管理工具,将LVGL集成到项目中。该工具可直接向项目中添加LVGL及其相关的移植组件,大大节省了时间和精力。如需更多信息,请查阅官方博客和文档。


总结

OpenAI的ChatGPT和乐鑫的ESP-BOX完美结合,为创造智能和强大的物联网设备带来了全新的可能。无线wifi芯片模组乐鑫大中华区代理商ESP-BOX提供了灵活可定制的AIoT开发平台,包括远场语音交互、离线语音命令识别和可重复使用的GUI框架等功能。当这些功能与OpenAIAPI相结合时,开发人员可以创建语音控制的聊天机器人,提高物联网应用的用户体验。

地址:深圳市宝安区西乡街道麻布社区宝安互联网产业基地A区6栋7栋7706

邮箱:Sales@ferry-semi.com

版权所有©2020  深圳市飞睿科技有限公司  粤ICP备2020098907号    飞睿科技微波雷达wifi模块网站地图

 

免责声明:本网站部分图片和文字内容可能来源于网络,转载目的在于传递更多信息,并不代表本网站赞同其观点或证实其内容的真实性。如涉及作品内容、版权和其它问题,请在30日内与本网站联系,我们将在第一时间删除内容!本站拥有对此声明的最终解释权。