使用百度的长文本转语音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变量来完成不同的任务。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】利用单链表再实现通讯录

在之前顺序表的实现中&#xff0c;我们利用了顺序表实现了通讯录&#xff0c;基于上篇文章学习了单链表&#xff0c;本篇文章将介绍如何利用单链表再实现通讯录。 1. 结构体用户数据 实现结构体的函数&#xff1a; //⽤⼾数据 typedef struct PersonInfo {char name[NAME_MA…

指定GPU跑模型

加上一个CUDA_VISIBLE_DEVICES0,2就行了&#xff0c;使用0卡和2卡跑模型&#xff0c;注意多卡有时候比单卡慢&#xff0c;4090无NVlink&#xff0c;数据似乎是通过串行的方式传输到多个gpu的&#xff0c;只不过单个gpu是并行计算&#xff0c;数据在gpu与gpu之间似乎是串行传输的…

如何通过Outlook大附件插件,加强外发附件的安全性和管控力度?

因邮件的便捷性和普遍性&#xff0c;企业间业务往来通常会采取邮箱业务&#xff0c;沟通使用成本也比较低&#xff0c;但容易出现附件太大无法上传的问题。Outlook大附件插件是为解决邮件系统中附件大小限制问题而开发的一系列工具。 使用邮件发送附件时&#xff0c;可能会遇到…

第九站:Java黑——安全编码的坚固防线(第②篇)

4. 验证和过滤输入数据示例&#xff1a;使用Apache Commons Lang 对输入数据进行验证和过滤是防止多种安全漏洞的关键步骤&#xff0c;包括但不限于SQL注入和命令注入。Apache Commons Lang库提供了一些实用方法来帮助进行字符串操作和验证。以下是一个简单的示例&#xff0c;…

基于51单片机万年历设计—显示温度农历

基于51单片机万年历设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 本系统采用单片机DS1302时钟芯片LCD1602液晶18b20温度传感器按键蜂鸣器设计而成。 1.可以显示年月日、时分秒、星期、温度值。…

掌握Mock.js基本使用:快速模拟API实现增删改查

在项目中使用Mock.js进行增删改查操作&#xff0c;可以模拟后端接口&#xff0c;方便前端开发和测试。下面是一个简单的示例&#xff0c;展示如何在Vue 2项目中使用Mock.js实现增删改查功能。 1. 安装依赖 npm install mockjs --save2. 配置Mock.js 在项目的根目录下创建一个…

代码随想录算法训练营DAY36补| 435. 无重叠区间、 763.划分字母区间

训练营计划更新了&#xff0c;补一下DAY36多出来的两道题 435. 无重叠区间 题目链接&#xff1a;435. 无重叠区间 class Solution(object):def eraseOverlapIntervals(self, intervals):""":type intervals: List[List[int]]:rtype: int"""if…

前端跨域问题的解决办法,两种类型

跨域问题是由于同源策略的原因&#xff0c;在协议(HTTP或HTTPS)不同、端口号(8080或8881)不同、主机IP(182.92.178.25或者182.92.178.26)不同时而导致的不能进行数据交换的问题。 当后端没有做跨域时&#xff0c;前端就需要自己配置。 类型一&#xff1a;使用代理服务器的方法…

《书生·浦语大模型实战营》第4课 学习笔记:XTuner 微调 LLM:1.8B、多模态、Agent

文章大纲 1. 大模型微调简介2 快速上手2.1 环境安装2.2 前期准备2.2.1 数据集准备2.2.2 模型准备2.2.3 配置文件选择2.2.4 小结 2.3 配置文件修改2.4 模型训练2.4.1 常规训练2.4.2 使用 deepspeed 来加速训练2.4.3 训练结果2.4.4 小结 2.5 模型转换、整合、测试及部署2.5.1 模型…

【QT5】<重点> QT串口编程

目录 前言 一、串口编程步骤 0. 添加串口模块 1. 自动搜索已连接的串口 2. 创建串口对象 3. 初始化串口 4. 打开串口 5. 关闭串口 6. 发送数据 7. 接收数据 二、简易串口助手 1. 实现效果 2. 程序源码 3. 实现效果二 前言 本篇记录QT串口编程相关内容&#xff0…

常见的中间件都在解决什么问题?

常见的中间件都在解决什么问题 RocketMQ RocketMQ 是一款功能强大的分布式消息系统。 RocketMQ 源码地址&#xff1a;https://github.com/apache/rocketmq(opens new window) RocketMQ 官方网站&#xff1a;https://rocketmq.apache.org 什么场景下用 RocketMQ&#xff1f…

线程安全的解决方案(概念版本)

线程安全其实本质 讲的是内存的安全。 多个线程对统一资源的操作可能导致这个资源的数据不一致性。 举例说明&#xff1a;比如 张三有100块钱&#xff0c;现在线程A是要花50元&#xff0c;线程二是要存300元&#xff0c;当线程A花50元后&#xff0c;还没有内存值修改&#xff0…

19.channel相关方法

channel close()可以用来关闭channel closeFuture()用来处理channel的关闭 sync方法作用是同步等待channel关闭 addListener方法是异步等待channel关闭 pipeline() 方法添加处理器 write() 方法将数据写入 writeAndFlush() 方法将数据写入并刷出 write()方法,将数据写入到…

Optional详解和常用API

目录 一、Optional简介 二、构建Optional对象三种方式 2.1 Optional.of(value) 2.1.1 使用案例 2.2 Optional.ofNullable(value) 2.2.1 使用案例 2.3 Optional.empty() 2.3.1 使用案例 三、Optional常用的api解析和使用案例 3.1 isPresent 3.1.1 使用案例 3.2 ifPrese…

登录MySQL方式

登录MySQL方式 方式一&#xff1a;通过MySQL自带的客户端 MySQL 客户端输入命令即可 方式二&#xff1a;通过window自带的客户端 从命令端&#xff08;cmd&#xff09;进入 mysql -h localhost -P 3306 -u root -p Enter password:密码登录方式&#xff1a; mysql -h 主…

深入理解指针(四)

目录 1. 回调函数是什么? ​2. qsort使用举例 2.1冒泡排序 2.2使用qsort函数排序整型数据 ​2.3 使用qsort排序结构数据(名字) 2.4 使用qsort排序结构数据(年龄) 3. qsort函数的模拟实现 1. 回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数…

VMware各版本镜像下载站

CDS Repository - /var/www/public/stage/session-120/cds/vmw-desktop/ws 参考&#xff1a; VMware各版本下载的镜像站(含windows和linux)_vm win7映像文件下载-CSDN博客

混淆矩阵-召回率、精确率、准确率

混淆矩阵 1 混淆矩阵2 混淆矩阵指标2.1 准确率2.2 精确率2.3 召回率2.4 特异度2.4 假正率2.5 假负率2.6 F1 分数 3 总结 1 混淆矩阵 混淆矩阵是一种用于评估分类模型性能的重要工具。它通过矩阵形式清晰地展示了模型对样本进行分类的结果&#xff0c;帮助我们理解模型在不同类…

【嵌入式】CAN总线详解

【嵌入式】CAN总线详解 一、CAN总线简介 CAN总线是一种控制器局域网总线&#xff0c;每一个挂载在CAN局域网的设备&#xff0c;都可以利用CAN去发送信息&#xff0c;也可以接收局域网的各种信息&#xff0c;每个设备都是平等的&#xff0c;共享CAN的资源。广泛应用于汽车、嵌…

从0开发一个Chrome插件:项目实战——翻译插件(附带申请谷歌翻译、百度翻译教程)

前言 这是《从0开发一个Chrome插件》系列的第十八篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…