27

还没吃饭 · 2月13日 · 河南

聆思大模型AI开发套件评测3(原创)调用ChatGPT源代码

嗨,亲爱的工程师、学生和爱好者们,我来啦!欢迎来到神秘的聆思大模型AI世界!如果你是一位电子工程师或者对魔法般的嵌入式技术感兴趣,那么你来到的地方绝对没错!今天,我们将一起探索一个令人惊叹的聆思大模型AI开发套件。
image.png
编写一个C语言程序来集成ChatGPT的API、语音识别和合成,以及控制机械臂的操作是一个复杂的任务,通常涉及多个库和硬件接口。这里,我会给出一个自己编写的具体代码,用来说明如何开始这个项目,并附带一些代码注释。首先,我们需要一个ChatGPT的API客户端,但是ChatGPT是OpenAI的服务,通常需要通过HTTP请求与其交互。
image.png
以下是我写的一个简化的C语言程序框架,使用了代码和注释来说明与ChatGPT的交互:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

// 这是ChatGPT API的URL
#define CHATGPT_API_URL "https://api.openai.com/v1/chat/completions"

// 发送HTTP请求到ChatGPT API的函数
char* send_request_to_chatgpt(const char* input) {
    CURL *curl;
    CURLcode res;
    char *output = NULL;
    struct curl_slist *headers = NULL;

    curl = curl_easy_init();
    if(curl) {
        // 设置请求的URL
        curl_easy_setopt(curl, CURLOPT_URL, CHATGPT_API_URL);

        // 设置POST请求的数据
        struct curl_slist *header_list = NULL;
        header_list = curl_slist_append(header_list, "Content-Type: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);

        char post_data[] = "{\"prompt\":\"" . input . "\", \"max_tokens\":50}";
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);

        // 设置接收响应的回调函数和数据
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &output);

        // 执行请求
        res = curl_easy_perform(curl);

        // 检查是否有错误发生
        if(res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        }

        // 清理
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }

    return output;
}

// 回调函数,用于接收ChatGPT的响应
size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

// 解析ChatGPT的响应并转换为控制信号的函数
void parse_chatgpt_response_and_control_robot(const char* response) {
    // 解析ChatGPT的JSON响应
    // 并根据解析的结果生成控制信号来控制机械臂

    // ChatGPT的响应是一个简单的字符串"MOVE_RIGHT"
    if (strcmp(response, "MOVE_RIGHT") == 0) {
        printf("机械臂:收到指令,向右移动!\n");
        // 在这里发送控制信号给机械臂,让它向右移动
    } else if (strcmp(response, "GRASP_OBJECT") == 0) {
        printf("机械臂:收到指令,抓取物体!\n");
        // 在这里发送控制信号给机械臂,让它抓取物体
    } else {
        printf("机械臂:我不明白指令 '%s',请再说一次!\n", response);
    }
}

int main() {
    // 用户通过控制台输入指令
    char user_input[100];
    printf("请输入你的指令(例如:'请向右移动机械臂'):");
    fgets(user_input, sizeof(user_input), stdin);

    // 去除换行符
    user_input[strcspn(user_input, "\n")] = 0;

    // 发送请求到ChatGPT
    char* chatgpt_response = send_request_to_chatgpt(user_input);

    // 解析响应并控制机械臂
    parse_chatgpt_response_and_control_robot(chatgpt_response);

    // 释放ChatGPT响应的内存
    free(chatgpt_response);

    return 0;
}

控制机械臂,并通过语音识别和合成实现与游戏的互动,需要先注册并获取ChatGPT的API密钥,然后编写代码来调用API,处理响应,以及控制机械臂。此外,还需要集成语音识别和合成的库或API。由于这是一个复杂的任务,涉及多个组件和API,我将再写一个简化的代码,并尽量以我的方式解释代码。

我首先写,需要包含的必要头文件和库:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h> // 用于HTTP请求的库
#include <espeak-ng/speak_lib.h>

// API接口和机械臂控制函数
// 我有一个串口通信函数 sendToSerialPort
// 这个函数会根据具体的硬件和库来实现
extern void sendToSerialPort(const char* data);

//  JSON 解析库提供的函数来解析 JSON 字符串
// 并且有一个函数来获取 JSON 对象中的文本字段
extern JSONObject* parseJSONResponse(const char* json);
extern const char* getTextFieldFromJSON(JSONObject* jsonObj, const char* fieldName);

// 发送命令到机械臂的函数
void sendCommandToArm(const char* command) {
    if (command == NULL) {
        printf("错误:命令字符串为空\n");
        return;
    }

    // 在这里,我们只是简单地通过串口发送命令字符串到机械臂
    sendToSerialPort(command);

    // 打印出已经发送的命令,方便调试
    printf("机械臂接收到命令:%s\n", command);
}

// 串口通信函数实现
void sendToSerialPort(const char* data) {
    if (data != NULL) {
        int length = strlen(data); // 计算字符串长度
        // 这里是具体的串口发送代码,比如使用串口通信库发送数据
        // sendDataOverSerial(data, length); 
        printf("通过串口发送数据:%s\n", data); // 替换为真实的串口发送代码
    } else {
        printf("错误:尝试发送空数据到串口\n");
    }
}


// 解析 ChatGPT 响应的函数
char* parseChatGPTResponse(const char* response) {
    if (response == NULL) {
        return NULL;
    }

    // response 是一个 JSON 字符串,我们首先解析它
    JSONObject* jsonObj = parseJSONResponse(response);

    if (jsonObj == NULL) {
        // 解析失败,可能返回 NULL 或者错误信息
        return NULL;
    }

    // 从 JSON 对象中提取我们需要的文本字段
    // 这个字段叫做 "text"
    const char* text = getTextFieldFromJSON(jsonObj, "text");

    if (text == NULL) {
        // 提取失败,可能返回 NULL 或者错误信息
        // 清理 JSON 对象资源
        // cleanupJSONObject(jsonObj); 
        return NULL;
    }

    // 复制提取的文本并返回
    char* result = strdup(text);

    // 清理 JSON 对象资源
    // cleanupJSONObject(jsonObj); 

    return result;
}


// 语音识别和合成的函数
char* recognizeSpeech() {
    // 识别语音并返回识别的文本
    return strdup("拿起红色的苹果"); // 识别结果
}

void synthesizeSpeech(const char* text) {
    espeak_ng_Initialize(NULL, 0);
    
    espeak_ng_VOICE voice = {0};
    voice.languages = "en";
    voice.name = "default";

    espeak_ng_Synth(text, strlen(text), NULL, POS_CHARACTER, 0, espeakCHARS_AUTO, &voice, NULL, NULL);

    // 等待语音合成完成
    while (espeak_ng_IsPlaying(0)) {}

    espeak_ng_Terminate();
}

image.png
然后,我可以编写一个函数来调用ChatGPT的API,并处理响应:

char* getInstructionFromChatGPT() {
    CURL *curl;
    CURLcode res;
    char *url = "https://api.openai.com/v1/chat/completions"; // ChatGPT API的URL
    char *payload_text = "请让机械臂执行一个动作"; // 发送给ChatGPT的文本
    char *response_string;
    char *instruction;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    if(curl) {
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        headers = curl_slist_append(headers, "Authorization: Bearer YOUR_CHATGPT_API_KEY"); // 替换为你的API密钥

        char payload[1024] = "{\"prompt\":\"\", \"max_tokens\":64, \"model\":\"text-davinci-003\", \"temperature\":0.7, \"top_p\":1.0, \"frequency_penalty\":0.0, \"presence_penalty\":0.0, \"stop\":[\"\\n\"]}";
        strcat(payload, "\"text\":\"");
        strcat(payload, payload_text);
        strcat(payload, "\"");

        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
            curl_easy_cleanup(curl);
            return NULL;
        }

        // 解析ChatGPT的响应
        instruction = parseChatGPTResponse(response_string);

        // 清理
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
        free(response_string);
    }

    return instruction;
}

image.png
今天先写到这里...

接上两篇:

聆思大模型AI开发套件评测1

聆思大模型AI开发套件评测2(原创)红外线传感器游戏功能

本人在本论坛内的试读经验 :

《嵌入式Linux系统原理与应用》读后感第八章-设备驱动程序设计

希望这些源代码能对您有所帮助!

谢谢!

还没吃饭中
2024年2月11日

推荐阅读
关注数
5166
内容数
99
聆思科技官方专栏,专注AIOT芯片,持续分享有趣的解决方案。商务合作微信:listenai-csk 技术交流QQ群:825206462
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息