js动效网站,app线下推广怎么做,滕州市做网站,百度极速版下载安装最新版今天是学生们交作业的时候#xff0c;结果是我最忙碌的一天#xff0c;各种改bug。
有个学生来问#xff1a; 我在百度提供的API代码(长文本转语音)的基础上添加了下载生成的.MP3文件的代码#xff0c;运行之后成功建成了.MP3文件#xff0c;但是文件的内容确实以下的报错…今天是学生们交作业的时候结果是我最忙碌的一天各种改bug。
有个学生来问 我在百度提供的API代码(长文本转语音)的基础上添加了下载生成的.MP3文件的代码运行之后成功建成了.MP3文件但是文件的内容确实以下的报错信息根据这一信息采用了新的accesstoken之后依旧无法解决。 看了输出发现获取链接的部分已经完成是后面下载这一链接里MP3文件的代码中存在的问题但是经过查询都没有指出这一部分代码的问题 从这个错误信息看似乎是下载MP3文件时百度的服务器认为链接非法所以拒绝了。但是如果单独用curl或者wget去下载这个MP3的链接是可以得到正确的文件的。看来这个问题是在程序里面隐藏的。
要来了学生的代码大致是这样的
int main() {std::cout Current working directory: getcwd(NULL, 0) std::endl;CURL *curl;FILE *fp;CURLcode res;std::string result;std::string downloadUrl;std::string outputFilename output.mp3;curl_global_init(CURL_GLOBAL_ALL);curl curl_easy_init();if(curl) {// 发送 POST 请求获取语音合成任务结果curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // 禁用证书验证curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); // 禁用证书验证curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, POST);// URL和access_tokencurl_easy_setopt(curl, CURLOPT_URL, https://aip.baidubce.com/rpc/2.0/tts/v1/query?access_tokenxxxxxxxx);curl_easy_setopt(curl, CURLOPT_POSTFIELDS,{\task_ids\:[\yyyyyyy\]});curl_easy_setopt(curl, CURLOPT_WRITEDATA, result);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onWriteData);res curl_easy_perform(curl);if(res ! CURLE_OK) {std::cerr curl_easy_perform() failed: curl_easy_strerror(res) std::endl;curl_easy_cleanup(curl);curl_global_cleanup();return 1;}// 解析 JSON 响应获取 MP3 文件的下载链接cJSON *json cJSON_Parse(result.c_str());if (json NULL) {std::cerr Error parsing JSON. std::endl;// 清理工作curl_easy_cleanup(curl);curl_global_cleanup();return 1;}......cJSON *task_result cJSON_GetObjectItem(task_info, task_result);if (task_result ! NULL) {// speech_url字段名cJSON *download_url_json cJSON_GetObjectItem(task_result, speech_url);if (download_url_json ! NULL download_url_json-type cJSON_String) {downloadUrl download_url_json-valuestring; // 获取下载链接//fprintf(stderr, speech-url: %s\n, downloadUrl.c_str());} else {std::cerr No download URL found in task result. std::endl;// 清理cJSON_Delete(json);curl_easy_cleanup(curl);curl_global_cleanup();return 1;}} else {std::cerr No task result found. std::endl;// 清理cJSON_Delete(json);curl_easy_cleanup(curl);curl_global_cleanup();return 1;}// 下载 MP3 文件fp fopen(outputFilename.c_str(), wb);if (fpnullptr) {std::cerr Failed to open file for writing. std::endl;// 清理cJSON_Delete(json);curl_easy_cleanup(curl);curl_global_cleanup();return 1;}curl_easy_setopt(curl, CURLOPT_URL, downloadUrl.c_str()); // 下载链接fprintf(stderr, speech-url: %s\n, downloadUrl.c_str()); // 打印查看curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);res curl_easy_perform(curl); // 下载if (res ! CURLE_OK) {std::cerr curl_easy_perform() failed: curl_easy_strerror(res) std::endl;fclose(fp);// 清理cJSON_Delete(json);curl_easy_cleanup(curl);curl_global_cleanup();return 1;}
从这段代码可以看出curl变量前面被用来做POST请求后面又被用来做GET请求第一次操作的状态影响了第二次导致第二次发给服务器的数据错了。让学生改成下面这样就对了 当然更好的办法是用两个curl变量来完成不同的任务。
一定要记住不要重复使用一个变量完成两个不同的任务