Ui::Widget *ui;
QCamera *m_Camera; /*** 摄像机类对象 ***/
QCameraImageCapture *CameraImageCapture; /*** 用于记录摄像头数据的类 ***/
public slots: void slot_pushButton_camrae_open(); void slot_CameraImageCapture(int id,QImage image); void slot_pushButton_capture(); };
#endif // WIDGET_H
.cpp 文件
#include "widget.h" #include "ui_widget.h"
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { 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,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.之后包括,注册和 搜索功能, 首先,我们的 讲 搜索功能
百度云技术文档

搜索
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.注册功能:
百度云技术文档

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 界面设计

头文件
#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 文件里面添加这个 (文字转语音的模块)

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不行 不能 文字转语音采用下面这种方法,百度云直接申请文字转语音,


tsn.baidu.com/text2audio?… // 这是一个正常MP3的下载url // tex在实际开发过程中请urlencode2次
代码:
QString text=ui->lineEdit_Text->text();
QByteArray url="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 设计界面

头文件
#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("厨房灯已关闭");
}
}
}
}
}
}
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**


**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**