根据百度的语音识别例子,展示C如何调用C++库

刚才无聊摆弄了一下百度的语音识别RestAPI,看到语音识别的Sample是用C++写的,一共有三个组件,libcurl.a、libjson.a、base64.cpp,在编译时出现Json::Reader未定义引用的错误。想着还是用C重写一下这个例子吧。RestAPI的调用方式是先用过SKey获得Token,然后把音频(例如:test.pcm)通过Base64编码成字符串附加到地址中,通过curl的方式post到语音识别平台,返回JSON获取音频结果。作者重写代码时json组件没有用libjson.a,而是用的cJSON组件,会在另一篇文章展示如何用cJSON。Base64的编码功能还是用的Base64.cpp这个文件。

因为C语言没有类的概念,C代码在调用C++编译的库的时候要在C++代码中添加一段可以被C调用的函数。在对音频编码时需要用到的是

std::string base64_encode(unsigned char const *bytes_to_encode, unsigned int in_len)

这个方法,看到是string类型,C标准没有这个类型,所以我们在写被C调用的方法时要把string转换成char*,作者不太会说,所以还是用代码来说话吧。



#ifdef __cplusplus

extern "C" {

#endif

//把被调用的方法放在这里

char *callBase64Encode(unsigned char const *bytes_to_encode, unsigned int in_len)

{

std::string ret;

ret = base64_encode(bytes_to_encode, in_len);

char *c;

const int len = ret.length();

c = new char[len + 1];

strcpy(c, ret.c_str());

return c;

}

#ifdef __cplusplus

}

#endif



在base64.cpp文件中添加上面的代码,上面的代码就是定义可以被C语言调用的方法,方法开头定义的是char*,因为代码的后部分获取到编码的值后通过

char *c;

const int len = ret.length();

c = new char[len + 1];

strcpy(c, ret.c_str());

return c;

这几行代码将string类型的字符串转换成了char*类型的字符串。

然后在base64.h头文件中添加



#ifdef __cplusplus

extern "C" {

#endif

char *callBase64Encode(unsigned char const *bytes_to_encode, unsigned int in_len);

#ifdef __cplusplus

}

#endif



上方法,在C代码中引用#include <base64.h>这个头文件,然后通过

g++ base64.cpp -fPIC -shared -o libase64.so

把base64代码编译成libase64.so链接库文件,再通过

gcc cJSON.c sample.c -L . -lase64 -lstdc++ -o sample -lm

我们的sample.c代码就可以调用libase64.so的方法了,结果如下:


json的speech值就是对音频进行编码后的字符串。

微信原文地址:http://mp.weixin.qq.com/s?__biz=MzA4NTU0OTU5MA==&mid=2247483660&idx=1&sn=8c02f0084d96de49596899484bd876e9&chksm=9fd77675a8a0ff63e0f61cc1e77e0a4a6e2fcc2ed62dcf8e5d75e9d20826bbc93c4679908594#rd

时间: 2024-10-30 09:35:02

根据百度的语音识别例子,展示C如何调用C++库的相关文章

根据百度的语音识别例子,展示C如何使用cJSON

前面一篇文章展示了根据百度语音识别例子如何用C调用C++的方法,这篇文章也是基于百度语音识别,展示如何使用cJSON,cJSON是一个用C写的JSON解析器,非常好用,可以用它来生成一个JSON,也可以用来解析JSON的值. 在我写的通过skey获取token的代码中 char *token = (char *)malloc(MAX_BUFFER_SIZE); char host[MAX_BUFFER_SIZE]; snprintf(host, sizeof(host), "https://op

百度Android语音识别SDK语义理解与解析方法

百度语义理解开放平台面向互联网开发者提供自然语言文本的解析服务,也就是可以根据文本的意图解析成相应的表示. 为了易于人阅读,同时也方便机器解析和生成,意图表示协议采用 json 语言进行描述,采用 gb18030 编码. json 语言的基本概念: 1.属性名/属性值 即键值对(key-value) 2.数组 在 json 中是"[]"括起来的内容,数据结构为 ["value1","value2",...],取值方式和所有语言中一样,使用索引获取

ASIO例子中定制handler调用

// // prioritised_handlers.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or

百度地图API,展示地图和添加控件

1.申请百度账号和AK 点我申请 2.准备页面 根据HTML标准,每一份HTML文档都应该声明正确的文档类型,我们建议您使用最新的符合HTML5规范的文档声明: <!DOCTYPE html> 3.适应移动端页面展示 下面我们添加一个meta标签,以便使您的页面更好的在移动平台上展示. <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 4.设置容器样式

一段讯飞、百度等语音识别API无法识别的语音最终解决办法

最近在做语音识别.字幕扒词相关的工作,遇到了一段录音(https://download.csdn.net/download/u014220286/12169183,各位有兴趣的可以下载下来试试),音质什么的和其他处理过的无二异,也是普通话,照常理说应该能识别出来,可为了类似这样的语音丢了工作机会(前一次没重视人工速录交了,后来又遇到了,琢磨了好长时间解决了,过了交稿时间,产生信任危机了,没有机会合作了.)记录下这次的解决过程,希望给你有需要的人帮助. 首先用ffmpeg查看该音频,发现是32是浮

c# 百度api语音识别

public static string getStrAccess(string para_API_key, string para_API_secret_key) { //方法参数说明: //para_API_key:API_key(你的KEY) //para_API_secret_key(你的SECRRET_KEY) //方法返回值说明: //百度认证口令码,access_token string access_html = null; string access_token = null;

百度地图和solr展示资源和附近等功能的实现 四

这章主要是定位功能,首先谈谈H5的定位,开始大部分的代码都是这个上面差不多https://www.cnblogs.com/lijuntao/p/6439596.html 但是第一步定位一直走不通, ie浏览器可以获取到定位的位置外,其他浏览器基本获取不到位置,https试过好像也不行,最后一朋友在国外试代码,结果可用,可怕啊,为啥不用百度地图自己的定位,可能是我技术不到位把,怎么也定位不准,也想过个种办法,最后还是放弃了,才用的H5定位, 开始用的ie测试的,效果蛮好,测试工程说,其他浏览器都不

AJax跨域请求百度音乐接口数据展示页面

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Music</title> 6 <script src="https://code.jquery.com/jquery.js"></script> 7 <!-- 引入 Bootstrap

Android采用Volley具体的例子展示完整的异步加载数据(一)

MainActivity例如下列: package cc.cn; import java.util.HashMap; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import com.android.volley.AuthFailureError; import com.android.volley.Reques