使用百度语音识别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

原文链接: https://www.cnblogs.com/findumars/p/5034606.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    使用百度语音识别REST API,做全平台语音识别

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/225621

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午12:52
下一篇 2023年2月13日 下午12:52

相关推荐