当前位置: 代码网 > it编程>编程语言>C/C++ > QT 系统学习 day06 ,摄像头,语音识别(语音转文字,文字转语音,Qt 的人脸识别系统),_qt 语音识别转文字

QT 系统学习 day06 ,摄像头,语音识别(语音转文字,文字转语音,Qt 的人脸识别系统),_qt 语音识别转文字

2024年08月01日 C/C++ 我要评论
/ 直接使用系统默认的 /// 或者调用上面的可用设备, 上面不是有码?if(info.isFormatSupported(format) == false)//检测配置是否支持该音频设备。void Audio::slot_pushButton_input() /*** 录制音频 ***/void Audio::slot_pushButton_input() /*** 录制音频 ***/

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

需要这些体系化资料的朋友,可以加我v获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事it行业的老鸟或是对it行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    connect(ui->pushbutton,signal(clicked(bool)),this,slot(slot_pushbutton_camrae_open()));
    connect(ui->pushbutton_2,signal(clicked(bool)),this,slot(slot_pushbutton_capture()));

}

widget::~widget()
{
delete ui;
}

void widget::slot_pushbutton_camrae_open()
{
if(ui->pushbutton->text() == “打开摄像头”)
{
/**** 摄像头初始化 /
qcamerainfo camreinfo = qcamerainfo::defaultcamera(); /
获取系统默认摄像头 /
if(camreinfo.isnull() == true)
{
qmessagebox::warning(this,“警告”,“系统没有可用摄像头”);
return ;
}
/
申请摄像头类空间 ****/
m_camera = new qcamera(camreinfo); // 直接使用系统默认的 /// 或者调用上面的可用设备, 上面不是有码?? 就是存入 combox里面的数据
m_camera->setcapturemode(qcamera::capturestillimage); //设置捕捉模式为静态帧(图片形式)
m_camera->setcapturemode(qcamera::capturemode::captureviewfinder); //将采集到取景器中
m_camera->setviewfinder((ui->videowidget)); //将摄像头数据输出到 ui 界面显示
m_camera->start(); //摄像头打开

    ui->pushbutton->settext("关闭摄像头");
    ui->pushbutton_2->setenabled(true);

    /***** 将摄像头放入摄像头记录类中,方便拍照 ******/
    cameraimagecapture = new qcameraimagecapture(m_camera);
    cameraimagecapture->setcapturedestination(qcameraimagecapture::capturetofile);
    /*********** 捕获信号函数 imagecaptured(int,qimage) 拍了一张照,发出该信号 ********/
    connect(cameraimagecapture,signal(imagecaptured(int,qimage)),this,slot(slot_cameraimagecapture(int,qimage)));
}
else
{
    delete m_camera; //释放他的空间
    delete cameraimagecapture; //释放他的空间

    ui->pushbutton->settext("打开摄像头");
    ui->pushbutton_2->setenabled(false);
}

}

void widget::slot_cameraimagecapture(int id, qimage image)
{
ui->label->setpixmap(qpixmap::fromimage(image));
}

void widget::slot_pushbutton_capture()
{
cameraimagecapture->capture(“d:\qt\hqyj_coding\day06_camera\gw.jpg”);
}




---




---




---


## **2.关于 阿里云 的人脸识别运用 (加载图片(注册),对比 )**


1. 和上面差不多,只是加了 , http  的网络请求 模式, 


2.建立信号, 



connect(m_http,signal(finished(qnetworkreply*)),this,slot(slot_http_finished(qnetworkreply*)));

//有信号可以读取的时候,调用槽函数


3. 第一步获取    发送请求     得到访问\_打开的命令 和 状态码,



void camera::slot_http_finished(qnetworkreply *reply)
{
// 响应的状态码为 200 , 表示请求成功
int stat = reply->attribute(qnetworkrequest::httpstatuscodeattribute).toint();

qbytearray reply_data = reply->readall();//读取网站的访问命令
qdebug() << "reply_data = " << reply_data << endl;
if(stat == 200) /*** 成功数据 ***/
{
    //获取响应信息
    qbytearray bytearray = qstring(reply_data).toutf8();//把数据转型
    qjsondocument jsondocument = qjsondocument::fromjson(bytearray); //转为json格式字符串
    if(jsondocument.isobject() == true)
    {
        qjsonobject jsonobject = jsondocument.object();
        if(jsonobject.find("access_token") != jsonobject.end())
        {
            access_token = jsonobject["access_token"].tostring();
            qdebug() << "access_token:" << access_token << endl;
        }
    }
}

}



4.之后包括,注册和 搜索功能, 首先,我们的 讲 搜索功能 


百度云技术文档 


![](https://img-blog.csdnimg.cn/b78135a0819b432ea5c4b080fc122b04.png)



搜索



void camera::slot_pushbutton_find()
{
/**** 获取用户输入的信息 *****/
qstring group = ui->combobox_group->currenttext();
qstring id = ui->lineedit_id->text();
qstring name = ui->lineedit_user_info->text();

/***** 组装http访问百度 *****/
qstring baidu = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=%1";
qstring url = baidu.arg(access_token);
/**** 图片转码为base64编码 ****/
qimage image = ui->label_pixmap->pixmap()->toimage(); //获取 qlabel 标签的图片

qbytearray data; /*** 用于存储图片的二进制数据 ***/

qbuffer buffer(&data); /*** 将 data 作为缓冲区对象 ****/
image.save(&buffer,"png"); /***将图片保存到 buf -> data 缓存区 为 png 格式 ***/

qstring buf = data.tobase64(); /** base64转码 **/
/*** 组装json数据 ****/
qjsonobject json;

json["image"] = buf;
json["image_type"] = "base64";
json["group_id_list"] = "student,teather"; //多组使用逗号隔开

/** 注意:人脸注册完毕后,生效时间一般为5s以内,之后便可以进行人脸搜索或认证操作 **/

/**** http 请求post 百度 ****/
qnetworkrequest request(url);
request.setheader(qnetworkrequest::contenttypeheader,"application/json");   //请求头 类型 json 格式

qbytearray byte = qjsondocument(json).tojson(qjsondocument::compact); //将json类内容转为字符串方便发送
/**** 执行post请求 ****/
m_http->post(request,byte);

}



5.注册功能:


百度云技术文档


![](https://img-blog.csdnimg.cn/260f10948357411486ef434b156d98b8.png)




void camera::slot_pushbutton_regiset()
{
/**** 获取用户输入的信息 *****/
qstring group = ui->combobox_group->currenttext();
qstring id = ui->lineedit_id->text();
qstring name = ui->lineedit_user_info->text();

/***** 组装http访问百度 *****/
qstring baidu = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=%1";
qstring url = baidu.arg(access_token);
/**** 图片转码为base64编码 ****/
qimage image = ui->label_pixmap->pixmap()->toimage(); //获取 qlabel 标签的图片

qbytearray data; /*** 用于存储图片的二进制数据 ***/

qbuffer buffer(&data); /*** 将 data 作为缓冲区对象 ****/
image.save(&buffer,"png"); /***将图片保存到 buf -> data 缓存区 为 png 格式 ***/

qstring buf = data.tobase64(); /** base64转码 **/
/*** 组装json数据 ****/
qjsonobject json;

json["image"] = buf;
json["image_type"] = "base64";
json["group_id"] = group;
json["user_id"] = id;
json["user_info"] = name;

/** 注意:人脸注册完毕后,生效时间一般为5s以内,之后便可以进行人脸搜索或认证操作 **/

/**** http 请求post 百度 ****/
qnetworkrequest request(url);
request.setheader(qnetworkrequest::contenttypeheader,"application/json");   //请求头 类型 json 格式

qbytearray byte = qjsondocument(json).tojson(qjsondocument::compact); //将json类内容转为字符串方便发送
/**** 执行post请求 ****/
m_http->post(request,byte);

}




---


所有的代码 (自己去加  百度云的  密钥, 私钥 )(用别人的有危险, 百度云有免费的,只要自己注册)


ui 界面设计


![](https://img-blog.csdnimg.cn/8626042046344422b2d22028cd3fca8f.png)



头文件 



#ifndef camera_h
#define camera_h

#include
/******* 摄像头相关类 **/
#include /
摄像头类 /
#include /
系统摄像头属性类 /
#include /
用于记录摄像头数据的类 ***/

#include /*** debug 调试类 /
/
*** 网络相关类 **/
#include /
网络访问类 */
#include /
网络数据结果类 ***/

/******* qjson 相关类 *****/
#include
#include

qt_begin_namespace
namespace ui { class camera; }
qt_end_namespace

class camera : public qmainwindow
{
q_object

public:
camera(qwidget *parent = nullptr);
~camera();

private:
ui::camera ui;
qcamera m_camera; /
* 摄像机类对象 */
qcameraimagecapture cameraimagecapture; /
用于记录摄像头数据的类 ***/
qnetworkaccessmanager m_http; /网络访问对象 /
/
百度人脸库秘钥 ***/
qstring appid = “”;
qstring api_key = “”;
qstring secret_key = “”;
qstring access_token = “”;
public slots:
void slot_pushbutton_camrae_open();
void slot_cameraimagecapture(int id,qimage image);
void slot_pushbutton_capture();
void slot_http_finished(qnetworkreply
reply);
void slot_pushbutton_regiset();
void slot_pushbutton_find();
};
#endif // camera_h



.cpp



#include “camera.h”
#include “ui_camera.h”
#include
#include
camera::camera(qwidget parent)
: qmainwindow(parent)
, ui(new ui::camera)
{
ui->setupui(this);
/
*** 获取系统可用摄像头列表 ****/
qlist cameras = qcamerainfo::availablecameras();//获取可用摄像头设备列表
int index = cameras.size();
for(int i=0;i<index;i++)
{
if(cameras.at(i).isnull() == false)
{
qdebug() << “有效摄像头:” << cameras.at(i).description();//摄像头的设备名称
ui->combobox->additem(cameras.at(i).description()); //将摄像头添加到ui界面摄像头列表中
}
}

connect(ui->pushbutton_camrae_open,signal(clicked(bool)),this,slot(slot_pushbutton_camrae_open()));
connect(ui->pushbutton_capture,signal(clicked(bool)),this,slot(slot_pushbutton_capture()));

/****** http网络访问类初始化 *****/
m_http = new qnetworkaccessmanager(this);

connect(m_http,signal(finished(qnetworkreply*)),this,slot(slot_http_finished(qnetworkreply*)));
qstring url("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%1&client_secret=%2&");
url = url.arg(api_key,secret_key);

m_http->get(qnetworkrequest(qurl(url)));
/****** 按钮发送 http 的 post 请求 ******/
connect(ui->pushbutton_regiset,signal(clicked(bool)),this,slot(slot_pushbutton_regiset()));
connect(ui->pushbutton_find,signal(clicked(bool)),this,slot(slot_pushbutton_find()));

}

void camera::slot_pushbutton_find()
{
/**** 获取用户输入的信息 *****/
qstring group = ui->combobox_group->currenttext();
qstring id = ui->lineedit_id->text();
qstring name = ui->lineedit_user_info->text();

/***** 组装http访问百度 *****/
qstring baidu = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=%1";
qstring url = baidu.arg(access_token);
/**** 图片转码为base64编码 ****/
qimage image = ui->label_pixmap->pixmap()->toimage(); //获取 qlabel 标签的图片

qbytearray data; /*** 用于存储图片的二进制数据 ***/

qbuffer buffer(&data); /*** 将 data 作为缓冲区对象 ****/
image.save(&buffer,"png"); /***将图片保存到 buf -> data 缓存区 为 png 格式 ***/

qstring buf = data.tobase64(); /** base64转码 **/
/*** 组装json数据 ****/
qjsonobject json;

json["image"] = buf;
json["image_type"] = "base64";
json["group_id_list"] = "student,teather"; //多组使用逗号隔开

/** 注意:人脸注册完毕后,生效时间一般为5s以内,之后便可以进行人脸搜索或认证操作 **/

/**** http 请求post 百度 ****/
qnetworkrequest request(url);
request.setheader(qnetworkrequest::contenttypeheader,"application/json");   //请求头 类型 json 格式

qbytearray byte = qjsondocument(json).tojson(qjsondocument::compact); //将json类内容转为字符串方便发送
/**** 执行post请求 ****/
m_http->post(request,byte);

}

void camera::slot_pushbutton_regiset()
{
/**** 获取用户输入的信息 *****/
qstring group = ui->combobox_group->currenttext();
qstring id = ui->lineedit_id->text();
qstring name = ui->lineedit_user_info->text();

/***** 组装http访问百度 *****/
qstring baidu = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=%1";
qstring url = baidu.arg(access_token);
/**** 图片转码为base64编码 ****/
qimage image = ui->label_pixmap->pixmap()->toimage(); //获取 qlabel 标签的图片

qbytearray data; /*** 用于存储图片的二进制数据 ***/

qbuffer buffer(&data); /*** 将 data 作为缓冲区对象 ****/
image.save(&buffer,"png"); /***将图片保存到 buf -> data 缓存区 为 png 格式 ***/

qstring buf = data.tobase64(); /** base64转码 **/
/*** 组装json数据 ****/
qjsonobject json;

json["image"] = buf;
json["image_type"] = "base64";
json["group_id"] = group;
json["user_id"] = id;
json["user_info"] = name;

/** 注意:人脸注册完毕后,生效时间一般为5s以内,之后便可以进行人脸搜索或认证操作 **/

/**** http 请求post 百度 ****/
qnetworkrequest request(url);
request.setheader(qnetworkrequest::contenttypeheader,"application/json");   //请求头 类型 json 格式

qbytearray byte = qjsondocument(json).tojson(qjsondocument::compact); //将json类内容转为字符串方便发送
/**** 执行post请求 ****/
m_http->post(request,byte);

}

void camera::slot_http_finished(qnetworkreply *reply)
{
qdebug()<<“这里输出”;
// 响应的状态码为 200 , 表示请求成功
int stat = reply->attribute(qnetworkrequest::httpstatuscodeattribute).toint();

qbytearray reply_data = reply->readall();
qdebug() << "reply_data = " << reply_data << endl;
ui->textedit_json->settext(qjsondocument::fromjson(reply_data).tojson()); //将其转为json字符串
if(stat == 200) /*** 成功数据 ***/
{
    //获取响应信息
    qbytearray bytearray = qstring(reply_data).toutf8();
    qjsondocument jsondocument = qjsondocument::fromjson(bytearray); //转为json格式字符串
    if(jsondocument.isobject() == true)
    {
        qjsonobject jsonobject = jsondocument.object();
        if(jsonobject.find("access_token") != jsonobject.end())
        {
            access_token = jsonobject["access_token"].tostring();
            qdebug() << "access_token:" << access_token << endl;
        }
    }
}

}

camera::~camera()
{
delete ui;
}

void camera::slot_pushbutton_camrae_open()
{
if(ui->pushbutton_camrae_open->text() == “打开摄像头”)
{
/**** 摄像头初始化 /
qcamerainfo camreinfo = qcamerainfo::defaultcamera(); /
获取系统默认摄像头 /
if(camreinfo.isnull() == true)
{
qmessagebox::warning(this,“警告”,“系统没有可用摄像头”);
return ;
}
/
申请摄像头类空间 ****/
m_camera = new qcamera(camreinfo); // 直接使用系统默认的
m_camera->setcapturemode(qcamera::capturestillimage); //设置捕捉模式为静态帧(图片形式)
m_camera->setcapturemode(qcamera::capturemode::captureviewfinder); //将采集到取景器中
m_camera->setviewfinder(ui->videowidget); //将摄像头数据输出到 ui 界面显示
m_camera->start(); //摄像头打开

    ui->pushbutton_camrae_open->settext("关闭摄像头");
    ui->pushbutton_capture->setenabled(true);

    /***** 将摄像头放入摄像头记录类中,方便拍照 ******/
    cameraimagecapture = new qcameraimagecapture(m_camera);
    cameraimagecapture->setcapturedestination(qcameraimagecapture::capturetofile);
    /*********** 捕获信号函数 imagecaptured(int,qimage) 拍了一张照,发出该信号 ********/
    connect(cameraimagecapture,signal(imagecaptured(int,qimage)),this,slot(slot_cameraimagecapture(int,qimage)));
}
else
{
    delete m_camera; //释放他的空间
    delete cameraimagecapture; //释放他的空间

    ui->pushbutton_camrae_open->settext("打开摄像头");
    ui->pushbutton_capture->setenabled(false);
}

}

void camera::slot_cameraimagecapture(int id, qimage image)
{
ui->label_pixmap->setpixmap(qpixmap::fromimage(image));
}

void camera::slot_pushbutton_capture()
{
cameraimagecapture->capture(“王老师.jpg”);
}




---




---




---




---


## **3. 文字转语音  录音,播放录音**


1.首先在。pro 文件里面添加这个   (文字转语音的模块)


![](https://img-blog.csdnimg.cn/389069bef9ee4c62a12c4f3075587504.png)



2.头文件




/******** 音频相关类 */
#include //音频属性类
#include //音频参数
#include //音频输入
#include //音频输出
/
文件相关类 **/
#include
/
文字转语音类 ********/
#include



3.建立对象



qaudioinput *m_audioinput;//音频输入
qaudiooutput *m_audiooutput;//音频输出
qfile *m_file;//文件对象
qtexttospeech *m_speech;//文字转语音对象


4.获取电脑上的音频输入,输出设备



/******* 获取系统可用的音频设备 ********/
qlist<qaudiodeviceinfo> audiodevice_outputs = qaudiodeviceinfo::availabledevices(qaudio::audiooutput);
for(int i = 0; i < audiodevice_outputs.size() ; i++)
{
    qstring name = audiodevice_outputs[i].devicename();//获取名字
    ui->combobox_audio_ouput->additem(name);//写入 ui 设计界面的设计框中
}

qlist<qaudiodeviceinfo> audiodevice_inputs = qaudiodeviceinfo::availabledevices(qaudio::audioinput);
for(int i = 0; i < audiodevice_inputs.size() ; i++)
{
    qstring name = audiodevice_inputs[i].devicename();//获取名字
    ui->combobox_audio_input->additem(name);//写入 ui 设计界面的设计框中
}


5.配置音频参数  (好被识别,)



qaudioformat format;
format.setsamplerate(16000); //设置采样率:16000mhz
format.setchannelcount(1); //设置采集通道数:1通道
format.setsamplesize(16); //设置样本大小:16比特
format.setcodec(“audio/pcm”); //设置录音格式为:pcm格式



6.检测输入设备是否可以使用, 我们默认使用系统默认的输入设备



qaudiodeviceinfo info = qaudiodeviceinfo::defaultinputdevice(); /** 使用默认输入 ***/
if(info.isformatsupported(format) == false) //检测配置是否支持该音频设备
{
format = info.nearestformat(format); //只用最接近配置的音频配置
}



7.实列化对象,打开空间音频 准备 存入数据



/****** 申请音频空间 *****/
m_audioinput = new qaudioinput(format,this);
m_audiooutput = new qaudiooutput(format,this);



8.准备文字转 音频的函数



/***** 打印电脑的tts语音引擎 *****/
qstringlist texttospeechs = qtexttospeech::availableengines();
for(qstring text : texttospeechs)
{
qdebug() << “语音引擎:” << text << endl;
}

m_speech = new qtexttospeech(this); //文字转语音对象实列化

9.录制音频




void audio::slot_pushbutton_input() /*** 录制音频 ***/
{
if(ui->pushbutton_input->text() == “开始录制”)
{
m_file = new qfile(“./录音.wav”);//音乐文件实列化 ,开辟空间
m_file->open(qiodevice::readwrite | qiodevice::truncate);//打开文件,没有创造, 可读可写
if(m_file->isopen() == false){ //打开失败
delete m_file;
return ;
}
m_audioinput->start(m_file);//开始录制

    ui->pushbutton_input->settext("停止录制");
}
else if(ui->pushbutton_input->text() == "停止录制")
{
    m_audioinput->stop();//关闭录制
    m_file->close(); //关闭文件
    ui->pushbutton_input->settext("开始录制");
}

}



10.播放音频



void audio::slot_pushbutton_output()
{
m_file = new qfile(“./录音.wav”);
m_file->open(qiodevice::readwrite);
if(m_file->isopen() == false){ //打开失败
delete m_file;
return ;
}

m_audiooutput->start(m_file);//播放音频

}



11.当文件播放完成 ,删除文件, (包含信号   连接函数)



void audio::slot_audiooutput(qaudio::state state)
{
if(state == qaudio::idlestate)//状态播放完成
{
m_audiooutput->stop();
delete m_file;
}
}



12.文字转语音,(需要系统自带的tts   的语音翻译工具)(文本转语音)



void audio::slot_pushbutton_transition()//转化函数
{
qstring text = ui->lineedit_text->text();//获取文字
m_speech->setvolume(1);//播放音量 最大 1 最小 0
m_speech->say(text);//播放获取的文字
}



13.假如你的  tts不行 不能 文字转语音采用下面这种方法,百度云直接申请文字转语音,


![](https://img-blog.csdnimg.cn/3274d00150c748bdb4de230f25615428.png)


![](https://img-blog.csdnimg.cn/0100a29a5e5946d19a87fc42adf2d340.png)



http://tsn.baidu.com/text2audio?lan=zh&ctp=1&cuid=abcdxxx&tok=1.a6b7dbd428f731035f771b8d****.86400.1292922000-2346678-124328&tex=%e7%99%be%e5%ba%a6%e4%bd%a0%e5%a5%bd&vol=9&per=0&spd=5&pit=5&aue=3
// 这是一个正常mp3的下载url
// tex在实际开发过程中请urlencode2次



代码:



qstring text=ui->lineedit_text->text();
qbytearray url=“http://tsn.baidu.com/text2audio?”;
url.append(qstring(“&lan=zh&cuid= mac 物理地址,自己的 &ctp=1&tok=”));
url.append(qurl::topercentencoding(access_token));//这个后面还可以加别的参数 声音, 列表里面的东西
url.append(“&tex=”);
url.append(qurl::topercentencoding(text));
qdebug()<<url;
media_player->setmedia(qurl::fromlocalfile(url));
media_player->play();





---


ui 设计界面


![](https://img-blog.csdnimg.cn/da5d8db035524fba9cb5a24310bd5668.png)


头文件



#ifndef audio_h
#define audio_h

#include
/******** 音频相关类 */
#include //音频属性类
#include //音频参数
#include //音频输入
#include //音频输出
/
文件相关类 **/
#include
/
文字转语音类 ********/
#include

#include
qt_begin_namespace
namespace ui { class audio; }
qt_end_namespace

class audio : public qwidget
{
q_object

public:
audio(qwidget *parent = nullptr);
~audio();

private:
ui::audio *ui;
qaudioinput *m_audioinput;//音频输入
qaudiooutput *m_audiooutput;//音频输出
qfile *m_file;//文件对象
qtexttospeech m_speech;//文字转语音对象
qmediaplayer
media_player;//没有 tts 的播放对象
public slots:
void slot_pushbutton_input();
void slot_pushbutton_output();
void slot_audiooutput(qaudio::state state);
void slot_pushbutton_transition();
};
#endif // audio_h




#include “audio.h”
#include “ui_audio.h”
#include
audio::audio(qwidget parent)
: qwidget(parent)
, ui(new ui::audio)
{
ui->setupui(this);
media_player = new qmediaplayer(this);//mp3播放
/
****** 获取系统可用的音频设备 ********/
qlist audiodevice_outputs = qaudiodeviceinfo::availabledevices(qaudio::audiooutput);
for(int i = 0; i < audiodevice_outputs.size() ; i++)
{
qstring name = audiodevice_outputs[i].devicename();
ui->combobox_audio_ouput->additem(name);
}

qlist<qaudiodeviceinfo> audiodevice_inputs = qaudiodeviceinfo::availabledevices(qaudio::audioinput);
for(int i = 0; i < audiodevice_inputs.size() ; i++)
{
    qstring name = audiodevice_inputs[i].devicename();
    ui->combobox_audio_input->additem(name);
}


/****** 配置音频参数 ******/
qaudioformat format;
format.setsamplerate(16000);	//设置采样率:16000mhz
format.setchannelcount(1);		//设置采集通道数:1通道
format.setsamplesize(16);		//设置样本大小:16比特
format.setcodec("audio/pcm");	//设置录音格式为:pcm格式

qaudiodeviceinfo info = qaudiodeviceinfo::defaultinputdevice(); /** 使用默认输入 ***/
if(info.isformatsupported(format) == false)	//检测配置是否支持该音频设备
{
    format = info.nearestformat(format);	//只用最接近配置的音频配置
}

/****** 申请音频空间 *****/
m_audioinput = new qaudioinput(format,this);
m_audiooutput = new qaudiooutput(format,this);


/****** 录音 ******/
connect(ui->pushbutton_input,signal(clicked(bool)),this,slot(slot_pushbutton_input()));
connect(ui->pushbutton_output,signal(clicked(bool)),this,slot(slot_pushbutton_output()));
connect(m_audiooutput,signal(statechanged(qaudio::state)),this,slot(slot_audiooutput(qaudio::state)));


/***** 打印电脑的tts语音引擎 *****/
qstringlist texttospeechs = qtexttospeech::availableengines();
for(qstring text : texttospeechs)
{
    qdebug() << "语音引擎:" << text << endl;
}

m_speech = new qtexttospeech(this); //文字转语音对象实列化
connect(ui->pushbutton_transition,signal(clicked(bool)),this,slot(slot_pushbutton_transition()));

}

void audio::slot_pushbutton_transition()//转化函数
{
qstring text = ui->lineedit_text->text();//获取文字
m_speech->setvolume(1);//播放音量 最大 1 最小 0
m_speech->say(text);//播放的内容
}

audio::~audio()
{s
delete ui;
}

void audio::slot_pushbutton_input() /*** 录制音频 ***/
{
if(ui->pushbutton_input->text() == “开始录制”)
{
m_file = new qfile(“./录音.wav”);
m_file->open(qiodevice::readwrite | qiodevice::truncate);
if(m_file->isopen() == false){ //打开失败
delete m_file;
return ;
}
m_audioinput->start(m_file);

    ui->pushbutton_input->settext("停止录制");
}
else if(ui->pushbutton_input->text() == "停止录制")
{
    m_audioinput->stop();//关闭录制
    m_file->close(); //关闭文件
    ui->pushbutton_input->settext("开始录制");
}

}

void audio::slot_pushbutton_output()
{
m_file = new qfile(“./录音.wav”);
m_file->open(qiodevice::readwrite);
if(m_file->isopen() == false){ //打开失败
delete m_file;
return ;
}

m_audiooutput->start(m_file);

}

void audio::slot_audiooutput(qaudio::state state)
{
if(state == qaudio::idlestate)
{
m_audiooutput->stop();
delete m_file;
}
}




---




---




---


## **4.百度云的语音识别功能**


1.基础配置和上面的出不多,只是多了语音识别为 文字的功能。。


2.百度云的开始 的步骤:(开辟一个列表就行了)


主要是 连接百度云的 语音翻译模式



void audio::slot_pushbutton_discern()
{
/***** 读取音频文件 *****/
m_file = new qfile(“./录音.wav”);
m_file->open(qiodevice::readwrite);
if(m_file->isopen() == false){ //打开失败
delete m_file;
return ;
}

qbytearray requestdata = m_file->readall(); //读取文件所有内容
m_file->close();;;;;
qstring buf = requestdata.tobase64(); //转码 base 64
/****** 组装网址 **************/
qurl url("http://vop.baidu.com/server_api");
/****** 组装json *************/
qjsonobject json;
json["format"] = "pcm";
json["rate"] = 16000;
json["dev_pid"] = 1537;
json["channel"] = 1;
json["token"] = access_token;
json["cuid"] = "q12993";
json["len"] = requestdata.size(); //语音文字真是的byte长度
json["speech"] = buf;

/****** 设置头部 **********/
qnetworkrequest request(url);
request.setheader(qnetworkrequest::contenttypeheader,"application/json");

qbytearray send_json = qjsondocument(json).tojson();
m_http->post(request,send_json);

}




3.获取语音翻译:



void audio::slot_http_finished(qnetworkreply *reply)
{
// 响应的状态码为 200 , 表示请求成功
int stat = reply->attribute(qnetworkrequest::httpstatuscodeattribute).toint();

qbytearray reply_data = reply->readall();
qdebug() << "reply_data = " << reply_data << endl;
ui->textedit_json->settext(qjsondocument::fromjson(reply_data).tojson()); //将其转为json字符串
if(stat == 200) /*** 成功数据 ***/
{
    //获取响应信息
    qbytearray bytearray = qstring(reply_data).toutf8();
    qjsondocument jsondocument = qjsondocument::fromjson(bytearray); //转为json格式字符串
    if(jsondocument.isobject() == true)
    {
        qjsonobject jsonobject = jsondocument.object();
        if(jsonobject.find("access_token") != jsonobject.end())
        {
            access_token = jsonobject["access_token"].tostring();
            qdebug() << "access_token:" << access_token << endl;
        }

        if(jsonobject.find("err_msg") != jsonobject.end() && jsonobject.find("result") != jsonobject.end())
        {
            qjsonarray jsonarray = jsonobject["result"].toarray();
            qstring result = jsonarray[0].tostring();//最后 json  形式的数据转为 qstring类型的数据
            ui->lineedit_json->settext(result);
            /***** 判断结果 *****/
            if(result.contains("打开") == true)
            {
                if(result.contains("卧室灯") == true)
                {
                    m_speech->say("卧室灯已打开");
                }
                else if(result.contains("厨房灯") == true)
                {
                    m_speech->say("厨房灯已打开");
                }
            }
            else if(result.contains("关闭") == true)
            {
                if(result.contains("卧室灯") == true)
                {
                    m_speech->say("卧室灯已关闭");
                }
                else if(result.contains("厨房灯") == true)
                {
                    m_speech->say("厨房灯已关闭");
                }
            }
        }
    }
}

}




---



ui 界面


![](https://img-blog.csdnimg.cn/6524d00a6ae4466299303ffe03c6e344.png)



头文件  (密钥自己  搞, 创建一个百度云就行了, 1元可以玩一个月,)



#ifndef audio_h
#define audio_h

#include
/******** 音频相关类 */
#include //音频属性类
#include //音频参数
#include //音频输入
#include //音频输出
/
文件相关类 **/
#include
/
文字转语音类 */
#include
/
网络相关类 **/
#include /
网络访问类 */
#include /
网络数据结果类 ***/

/******* qjson 相关类 *****/
#include
#include
#include

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我v获取:vip1024c (备注嵌入式)

h->say(“厨房灯已关闭”);
}
}
}
}
}
}




---



ui 界面


![](https://img-blog.csdnimg.cn/6524d00a6ae4466299303ffe03c6e344.png)



头文件  (密钥自己  搞, 创建一个百度云就行了, 1元可以玩一个月,)



#ifndef audio_h
#define audio_h

#include
/******** 音频相关类 */
#include //音频属性类
#include //音频参数
#include //音频输入
#include //音频输出
/
文件相关类 **/
#include
/
文字转语音类 */
#include
/
网络相关类 **/
#include /
网络访问类 */
#include /
网络数据结果类 ***/

/******* qjson 相关类 *****/
#include
#include
#include

[外链图片转存中…(img-ku5ugwm8-1715789878387)]
[外链图片转存中…(img-zhg8taxt-1715789878388)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我v获取:vip1024c (备注嵌入式)

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com