首先程序中会用到Json,curl

安装相应的库

$ sudo apt-get install libcurl3 libcurl4-openssl-dev
$ sudo apt-get install libjsoncpp0 libjsoncpp-dev

关机重启

参考

C++ 用libcurl库进行http通讯网络编程http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html

使用curl库,以post方式向服务器发送json数据  http://blog.csdn.net/dgyanyong/article/details/14166217

libcurl使用程序总结                                                   http://www.programgo.com/article/71711741757/

在上节 tts_voice/src 中添加tuling_arv.cpp

/*
* tuling_arv.cpp
* tuling_arv_node
*/ #include<ros/ros.h>
#include<std_msgs/String.h>
#include<iostream>
#include<sstream>
#include<jsoncpp/json/json.h>
#include<curl/curl.h>
#include<string>
#include<exception> using namespace std; int flag = 0;
string result; int writer(char *data, size_t size, size_t nmemb, string *writerData)
{
unsigned long sizes = size * nmemb;
if (writerData == NULL)
return -1; writerData->append(data, sizes); return sizes;
} /*
* 解析图灵服务器返回的Json string
*/
int parseJsonResonse(string input)
{
Json::Value root;
Json::Reader reader;
bool parsingSuccessful = reader.parse(input, root);
if(!parsingSuccessful)
{
std::cout<<"!!! Failed to parse the response data"<< std::endl;
return -1;
}
const Json::Value code = root["code"];
const Json::Value text = root["text"];
result = text.asString();
flag = 1; std::cout<< "response code:" << code << std::endl;
std::cout<< "response text:" << result << std::endl; return 0;
} /*
* 将input字腹发送到图灵服务器接受json string
*/
int HttpPostRequest(string input)
{
string buffer; std::string strJson = "{";
strJson += "\"key\" : \"1bf4cfd53fea4ee09f327822c53ad20c\","; //双引号前加/防转仪
strJson += "\"info\" : ";
strJson += "\"";
strJson += input;
strJson += "\"";
strJson += "}"; std::cout<<"post json string: " << strJson << std::endl; try
{
CURL *pCurl = NULL;
CURLcode res;
// In windows, this will init the winsock stuff
curl_global_init(CURL_GLOBAL_ALL); // get a curl handle
pCurl = curl_easy_init();
if (NULL != pCurl)
{
// 设置超时时间为10秒
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 10); // First set the URL that is about to receive our POST.
// This URL can just as well be a
// https:// URL if that is what should receive the data.
curl_easy_setopt(pCurl, CURLOPT_URL, "http://www.tuling123.com/openapi/api");
//curl_easy_setopt(pCurl, CURLOPT_URL, "http://192.168.0.2/posttest.cgi"); // 设置http发送的内容类型为JSON
curl_slist *plist = curl_slist_append(NULL,
"Content-Type:application/json;charset=UTF-8");
curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, plist); // 设置要POST的JSON数据
curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, strJson.c_str()); curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, writer); curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, &buffer); // Perform the request, res will get the return code
res = curl_easy_perform(pCurl);
// Check for errors
if (res != CURLE_OK)
{
printf("curl_easy_perform() failed:%s\n", curl_easy_strerror(res));
}
// always cleanup
curl_easy_cleanup(pCurl);
}
curl_global_cleanup();
}
catch (std::exception &ex)
{
printf("curl exception %s.\n", ex.what());
}
if(buffer.empty())
{
std::cout<< "!!! ERROR The Tuling sever response NULL" << std::endl;
}
else
{
parseJsonResonse(buffer);
} return 0; } /*
* 当voice/tuling_arv_topic话题有消息时,调用HttpPostRequest向图灵服务器发送内容,返回结果。
*/
void arvCallBack(const std_msgs::String::ConstPtr &msg)
{
std::cout<<"your quesion is: " << msg->data << std::endl;
HttpPostRequest(msg->data);
} int main(int argc, char **argv)
{
ros::init(argc, argv,"tuling_arv_node");
ros::NodeHandle nd; ros::Subscriber sub = nd.subscribe("voice/tuling_arv_topic", 10, arvCallBack);
ros::Publisher pub = nd.advertise<std_msgs::String>("/voice/xf_tts_topic", 10);
ros::Rate loop_rate(10); while(ros::ok())
{
if(flag)
{
std_msgs::String msg;
msg.data = result;
pub.publish(msg);
flag = 0;
}
ros::spinOnce();
loop_rate.sleep();
} }

修改Cmkefile文件添加

add_executable(tuling_arv_node src/tuling_arv.cpp)
target_link_libraries(tuling_arv_node ${catkin_LIBRARIES} -lcurl -ljsoncpp)

编译完后运行

$ roscore
$ rosrun tts_voice tts_voice_node
$ rosrun tts_voice tuling_arv_node
$ rostopic pub -1 /voice/tuling_arv_topic std_msgs/String "讲个绕 口令吧"

ROS语音交互(四)接入图灵语义理解的更多相关文章

  1. ros语音交互(四)移植科大讯飞语音识别到ros

    将以前下载的的语音包的 samples/iat_record/的iat_record.c speech_recognizer.c speech_recognizer.c 拷贝到工程src中, linu ...

  2. ROS语音交互(三)科大讯飞语音在ROS平台下使用

    以上节tts语音输出为例 下载sdk链接:http://www.xfyun.cn/sdk/dispatcher 1.下载SDK,解压: 2.在ROS工作空间下创建一个Package: catkin_c ...

  3. ros语音交互(五)移植科大讯飞语音识别到ros

    将以前下载的的语音包的 samples/iat_record/的iat_record.c speech_recognizer.c speech_recognizer.c 拷贝到工程src中, linu ...

  4. ROS语音交互——科大讯飞语音合成TTS(二)

    之前我用过科大讯飞的语音包,为了记录一下我重新使用一下 首先注册科大讯飞账号及应用,以后每个下载的在线使用SDK都是以此账户ID登录讯飞语音服务器. 下载科大讯飞在线合成包. $ unzip Linu ...

  5. ROS机器人语音交互(一)

    语音交互早期已经广泛应用在手机端,电脑端,随着技术的成熟,接口逐渐开放,ROS上老外搞的开源语音识别只支持英文,识别率还低. 国内语音识别技术已经相当成熟稳定.感谢ros小课堂的讲解,解决了自己的疑惑 ...

  6. 微信小程序——智能小秘“遥知之”源码分享(语义理解基于olami)

    微信小程序智能生活小秘书开发详解 >>>>>>>>>>>>>>>>>>>>> ...

  7. SLAM+语音机器人DIY系列:(七)语音交互与自然语言处理——1.语音交互相关技术

    摘要 这一章将进入机器人语音交互的学习,让机器人能跟人进行语音对话交流.这是一件很酷的事情,本章将涉及到语音识别.语音合成.自然语言处理方面的知识.本章内容: 1.语音交互相关技术 2.机器人语音交互 ...

  8. 曼孚科技:AI语音交互领域常用的4个术语

    ​语音交互是基于语音输入的新一代交互模式,比较典型的应用场景是各类语音助手. 本文整理了语音交互领域常用的4个术语,希望可以帮助大家更好地理解这门学科. 1. 语音合成标记语言(SSML) 语音合成标 ...

  9. C#开发微信门户及应用(31)--微信语义理解接口的实现和处理

    微信语义理解接口提供从用户自然语言输入到结构化解析的技术实现,使用先进的自然语言处理技术给开发者提供一站式的语义解析方案.该平台覆盖多个垂直领域的语义场景,部分领域还可以支持取得最终的展示结果.开发者 ...

随机推荐

  1. eclipse上修改js后,浏览器上还是出现原来效果的解决方法

    废话不多说,直接上方法: 1.最简单的是清除浏览器缓存.2.换个浏览器试试.3.修改js文件名,换成别的名称,再引用.4.重启eclipse.5.重启电脑.

  2. iOS 10 UserNotifications 使用说明

    本教程以贴代码为主.尽可能直观,少量说明. 注意:XCode8的需要手动开启主target Capabilities中的Push Notification. 关于创建多个target后真机测试的证书问 ...

  3. DAL.SQLHelper 的类型初始值设定项引发异常的处理

    这是DAL.SQLHelper的类中定义了sql连接字符串,但是在web.config中没有定义,在类判断获取的字符串是否为空,或是在web.config添加相应的连接字符串.

  4. J2EE版本

    Different versions of JEE: Note: JPE (Java Professional Edition) project announced in May 1998 at Su ...

  5. JQuery_处理元素和浏览器的窗口的尺寸

    一.jQuery width() 和 height() 方法 width() 方法设置或返回元素的宽度(不包括内边距.边框或外边距). height() 方法设置或返回元素的高度(不包括内边距.边框或 ...

  6. 完美解释if-modified-since/not-modified 文件头的意义

    http://www.cnblogs.com/zh2000g/archive/2010/03/22/1692002.html 很好很强大

  7. float浮点数的二进制存储方式及转换

    int和float都是4字节32位表示形式.为什么float的范围大于int? float精度为6-7位.1.66*10^10的数字结果并不是166 0000 0000 指数越大,误差越大. 这些问题 ...

  8. HTML5Viewer中如何运行时绑定多数据源

    很多报表控件提供HTML5Viewer 支持跨设备的报表系统,当然在很多情况下,一个系统可包含多个报表文件,这些报表的数据有可能均为运行时绑定数据源,那么在html5viewer中对一张报表通过重写W ...

  9. python——django使用mysql数据库(一)

    之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...

  10. (45) Manifest文件

    这个是一模块主要描述和设置的文件,下面进行讲解一下{    'name': "A Module",    'version': '1.0',    'depends': ['bas ...