#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowIcon(QIcon("timg.ico"));
// 设置窗体标题
setWindowTitle(tr("快来和小精灵一起聊天吧~"));
ui->InputText->setStyleSheet("background:transparent");
ui->OutputText->setStyleSheet("background:transparent");
p_BaiduVoice=new baiduVoice();
connect(this,&MainWindow::changeV2T,this,&MainWindow::voice_post_Tuling_slot);
connect(this,&MainWindow::changeUIANS,this,&MainWindow::Baidu_TextToVoice_replyFinish);
AudioInit();
media_player =new QMediaPlayer(this);
getMacAddress();
TokenInit();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::AudioInit()
{
const auto &&availableDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
if(!availableDevices.isEmpty())
{
SpeechCurrentDevice = availableDevices.first();
QAudioFormat format;
format.setSampleRate(8000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setSampleType(QAudioFormat::SignedInt);
format.setByteOrder(QAudioFormat::LittleEndian);
format.setCodec("audio/pcm");
audio_input = new QAudioInput(SpeechCurrentDevice, format, this);
}
}
void MainWindow::TokenInit()
{
if(JudgeTokenTime()) return;
QUrl url=QUrl(p_BaiduVoice->Get_Token_URL+
"?grant_type=client_credentials"+
"&client_id="+p_BaiduVoice->API_KEY+
"&client_secret="+p_BaiduVoice->Secret_Key);
QNetworkAccessManager *manager=new QNetworkAccessManager(this);
QNetworkRequest request(url);
connect(manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(get_Token_slot(QNetworkReply *)));
manager->get(request);
}
void MainWindow::get_Token_slot(QNetworkReply *reply)
{
QByteArray JsonStr=reply->readAll();
QJsonObject acceptedData(QJsonDocument::fromJson(JsonStr).object());
if(acceptedData.contains("access_token"))
{
QJsonValue json_value = acceptedData.take("access_token");
p_BaiduVoice->Access_Token=json_value.toString();
qDebug()<<"success get token:"<<p_BaiduVoice->Access_Token;
}
}
//声音转成文本
void MainWindow::Baidu_VoiceToText_replyFinish(QNetworkReply *reply)
{
qDebug()<<"进到槽函数了哦~~";
QByteArray JsonStr=reply->readAll();
qDebug()<<"返回信息 "<<JsonStr;
QJsonObject acceptedData(QJsonDocument::fromJson(JsonStr).object());
if(acceptedData.contains("err_no"))
{
QJsonValue version_value = acceptedData.take("err_no");
if(version_value.isDouble())
{
int version = version_value.toVariant().toInt();
if(version == 3300){
// textEdit -> append("错误代码:3300-输入参数不正确,请仔细核对文档及参照demo,核对输入参数");//重新写入文本
}else if(version == 3301){
// textEdit -> append("错误代码:3301-音频质量过差,请上传清晰的音频");//重新写入文本
QMessageBox::information(NULL,tr("识别失败"),tr("请等待一秒后开始录音,确认录音质量良好"));
}else if(version == 3302){
// textEdit -> append("错误代码:3302-鉴权失败,token字段校验失败。请用appkey 和 app secret生成");//重新写入文本
}else if(version == 3303){
// textEdit -> append("错误代码:3303-转pcm失败,如下2个原因 1. wav amr音频转码失败,即音频有问题。2. 服务端问题,请将api返回结果反馈至论坛或者QQ群");//重新写入文本
}else if(version == 3304){
// textEdit -> append("错误代码:3304-用户的请求QPS超限,请降低识别api请求频率 (qps以appId计算,移动端如果共用则累计)");//重新写入文本
}else if(version == 3305){
// textEdit -> append("错误代码:3305-用户的日pv(日请求量)超限,请“申请提高配额”,如果暂未通过,请降低日请求量");//重新写入文本
}else if(version == 3307){
// textEdit -> append("错误代码:3307-语音服务器后端识别出错问题,请将api返回结果反馈至论坛或者QQ群");//重新写入文本
}else if(version == 3308){
// textEdit -> append("错误代码:3308-音频过长,音频时长不超过60s,请将音频时长截取为60s以下");//重新写入文本
}else if(version == 3309){
// textEdit -> append("错误代码:3309-音频数据问题,服务端无法将音频转为pcm格式,可能是长度问题,音频格式问题等。 请将输入的音频时长截取为60s以下,并核对下音频的编码,是否是8K或者16K, 16bits,单声道。");//重新写入文本
}else if(version == 3310){
// textEdit -> append("错误代码:3310-输入的音频文件过大,语音文件共有3种输入方式: json 里的speech 参数(base64后); 直接post 二进制数据,及callback参数里url。 分别对应三种情况:json超过10M;直接post的语音文件超过10M;callback里回调url的音频文件超过10M");//重新写入文本
}else if(version == 3311){
// textEdit -> append("错误代码:3311-采样率rate参数不在选项里,目前rate参数仅提供8000,16000两种,填写4000即会有此错误");//重新写入文本
}else if(version == 3312){
// textEdit -> append("错误代码:3312-音频格式format参数不在选项里,目前格式仅仅支持pcm,wav或amr,如填写mp3即会有此错误");//重新写入文本
}
// return;
}
}
if(!acceptedData["result"].isNull())
{
QString message=acceptedData["result"].toArray()[0].toString();
ui->InputText->setText(message);
changeBaiduAudioAns(message);
}
}
void MainWindow::changeBaiduAudioAns(QString str)
{
this->voice_get_ans=str;
qDebug()<<"识别声音结果 "<<this->voice_get_ans;
emit changeV2T();
}
bool MainWindow::JudgeTokenTime()
{
QSettings *setting=new QSettings("GetTokenTime.ini",QSettings::IniFormat);
//当前时间
QDateTime current_date_time=QDateTime::currentDateTime();
QDateTime file_date_time;
//读取的文件时间
QString file_date_str=setting->value("/TIME/last_time").toString();
file_date_time=QDateTime::fromString(file_date_str,"yyyy-MM-dd");
// qDebug()<<"file_date_time"<<file_date_time;
uint stime = file_date_time.toTime_t();
uint etime = current_date_time.toTime_t();
int ndaysec = 24*60*60;
int Day= (etime - stime)/(ndaysec) + ((etime - stime)%(ndaysec)+(ndaysec-1))/(ndaysec) - 1;
//Token 有效期内
if(Day<30) return true;
else
{
//写时间
setting->beginGroup("TIME");
setting->setValue("last_time",current_date_time.toString("yyyy-MM-dd"));
setting->endGroup();
return false;
}
}
//更改UI_ANS_String函数,用于发射信号
void MainWindow::setUIString(QString str)
{
this->UI_ANS_String=str;
this->ui->OutputText->setText(str);
emit changeUIANS();
}
//获取本机MAC
评论1