MyException - 我的异常网
当前位置:我的异常网» 开源软件 » Qt编纂语音聊天机器人详解

Qt编纂语音聊天机器人详解

www.MyException.Cn  网友分享于:2013-08-22  浏览:0次
Qt编写语音聊天机器人详解

现在语音聊天机器人是一度火热,网上也有其他编程软件的语音聊天机器人,但是没有Qt的(或许是博主没找到),故在此发一篇关于Qt如何编写语音聊天机器人详解。代码中运用到了一些常见的命令,比如正则表达式、获取时间等,希望大家喜欢。

注:Aili_Xiao首发博客园及CSDN博客

前期准备:聊天机器人(图灵和小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 IDAPI 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 <QWidget>
 5 #include <QtNetwork>
 6 #include <QMediaPlayer>
 7 
 8 #include <QLineEdit>
 9 #include <QLabel>
10 #include <QPushButton>
11 #include <QListWidget>
12 #include <QGridLayout>
13 
14 #include <QRegExp>
15 #include <QRegExpValidator>
16 #include <QStringList>
17 
18 #include <QTimer>
19 #include <QTime>
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 <QDebug>
  4 
  5 #include <QJsonDocument>
  6 #include <QJsonParseError>
  7 #include <QtScript/QScriptEngine>
  8 #include <QtScript/QScriptValueIterator>
  9 #include <QtScript/QScriptValue>
 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("<a href = %1>%2</a>").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 }

以上就是第二部分的内容,下面附上测试图:当输入框中没有内容的时候,默认是发送“你好”问候语。

如果觉得好,就给一个赞吧以及分享给好友!如有疑问留言,或者发送邮箱:1285015525@qq.com。

 

文章评论

什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员必看的十大电影
程序员必看的十大电影
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员都该阅读的书
程序员都该阅读的书
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
总结2014中国互联网十大段子
总结2014中国互联网十大段子
每天工作4小时的程序员
每天工作4小时的程序员
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员和编码员之间的区别
程序员和编码员之间的区别
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
为什么程序员都是夜猫子
为什么程序员都是夜猫子
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我是如何打败拖延症的
我是如何打败拖延症的
编程语言是女人
编程语言是女人
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
旅行,写作,编程
旅行,写作,编程
漫画:程序员的工作
漫画:程序员的工作
如何成为一名黑客
如何成为一名黑客
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
我的丈夫是个程序员
我的丈夫是个程序员
Java程序员必看电影
Java程序员必看电影
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
那些争议最大的编程观点
那些争议最大的编程观点
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
一个程序员的时间管理
一个程序员的时间管理
程序员的鄙视链
程序员的鄙视链
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
鲜为人知的编程真相
鲜为人知的编程真相
程序员应该关注的一些事儿
程序员应该关注的一些事儿
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
 程序员的样子
程序员的样子
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
老程序员的下场
老程序员的下场
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有