技术拆解:基于 Rokid CXR-M SDK 构建"AI 实时翻译眼镜伴侣"核心逻辑
摘要:本文基于 Rokid CXR-M SDK,从零开始构建一款面向演讲者、主持人、教师等场景的 AR 提词器应用。通过手机 App 与 Rokid Glasses 的蓝牙/Wi-Fi 协同,实现提词内容的实时推送、滚动控制、字体自定义及 ASR 联动自动翻页。文章详细解析 SDK 集成、权限申请、设备连接、提词器场景控制、数据流发送、参数配置等关键技术点,并提供完整可复现的代码结构与交互逻辑。最终,我们不仅打造了一个实用工具,更展示了"手机+AR眼镜"协同开发的巨大潜力。
一、引言:演讲者的痛点与 AR 的破局之道
在会议、发布会、教学、直播等场景中,演讲者常常面临一个尴尬困境:既要保持与观众的眼神交流,又要记住冗长的讲稿内容。传统提词器(如手机支架、地面提词板)不仅笨重,还迫使演讲者低头或偏头,破坏了自然流畅的表达节奏。
而 AR(增强现实)技术,尤其是搭载光学显示的智能眼镜,为这一痛点提供了优雅解法------将提词内容直接投射在演讲者视野前方,视线无需偏移,即可"看稿如看人"。
Rokid Glasses 正是这样一款支持第一视角显示的 AR 眼镜。结合其官方提供的 CXR-M SDK,我们可以在 Android 手机端开发一个"提词搭档"App,实现:
- 手机编辑讲稿,一键推送到眼镜;
- 自定义字体大小、行距、显示区域;
- 支持手动滚动或 ASR 语音驱动自动滚动;
- 实时同步演讲进度,让表达如行云流水。
本文将手把手带你实现这一创意应用,从 SDK 集成到功能闭环,全程可落地、可演示、可商用。
二、技术准备:CXR-M SDK 核心能力解析
在动手前,我们需要明确 CXR-M SDK 中与提词器相关的功能模块:
功能模块 | SDK 接口 | 说明 |
---|---|---|
设备连接 | initBluetooth() , connectBluetooth() |
通过蓝牙建立手机与眼镜的控制通道 |
Wi-Fi 同步(可选) | initWifiP2P() |
若需传输大段文本或资源,可启用高速 Wi-Fi 通道 |
提词器场景控制 | controlScene(CxrSceneType.WORD_TIPS, true/false) |
打开/关闭眼镜端提词器界面 |
提词内容推送 | sendStream(CxrStreamType.WORD_TIPS, content, filename) |
将讲稿文本以字节流形式发送至眼镜 |
显示参数配置 | configWordTipsText(...) |
设置字体大小、行距、显示区域、滚动模式等 |
ASR 联动(AI 模式) | sendAsrContent() |
在"AI 模式"下,根据语音识别结果自动滚动提词器 |
⚠️ 注意:提词器场景依赖 Rokid Assist Service,需确保眼镜端服务未被禁用。
三、项目搭建:从零集成 CXR-M SDK
3.1 创建 Android 项目
使用 Android Studio 创建新项目,选择 Empty Activity ,语言选择 Kotlin ,Min SDK 设置为 API 28 (Android 9)。
3.2 配置 Maven 仓库与依赖
在 settings.gradle.kts
中添加 Rokid Maven 仓库:
kotlin
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven { url = uri("https://maven.rokid.com/repository/maven-public/") }
google()
mavenCentral()
}
}
在 app/build.gradle.kts
中添加 SDK 依赖并设置 minSdk:
kotlin
android {
defaultConfig {
minSdk = 28
}
}
dependencies {
implementation("com.rokid.cxr:client-m:1.0.1-20250812.080117-2")
// 其他依赖(如冲突,优先使用 SDK 指定版本)
}
3.3 声明必要权限
在 AndroidManifest.xml
中添加以下权限:
xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
3.4 动态申请权限
在 MainActivity
中实现权限申请逻辑(参考 SDK 文档示例),确保在初始化 SDK 前所有权限已授予。
四、核心功能实现:构建 AR 提词搭档
4.1 设备发现与蓝牙连接
我们复用 SDK 文档中的 BluetoothHelper
类,扫描 UUID 为 00009100-...
的 Rokid Glasses 设备。
kotlin
// 扫描到设备后,点击连接
fun onDeviceSelected(device: BluetoothDevice) {
CxrApi.getInstance().initBluetooth(this, device, object : BluetoothStatusCallback {
override fun onConnected() {
Log.d("Prompter", "蓝牙连接成功!")
// 可选:初始化 Wi-Fi P2P(用于大文件同步)
}
override fun onFailed(errorCode: ValueUtil.CxrBluetoothErrorCode?) {
Toast.makeText(this@MainActivity, "连接失败: $errorCode", Toast.LENGTH_SHORT).show()
}
override fun onConnectionInfo(uuid, mac, account, type) {
// 保存 uuid 和 mac,用于重连
}
override fun onDisconnected() {
Log.w("Prompter", "蓝牙断开")
}
})
}
4.2 打开提词器场景
连接成功后,调用 controlScene
打开眼镜端提词器:
kotlin
fun openTeleprompter() {
val status = CxrApi.getInstance().controlScene(
ValueUtil.CxrSceneType.WORD_TIPS,
true,
null
)
if (status == ValueUtil.CxrStatus.REQUEST_SUCCEED) {
Log.d("Prompter", "提词器已开启")
}
}
4.3 推送提词内容
用户在手机 App 的 EditText 中输入讲稿,点击"发送"按钮:
kotlin
fun sendScript(script: String) {
val callback = object : SendStatusCallback {
override fun onSendSucceed() {
runOnUiThread { Toast.makeText(this@MainActivity, "提词内容已发送", Toast.LENGTH_SHORT).show() }
}
override fun onSendFailed(errorCode: ValueUtil.CxrSendErrorCode?) {
runOnUiThread { Toast.makeText(this@MainActivity, "发送失败: $errorCode", Toast.LENGTH_SHORT).show() }
}
}
CxrApi.getInstance().sendStream(
ValueUtil.CxrStreamType.WORD_TIPS,
script.toByteArray(),
"speech_${System.currentTimeMillis()}.txt",
callback
)
}
4.4 自定义显示样式
提供 UI 控件让用户调整字体、行距、位置等:
kotlin
fun configureDisplay() {
val textSize = binding.textSizeSlider.value // 例如 18f
val lineSpace = binding.lineSpaceSlider.value // 例如 1.2f
val mode = if (binding.aiModeSwitch.isChecked) "ai" else "normal"
CxrApi.getInstance().configWordTipsText(
textSize = textSize,
lineSpace = lineSpace,
mode = mode,
startPointX = 100, // 左边距 100px
startPointY = 200, // 上边距 200px
width = 800, // 显示区域宽
height = 600 // 显示区域高
)
}
模式说明:
normal
:纯手动滚动(眼镜侧通过手势或按键控制)。ai
:当 ASR 识别结果接近屏幕底部时,自动向上滚动。
4.5 ASR 联动自动翻页(进阶功能)
若启用"AI 模式",需在手机端集成语音识别(如讯飞、百度或 Android 自带 SpeechRecognizer),并将识别结果实时发送至眼镜:
kotlin
// 假设已获取 ASR 结果
fun onAsrResult(text: String) {
CxrApi.getInstance().sendAsrContent(text)
// 眼镜端提词器会根据 text 长度自动判断是否滚动
}
💡 提示:此功能需确保眼镜处于 AI 场景监听状态,且提词器配置为 "ai"
模式。
五、交互流程与状态管理
为提升用户体验,我们需要管理整个提词流程的状态机:

同时,监听眼镜端事件(如意外退出提词器):
kotlin
CxrApi.getInstance().setAiEventListener(object : AiEventListener {
override fun onAiExit() {
runOnUiThread {
Toast.makeText(this@MainActivity, "提词器已退出", Toast.LENGTH_SHORT).show()
// 更新 UI 状态
}
}
})
六、性能优化与异常处理
6.1 蓝牙/Wi-Fi 双通道策略
- 小文本(<10KB) :直接通过蓝牙
sendStream
发送,延迟低。 - 大讲稿或带格式文本:先通过 Wi-Fi P2P 同步文件,再发送文件路径指令(需自定义协议)。
6.2 重连机制
保存 socketUuid
和 macAddress
,在网络波动或眼镜重启后自动重连:
kotlin
fun reconnect() {
CxrApi.getInstance().connectBluetooth(
context = this,
socketUuid = savedUuid,
macAddress = savedMac,
callback = bluetoothCallback
)
}
6.3 错误码处理
对常见错误码进行友好提示:
错误码 | 含义 | 用户提示 |
---|---|---|
SOCKET_CONNECT_FAILED |
蓝牙通道建立失败 | "请确保眼镜已开机并靠近手机" |
WIFI_DISABLED |
Wi-Fi 未开启 | "请打开手机 Wi-Fi 以启用高速同步" |
REQUEST_WAITING |
上一请求未完成 | "操作太快,请稍后再试" |
七、应用场景拓展
本应用不仅限于演讲,还可延伸至:
- 教师授课:解放双手,边写板书边看教案;
- 直播带货:主播无需低头看脚本,自然互动;
- 新闻播报:记者外景采访,提词内容实时更新;
- 舞台剧提词:演员佩戴眼镜,台词自动滚动。
八、总结与展望
通过 Rokid CXR-M SDK,我们成功构建了一款实用、流畅、可定制的 AR 提词搭档。整个过程充分体现了 "手机作为控制端,眼镜作为显示端" 的协同开发范式。
未来,可进一步结合:
- 云端讲稿同步:多设备共享同一份脚本;
- 多语言实时翻译:结合翻译场景,实现双语提词;
- AI 内容生成:根据关键词自动生成演讲草稿并推送。
技术的价值,在于解决真实世界的痛点。而 Rokid 的开放生态,正为我们提供了将创意变为现实的画布。