百度语音开发介绍文档:

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头文件部分

  1. class BaiduVop: public QObject
  2. {
  3. Q_OBJECT
  4. private:
  5. QAudioDeviceInfo m_currentDevice;
  6. QString m_apiKey;
  7. QString m_secretKey;
  8. QString m_token;
  9. QAudioInput *m_audioInput = NULL;
  10. QByteArray m_buf;
  11. QBuffer *m_buffer = NULL;
  12. JasonQt_Net::HTTP m_http;
  13. public:
  14. BaiduVop(const QString &apiKey, const QString &secretKey);
  15. void setDevice(const QAudioDeviceInfo &device);
  16. public slots:
  17. bool refreshToken(void);
  18. bool start(void);
  19. std::pair<bool, QString> finish(void);
  20. };

.cpp实现文件

  1. BaiduVop::BaiduVop(const QString &apiKey, const QString &secretKey):
  2. m_apiKey(apiKey),
  3. m_secretKey(secretKey)
  4. {
  5. const auto &&availableDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
  6. if(!availableDevices.isEmpty())
  7. {
  8. m_currentDevice = availableDevices.first();
  9. QAudioFormat format;
  10. format.setSampleRate(8000);
  11. format.setChannelCount(1);
  12. format.setSampleSize(16);
  13. format.setSampleType(QAudioFormat::SignedInt);
  14. format.setByteOrder(QAudioFormat::LittleEndian);
  15. format.setCodec("audio/pcm");
  16. m_audioInput = new QAudioInput(m_currentDevice, format, this);
  17. }
  18. }
  19. void BaiduVop::setDevice(const QAudioDeviceInfo &device)
  20. {
  21. m_currentDevice = device;
  22. }
  23. bool BaiduVop::refreshToken(void)
  24. {
  25. QNetworkRequest request(QUrl(QString("https://openapi.baidu.com/oauth/2.0/token?")));
  26. QByteArray append = QString("grant_type=client_credentials&client_id=%1&client_secret=%2&").arg(m_apiKey, m_secretKey).toLatin1();
  27. QByteArray buf;
  28. request.setRawHeader("Content-Type", "application/json");
  29. const auto &&flag = m_http.post(request, append, buf, 15000);
  30. if(!flag) { return false; }
  31. const auto &&data = QJsonDocument::fromJson(buf).object();
  32. if(data.isEmpty() || !data.contains("access_token")) { return false; }
  33. m_token = data["access_token"].toString();
  34. return true;
  35. }
  36. bool BaiduVop::start(void)
  37. {
  38. if(m_token.isEmpty())
  39. {
  40. qDebug("BaiduVop::start fail, Need refresh token befor start.");
  41. return false;
  42. }
  43. m_buffer = new QBuffer;
  44. m_buffer->open(QIODevice::ReadWrite);
  45. m_audioInput->start(m_buffer);
  46. return true;
  47. }
  48. std::pair<bool, QString> BaiduVop::finish(void)
  49. {
  50. m_audioInput->stop();
  51. const auto &sendData = m_buffer->data();
  52. m_buffer->deleteLater();
  53. QNetworkRequest request(QUrl("http://vop.baidu.com/server_api"));
  54. QJsonObject append;
  55. request.setRawHeader("Content-Type", "application/json");
  56. append["format"] = "pcm";
  57. append["rate"] = 8000;
  58. append["channel"] = 1;
  59. append["token"] = m_token;
  60. append["lan"] = "zh";
  61. append["cuid"] = "JasonQt";
  62. append["speech"] = QString(sendData.toBase64());
  63. append["len"] = sendData.size();
  64. QByteArray buf;
  65. m_http.post(request, QJsonDocument(append).toJson(), buf, 15000);
  66. QJsonObject acceptedData(QJsonDocument::fromJson(buf).object());
  67. if(buf.isEmpty() || acceptedData.isEmpty() || !acceptedData.contains("result")) { return { false, buf }; }
  68. const auto &&message = acceptedData["result"].toArray()[0].toString();
  69. return { true, message.mid(0, message.size() - 1) };
  70. }

其中有几个http的接口已经被我封装了,需要自行开发的请更改代码或者直接下载我的示例,里面有完整的工程。

可以到下方链接中下载

http://download.csdn.net/detail/wsj18808050/8659091

http://blog.csdn.net/wsj18808050/article/details/45478983

使用百度语音识别REST API,做全平台语音识别的更多相关文章

  1. 百度语音识别REST API——通过使用Http网络请求方式获得语音识别功能

    百度语音识别通过REST API的方式给开发人员提供一个通用的HTTP接口,基于该接口,开发人员能够轻松的获取语音识别能力,本文档描写叙述了使用语音识别服务REST API的方法. 长处: 较之开发人 ...

  2. 百度语音识别REST API用法(含JAVA代码)——不须要集成SDK的方法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zpf8861/article/details/32329457 上一篇文章http://blog.c ...

  3. Linux VPS使用百度网盘API上传备份文件

    最近百度网盘将空间升级到了永久1TB,鉴于百度的实力用做数据备份空间不错,不过百度网盘没有Linux下的客户端,上传管理文件需通过百度开放云平台访问PCS资源的系列接口. 1.首先加入百度开发者:ht ...

  4. 可能是目前市面上唯一能够支持全平台的RTMP推流组件:Windows、Linux、Android、iOS、ARM

    EasyRTMP是什么? EasyRTMP是一套RTMP直播推送功能组件,内部集成了包括:基本RTMP协议.断线重连.异步推送.环形缓冲区.推送网络拥塞自动丢帧.缓冲区关键帧检索.事件回调(断线.音视 ...

  5. .NET之全平台一体化的体验

    一.前言 近来利用空闲时间研究了一下Xamarin的技术,想想既然提供了如此好的支持,就该尝试一切可能,来一个”大小通吃“. 何为全平台:APP包括Android.IOS.WP,WEB可在Window ...

  6. 百度地图JavaScript API覆盖物旋转时出现偏移

    在项目中,调用百度地图JavaScript API,做覆盖物的旋转再添加到地图上,结果出现偏移了. 调试过程中的效果图: 发现图片的旋转并不是按车子的中心来的,而是之外的一个点.最后发现犯了一个很细节 ...

  7. NET之全平台一体化

    NET之全平台一体化的体验 一.前言 近来利用空闲时间研究了一下Xamarin的技术,想想既然提供了如此好的支持,就该尝试一切可能,来一个”大小通吃“. 何为全平台:APP包括Android.IOS. ...

  8. WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现

    原文:WPF技术触屏上的应用系列(二): 嵌入百度地图.API调用及结合本地数据库在地图上进行自定义标点的实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系 ...

  9. 百度地图JavaScript API使用

    最近在完成优达学城前端开发(入门)课程的P4项目中,要求调用google地图进行交互,项目已提供部分js代码和html代码.但在申请google地图API密钥时由于网络等原因,打不开或者连接超时,所以 ...

随机推荐

  1. DIR和dirent结构体

    DIR结构体类似于FILE,是一个内部结构 struct __dirstream { void *__fd; char *__data; int __entry_data; char *__ptr; ...

  2. C++中的操作符重载

    一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...

  3. nginx1.9.4 +php 5.5.29+yii2.0配置手册

    nginx1.9.4 +php 5.5.29+yii2.0配置手册 目录 一.    php5.5.29安装配置    2 二.    nginx1.9.4安装配置    2 三.    yii2.0 ...

  4. struts项目中添加的jar包

    一般我们使用struts时,添加的jar如下: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar freemarker-2.3.16.jar java ...

  5. 移动端h5摇一摇事件

    // 摇一摇动作 //获取加速度信息 //通过监听上一步获取到的x, y, z 值在一定时间范围内的变化率,进行设备是否有进行晃动的判断. //而为了防止正常移动的误判,需要给该变化率设置一个合适的临 ...

  6. Redis解决强制关闭Redis快照导致不能持久化错误

    今天在使用composer添加Redis缓存的时候,运行Redis发生错误: 127.0.0.1:6379> set dachou dadachou (error) MISCONF Redis ...

  7. 习惯使用断言Assert

    一直在给党做项目,我们这些可怜兮兮的学生都没太多时间安排自己的活动了,写个blog都要在中午休息的时间. 项目用的是.NET,本来也想分享一些干货点的东西,但博客园里的前辈把这类文章已经分享泛滥了,想 ...

  8. 转:JavaScript函数式编程(一)

    转:JavaScript函数式编程(一) 一.引言 说到函数式编程,大家可能第一印象都是学院派的那些晦涩难懂的代码,充满了一大堆抽象的不知所云的符号,似乎只有大学里的计算机教授才会使用这些东西.在曾经 ...

  9. C#内存操作

    原文:[转]C#内存操作 最近闲来无事发现周围的朋友都在玩<植物大战僵尸>的游戏!于是动了制作这游戏工具的念头!虽然在网上同类工具很多 但是用C#写的我几乎看不到!所以我想用C#写一个!  ...

  10. fragment中listview触发事件setOnItemClickListener不好使

    <listView/>中// listview点击 ,高度wrap_content改成fill_prarent