zoukankan      html  css  js  c++  java
  • 使用百度语音识别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头文件部分

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. class BaiduVop: public QObject  
    2. {  
    3.     Q_OBJECT  
    4.   
    5. private:  
    6.     QAudioDeviceInfo m_currentDevice;  
    7.   
    8.     QString m_apiKey;  
    9.     QString m_secretKey;  
    10.     QString m_token;  
    11.   
    12.     QAudioInput *m_audioInput = NULL;  
    13.     QByteArray m_buf;  
    14.     QBuffer *m_buffer = NULL;  
    15.   
    16.     JasonQt_Net::HTTP m_http;  
    17.   
    18. public:  
    19.     BaiduVop(const QString &apiKey, const QString &secretKey);  
    20.   
    21.     void setDevice(const QAudioDeviceInfo &device);  
    22.   
    23. public slots:  
    24.     bool refreshToken(void);  
    25.   
    26.     bool start(void);  
    27.   
    28.     std::pair<bool, QString> finish(void);  
    29. };  


    .cpp实现文件

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.   
    10.         QAudioFormat format;  
    11.         format.setSampleRate(8000);  
    12.         format.setChannelCount(1);  
    13.         format.setSampleSize(16);  
    14.         format.setSampleType(QAudioFormat::SignedInt);  
    15.         format.setByteOrder(QAudioFormat::LittleEndian);  
    16.         format.setCodec("audio/pcm");  
    17.   
    18.         m_audioInput = new QAudioInput(m_currentDevice, format, this);  
    19.     }  
    20. }  
    21.   
    22. void BaiduVop::setDevice(const QAudioDeviceInfo &device)  
    23. {  
    24.     m_currentDevice = device;  
    25. }  
    26.   
    27. bool BaiduVop::refreshToken(void)  
    28. {  
    29.     QNetworkRequest request(QUrl(QString("https://openapi.baidu.com/oauth/2.0/token?")));  
    30.     QByteArray append = QString("grant_type=client_credentials&client_id=%1&client_secret=%2&").arg(m_apiKey, m_secretKey).toLatin1();  
    31.     QByteArray buf;  
    32.   
    33.     request.setRawHeader("Content-Type", "application/json");  
    34.   
    35.     const auto &&flag = m_http.post(request, append, buf, 15000);  
    36.     if(!flag) { return false; }  
    37.   
    38.     const auto &&data = QJsonDocument::fromJson(buf).object();  
    39.     if(data.isEmpty() || !data.contains("access_token")) { return false; }  
    40.   
    41.     m_token = data["access_token"].toString();  
    42.     return true;  
    43. }  
    44.   
    45. bool BaiduVop::start(void)  
    46. {  
    47.     if(m_token.isEmpty())  
    48.     {  
    49.         qDebug("BaiduVop::start fail, Need refresh token befor start.");  
    50.         return false;  
    51.     }  
    52.   
    53.     m_buffer = new QBuffer;  
    54.     m_buffer->open(QIODevice::ReadWrite);  
    55.     m_audioInput->start(m_buffer);  
    56.   
    57.     return true;  
    58. }  
    59.   
    60. std::pair<bool, QString> BaiduVop::finish(void)  
    61. {  
    62.     m_audioInput->stop();  
    63.   
    64.     const auto &sendData = m_buffer->data();  
    65.     m_buffer->deleteLater();  
    66.   
    67.     QNetworkRequest request(QUrl("http://vop.baidu.com/server_api"));  
    68.     QJsonObject append;  
    69.   
    70.     request.setRawHeader("Content-Type", "application/json");  
    71.   
    72.     append["format"] = "pcm";  
    73.     append["rate"] = 8000;  
    74.     append["channel"] = 1;  
    75.     append["token"] = m_token;  
    76.     append["lan"] = "zh";  
    77.     append["cuid"] = "JasonQt";  
    78.     append["speech"] = QString(sendData.toBase64());  
    79.     append["len"] = sendData.size();  
    80.   
    81.     QByteArray buf;  
    82.     m_http.post(request, QJsonDocument(append).toJson(), buf, 15000);  
    83.   
    84.     QJsonObject acceptedData(QJsonDocument::fromJson(buf).object());  
    85.   
    86.     if(buf.isEmpty() || acceptedData.isEmpty() || !acceptedData.contains("result")) { return { false, buf }; }  
    87.   
    88.     const auto &&message = acceptedData["result"].toArray()[0].toString();  
    89.     return { true, message.mid(0, message.size() - 1) };  
    90. }  


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

    可以到下方链接中下载

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

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

  • 相关阅读:
    GeoServer源码解析和扩展 (三)结构篇
    GeoServer源码解析和扩展 (一)基础篇
    开放GIS标准OGC之路(4)之 解密Filter
    开放GIS标准OGC之路(3)之 WFS初探
    养成重构的习惯有多重要
    使用GeoTools遇到的两个小问题:nvarchar类型字段无法识别,主键字段无法识别
    OGC之路(1) 之 WMS标准学习总结
    移动端flex布局
    推一把随机回帖模块
    用htmlparser来获取你想要的内容
  • 原文地址:https://www.cnblogs.com/findumars/p/5034606.html
Copyright © 2011-2022 走看看