现在语音聊天机器人是一度火热,网上也有其他编程软件的语音聊天机器人,但是没有Qt的(或许是博主没找到),故在此发一篇关于Qt如何编写语音聊天机器人详解。代码中运用到了一些常见的命令,比如正则表达式、获取时间等,希望大家喜欢。
注:Aili_Xiao首发博客园及CSDN博客
新增附件:百度语音识别1.1 原百度语音识别链接删除
好多人私聊说需要语音识别的教程,因为时间关系,教程就不写了直接将语音识别源码放附件中,有需要的看附件。
2018/11/21注:修订百度语音识别,重新上传
2018/11/14注:经过网友反映附件有可能出错,请注意Qt版本和QSslSocket类加载。测试附件Qt版本为5.9.2,其他版本使用时请注意QSslSocket调用是否成功。附件中的百度Key明显是错误的,请换成自己的Key进行使用!!!
前期准备:聊天机器人(图灵和小i等,这里采用的图灵),语音服务(百度语音和讯飞语音,这里采用的是百度语音)。跳过前期准备
图灵机器人:http://www.tuling123.com/
百度语音:http://yuyin.baidu.com/
图灵机器人注册示意图:
图灵机器人登陆示意图,可以选择第三方登录。
图灵机器人创建示意图以及能力购买
百度语音:http://yuyin.baidu.com/
百度语音注册示意图:
百度语音创建应用示意图:
只进行前两步 ,我们的百度语音的应用就创建好了,然后刷新一下就可以看到,我们创建的应用,之后我们开通服务。
两个服务都选上,其实我们今天就只讲语音合成。
好了以上是前期的准备工作。当我们创建好了,那就开始我们今天的正题,Qt编写语音聊天机器人。
===正文开始===
一、获取API数据:
记录图灵机器人的API接口:在图灵机器人界面点击设置然后往下翻,将API地址,APIkey记录下来,secret是加密的我们可以不打开后面的开关
记录百度语音的API接口:(因为我们是在PC端进行的,所以不能使用Android或者ISO的服务)
在应用管理点击 查看key,将APP ID,API Key,和Secret Key都记录下来。
此时我们打开百度语音的“文档中心”,找到今天我们要使用的“语音合成”点开,之后找到“语音合成 REST API”。使用语音功能我们需要权威的认证,所以我们需要认证,点开“鉴权认证机制”,照着文章所说我们取得Access Token,也可以直接编辑下面的链接然后填入自己百度API Key和Secret Key,复制到浏览器打开链接就可以获得Access Token。
https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=API Key&client_secret= Secret Key
Access_token = 24.b9ff177ff09b5133f0a84bc04d631703.2592000.1504956436.282335-9993948
这个是我获取的,到这里第一步的过程已经结束。
二、打开Qt Creator新建项目为ChatRobots,我们这里采用无ui设计。
编辑ChatRobots.pro文件:编辑过后Ctrl+S保存
1 QT += core gui network script multimedia
编辑widget.h文件
1 #ifndef WIDGET_H
2 #define WIDGET_H
3 //作者:夜潇
4 #include
5 #include
6 #include
7
8 #include
9 #include
10 #include
11 #include
12 #include
13
14 #include
15 #include
16 #include
17
18 #include
19 #include
20
21 static const QString TuLing_URL = "http://www.tuling123.com/openapi/api";
22 static const QString TuLing_APIKEY = "填写你的图灵API_KEY";
23 static const QString baidu_URL = "http://tsn.baidu.com/text2audio?";
24 static const QString baidu_token = "填写你的百度权威认证:Access_token";
25
26 class Widget : public QWidget
27 {
28 Q_OBJECT
29
30 public:
31 Widget(QWidget *parent = 0);
32 ~Widget();
33 private:
34 QLabel *labelInput,*labelOut,*labellink;
35 QLineEdit *lineEdit; //发送内容
36 QPushButton *BtnFaSong;
37 QListWidget *lineEdit1; //聊天内容
38 QGridLayout *mainlayout;
39 QString URl,baidu_Cuid,StrMac;
40 QString text;
41 QString StrTemp;
42 QMediaPlayer *player; //语音播放
43 private slots:
44 void on_btnSend_clicked();
45 void replyFinish(QNetworkReply *);
46 //时间
47 void showTime();
48 //延时
49 void ShowAllDelay(int b);
50 //调用百度语音合成API槽函数
51 void ShowSong(QString bai_tex,QString bai_lan,
52 QString bai_tok,QString bai_ctp,QString bai_cuid,QString bai_spd,
53 QString bai_pit,QString bai_vol,QString bai_per);
54 //获取本机MAC地址
55 QString getMacAddress();
56 //转换MAC地址格式
57 QString tgt_mac();
58 };
59
60 #endif // WIDGET_H
编辑widget.cpp文件
1 #include "widget.h"
2 #include "QString"
3 #include
4
5 #include
6 #include
7 #include
8 #include
9 #include
10
11 Widget::Widget(QWidget *parent)
12 : QWidget(parent)
13 {
14 setWindowTitle("ChatRobots(聊天机器人) —— 作者:夜潇");
15 setMinimumSize(520,410);
16
17 labelInput = new QLabel("欲发送内容:");
18 labellink = new QLabel;
19 labellink ->setOpenExternalLinks(true);
20 labelOut = new QLabel("当前聊天:");
21 lineEdit = new QLineEdit;
22 lineEdit ->setMinimumHeight(32);
23 lineEdit ->setFocus();
24 lineEdit ->setClearButtonEnabled(true);
25 lineEdit1 = new QListWidget;
26 lineEdit1 ->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
27 lineEdit1 ->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
28 BtnFaSong = new QPushButton("发送");
29 BtnFaSong ->setMinimumHeight(32);
30
31 player=new QMediaPlayer(this);
32
33 mainlayout = new QGridLayout(this);
34 mainlayout ->addWidget(labelOut,0,0);
35 mainlayout ->addWidget(labellink,0,1);
36 mainlayout ->addWidget(lineEdit1,1,0,1,2);
37 mainlayout ->addWidget(labelInput,2,0);
38 mainlayout ->addWidget(lineEdit,2,1);
39 mainlayout ->addWidget(BtnFaSong,3,0,1,2);
40
41 connect(BtnFaSong,SIGNAL(clicked(bool)),this,SLOT(on_btnSend_clicked()));
42 QTimer *timer=new QTimer(this);
43 connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
44 timer->start(1000);
45 showTime();
46 getMacAddress();
47 tgt_mac();
48 }
49
50 Widget::~Widget()
51 {
52
53 }
54
55 void Widget::on_btnSend_clicked()
56 {
57 StrTemp = lineEdit->text();
58 if(StrTemp.isEmpty())
59 {
60 StrTemp = "你好";
61 URl = TuLing_URL + "?key=" + TuLing_APIKEY + "&info=" + StrTemp;
62 }
63 else
64 {
65 URl = TuLing_URL + "?key=" + TuLing_APIKEY + "&info=" + StrTemp;
66 }
67 lineEdit1->addItem(text);
68 lineEdit1->addItem("我:"+StrTemp);
69 lineEdit1 ->setCurrentRow(lineEdit1->count() - 1);
70 QUrl url;
71 url.setUrl(URl);
72 QNetworkRequest request(url);
73 QNetworkAccessManager *manager=new QNetworkAccessManager(this);
74 manager->get(request);
75 connect(manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(replyFinish(QNetworkReply *)));
76 }
77
78 void Widget::replyFinish(QNetworkReply * reply)
79 {
80 QString data=reply->readAll();
81 QString strText,StrTextUrl;
82 QScriptValue jsontext;
83 QScriptEngine engineText;
84 jsontext=engineText.evaluate("value="+data);
85 StrTextUrl = jsontext.property("url").toString();
86 QScriptValueIterator iteratorText(jsontext);
87 while(iteratorText.hasNext())
88 {
89 iteratorText.next();
90
91 if(iteratorText.name()=="text")
92 {
93 strText=iteratorText.value().toString();
94 lineEdit1->addItem(text);
95 lineEdit1->addItem("如梦令:"+strText);
96 ShowSong(strText,"zh",baidu_token,"1",StrMac,"5","5","5","0");//默认设置语音:中文,语速语调等为5,讲述人:0为女
97 lineEdit1->setWordWrap(true);
98 lineEdit1 ->setCurrentRow(lineEdit1->count() - 1);
99 if(!StrTextUrl.isEmpty())
100 {
101 labellink->setText(tr("%2").arg(StrTextUrl).arg(StrTemp));
102 labellink->show();
103 ShowAllDelay(30000);//设置延时时间为半分钟
104 labellink->hide();
105 }
106 break;
107 }
108 }
109 }
110
111 void Widget::showTime()
112 {
113 QTime time=QTime::currentTime();
114 text=time.toString("hh:mm:ss");
115 }
116
117 void Widget::ShowAllDelay(int b)
118 {
119 QTime timer = QTime::currentTime().addMSecs(b);
120 while (QTime::currentTime() < timer)
121 {
122 QCoreApplication::processEvents(QEventLoop::AllEvents,100);
123 }
124 }
125
126 void Widget::ShowSong(QString bai_tex,QString bai_lan,QString bai_tok,QString bai_ctp,
127 QString bai_cuid,QString bai_spd,QString bai_pit,QString bai_vol,QString bai_per)
128 {
129 QByteArray url="http://tsn.baidu.com/text2audio?";
130 url.append(QString("&lan=%1&cuid=%2&ctp=%3&tok=%4&spd=%5&pit=%6&vol=%7&per=%8").arg(bai_lan).arg(bai_cuid).arg(bai_ctp).arg(bai_tok).arg(bai_spd).arg(bai_pit).arg(bai_vol).arg(bai_per));
131 url.append("&tex=");
132 url.append(QUrl::toPercentEncoding(bai_tex));
133 player->setMedia(QUrl::fromLocalFile(url));
134 player->play();
135 }
136
137 QString Widget::getMacAddress()
138 {
139 foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces())
140 {
141 baidu_Cuid += "Interface:"+interface.hardwareAddress()+"\n";
142 if (!(interface.flags() & QNetworkInterface::IsRunning))
143 {
144 baidu_Cuid = interface.hardwareAddress();
145 return baidu_Cuid;
146 }
147 }
148 }
149
150 QString Widget::tgt_mac()
151 {
152 QString str1,str2,str3,str4,str5,str6;
153 QStringList list = baidu_Cuid.split(QRegExp(":"), QString::SkipEmptyParts); //这里采用的正则分割文本
154 str1 = list[0];
155 str2 = list[1];
156 str3 = list[2];
157 str4 = list[3];
158 str5 = list[4];
159 str6 = list[5];
160 StrMac =str1+"-"+str2+"-"+str3+"-"+str4+"-"+str5+"-"+str6;
161 return StrMac;
162 }
以上就是第二部分的内容,下面附上测试图:当输入框中没有内容的时候,默认是发送“你好”问候语。
如果觉得好,就给一个赞吧以及分享给好友!如有疑问留言,或者发送邮箱:[email protected]。