gpt4 book ai didi

c++ - 如何将 libcurl 与 Google Speech API 一起使用(--data-binary 或 --upload-file 的等价物是什么)?

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:37 29 4
gpt4 key购买 nike

我已经想出了如何在命令行上完成它:

curl -X POST --upload-file audio/test.wav 
--header "Content-Type: audio/l16; rate=44100;"
"https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=MYKEY"

curl -X POST --data-binary @audio/test.wav 
--header "Content-Type: audio/l16; rate=44100;"
"https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=MYKEY"

“MYKEY”是我的开发者 key 。

我如何在 C++ 中使用 libcurl 执行此操作?我已经搜索了几个小时,但无法弄清楚如何使用 CURLOPT_POSTFIELDS(或其他参数)将我的音频文件正确附加到发布请求。

这是我目前所拥有的。它因访问冲突而中断。

#include <iostream>
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
CURL *curl; // curl handle
CURLcode res;

curl = curl_easy_init();
if (curl)
{
struct curl_slist *chunk = NULL;

chunk = curl_slist_append(chunk, "Content-Type: audio/l16; rate=44100");

std::cout << curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "file=@audio/test.wav") << std::endl;
std::cout << curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 177644) << std::endl;
std::cout << curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk) << std::endl;
std::cout << curl_easy_setopt(curl, CURLOPT_CAINFO, "ca-bundle.crt") << std::endl;
std::cout << curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=MYKEY") << std::endl;

res = curl_easy_perform(curl);

std::cout << res;

curl_easy_cleanup(curl);

}
return 0;
}

我认为“file=@audio/test.wav”不正确,我在 curl 的 PHP 文档中看到了该语法,并决定使用 libcurl 进行尝试。

我真的很茫然,任何帮助将不胜感激。

编辑:这是一个工作示例 [pastebin] .我花了很多时间才弄明白。它使用 http://curl.haxx.se/libcurl/c/post-callback.html 中给出的示例函数,所以它不是最终的解决方案,而是一个很好的起点。确保将您的 API key 放入语音 API 链接中。

#include <iostream>
#include <stdio.h>
#include <curl/curl.h>
#include <direct.h>
#include <string>

struct WriteThis {
const char *readptr;
long sizeleft;
};

// callback function from http://curl.haxx.se/libcurl/c/post-callback.html
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{
struct WriteThis *pooh = (struct WriteThis *)userp;

if (size*nmemb < 1)
return 0;

if (pooh->sizeleft) {
*(char *)ptr = pooh->readptr[0]; /* copy one single byte */
pooh->readptr++; /* advance pointer */
pooh->sizeleft--; /* less data left */
return 1; /* we return 1 byte at a time! */
}

return 0; /* no more data left to deliver */
}

int main(void)
{
CURL *curl; // curl handle
CURLcode res;

curl = curl_easy_init();
if (curl)
{
FILE *file;
errno_t err = fopen_s(&file, "testaudio.wav", "r");
fseek(file, 0, SEEK_END);
int fileSize = ftell(file);
fseek(file, 0, SEEK_SET);

std::cout << "file open status: " << err << std::endl;
std::cout << "file " << fileSize << std::endl;

struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "Content-Type: audio/l16; rate=44100");

char *audioData = (char*)malloc(fileSize);
struct WriteThis pooh;
fread(audioData, fileSize, 1, file);
fclose(file);

pooh.readptr = audioData;
pooh.sizeleft = fileSize;

std::string sizeHeader = "Content-Length: ";
sizeHeader += std::to_string(fileSize);
chunk = curl_slist_append(chunk, sizeHeader.c_str());

std::cout << curl_easy_setopt(curl, CURLOPT_POST, 1L) << std::endl;
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(curl, CURLOPT_READDATA, &pooh);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

std::cout << curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk) << std::endl;
std::cout << curl_easy_setopt(curl, CURLOPT_CAINFO, "ca-bundle.crt") << std::endl;
std::cout << curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=yourkey") << std::endl;

res = curl_easy_perform(curl);
std::cout << res;
curl_easy_cleanup(curl);

}
return 0;
}

最佳答案

您需要使用回调来上传数据文件。你可以在这里找到例子:

http://curl.haxx.se/libcurl/c/post-callback.html

data-binary 在这个例子中是不相关的,因为你没有对回调中传递数据的文件做任何事情,所以它会按原样发布。

关于c++ - 如何将 libcurl 与 Google Speech API 一起使用(--data-binary 或 --upload-file 的等价物是什么)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307487/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com