转自:https://www.jianshu.com/p/0d1ed1310e61?nomobile=yes

搜索

1.简单认识

由于表格视图可以呈现大量的信息,因此对这些信息进行搜索是很常见的,可以为表格视图添加搜索条(UISearchBar),根据搜索结果来刷新表格视图。
这里讲解三种搜索:
(1)普通的UITableView搜索 ,
(2)和在此基础上的语音搜索,
(3)以及UISearchDisplayController(苹果自带封装好的)

2.UITableView搜索

UIKit里有一个叫做UISearchBar的组件,能让用户迅速的筛选有用的信息。其实UISearchBar挺懒的。它本身不做任何搜索。UISearchBar会提供一个基本的iOS搜索栏界面。它就像一个中等干部一样,最在行的就是让别人做事情。(像我以前的老板一样!)UISearchBar类用delegate协议的方式来告诉app的其他部分用户正在搜索栏中做什么。你需要自己编写对比字符串和过滤搜索的函数。自定义的搜索功能让你对搜索过滤有更多的控制,你能够根据自己app的特点来修改搜索结果,让你的用户体验更迅速和智能的搜索。

@interface ViewController () <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate> {UITableView *myTableView;UISearchBar *mySearchBar; NSArray *currentArray; // 指向当前正在使用的数据模型数组的指针NSMutableArray *dataArray; // 保存固定数据的数组 NSMutableArray *resultsArray; // 装搜索结果的数组
}
@end- (void) customizeSearchBar {mySearchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 0, 40)]; mySearchBar.placeholder = @"请输入要查找的名字"; mySearchBar.showsCancelButton = YES; mySearchBar.showsBookmarkButton = YES; [mySearchBar setImage:[UIImage imageNamed:@"Dudu.jpg"] forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal]; mySearchBar.delegate = self;[myTableView setTableHeaderView:mySearchBar];}#pragma mark UISearchBarDelegate回调方法
// 点击键盘上的搜索按钮
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
if (!resultsArray) { resultsArray = [NSMutableArray array];
} else { [resultsArray removeAllObjects];
}NSString *str = searchBar.text;
for (CDPerson *tempPerson in dataArray) {NSRange range = [tempPerson.name rangeOfString:str]; if (range.location != NSNotFound) { [resultsArray addObject:tempPerson];}
} // 将搜索结果作为表格视图的模型 currentArray = resultsArray; [myTableView reloadData];
}// 点击搜索栏上的取消按钮的回调方法
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { // 使用原来的数据模型currentArray = dataArray; [myTableView reloadData];
}
3.语音搜索

在移动应用中使用语音识别功能后,原来需要键盘输入的地方可以直接使用语音进行输入,从而解放用户的双手提供更好的用户体验。目前,讯飞MSC在中文语音识别中用得较多,下面就以讯飞语音识别为例讲解如何实现语音搜索功能。

可以在讯飞开放平台的SDK下载中心下载讯飞提供的语音听写功能,当然需要注册账号并获得使用SDK的APPID,下载后的文件夹中包含了文档、库文件和样例程序,可以直接阅读文档或参考样例程序来实现自己的语音搜索功能。

创建项目后,需要向项目中加入讯飞的库文件以及它依赖的其他库文件,可以在下图所示的位置进行添加,需要添加的库文件也如下图所示,其他的库文件可以通过Xcode的自动链接器自动加入。

这里写图片描述

可以对讯飞提供的SDK进行二次封装,使其变成更容易使用的API(只用一行代码就可以使用它的功能),代码如下所示。

屏幕快照 2016-08-30 下午2.36.55.png

屏幕快照 2016-08-30 下午2.38.13.png

屏幕快照 2016-08-30 下午2.42.51.png

屏幕快照 2016-08-30 下午2.39.53.png

上面的代码在讯飞提供的样例程序中可以找到,无需自行编写,但是可以对其中的一些参数进行设置,例如language(语种)、vadEos(语音结束后的超时点)、vadBos(语音开始前的超时点)、speechTimeout(语音长度达到多少时间超时)等。

#import <Foundation/Foundation.h>
#import "iflyMSC/IFlyMSC.h"typedef void(^CDVoiceHandler)(NSString *);@interface CDVoice : NSObject <IFlyRecognizerViewDelegate> {
IFlyRecognizerView *rView;
}@property (nonatomic, copy) CDVoiceHandler voiceHandler;+ (instancetype) sharedInstance;- (void) voiceToTextString:(CDVoiceHandler) handler;@end

.m文件

#import "CDVoice.h"
#import "IATConfig.h"#define LEFT_FOR_RV 50#define TOP_FOR_RV 50
@implementation CDVoice- (instancetype) init { @throw [NSException exceptionWithName:@"CDVoiceException" reason:@"不允许使用初始化方法" userInfo:nil];
}- (instancetype) initPrivate { if (self = [super init]) { // Do some initialization here!!!} return self;
}+ (instancetype) sharedInstance { static CDVoice *instance = nil;if (!instance) {instance = [[self alloc] initPrivate]; } return instance;
}- (void) voiceToTextString:(CDVoiceHandler) handler{if (!rView) {rView = [[IFlyRecognizerView alloc] initWithOrigin:CGPointMake(LEFT_FOR_RV, TOP_FOR_RV)]; [rView setParameter:@"" forKey:[IFlySpeechConstant PARAMS]]; //设置听写模式 [rView setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]]; rView.delegate = self;IATConfig *instance = [IATConfig sharedInstance]; //设置最长录音时间 [rView setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]]; //设置后端点 [rView setParameter:instance.vadEos forKey:  [IFlySpeechConstant VAD_EOS]]; //设置前端点 [rView setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];  //设置采样率,推荐使用16K [rView setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]]; if ([instance.language isEqualToString:[IATConfig chinese]]) { //设置语言 [rView setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]]; //设置方言[rView setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];} else if ([instance.language isEqualToString:[IATConfig english]]) { //设置语言 [rView setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]]; } //设置是否返回标点符号 [rView setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];} // 绑定语音识别完成后做回调的Block  self.voiceHandler = handler; [rView start];
}// 语音识别完成的回调
- (void)onResult:(NSArray *)resultArray isLast:(BOOL) isLast {NSMutableString *result = [[NSMutableString alloc] init]; NSMutableString * resultString = [[NSMutableString alloc]init]; NSDictionary *dic = resultArray[0]; for (NSString *key in dic) { [result appendFormat:@"%@",key]; NSString * resultFromJson = [self stringFromABNFJson:result];if (! [resultString isEqualToString:@" "]) {    [resultString appendString:resultFromJson];       } } if (!isLast && self.voiceHandler) {  self.voiceHandler(resultString); }
}// 语音识别出错的回调方法
- (void)onError: (IFlySpeechError *) error { if (error.errorCode) {NSLog(@"%@", error); }
}// 从JSON格式的数据中提取语音数据(该方法可以在官方Demo的代码中找到)
- (NSString *)stringFromABNFJson: (NSString *) params {if (!params) { return nil; } NSMutableString *tempStr = [[NSMutableString alloc] init]; NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:[params dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];NSArray *wordArray = [resultDic objectForKey:@"ws"];for (int i = 0; i < [wordArray count]; i++) {  NSDictionary *wsDic = [wordArray objectAtIndex: i]; NSArray *cwArray = [wsDic objectForKey:@"cw"]; for (int j = 0; j < [cwArray count]; j++) { NSDictionary *wDic = [cwArray objectAtIndex:j]; NSString *str = [wDic objectForKey:@"w"]; [tempStr appendString: str]; }} return tempStr;
}
@end

到此为止,我们已经封装好了自己的API,要使用它非常简单,代码如下所示。

#import "AppDelegate.h"
#import "iflyMSC/IFlyMSC.h"
@interface AppDelegate ()@end
@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 将自己申请的APPID通过IFlySpeechUtility工具类进行注册 [IFlySpeechUtility createUtility:@"appid=自己申请的APPID"];    return YES;
}
@end

下面完成了一个非常简单的应用来使用我们封装好的语音识别功能。

屏幕快照 2016-08-30 下午3.20.38.png

运行效果如下图所示,点击OK按钮开始进行语音识别,完成后将识别的内容输入文本框中

这里写图片描述

这里写图片描述

 我们可以对搜索栏中的书签按钮进行定制,在点击通过调用我们封装好的代码后产生语音识别的视图,然后将识别的结果填入搜索栏中。

- (void) customizeSearchBar { mySearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 0, 40)]; mySearchBar.placeholder = @"请输入要查找的名字"; mySearchBar.showsCancelButton = YES; mySearchBar.showsBookmarkButton = YES; [mySearchBar setImage:[UIImage imageNamed:@"Dudu.jpg"] forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal]; mySearchBar.delegate = self; [myTableView setTableHeaderView:mySearchBar];
}// 点击书签按钮的回调方法
- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar {[[CDVoice sharedInstance] voiceToTextString:^(NSString *str) { mySearchBar.text = str;[mySearchBar becomeFirstResponder];}];
}
4.UISearchDisplayController

UISearchDisplayController 是苹果专为 UITableView 搜索封装的一个类。里面内置了一个 UITableView 用于显示搜索的结果。它可以和一个需要搜索功能的controller 关联起来,其它的像原 TableView 和搜索结果TableView 的切换, mask 的显示等等都封装好了,使用起来非常非常的简单。特别是要实现全屏搜索时使用最多。全屏搜索的意思是如果你用了 NavigationBar 当点击搜索框时 TableView 会自动弹上去覆盖NavigationBar,达到一种全屏搜索的效果,这一切 UISearchDisplayController 都封装好了,如果自己写就比较麻烦一些。

效果图:

关键代码

屏幕快照 2016-08-30 下午3.47.30.png

屏幕快照 2016-08-30 下午3.47.42.png

iOS搜索 讯飞语音的使用相关推荐

  1. iOS使用讯飞语音-语音识别(最新版)

    引言 去年在一家公司实习,接触了一点人工智能.既然接触人工智能,那么语音识别.语音合成.人脸识别等等都是必不可少的. 本来已经是离开iOS开发这条路了,还剩下毕业设计要做,所以这段时间最后一次回来接触 ...

  2. iOS接入讯飞语音,声音没有bug

    最近在做直播间项目,接入了讯飞语音的听写功能,然而识别出语音并转成文字之后,直播间播放的视频内容的声音没有了,参考了某大牛的解决方法 需要写一个分类 图如下;ok解决 更多问题,欢迎加群讨论:qq群 ...

  3. IOS 集成讯飞语音唤醒+语音识别,实现语音控制效果

    前言 最近项目上需要实现语音调度,一开始是想用苹果原生speech Framework框架的,但是网上找了很久都没有原生实现语音唤醒功能的栗子,到时有不少百度,讯飞的语音唤醒,语音识别的栗子,不过都是 ...

  4. iOS 讯飞语音的使用

    一.下载讯飞的SDK 二.集成流程 第一步:获取appid(进入控制台查看) 第二步:工程配置 1.将模板项目的lib文件拉入项目,并加入依赖库 注意: 添加iflyMSC.framework时,请检 ...

  5. iOS: 讯飞语音的使用

    一.介绍: 讯飞语音做的相当不错,容错率达到90%多,如果需要做语音方面的功能,它绝对是一个不错的选择.讯飞语音的功能很多:语音听写.语音识别.语音合成等,但我们最常用的还是语音听写.讯飞语音中包含界 ...

  6. 讯飞语音集成(语音转文字,文字转语音)

    语音听写SDK适配安卓6.0需要手动申请权限 关于语音听写SDK的开发,参考科大讯飞开放平台官网为准 在百度搜索讯飞科技开放平台,自己注册账号 自己创建一个新应用 在控制台界面创建完应用,然后选择SD ...

  7. Android——讯飞语音唤醒简介及实现

    前段时间写了一个关于百度语音唤醒文章,最近有做了一个讯飞语音的应用,在这里把学习的资料整理一下. 唤醒的整个过程如下: (图源自讯飞官网) 讯飞的语音唤醒功能实现起来挺方便的(相比百度,百度语音And ...

  8. 真人语音朗读软件_讯飞语音云助力移动“和阅读”,打造个性化听书应用

    不知不觉,"语"时代已悄然走进我们的生活.各行业移动应用也乘势插上了语音腾飞的翅膀.移动"和阅读"是中国移动推出的一款花了包月费用后免流量看书的套餐配套软件,集 ...

  9. 如何通过讯飞语音将文本合成后的语音保存到本地

    如何通过讯飞语音将文本合成后的语音保存到本地 2014-2-21分类:Android, 解决方案, 随手实例 | 暂无评论 转自:http://www.krislq.com/2014/02/voice ...

最新文章

  1. 三星教父逝世!李健熙缔造的商业传奇和争议人生
  2. 用串口电缆实现双机互联(图)
  3. 深度学习(二十三)——Fast Image Processing, SVDF, LCNN, LSTM进阶
  4. 列表和range、元组
  5. PyQt5代码触发QTreeWidget的列表中某个item点击信号
  6. MySQL日志的类型和实现方法_mysql的日志类型及作用
  7. Vue-tools.crx 及安装常见问题解决
  8. tomcat启动流程分析
  9. 小白设计模式:责任链模式
  10. 湖南省第六届大学生计算机程序设计竞赛---数字整除
  11. 洛谷P2051 中国象棋
  12. live555 linux 编译
  13. 简单电脑***《菜鸟级》
  14. localhost改ip访问
  15. 【实用工具】一键在线抠图、一键在线更换图片背景、一键更换证件照片背景颜色的神奇AI网站 RemoveBg
  16. 起风了数字简谱用计算机,起风了钢琴简谱-数字双手-买辣椒也用券
  17. 论文笔记二 Positive, Negative and Neutral: Modeling Implicit Feedback inSession-based News Recommendatio。
  18. 07蚂蚁-高并发解决方案——1.Hystrix服务降级,服务隔离,服务熔断,服务限流,CDN
  19. 2023编程语言趋势
  20. Arduino使用雨滴模块

热门文章

  1. 小机器人显示服务器异常,机器人常见异常报警处理、及日常维护保养。
  2. Navicat导入xlsx文件提示无法打开文件
  3. python基础编程题(一)
  4. 打cf提示计算机内存不足怎么办,玩cf游戏提示内存不足的解决方法
  5. 计算机毕业设计springboot睎晴贸易公司安保保洁管理平台
  6. python实现视频ai换脸_python 实现 AI 换脸
  7. Python再夺冠,2020年度编程语言排行榜出炉
  8. Excel技巧【标记多行数据连续一样的行】【第一个单元格公式适用于所有本列所有行】【按照逗号分列】【快速统计出各个项出现的次数】【冻结窗口】[表格分段选择数据][根据单元格内容引索其他单元格数据指针]
  9. 团队作业8——Beta 阶段冲刺6th day
  10. [转]Facebook 如何管理150亿张照片