当前位置: 首页 > news >正文

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

在这里插入图片描述

文章目录

    • 一、前言
    • 二、项目介绍
      • 2.1、项目背景
      • 2.2、本项目整体思路
    • 三、案例开发
      • 3.1、申请开发者
      • 3.2、Clone RokidSDKDemoKotlin 项目
      • 3.3、集成 Rokid Mobile SDK
      • 3.4、UI 以及眼镜侧渲染
    • 四、优化与一些调试经验
    • 五、个人总结

一、前言

各位大家好,我是开发者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"?>

<TextViewandroid:id="@+id/tv_status"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="状态: 未连接"android:textSize="18sp" /><EditTextandroid: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" /><Buttonandroid:id="@+id/btn_connect"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="连接眼镜"android:layout_marginTop="10dp" /><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送脚本 & 开始滚动"android:layout_marginTop="5dp" /><Buttonandroid: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)// 初始化UItvStatus = 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 = nullcurrentLine = 0RokidMobileSDK.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,脱稿演讲变日常也有可能。总之,动手试试,你会发现,技术不冷冰冰,它能让生活多点惊喜。

http://www.dtcms.com/a/535759.html

相关文章:

  • 量化指标解码03:布林带的开口收口策略与市场波动性分析
  • 深圳网站建设报价表廊坊建手机网站
  • 余姚网站推广wordpress多个域名
  • CSS引入方式(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • SuperMap iObjects .NET 11i 二次开发(十六)—— 叠加分析之合并
  • 【Linux笔记】网络部分——传输层协议UDP
  • Ansible 自动化项目结构与 Harbor 安装示例(基于 kubeasz)①
  • Spring 源码学习(十五)—— HandlerMethodReturnValueHandler
  • everviz 数据可视化平台
  • 12 U盘挂载
  • 【Kylin Linux root 密码故障处置指南(超限重试 + 改回原密码)】
  • 网络原理:数据链路层、NAT与网页加载
  • 【从零开始开发远程桌面连接控制工具】01-项目概述与架构设计
  • 网站建设竞价托管什么意思在国内做推广产品用什么网站好
  • 有没有做宠物的网站网站开发中间商怎么做
  • 深度强化学习 | 详解从信赖域策略优化(TRPO)到近端策略优化(PPO)算法原理
  • 在类中定义装饰器:Python高级元编程技术详解
  • [C++][正则表达式]常用C++正则表达式用法
  • 基于大数据的短视频数据分析系统 Spark哔哩哔哩视频数据分析可视化系统 Hadoop大数据技术 情感分析 舆情分析 爬虫 推荐系统 协同过滤推荐算法 ✅
  • 参考抖音推荐算法的功能:不同用户规模的推荐技术框架
  • 深入理解C语言scanf函数:从基础到高级用法完全指南
  • 检测相邻递增子数组1 2(LeetCode 3349 3350)
  • 《算法闯关指南:优选算法--前缀和》--25.【模板】前缀和,26.【模板】二维前缀和
  • 快速搭建网站2020缅甸新闻最新消息
  • 搜索网站做推广全网推广平台推荐
  • 仓颉编程(16)泛型类型
  • 「小有可为」AI 开源公益创新挑战赛
  • 《 Linux 点滴漫谈: 四 》文件权限与用户管理
  • 评估虚拟机资源规划
  • 深入理解 SO_REUSEADDR:从“Address already in use”到服务器瞬间重启