QT应用(9)-百度AI语音识别(音频->文字)

功能:给百度发一条音频,百度会给你返回一条文字。

[En]

Function: send an audio to Baidu, and Baidu returns a text to you.

结果图: 语音识别一般分在线和离线两种。本文说的是在线过程。录制一段音频文件->baidu,baidu ->返回一段文字给你。

1.注册账户
2.录制音频文件
3.发送http请求
4.解析json数据

1.百度注册账户+创建应用+API文档 https://console.bce.baidu.com/ai/#/ai/speech/overview/indexhttps://cloud.baidu.com/doc/SPEECH/s/ek38lxj1u
请AK和SK请自行注册

const QString baiduSpeechTokenUrl = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%1&client_secret=%2";
const QString speech_client_AK= "yLnualRuHnCcZDi2B3wEZ1rs";
const QString speech_client_SK= "LA55muGIGSWZPBkcQWnjA9AmlKeSRGLA";
const QString BaiduSpeechVideoUrl = "https://vop.baidu.com/pro_api?dev_pid=1537&cuid=%1&token=%2";

2.录制音频文件

1.一般支持的音频格式:pcm、wav、amr、m4a
2.编码要求:采样率 16000、16bit、单声道

3.发送http请求
3.1
向 baiduSpeechTokenUrl 发请求得access_token (参数为:AK,SK)

 QString m_accessToken,m_text;
    QString TokenUrl = QString(baiduSpeechTokenUrl).arg(speech_client_AK).arg(speech_client_SK);
    QMap<qstring ,qstring>header;
    header.insert(QString("Content-Type") ,QString("audio/pcm;rate=16000"));
    QByteArray requestData;
    QByteArray replyData;
    myhttp m_http;
    bool ret;
    if(m_accessToken.isEmpty() == true)
    {
        ret = m_http.post_sync(TokenUrl ,header ,requestData ,replyData);
        if(ret)
        {
            QString key = "access_token";
            m_accessToken = getJsonValueBtn(replyData ,key);
            replyData.clear();
            qDebug() << "&#x83B7;&#x53D6;&#x7684;token" << m_accessToken;
        }
        else
        {
        }
  }</qstring>

下图为返回结果

3.2 向BaiduSpeechVideoUrl 发请求得文本(参数为:access_token,录音文件流)
发送代码:

 QString speechUrl = QString(BaiduSpeechVideoUrl).arg(QHostInfo::localHostName()).arg(m_accessToken);
     ret = m_http.post_sync(speechUrl ,header ,requestData ,replyData);
     if(ret)
     {
         QString key = "result";
         m_text = getJsonValueBtn(replyData ,key);
         replyData.clear();
         qDebug() << "&#x5F97;&#x5230;&#x7684;&#x6587;&#x672C;&#x7ED3;&#x679C;&#xFF1A;" << m_text;
     }

3.3 post代码:

bool myhttp::post_sync(QString Url ,QMap<qstring ,qstring>header ,QByteArray &requestData ,QByteArray &replyData)
{

    //QNetworkAccessManager Url QNetworkRequest  QNetworkReply
    QNetworkAccessManager m_manager;
    QNetworkRequest m_request;
    m_request.setUrl(Url);
    QMapIterator<qstring ,qstring> it(header);
    while(it.hasNext())
    {
        it.next();
        m_request.setRawHeader(it.key().toLatin1() ,it.value().toLatin1());
    }
    QNetworkReply *pReply = m_manager.post(m_request ,requestData);
    QEventLoop l;
    connect( pReply ,&QNetworkReply::finished ,&l ,&QEventLoop::quit);
    l.exec();
    if(pReply != nullptr && pReply->error() == QNetworkReply::NoError)
    {
       replyData = pReply->readAll();
       qDebug()<<"replydata:"<<replydata; return true; } false; }< code>
</"replydata:"<<replydata;></qstring></qstring>

4.解析json数据

JSONRAW编码读取二进制后base64编码读取直接放在Body中 数据长度数据增大1/3 len =原始大小音频文件大小 Content-LengthheaderContent-Type:application/jsonContent-Type: audio/pcm;rate=16000url:cuid token:APPID ,API KEY,Secret KEY dev_pid1537(普通话)

QString mySpeech::getJsonValue(QByteArray &data, QString &key)
{
    QString ansstr="";
    QJsonParseError parseError;
    QJsonDocument jsonDocument = QJsonDocument::fromJson(data, &parseError);
     if(parseError.error == QJsonParseError::NoError)
    {
        if(jsonDocument.isObject())
        {
            QJsonObject jsonObj = jsonDocument.object();
            if(jsonObj.contains(key))
            {
                QJsonValue jsonVal = jsonObj.value(key);
                if(jsonVal.isString())
                {
                    return jsonVal.toString();
                }
                if(jsonVal.isArray())
                {
                    QJsonArray arr = jsonVal.toArray();
                    for(int index = 0;index < arr.size();index++)
                    {
                        QJsonValue subValue = arr.at(index);
                        if(subValue.isString())
                        {
                            ansstr += subValue.toString() + " ";
                        }
                    }
                    return ansstr;
                }
            }
            else
            {
                qDebug() << "&#x4E0D;&#x5305;&#x542B;&#x5173;&#x952E;&#x5B57;:" << key;
            }//contains(key)
        }
        else
        {
            qDebug() << "&#x4E0D;&#x662F;json&#x5BF9;&#x8C61;";
        }//isObject
    }
    else
    {
        qDebug() << "&#x672A;&#x6210;&#x529F;&#x89E3;&#x6790;JSON";
    }//NoError
    qDebug() << "&#x672A;&#x6210;&#x529F;&#x89E3;&#x6790;JSON&#xFF1A;"<< data.data();
    return QString("");
    return ansstr;
}
&#x70B9;&#x51FB;&#x5E76;&#x62D6;&#x62FD;&#x4EE5;&#x79FB;&#x52A8;

Original: https://blog.csdn.net/aggie4628/article/details/114682323
Author: 多云的夏天
Title: QT应用(9)-百度AI语音识别(音频->文字)

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

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

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球