本博是针对上一个版本的语音机器人更新,主要更新内容为对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文档
独乐乐不如众乐乐,需要源码的可以评论留下邮件地址。
转载:https://blog.csdn.net/weixin_39541080/article/details/104717598