本博是针对上一个版本的语音机器人更新,主要更新内容为对iat的支持,即使用语音交互取代文字输入的方式,由于之前忙于其他事情一直没来的及更新,以后会将语音机器人一直做下去,添加更多的功能和大家分享。
那么先来看看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文档
独乐乐不如众乐乐,需要源码的可以评论留下邮件地址。