使用百度的长文本转语音API时无法下载.MP3文件

2024-06-17 01:04

本文主要是介绍使用百度的长文本转语音API时无法下载.MP3文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天是学生们交作业的时候,结果是我最忙碌的一天,各种改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_token=xxxxxxxx");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 (fp==nullptr) {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变量来完成不同的任务。

一定要记住,不要重复使用一个变量完成两个不同的任务!

这篇关于使用百度的长文本转语音API时无法下载.MP3文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068056

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers