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,脱稿演讲变日常也有可能。总之,动手试试,你会发现,技术不冷冰冰,它能让生活多点惊喜。

相关推荐
墨利昂2 小时前
深度学习常用优化器解析
人工智能·深度学习·机器学习·1024程序员节
这张生成的图像能检测吗3 小时前
(论文速读)超像素引导低光图像增强与特征恢复
图像处理·人工智能·目标检测·计算机视觉·低照度图像增强
马 孔 多 在下雨3 小时前
手机App上的轮播图是如何实现的—探究安卓轮播图
android·智能手机
机器之心3 小时前
吴恩达关注的Ling-1T背后,蚂蚁Ling 2.0技术报告解密万亿模型开源配方
人工智能·openai
空白到白3 小时前
NLP相关面试题
人工智能·自然语言处理
嵌入式-老费3 小时前
Easyx图形库应用(和opencv协同)
人工智能·opencv·计算机视觉
放羊郎3 小时前
基于三维点云图的路径规划
人工智能·动态规划·slam·点云·路径规划·激光slam
算家计算3 小时前
英伟达亮出最强AI芯片!性能暴增3倍,算力竞赛迎来新节点
人工智能·nvidia·芯片
lxmyzzs3 小时前
【图像算法 - 30】基于深度学习的PCB板缺陷检测系统: YOLOv11 + UI界面 + 数据集实现
人工智能·深度学习·算法·yolo·缺陷检测