使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践
前言
在今年声网主办的「RTE2022 编程挑战赛」中,数支队伍经过一个多月的努力开发,很多优秀的作品最终突出重围,斩获大奖。本文由RTE2022编程挑战赛获奖者之一李新春撰写,他主要围绕获奖作品「Piloteer助盲服务平台」分享了开发的构思过程、实践经验。
01 为什么要做这件事
因为工作原因,在一些沟通中接触了不少养老相关的项目需求,在信息化高度发展的社会,老年人的生活却变得不那么舒服,特别是在疫情期间以及健康码常态化的今天,老年人以及推而广之的视障人员的生活会更加的不方便。因此,考虑到视障人员更不方便,所以以视障人员为目标人群,以人工智能、声网音视频技术、智能硬件设备和人性化服务为依托,进行了该解决方案的设计和系统开发。
02 项目介绍
项目口号:让我成为你的眼,让我领航前行路
项目介绍:科技在飞速发展,而部分人被落在了后面,让我们协助弱势群体,为他们在新时代领航。新技术让人们的生活更加便利,而视障群体无法看清世界、老年群体无法快速学习进而无法有效的享受科技带来的便利生活。本项目利用人工智能、音视频传输技术、智能硬件等为他们提供一套音视频领航服务方案,协助他们在熟悉周边环境、道路导航、辅助食品/药品辨别等场景下更从容、更舒心。
项目地址:
03 如何做这个项目
需求调研
有了这个想法,那首先还是要看看视障人员有没有这个需求。
在我国有 8500 万残疾人¹,这其中超 1700 万是视障人群²。其中 23.5% 是 30 岁以下的年轻人,而在视障网民中,80、90 后占比 75%。
在我国有 30% 的视障者基本呆在家中不出门,大部分人出行是需要家人朋友陪同的。完全不需要家人朋友出行的视障人士比例很低,而且大部分不是全盲人。
因此,从数据上看,有一定学历又不经常出门的视障者有不少人群,那他们出门用什么设备呢?粗略统计一下得到如下内容:
导盲犬:导盲犬是一种工作犬,主要工作是代替视障人士的眼睛,为他们领路。训练导盲犬的原理是利用动物的自我保护本能,行走避开障碍物,通过训练将导盲犬的保护机制扩大到视障者,使导盲犬能带着主人躲避障碍物。
超声波导盲仪:超声波导盲仪是以发射超声波和接收障碍物反射回波的方式来定位的,它从回波中得到障碍物信息。
穿戴式导盲仪器:将导盲装置穿戴在身上,通过简单的导盲语音来进行安全行进。比如腰带式行动辅具。能够通过引导的方式使盲人躲避障碍物,将盲人作为半被动式接受躲避障碍物命令的辅助工具。
移动式机器人:移动式机器人是具有多种监测器、强大计算能力和高度智能化障碍物躲避系统的机器人。
AI智能设备:通过视障人士携带的图像采集单元采集环境图像;将所述环境图像与预设的立体地图进行对比,以确定所述视障人士的当前位置;根据所述当前位置和立体地图,向所述视障人士发出导航提示。
以上这些设备各有各的优势也各有劣势,综合考虑来看随着技术的发展,利用智能化设备、AI 识别、音视频高效传输才是未来真正解决问题的方向。
04 解决方案
综合来看,还是考虑依托新技术来实现降低成本,辅助出行的目的。通过可移动的摄像头解决人员移动过程中视角差的问题,如果使用手机视频,需要举着才能获得第一视角,而利用 OTG 和 UVC 摄像头,可以佩戴到眼镜上,更加方便。
05 系统架构
从系统架构中可以清楚的看到,在设计过程中应用了如下技术:
UVC 摄像头:利用安卓手机以及安卓系统硬件的 OTG 特性,设计可挂载摄像头,以第一视角进行导引。
视频中台:主要利用声网音视频传输技术,实现 1V1 对话,群组对话等实时通信功能,实现单人指导和多人协助的功能以及后台的针对音视频质量、接入时间以及设备的管理。
AI 中台:是以 AI 算法为核心的能力中台,目前主要依托于 Yolo 算法,实现各类车辆、行人、动物等的识别。
平台功能:平台功能依托赋能中台,提供基础的三维地图导航、接入设备管理、导航业务管理以及数据分析等功能,未来根据客户需要进行模块化调整。
06 项目开发实践
开发环境准备
安卓平台
开发平台:android studio 2021.2.1
安卓版本:6.0.1
一般支持 OTG 摄像头的系统即可使用,当前未作机型适配。
Windows平台
当前测试系统使用的是:win10
CPU:I7 7700K
GPU:GTX1050TI
内存:16G
开发平台:Unity3D 2021.2.14AI
算法:Yolo v3
其他:云虚拟主机
声网 SDK 应用
Unity3D C#开发
开发工具:Unity3D 2021.2.4 SDK 版本、RTM 1.4+、RTC 3.7+学习 Demo 场景。在如下场景中,首先要注册登陆声网开发者控制台 console.agora.io 并且创建项目获得的 AppID,点击运行即可进入视频房间,关于获得声网 AppID 的过程,建议在声网官网浏览一下,有非常丰富的文档,如下链接。
https://docs.agora.io/cn/Agora%20Platform/get_appid_token
下面简单介绍几个重要函数
1、打开脚本“TestHelloUnityVideo”这里面的“loadEngine”即为声网引擎重要的初始化步骤。
public void loadEngine(string appId)
{
// start sdk
Debug.Log("initializeEngine"); if (mRtcEngine != null)
{
Debug.Log("Engine exists. Please unload it first!");
return;
} // init engine
mRtcEngine = IRtcEngine.GetEngine(appId); // enable log
mRtcEngine.SetLogFilter(LOG_FILTER.DEBUG | LOG_FILTER.INFO | LOG_FILTER.WARNING | LOG_FILTER.ERROR | LOG_FILTER.CRITICAL);
}
2、加入房间,“join”函数,为用户加入房间以及各种回调函数的设计,也是未来我们系统中进行实时沟通对话的开始。
public void join(string channel)
{
Debug.Log("calling join (channel = " + channel + ")"); if (mRtcEngine == null)
return; // set callbacks (optional)
mRtcEngine.OnJoinChannelSuccess = onJoinChannelSuccess;
mRtcEngine.OnUserJoined = onUserJoined;
mRtcEngine.OnUserOffline = onUserOffline; // enable video
mRtcEngine.EnableVideo();
// allow camera output callback
mRtcEngine.EnableVideoObserver(); // join channel
mRtcEngine.JoinChannel(channel, null, 0);
}
3、完成点对点导航后,“leave”函数,切记在程序退出时记得关闭。
public void leave()
{
Debug.Log("calling leave"); if (mRtcEngine == null)
return; // leave channel
mRtcEngine.LeaveChannel();
// deregister video frame observers in native-c code
mRtcEngine.DisableVideoObserver();
}
4、因为我们使用的是 OTG 外部摄像头,因此在开发过程中要使用声网的外部视频推送能力。
安卓端代码如下
protected void preview(boolean start, SurfaceView view, int uid) {
if (start) {
mSource = new AgoraVideoSource();
mRender = new AgoraVideoRender(uid, false);
rtcEngine().setVideoSource(mSource);
rtcEngine().setLocalVideoRenderer(mRender);
// rtcEngine().startPreview();
} else {
// rtcEngine().stopPreview();
}
}
07 项目主要功能
移动端
安卓端主要包含用户登录和音视频通话,为方便视障人员使用,尽量做了简化
Win 服务端
包含数据大屏、设备管理、工单管理、导航管理等模块
数据大屏
展示运营数据分析,设备使用信息,服务质量等内容,如用户年龄分布、周服务排名、当前呼叫信息、日活用户分布等数据问题。
导航管理
以卫星图、街道图为服务人员提供导航服务,可以进行初步的线路规划,实时视频对话、RTM 及时信令控制等。
设备管理
采购设备的企业、单独购买的用户,通过集中注册或者个人注册的方式,将自身设备注册到系统平台上,通过该界面对设备的使用者基本信息进行编辑。
工单管理
系统采用了 AI 辅助识别功能,因此系统设计支持通过网页端(非 AI)和本地端(AI 辅助)进行系统登录和远程服务,包含导航信息的获取、查看、检索等功能。
08 未来拓展
“十四五”规划和 2035 年远景目标纲要中提出要加快数字化社会建设,我们需要考虑到不同群体的数字化需求,特别是老年群体。
上海是国内最早进入人口老龄化且老龄化程度最深的大型城市有将近 400 万老年人,近年来上海积极探索“社区嵌入式养老服务”,让社区老人在熟悉的环境中实现“老有所养”。因而,利用我们已开发完成的这套系统和服务模式,可以在多方面辅助老年人的生活。
以上是 Piloteer 助盲服务平台作品在 RTE2022 编程挑战赛期间的实践分享,更多信息和作品可以访问官方渠道。
Piloteer服务平台:
大赛作品仓库:
https://github.com/AgoraIO-Community/RTE-2022-Innovation-Challenge
使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践的更多相关文章
- 弹性配置为构建提速 - CODING & 腾讯云 CVM 最佳实践
CODING 中提供了内置云主机用来执行持续集成(CI)中的构建计划,能够胜任大部分构建任务.但如果碰上了大型项目的构建,或者需要在本地服务器生成构建成果,单个计算资源就显得有点捉急了.针对这一部分需 ...
- CODING DevOps 线下沙龙回顾二:SDK 测试最佳实践
讲师:潘志刚 声网质量效能部门负责人,超过 14 年服务器.移动终端.音视频编解码以及汽车电子等跨行业从业经历,负责建立测试基础架构和自动化测试方案,主持搭建持续集成测试生态体系.现任声网质量效能部门 ...
- 【征文活动】为自己发“声” —— 声网RTC征文大赛在园子里征稿
2020年8月20日,声网Agora入驻园子的新楼盘--博客园品牌专区.9月,我们与声网Agora再度合作,「为自己发"声"- RTC 征文大赛」在园子里征稿. RTC(Real- ...
- CoSky-Mirror 就像一个镜子放在 Nacos、CoSky 中间,构建一个统一的服务发现平台
CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...
- Aggregated APIServer 构建云原生应用最佳实践
作者 张鹏,腾讯云容器产品工程师,拥有多年云原生项目开发落地经验.目前主要负责腾讯云 TKE 云原生 AI 产品的开发工作. 谢远东,腾讯高级工程师,Kubeflow Member.Fluid(CNC ...
- 基于dubbo构建分布式项目与服务模块
关于分布式服务架构的背景和需求可查阅http://dubbo.io/.不同于传统的单工程项目,本文主要学习如何通过maven和dubbo将构建分布项目以及服务模块,下面直接开始. 创建项目以及模块 ...
- java中用中国网建提供的SMS短信平台发送短信
接下来的项目需求中提到需要短信发送功能,以前没有做过,因此便在网上搜了一下.大体上说的都是有三种方法,分别是sina提供的webservice接口.短信mao和中国网建提供的SMS短信平台. 这三种方 ...
- 构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介
构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组 ...
- 高级爬虫工程师(Spider)-美团网-拉勾网-最专业的互联网招聘平台
高级爬虫工程师(Spider)-美团网-拉勾网-最专业的互联网招聘平台 高级爬虫工程师(Spider)
- CI Weekly #18 | flow.ci iOS 最佳实践出炉,正式支持 Git@OSC 构建
如大家所期待,flow.ci 现已支持开源中国的代码仓库 - 码云,可以直接构建 Git@OSC 的项目了,点击创建项目-选择代码仓库-选择码云-绑定 OSChina 账户-选择要构建项目,教程看这里 ...
随机推荐
- IE浏览器a标签无法下载问题解决(IE浏览器a标签download属性不兼容问题解决)
//下载文件流函数,只支持get方法. export function downBlob(payload) { return new Promise(((resolve, reject) => ...
- Linux下找不到SO的解决方法
Linux下找不到so文件的解决办法 1)将.so文件路径的目录添加到/etc/ld.so.conf sudo vim /etc/ld.so.conf 将你的SO文件存放路径的根目录写进去(不带so本 ...
- 大数据分析——matplotlib
参考链接:https://blog.csdn.net/xavier_muse/article/details/83859272 fig,ax = plt.subplots()等价于: fig = pl ...
- QT窗口显示的风格设置
在main.cpp中添加头文件#include <QStyleFactory> 然后在QApplication a(argc, argv);后添加 a.setStyle(QStyleFac ...
- 「SOL」射命丸文的笔记 (洛谷)
讲题人:"这是一个很经典的模型,大家应该都会" 我:"???" # 题面 给出 \(m\),求所有 \(m\) 个点的有标号强联通竞赛图的哈密顿回路数量的平均数 ...
- RN 手势响应系统基本用法和获取坐标判断用户手势方向
1. 基本使用,注意两点 (1)将手势系统的函数放在"componentWillMount"生命周期函数里面,当时会有警告,警告自己看吧 (2)将方法使用ES6扩展运算符展开 im ...
- 简介Hadoop
Hadoop 简介 Hadoop 是什么 Hadoop 是一个提供分布式存储和计算的开源软件框架,它具有无共享.高可用(HA).弹性可扩展的特点,非常适合处理海量数量. Hadoop 是一个开源软件框 ...
- Vue.js + TypeScript 项目构建 (图形界面构建)
一,打开图形界面 vue ui 二,创建文件 三,创建成功
- 如何申请ios证书
第一次申请ios证书 记录下来 第一步 随便找个可以在线生成ios证书的网站 在这里生成csr文件 https://www.yunedit.com/update/ioszhengshu/list 第 ...
- QT动态库的创建和使用
QT动态库的创建和使用 步骤一: 创建一个库文件 Library 步骤二:进行动态库封装方法的实现 注意事项:要注意共享类均需要包含导出的宏定义 这个宏定义和导出向导的宏定义一致 宏定义: 向导文件: ...