使用百度语音识别REST API,做全平台语音识别
百度语音开发介绍文档:
http://yuyin.baidu.com/docs/asr#
使用语音识别,需要在百度申请一个应用,然后拿到API Key和Secret Key,然后才可以使用语音识别
ps:我的示例里面有放了一组可用的Key,但是仅供各位测试使用,有需要开发App的请自行申请,放在示例中的Key我可能随时会撤销。
ps:编译需要开启C++11的支持
ps:我写示例在OS X下是没问题的。但是当我移植到Windows下的时候,在刷新token那一步有问题,貌似和https有关,等到我想到解决方法的时候回来更新。
ps:示例里,在刷新token的地方我直接写了apikey的明文字符串,应该替换成m_apiKey,请手动替换。本页面中我已经更改了。
直接上代码
.h头文件部分
- class BaiduVop: public QObject
- {
- Q_OBJECT
- private:
- QAudioDeviceInfo m_currentDevice;
- QString m_apiKey;
- QString m_secretKey;
- QString m_token;
- QAudioInput *m_audioInput = NULL;
- QByteArray m_buf;
- QBuffer *m_buffer = NULL;
- JasonQt_Net::HTTP m_http;
- public:
- BaiduVop(const QString &apiKey, const QString &secretKey);
- void setDevice(const QAudioDeviceInfo &device);
- public slots:
- bool refreshToken(void);
- bool start(void);
- std::pair<bool, QString> finish(void);
- };
.cpp实现文件
- BaiduVop::BaiduVop(const QString &apiKey, const QString &secretKey):
- m_apiKey(apiKey),
- m_secretKey(secretKey)
- {
- const auto &&availableDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
- if(!availableDevices.isEmpty())
- {
- m_currentDevice = availableDevices.first();
- QAudioFormat format;
- format.setSampleRate(8000);
- format.setChannelCount(1);
- format.setSampleSize(16);
- format.setSampleType(QAudioFormat::SignedInt);
- format.setByteOrder(QAudioFormat::LittleEndian);
- format.setCodec("audio/pcm");
- m_audioInput = new QAudioInput(m_currentDevice, format, this);
- }
- }
- void BaiduVop::setDevice(const QAudioDeviceInfo &device)
- {
- m_currentDevice = device;
- }
- bool BaiduVop::refreshToken(void)
- {
- QNetworkRequest request(QUrl(QString("https://openapi.baidu.com/oauth/2.0/token?")));
- QByteArray append = QString("grant_type=client_credentials&client_id=%1&client_secret=%2&").arg(m_apiKey, m_secretKey).toLatin1();
- QByteArray buf;
- request.setRawHeader("Content-Type", "application/json");
- const auto &&flag = m_http.post(request, append, buf, 15000);
- if(!flag) { return false; }
- const auto &&data = QJsonDocument::fromJson(buf).object();
- if(data.isEmpty() || !data.contains("access_token")) { return false; }
- m_token = data["access_token"].toString();
- return true;
- }
- bool BaiduVop::start(void)
- {
- if(m_token.isEmpty())
- {
- qDebug("BaiduVop::start fail, Need refresh token befor start.");
- return false;
- }
- m_buffer = new QBuffer;
- m_buffer->open(QIODevice::ReadWrite);
- m_audioInput->start(m_buffer);
- return true;
- }
- std::pair<bool, QString> BaiduVop::finish(void)
- {
- m_audioInput->stop();
- const auto &sendData = m_buffer->data();
- m_buffer->deleteLater();
- QNetworkRequest request(QUrl("http://vop.baidu.com/server_api"));
- QJsonObject append;
- request.setRawHeader("Content-Type", "application/json");
- append["format"] = "pcm";
- append["rate"] = 8000;
- append["channel"] = 1;
- append["token"] = m_token;
- append["lan"] = "zh";
- append["cuid"] = "JasonQt";
- append["speech"] = QString(sendData.toBase64());
- append["len"] = sendData.size();
- QByteArray buf;
- m_http.post(request, QJsonDocument(append).toJson(), buf, 15000);
- QJsonObject acceptedData(QJsonDocument::fromJson(buf).object());
- if(buf.isEmpty() || acceptedData.isEmpty() || !acceptedData.contains("result")) { return { false, buf }; }
- const auto &&message = acceptedData["result"].toArray()[0].toString();
- return { true, message.mid(0, message.size() - 1) };
- }
其中有几个http的接口已经被我封装了,需要自行开发的请更改代码或者直接下载我的示例,里面有完整的工程。
可以到下方链接中下载
http://download.csdn.net/detail/wsj18808050/8659091
http://blog.csdn.net/wsj18808050/article/details/45478983
使用百度语音识别REST API,做全平台语音识别的更多相关文章
- 百度语音识别REST API——通过使用Http网络请求方式获得语音识别功能
百度语音识别通过REST API的方式给开发人员提供一个通用的HTTP接口,基于该接口,开发人员能够轻松的获取语音识别能力,本文档描写叙述了使用语音识别服务REST API的方法. 长处: 较之开发人 ...
- 百度语音识别REST API用法(含JAVA代码)——不须要集成SDK的方法
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zpf8861/article/details/32329457 上一篇文章http://blog.c ...
- Linux VPS使用百度网盘API上传备份文件
最近百度网盘将空间升级到了永久1TB,鉴于百度的实力用做数据备份空间不错,不过百度网盘没有Linux下的客户端,上传管理文件需通过百度开放云平台访问PCS资源的系列接口. 1.首先加入百度开发者:ht ...
- 可能是目前市面上唯一能够支持全平台的RTMP推流组件:Windows、Linux、Android、iOS、ARM
EasyRTMP是什么? EasyRTMP是一套RTMP直播推送功能组件,内部集成了包括:基本RTMP协议.断线重连.异步推送.环形缓冲区.推送网络拥塞自动丢帧.缓冲区关键帧检索.事件回调(断线.音视 ...
- .NET之全平台一体化的体验
一.前言 近来利用空闲时间研究了一下Xamarin的技术,想想既然提供了如此好的支持,就该尝试一切可能,来一个”大小通吃“. 何为全平台:APP包括Android.IOS.WP,WEB可在Window ...
- 百度地图JavaScript API覆盖物旋转时出现偏移
在项目中,调用百度地图JavaScript API,做覆盖物的旋转再添加到地图上,结果出现偏移了. 调试过程中的效果图: 发现图片的旋转并不是按车子的中心来的,而是之外的一个点.最后发现犯了一个很细节 ...
- NET之全平台一体化
NET之全平台一体化的体验 一.前言 近来利用空闲时间研究了一下Xamarin的技术,想想既然提供了如此好的支持,就该尝试一切可能,来一个”大小通吃“. 何为全平台:APP包括Android.IOS. ...
- WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现
原文:WPF技术触屏上的应用系列(二): 嵌入百度地图.API调用及结合本地数据库在地图上进行自定义标点的实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系 ...
- 百度地图JavaScript API使用
最近在完成优达学城前端开发(入门)课程的P4项目中,要求调用google地图进行交互,项目已提供部分js代码和html代码.但在申请google地图API密钥时由于网络等原因,打不开或者连接超时,所以 ...
随机推荐
- CI的扩展机制
CI的扩展机制 在熟悉了CI的源码之后,它的简单明了的代码风格很有趣,这篇文章看看在CI是如何实现扩展的. 扩展包 扩展是为了完成特定的功能,在CI中,扩展包的开发只能在application/lib ...
- 最长增长子序列 DP
#include<iostream> using namespace std; #define INF 0x7fffffff #define N 10000 // O(n^2) int l ...
- LeetCode:Rank Scores
做到这题时卡了不少时间,参考了别人的解法,觉得挺不错的,还挺巧妙. SELECT s2.Score,s1.Rank From ( SELECT S1.Score, COUNT(*) as Rank F ...
- Python urllib和urllib2模块学习(三)
build_opener()详解: 1.urllib2.urlopen()函数不支持验证.cookie或者其它HTTP高级功能,要支持这些功能,必须使用build_opener()函数创建自定这句话的 ...
- SQL Server 数据库的自动选项
自动选项影响SQL Server 可能会自动进行的操作,所有的这些都是bool值,值为on 或off 1. auto_close: 当这个为on 时.数据库在最后一个用户退出后完全关闭,这样数据库就不 ...
- Android - Ant自动编译打包android项目 -- 1(转)
1. 背景: Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其当要将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我 ...
- Android开发之发送邮件功能的实现(源代码分享)
Android开发中可能会碰到如何发送邮件的困扰,之前我也查了相关的文档,博友们也分享了不少的发送邮件的办法,总共有3种把,我仔细阅读了下,发现有的讲的太过复杂跟麻烦,不够清晰,我今天就来分享下我认为 ...
- cdoj 791 Frozen Rose-Heads
//本来想做白书上一题 结果发现又要二染色 又要dp的 想了两个小时没想通 然后做了个傻逼题安慰自己 解:不多说,就是递归到叶节点,然后回来的时候在解决子树和直接删边的代价中间取个最小值 #inclu ...
- Yii国际化
Yii版本:1.1.13 1.将CMessageSource的$forceTranslation属性改为true Yii::app()->messages->forceTranslatio ...
- JS 匿名函数 自执行
其实就是将函数直接做为表达调用,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数. 常见格式:(function() { /* code */ })(); 解释:包围函数(funct ...