本博是针对上一个版本的语音机器人更新,主要更新内容为对iat的支持,即使用语音交互取代文字输入的方式,由于之前忙于其他事情一直没来的及更新,以后会将语音机器人一直做下去,添加更多的功能和大家分享。
那么先来看看2.0版本的长什么样吧,首先来捕捉一只皮皮怪:
基于QT平台webapi科大讯飞语音机器人2.0
额,单看界面好像并没有什么变化,唯一的区别就是输入聊天内容变成了按住说话,美化什么的只能图一乐,真快乐还得看功能哈哈哈,当前版本的实现方式同第一版大同小异,同样按照讯飞webapi文档准备好Appid,CurTime, Param 和 CheckSum 信息并放在 HTTP 请求头中,其实与第一版不同的就是param,第一版的Param是上传文字信息的Param,2.0版本则是上传的则是语音信息的,至于其他的参数如何获取可参考第一版,要上传语音信息首先要获取用户的语音,通过QAudioInput来获取用户的语音,首先来声明一个AudioDevice的类:

class AudioDevice : public QWidget {     Q_OBJECT public:     AudioDevice();     void startAudioDevice();     void endAudioDevice();     void playAudio();     QString getWavFilePath() {return AudioFileSouce + AudioWavFile;}     qint64 addWavHeader(QString catheFileName , QString wavFileName); private:     QString AudioFileSouce = QCoreApplication::applicationDirPath()+ "/Audio/"; //设置音频文件的存放路径     QString AudioRawFile = "1.raw"; //音频文件名     QString AudioWavFile = "1.pcm"; //音频文件名     QFile *file;     QAudioInput * input;     QAudioOutput* output; };

startAudioDevice表示开始录音,endAudioDevice表示结束,按照界面的方式我们的实现逻辑就应该是当鼠标按下按钮时调用startAudioDevice,然后录音结束时调用endAudioDevice,然后就可以将语音消息上传到讯飞Aiui获取结果了,addWavHeader主要是将录音生成的.raw文件转成.wav格式的语音文件,类中具体的实现博主也是参考了网友的代码,这里不做展示,需要源码的可以在评论区给个邮件地址,然后就是准备好Param,主要录音的采用频率和编码格式,比如博主采用的是采样频率:8000,音频编码格式:raw,一切准备就绪后回到主程序:

    audioDevice = new AudioDevice;     connect(BtnFaSong, &QPushButton::pressed, this, [=](){        audioDevice->startAudioDevice();  //开始录音		     });     connect(BtnFaSong, &QPushButton::released, this, [=](){         audioDevice->endAudioDevice();  //结束录音         SendMsg();  //上传语音消息     });

逻辑如上所述,然后就是SendMsg中的变化:

    QByteArray dataArray; //    QString text = lineEdit->text(); //    if(text.isEmpty())  //若发送内容为空时,默认发送你好 //    { //        text = "你好"; //    }     //获取文件的指针     FILE *file=fopen(audioDevice->getWavFilePath().toLocal8Bit().data(),"rb");     if(!file)     {         qDebug()<<"Open Failed";         return;     }    //把指针移动到文件的结尾 ,获取文件长度     fseek(file,0,SEEK_END);    //获取文件长度     auto fileLength=ftell(file);    //定义数组长度     auto fileBuffer = new char[fileLength+1];     //把指针移动到文件开头 因为我们一开始把指针移动到结尾,如果不移动回来 会出错     rewind(file);     //读文件     fread(fileBuffer,1,fileLength,file);     //把读到的文件最后一位 写为0 要不然系统会一直寻找到0后才结束     fileBuffer[fileLength]=0;     //关闭文件     fclose(file);     qDebug()<<fileLength;     dataArray.append(fileBuffer,fileLength);

1.0版本是将用户输入框lineedit中的内容作为post的内容(注释部分),2.0则是获取本地保存的之前录好的wav文件,将wav文件读取并以二进制字节数组放入请求body中,发送出去后就可以获取到返回的Jason信息了,对于Jason信息我们主要关注关键字:“sub”,“text”和“answer”就可以了,至于其他内容功能可以自行选择解析,备注第一版的解析方式不可以直接在第二版上用,需要做一定的修改。
至此,iat功能已经集成,其他省略的内容请参照第一版,下面是讯飞官方的webapi文档:
讯飞官方的webapi文档
独乐乐不如众乐乐,需要源码的可以评论留下邮件地址。

  • 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。

发表回复

后才能评论