智能聊天机器人实现(源代码+解析)

前言:


之前写了一篇  《美女图片採集器 (源代码+解析)》 得到了众多朋友的支持, 发现这样系列的教程还是挺受欢迎的, 也激励我继续写下去。

也在那一篇文章中提过, 美女图片採集仅仅是我先前那个完整APP中的一个功能罢了, 还有其它几个比較好玩的尚未开源, 之后有时间会逐一写篇教程。

今天带来的是智能聊天机器人实现(源代码+解析), 和上一篇教程一样, 当你没有女朋友的时候, 能够用它来打发时间。这里的API是图灵机器人提供的, 实现一个十分强大的机器人。

详细功能包含:

• 支持聊天对话、智能问答
• 拥有笑话、天气、公交等丰富功能
• 支持自然语言处理及语义理解
• 数十亿知识库数据。应有尽有


执行效果:


                                   

源代码下载:


源代码已经传到git上了, 欢迎下载学习。 

下载链接: https://github.com/colin1994/tulingIOS


源代码解析:


一。

仿微信界面


这个小demo的界面是仿微信的。

仅仅只是是简化版的, 包含表情, 语音什么的, 都省略了。

对于界面这一块, 我这里不多做介绍, 由于这并非本教程主要内容。毕竟, 这个界面到自己实际项目中的时候, 肯定是须要自己定义的。

这里简要介绍一下。

该界面分成两部分: 

1. UITableView: 显示聊天列表, 当中, 左边的是机器人回答, 右边是自己的提问。

另外, 列表的每一个cell, 由头像和文字组成。 这个cell是自己定义的, 详细能够自己查看源代码。

列表加入:

//add UItableView
    self.tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 44, self.view.frame.size.width, self.view.frame.size.height-88) style:UITableViewStylePlain];
    [self.tableView registerClass:[ChartCell class] forCellReuseIdentifier:cellIdentifier];
    self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
    self.tableView.allowsSelection = NO;
    self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chat_bg_default.jpg"]];
    self.tableView.dataSource=self;
    self.tableView.delegate=self;
    [self.view addSubview:self.tableView];

2. KeyBordVIew: 自己定义的UIView, 用来显示自己定义的键盘视图。

键盘加入:

    //add keyBorad
    self.keyBordView=[[KeyBordVIew alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height-44, self.view.frame.size.width, 44)];
    self.keyBordView.delegate=self;
    [self.view addSubview:self.keyBordView];


另外, 键盘涉及弹出和收起操作操作, 这个须要在视图加载之前, 注冊通知, 响应相关操作。

1.注冊通知

    //注冊通知, 键盘收起, 弹出
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardWillHideNotification object:nil];

2.响应操作

//键盘弹出响应
-(void)keyboardShow:(NSNotification *)note
{
    CGRect keyBoardRect=[note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat deltaY=keyBoardRect.size.height;
    
    [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{
        
        self.view.transform=CGAffineTransformMakeTranslation(0, -deltaY);
    }];
}

//键盘收起响应
-(void)keyboardHide:(NSNotification *)note
{
    [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{
        self.view.transform = CGAffineTransformIdentity;
    }];
}


二。图灵key获取


用过一些第三方API的都知道, 通常我须要先注冊成为它的用户, 才干获取相应的key, 以便调用API。

图灵也不例外, 你须要先注冊成为图灵用户, 然后有相关教程, 教你怎样获取自己的key, 以及正确的URL。这里就不反复了。

图灵机器人官网链接

比如, 我这个demo里面的key是:6c2cfaf7a7f088e843b550b0c5b89c26

相应的API是:http://www.tuling123.com/openapi/api?key=6c2cfaf7a7f088e843b550b0c5b89c26&&info=%@

所以, 你仅仅要把这里的key替换成你自己的就能够了。



三。图灵API的使用


这里使用了第三方网络请求库ASI 和 json格式数据解析库 JsonKit

在导入ASI的时候, 假设你的项目是ARC, 那么, 请将相应的文件设置成支持ARC就可以。

(-fno-objc-arc)

另外, 要导入一些框架

SystemConfiguration.framework
MobileCoreServices.framework
CFNetwork.framework
libz.dylib


接着就能利用ASI调用图灵API。再利用jsonkit解析返回的数据了。

详细实现例如以下:

//每当编辑完问题后
//1. 显示自己的问题 messageType=1
//2. 调用API。返回结果
-(void)KeyBordView:(KeyBordVIew *)keyBoardView textFiledReturn:(UITextField *)textFiled
{
    
    //显示自己的问题
    ChartCellFrame *cellFrame=[[ChartCellFrame alloc]init];
    ChartMessage *chartMessage=[[ChartMessage alloc]init];
    
    chartMessage.icon=@"icon01.png";
    chartMessage.messageType=1;
    chartMessage.content=textFiled.text;
    cellFrame.chartMessage=chartMessage;
    
    [self.cellFrames addObject:cellFrame];
    [self.tableView reloadData];
    
    //滚动到当前行
    [self tableViewScrollCurrentIndexPath];
    
    //利用用户问题, 查询结果
    
    //API请求格式。 详细格式见图灵官网
    //6c2cfaf7a7f088e843b550b0c5b89c26 替换成你申请的key就可以
    NSString* urlString = [NSString stringWithFormat:@"http://www.tuling123.com/openapi/api?key=6c2cfaf7a7f088e843b550b0c5b89c26&&info=%@", textFiled.text];
    
    //NSUTF8StringEncoding编码。

避免中文错误 urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //调用API NSURL *url = [NSURL URLWithString:urlString]; testRequest = [ASIHTTPRequest requestWithURL:url]; [testRequest setDelegate:self]; [testRequest startAsynchronous]; textFiled.text=@""; myTextField = textFiled; } #pragma mark - 返回机器人回答 //调用API完成, 返回图灵回答结果 //1. 收起键盘 //2. 显示回答内容 - (void)requestFinished:(ASIHTTPRequest *)request { //收起键盘 [myTextField resignFirstResponder]; // 当以文本形式读取返回内容时用这种方法 // 解析返回的json数据 NSString *responseString = [request responseString]; self.testDic = [responseString objectFromJSONString]; self.testArr = [testDic objectForKey:@"text"]; //显示回答内容 ChartCellFrame *cellFrame=[[ChartCellFrame alloc]init]; ChartMessage *chartMessage=[[ChartMessage alloc]init]; chartMessage.icon=@"icon02.png"; chartMessage.messageType=0; chartMessage.content=[NSString stringWithFormat:@"%@", self.testArr]; cellFrame.chartMessage=chartMessage; [self.cellFrames addObject:cellFrame]; [self.tableView reloadData]; //滚动到当前行 [self tableViewScrollCurrentIndexPath]; } // API请求失败 - (void)requestFailed:(ASIHTTPRequest *)request { NSError *error = [request error]; NSLog(@"error --- %@",error); UIAlertView *alert_ = [[UIAlertView alloc]initWithTitle:@"提示" message:@"无网络可用,请检查网络状态" delegate:self cancelButtonTitle:@"知道了" otherButtonTitles: nil]; [alert_ show]; }



学习的路上, 与君共勉

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 很抱歉,我并不能完全理解您的问题。如果您是想了解关于嵌入式Linux机器人的开发,这需要考虑到硬件和软件两个方面。一般情况下,我们需要选择合适的硬件平台,并在其上安装嵌入式Linux系统,然后使用编程语言(如C/C++、Python等)编写机器人的控制程序。 以下是一个简单的示例代码,使用Python语言实现了一个基于嵌入式Linux机器人的前进和后退功能: ``` python import RPi.GPIO as GPIO import time # 设置GPIO口 GPIO.setmode(GPIO.BOARD) GPIO.setup(11, GPIO.OUT) GPIO.setup(13, GPIO.OUT) GPIO.setup(15, GPIO.OUT) GPIO.setup(19, GPIO.OUT) # 向前 def forward(): GPIO.output(11, GPIO.HIGH) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.HIGH) GPIO.output(19, GPIO.LOW) # 向后 def backward(): GPIO.output(11, GPIO.LOW) GPIO.output(13, GPIO.HIGH) GPIO.output(15, GPIO.LOW) GPIO.output(19, GPIO.HIGH) # 停止 def stop(): GPIO.output(11, GPIO.LOW) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.LOW) GPIO.output(19, GPIO.LOW) # 主函数 if __name__ == '__main__': try: while True: forward() time.sleep(2) stop() time.sleep(1) backward() time.sleep(2) stop() time.sleep(1) except KeyboardInterrupt: GPIO.cleanup() ``` 上述代码使用了树莓派(Raspberry Pi)的GPIO库,通过设置GPIO口的电平来控制机器人的前进和后退。当然,这只是一个简单的示例代码,实际的机器人开发还需要考虑到很多其他的因素,比如传感器、图像识别等等。 ### 回答2: 嵌入式Linux机器人的实现源代码可以分为几个关键方面: 1.硬件驱动程序:为了使机器人能够与外部设备进行通信和控制,需要编写硬件驱动程序。这些驱动程序可以包括控制底盘的驱动程序、传感器驱动程序、摄像头驱动程序等。 2.操作系统和内核定制:嵌入式Linux机器人需要一个适合嵌入式设备的操作系统和内核。在源代码,我们需要对操作系统和内核进行定制,以满足机器人的需求。例如,可以选择定制轻量级的Linux发行版,去除不必要的组件和功能,加入对机器人硬件的支持等。 3.通信和控制程序:机器人要能够与其他设备、服务器或人机界面进行通信和控制。因此,我们需要编写通信和控制程序,以实现远程控制、信息传输等功能。这些程序可以使用网络协议、串口通信或其他通信方式。 4.感知和决策算法:机器人需要能够感知周围环境并做出相应决策。在源代码,我们需要实现各种感知算法,如图像识别、目标跟踪、距离测量等,并结合决策算法,使机器人能够做出适当的行动。 5.用户界面和应用程序:为了更好地与机器人进行交互,我们可以编写用户界面和应用程序。这些程序可以包括机器人状态显示、地图生成、路径规划等。用户界面可以是图形化界面或命令行界面,根据实际需求进行选择。 总之,嵌入式Linux机器人的实现源代码是一个综合性的工程,需要涉及到硬件驱动、操作系统定制、通信和控制程序、感知和决策算法以及用户界面和应用程序等方面的编写和集成。这些源代码的编写需要深入理解嵌入式Linux系统的原理和机器人的工作原理,并结合实际的硬件和应用需求进行开发。 ### 回答3: 嵌入式Linux机器人的源代码实现可以包括以下几个方面: 1. 系统初始化:源代码需要实现嵌入式Linux系统的初始化,包括启动引导程序、加载内核镜像、初始化硬件设备、加载文件系统等。 2. 传感器驱动:机器人通常需要使用各种传感器来感知环境。源代码需要实现传感器驱动程序,以便与传感器进行通信和数据交换,如摄像头驱动、红外传感器驱动、超声波传感器驱动等。 3. 运动控制:机器人的运动控制涉及到电机、舵机等设备的驱动。源代码需要实现运动控制的相关算法,如PID控制算法、路径规划算法等,并与电机和舵机进行通信,控制机器人的运动。 4. 环境感知:源代码需要实现对机器人周围环境的感知和分析,以便进行智能决策。例如,图像处理算法可以用于识别目标物体,声音处理算法可以用于语音识别等。 5. 通信模块:机器人通常需要与其他系统进行通信,如与远程控制台进行通信、与其他机器人进行协作等。源代码需要实现通信模块,以便机器人能够与其他系统进行数据传输和指令交互。 6. 高级功能:根据机器人的具体应用场景,源代码还可以实现一些高级功能,如人脸识别、目标跟踪、自主导航等。这些功能需要依赖于相应的算法和模型,源代码需要与这些算法和模型进行集成。 总之,基于嵌入式Linux实现机器人的源代码包含了系统初始化、传感器驱动、运动控制、环境感知、通信模块以及各种高级功能的实现。这些源代码的编写需要结合具体的硬件平台和应用需求,并进行充分的调试和测试,确保机器人的正常运行和实现预期的功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值