小言_互联网的博客

基于QT平台webapi科大讯飞语音机器人2.0

334人阅读  评论(0)

本博是针对上一个版本的语音机器人更新,主要更新内容为对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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场