Rokid AR眼镜开发入门:构建智能演讲提词器Android应用

Rokid AR眼镜开发入门:构建智能演讲提词器Android应用
在这里插入图片描述

文章目录

一、前言

各位大家好,我是开发者Bluetata,在数字化浪潮席卷全球的当下,增强现实(AR)技术正悄然重塑我们的工作与生活方式。从虚拟试衣到工业远程协作,AR眼镜以其轻便、沉浸的特性,成为连接现实与数字世界的桥梁。其中,Rokid作为AR领域的先锋品牌,其智能眼镜系列(如 Rokid Max和Rokid Glasses)以低功耗、6DoF空间定位和多模态交互(如手势、语音)著称,不仅在文化文旅和娱乐领域大放异彩,更在办公场景中展现出革命性潜力。回想 Rokid 创始人曾在政府会议上“脱稿”演讲的经典演示:戴上眼镜,实时叠加提词提示,他眼神坚定、双手自由,瞬间俘获全场目光。这不仅仅是技术炫技,更是AR赋能人类表达的生动写照。我看到这个视频的时候当时非常震惊,甚至联想到,未来的科技生活理应如是啊,今天博主就基于 Rokid AR 来实现一个简单的演讲脱稿案例的开发,带大家感受一下 Rokid AR 眼镜的魅力。

二、项目介绍

2.1、项目背景

在刚才前言中我也有提到:脱稿演讲提词项目,这个 demo 正是源于这一灵感而生。在传统会议中,演讲者往往被提词器或纸稿束缚,无法与观众建立自然眼神交流,导致表达力大打折扣。本项目通过Android Studio开发一个简易伴侣App,利用Rokid CXR-M SDK实现BLE无线连接、脚本实时传输与滚动显示。开发者只需几步集成,即可让眼镜镜片上浮现滚动文本,支持速度调节和语音触发,最终打造一个无纸化、智能化提词工具。

2.2、本项目整体思路

下面介绍一下整体 Rokid AR 脱稿演讲提词案例开发的思路

  1. 先要申请 Rokid 的开发者,这样才能使用其 Rokid 的 AppKey、AppSecrect 和 accessKey。
  2. Clone RokidSDKDemoKotlin 的项目,RokidSDKDemoKotlin 项目是在官方 Rokid github 中提供的示例仓库,我们可以整体借用仓库的代码架构,当然你如果想直接自己创建项目也是可以的,我们这里方便 Demo 是基于 Rokid RokidSDKDemoKotlin 仓库架构进行 App的后续开发
  3. 集成 Rokid Mobile SDK,在这里我们会在 APP 项目中集成 Rokid Mobile SDK,后面会详细介绍
  4. 眼镜侧渲染:SDK会触发眼镜显示滚动文本(假设使用Rokid的显示API;实际需测试UUID)。
  5. 最后添加 EditText 输入脚本、Button 发送、TextView 显示状态。滚动逻辑用 Timer 模拟。
在这里插入图片描述

三、案例开发

3.1、申请开发者

博主是建议大家申请一下开发者,因为无论是后续使用还是一些官方资料都需要开发者认证,申请开发者后才可以进行线上环境的 AppKey、AppSecrect 和 accessKey 我个人还是比较推荐的,简单的申请步骤如下:

需先在开放平台注册一个帐号,并在 https://account.rokid.com/#/setting/prove 中申请

3.2、Clone RokidSDKDemoKotlin 项目

直接使用自己的 IDE 使用 git 去 Clone 该项目

git clone https://github.com/rokid/RokidMobileSDKAndroidDemo.git

Clone 完成后可以看到项目的目录结构如下,这里进行一下简单的描述如下

在这里插入图片描述
RokidMobileSDKAndroidDemo/ ├── .git/ # Git 版本控制目录 ├── .gitignore # Git 忽略文件配置 ├── LICENSE.txt # Apache 2.0 开源许可证 ├── README.md # 项目说明文档 └── RokidSDKDemoKotlin/ # 主项目目录 ├── .gitignore # 项目级 Git 忽略配置 ├── build.gradle # 项目级 Gradle 构建配置 ├── gradle.properties # Gradle 属性配置 ├── gradlew # Unix/Linux Gradle 包装脚本 ├── gradlew.bat # Windows Gradle 包装脚本 ├── settings.gradle # Gradle 设置文件 ├── gradle/ # Gradle Wrapper 目录 │ └── wrapper/ │ ├── gradle-wrapper.jar # Gradle Wrapper JAR 文件 │ └── gradle-wrapper.properties # Gradle Wrapper 配置 └── app/ # Android 应用模块 ├── .gitignore # 应用模块 Git 忽略配置 ├── build.gradle # 应用模块构建配置 ├── key_demo.keystore # 应用签名密钥库 ├── proguard-rules.pro # ProGuard 混淆规则 ├── libs/ # 本地依赖库目录 │ ├── KGMusicSDK.jar # 酷狗音乐 SDK │ └── rokid-recyclerview-0.0.1.aar # Rokid RecyclerView 组件 └── src/ # 源代码目录 

注意 RokidMobileSDKAndroidDemo 它包含连接和命令发送示例,但无文本显示,所以我们可以使用这个 demo案例中的框架结构以及相关的部分代码,但是对于文本显示等,我们可以进行后续开发。

3.3、集成 Rokid Mobile SDK

这里集成 Rokid Mobile SDK 有两种方式,一种是使用线上的maven库去集成,一种是离线下载后再集成,离线这种不是很推荐,所以一般都使用官方的 Maven 去集成,一般在工程根目录的 build.gradle 找到(或增加) allprojects -> repositories 节点,然后在该节点加入 maven 仓库地址 https://dl.bintray.com/rokid/maven/,如下所示:
allprojects {
repositories {
google()
jcenter()

maven { url “https://dl.bintray.com/rokid/maven/” }

}
}

我们在 RokidMobileSDKAndroidDemo 中也可以看到 build.gradle 可以

在这里插入图片描述

之后在 app 的中找到 dependencies 节点,并在该节点加入 SDK 依赖 implementation com.rokid.mobile:sdk:1.x.x,当前 SDK 最新版本为: 具体如下所示:

在这里插入图片描述

3.4、UI 以及眼镜侧渲染

我们先在 app/src/main/AndroidManifest.xml 中添加相关权限配置如下

<!-- 蓝牙相关权限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- 位置权限(蓝牙扫描需要) --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- AR 提词器相关权限 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 硬件特性声明 --> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" /> <uses-feature android:name="android.hardware.camera" android:required="true" /> <uses-feature android:name="android.hardware.microphone" android:required="true" /> 
在这里插入图片描述

更新activity_main.xml

官方Demo的界面基本就是个扫描按钮和设备列表,够用但太单调。我们加个大文本框,让用户直接敲脚本,就跟记事本似的。打开activity_main.xml,用LinearLayout包起来:顶上放个TextView显示连接状态(比如“未连接”),中间是EditText,设成多行输入(inputType=“textMultiLine”,minLines=6),下面三个按钮 – 连接、发送、停止。布局别太挤,加点marginTop=10dp就行。改完保存,预览一下,确保在手机上不挤字。
小提示:这个UI变化不大,但用户体验翻倍 – 试想演讲前手机上刷刷写稿,点一下就传到眼镜,省得切App。我们可以替换或扩展为如下的代码:

<?xml version="1.0" encoding="utf-8"?>

<TextView android:id="@+id/tv_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="状态: 未连接" android:textSize="18sp" /> <EditText android:id="@+id/et_script" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:hint="输入演讲脚本(每行一段)..." android:gravity="top" android:inputType="textMultiLine" android:minLines="6" android:layout_marginTop="10dp" /> <Button android:id="@+id/btn_connect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="连接眼镜" android:layout_marginTop="10dp" /> <Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送脚本 & 开始滚动" android:layout_marginTop="5dp" /> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止滚动" android:layout_marginTop="5dp" /> 

拓展实现核心逻辑

我们接下来扩展MainActivity.kt实现所有的核心代码:

这里注意我们在官方初始化(扩展)步骤中,需要对 RokidMobileSDK.init(this, “YOUR_API_KEY”) 中的 API key进行替换,也就是我们开始申请开发者的时候的 API Key,这个部分就是 Android 侧 CXR-M SDK 创建UI输入脚本,连接眼镜后发送文本命令即使用 SDK 的sendCommand

基于Demo的BLE连接,别动它(scanAndConnect方法直接用),重点加提词部分。在MainActivity.kt里,先声明Timer和scriptLines列表,然后在onCreate里绑定按钮监听。发送按钮点开:检查连接状态,没连就吐个Toast;有连了,就split脚本成行(filter掉空行),打包成命令发给SDK(用"TELEPROMPT_START:行1|行2"这种格式,SDK 的 sendCommand带回调)。滚动用Timer每3秒跑一次:发当前行命令,高亮EditText显示,超了就停。停止按钮直接cancel Timer + 发STOP命令。代码别忘onDestroy里清理Timer,避免内存漏。

class MainActivity : AppCompatActivity() {
private lateinit var tvStatus: TextView
private lateinit var etScript: EditText
private lateinit var btnConnect: Button
private lateinit var btnSend: Button
private lateinit var btnStop: Button
private var timer: Timer? = null
private var currentLine = 0
private val scriptLines = mutableListOf()
private var isConnected = false

// 权限请求(官方Demo已有,保留) private val requestPermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { /* 处理逻辑 */ } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化UI tvStatus = findViewById(R.id.tv_status) etScript = findViewById(R.id.et_script) btnConnect = findViewById(R.id.btn_connect) btnSend = findViewById(R.id.btn_send) btnStop = findViewById(R.id.btn_stop) // 官方连接逻辑(简化,从Demo复制) btnConnect.setOnClickListener { requestPermissions() // 权限检查 if (hasPermissions()) { scanAndConnect() // BLE扫描 & 连接 } } btnSend.setOnClickListener { if (!isConnected) { tvStatus.text = "请先连接眼镜" return@setOnClickListener } sendTeleprompterScript() } btnStop.setOnClickListener { stopScrolling() } } // 官方初始化(扩展) private fun initSDK() { RokidMobileSDK.init(this, "YOUR_API_KEY") tvStatus.text = "SDK初始化完成" } // 官方BLE连接(从Demo保留/简化) private fun scanAndConnect() { // 使用BluetoothLeScanner.startScan(),过滤Rokid UUID // 成功后:RokidMobileSDK.connect(device) { success -> isConnected = success } // 示例回调: isConnected = true // 模拟成功 tvStatus.text = "已连接眼镜" } // 新增:发送脚本 private fun sendTeleprompterScript() { val script = etScript.text.toString().trim() if (script.isEmpty()) { Toast.makeText(this, "请输入脚本", Toast.LENGTH_SHORT).show() return } scriptLines.clear() scriptLines.addAll(script.split("\n").filter { it.isNotBlank() }) currentLine = 0 // 发送整个脚本命令(SDK API) val command = "TELEPROMPT_START:${scriptLines.joinToString("|")}" // 自定义格式,根据SDK调整 RokidMobileSDK.sendCommand(command) { success -> if (success) { tvStatus.text = "脚本发送成功,开始滚动..." startScrolling() } else { Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show() } } } // 新增:开始滚动 private fun startScrolling() { timer = Timer() timer?.scheduleAtFixedRate(object : TimerTask() { override fun run() { if (currentLine < scriptLines.size) { val line = scriptLines[currentLine] // 发送当前行到眼镜 RokidMobileSDK.sendCommand("TELEPROMPT_LINE:$line") { /* 回调可选 */ } runOnUiThread { etScript.setText(line) } // UI高亮当前行 currentLine++ } else { stopScrolling() } } }, 0, 3000L) // 每3秒一行,调整速度 } // 新增:停止滚动 private fun stopScrolling() { timer?.cancel() timer = null currentLine = 0 RokidMobileSDK.sendCommand("TELEPROMPT_STOP") tvStatus.text = "滚动已停止" } // 其他官方方法(如onDestroy中清理连接)保留... 

}

最后我们带上 Rokid 的眼镜就会出现类似如下的效果

在这里插入图片描述

四、优化与一些调试经验

跑起来前,先连眼镜(长按电源进BLE模式),授权权限。输入个短脚本测试 – “第一行:开场白\n第二行:核心点” – 点发送,看眼镜上文本滚不滚(Logcat搜“Rokid”抓日志)。连不上?重启蓝牙或检查位置服务;文本不显?可能是SDK的Display API缺了,fallback用眼镜内置Teleprompter。优化时加个SeekBar调速度,语音用SpeechRecognizer接个暂停键。整个测试循环跑3-5次,日志记下来,文章里能举例“比如权限拒了,Logcat会吐E/Bluetooth: Permission denied”。
个人觉得:真机测试是王道,模拟器BLE不稳 – 眼镜戴上走两步,确认AR叠加不抖才行。

五、个人总结

写到这里回想起来,刚上手时我还纠结于SDK的权限配置,折腾了半天Logcat才看到“Connected”的绿光,那一刻觉得值了。作为一个普通用户,戴上眼镜试脚本滚动时,想象你在台上讲报告,镜片上安静飘过下一句提示,不会慌神,不会低头翻纸,效率至少翻倍。以前开会总得偷偷瞄手机,现在呢?全神贯注,观众反馈也更热烈了。简单说,这玩意儿不只是工具,更像个隐形搭档,让表达自然流畅。从开发者角度看,过程其实挺接地气的。基于官方Demo扩展,代码改动就那么几处——加个EditText、套个Timer,sendCommand一发就灵。没啥高大上的算法,纯手工调BLE连接和滚动速度,调试时眼镜不响应就重启蓝牙,问题一个个砸掉。收获是,AR开发门槛没想象中高,Rokid的SDK文档虽简,但上手快,适合周末捣鼓。唯一小遗憾是语音暂停没来得及加,下次补上。
其实在这里我个人还是想展望下,这项目由于时间问题,我觉得后面还能玩出更多的花火。如果是一个用户角度上,它可以继续扩展到直播或培训课等等。后续自己也想试试Unity UXR接上,长远看,AR眼镜像手机一样普及,无纸化办公会成标配——谁知道呢,也许哪天大家会议能全员戴 Rokid,脱稿演讲变日常也有可能。总之,动手试试,你会发现,技术不冷冰冰,它能让生活多点惊喜。

Read more

40 万人在用!这个 GitHub 项目让你白嫖免费域名

40 万人在用!这个 GitHub 项目让你白嫖免费域名

想拥有一个属于自己的域名,但不想花钱?FreeDomain 是一个完全免费的域名注册平台,提供 .us.kg、.dpdns.org、.qzz.io、.xx.kg 等多种后缀选择。无需付费、无隐藏费用、支持商用,已有超过 40 万个域名 被注册使用。 对应的开源项目目前已经在 Github 上斩获了 141k+ Star。 项目地址:https://github.com/DigitalPlatDev/FreeDomain 01 为什么你需要一个免费域名? 域名是你在互联网上的"门牌号"。无论是搭建个人博客、部署开源项目、还是做技术演示,一个好记的域名都能让你的作品更专业。 但问题来了: * 传统域名要花钱:.com 一年几十到上百元,续费还可能涨价 * 学生党/业余玩家预算有限:只是想练练手,

By Ne0inhk
Git 提交信息的规范化简写格式

Git 提交信息的规范化简写格式

你想了解的是 Git 提交信息的规范化简写格式(也常被称为 Conventional Commits 规范),除了 feat、fix、refactor 之外,还有很多不同类型的前缀可以让提交信息更清晰、更有语义。 完整的规范提交前缀及含义 以下是业界通用的 Conventional Commits 规范中常用的前缀,按使用场景分类,每个前缀都有明确的语义: 前缀中文含义使用场景举例feat新增功能feat: 新增商品详情页分享功能fix修复 Bugfix: 修复移动端下拉刷新数据重复的问题refactor代码重构(无功能变更)refactor: 重构订单列表组件,优化代码结构docs文档修改docs: 更新 README 中的接口使用说明style代码格式调整(无逻辑变更)style: 格式化代码缩进,修正变量命名规范test测试相关test: 为用户登录接口添加单元测试chore琐碎工作(构建/工具等)chore: 升级依赖包 axios 到 1.6.0 版本perf性能优化perf: 优化商品列表查询 SQL,提升接口响应速度build构建相关(

By Ne0inhk
轮腿机器人代码调试补充

轮腿机器人代码调试补充

* @Author: 星夜雨夜 * @brief: 轮腿基础代码编写调试补充,移植自达妙开源代码 * @attention:笔者默认读者已经熟练掌握机甲大师RoboMaster c型开发板例程代码的底盘代码和INS_task.c陀螺仪代码、熟练掌握各电机can协议和遥控器dbus协议。默认读者已能看懂轮腿圣经和玺佬的五连杆运动学解算与VMC。建议读者仔细研读轮腿圣经3~5遍,边看MATLAB文件和达妙开源代码,掌握轮腿调试和编写大致思路。一定要注意各状态变量的单位和正负号是否正确,轮腿调试过程中,最难之处在于极性是否正确。本车所有电机均为逆时针旋转为正方向。 !!!强烈建议读者在开发轮腿之前,先运用LQR算法完成一阶倒立摆的平衡小车(即板凳模型)的实现 !!!如果时间紧,其实完全可以不搞仿真,直接实机开调。仿真不疯,实物不一定不疯;但实物疯,仿真必疯。 调试成果展示视频链接(抖音):轮腿机器人 一阶倒立摆平衡小车参考资料: 1.本科毕设 轮腿式双足机器人 开源文件演示_哔哩哔哩_bilibili(资料在视频评论区) 2.达妙平衡小车开源:[达妙科技开源系列-平衡小车] 第一弹_哔哩

By Ne0inhk

机器人系统架构十年演进典型架构对比

机器人系统架构十年演进典型架构对比 2015-2025年,机器人系统架构完成了从硬件绑定紧耦合单机架构→模块化分布式松耦合架构→云边端一体化云原生架构→具身原生端云协同通用架构的四次代际跃迁。本文聚焦每个阶段的行业标杆典型架构,从核心设计、全栈维度、优劣势、适用场景做横向+纵向深度对比,清晰还原十年间架构的本质变革与技术迭代逻辑。 一、四大阶段核心典型架构总览对比表 本表覆盖十年间四个演进阶段的行业公认标杆架构,从全栈技术维度做横向对比,是架构演进的核心浓缩。 演进阶段2015-2017 萌芽期2018-2020 起步期2021-2023 成熟期2024-2025 爆发期核心架构范式硬件绑定的单机嵌入式紧耦合架构分层模块化分布式松耦合架构云边端三级协同云原生全栈架构具身原生端云协同软硬一体化架构行业标杆典型架构1. 发那科30iB工业机器人闭源架构 2. ROS 1 Noetic中心化开源架构1. ROS 2 Dashing/Eloquent分布式架构 2. 海康/极智嘉AMR模块化架构1. 华为RoboOS V1.0云边端架构 2. 新松SRCS数字孪生原生架构1. 华

By Ne0inhk