技术拆解:基于 Rokid CXR-M SDK 构建“AI 实时翻译眼镜伴侣”核心逻辑

技术拆解:基于 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 重连机制

保存 socketUuidmacAddress,在网络波动或眼镜重启后自动重连:

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 的开放生态,正为我们提供了将创意变为现实的画布。


相关推荐
码码宇3 小时前
技术拆解:Rokid CXR-M SDK 如何构建流畅AR演讲提词功能
后端
沐眼3 小时前
技术拆解:Rokid CXR-M SDK 构建 AI 智能提词眼镜助手连接到场景落地
后端
阑梦清川3 小时前
docker基础学习通关教程
后端
五月天3 小时前
边走边听,所见即所讲:用手机+AR眼镜构建新一代智能导览体验
后端
BingoGo3 小时前
现代 PHP8+ 实战特性介绍 Enums、Fibers 和 Attributes
后端·php
三十_3 小时前
TypeORM 基础篇:项目初始化与增删改查全流程
前端·后端
泉城老铁4 小时前
tomcat 部署springboot,线程经常断开导致数据库连接池关闭,如何解决
java·spring boot·后端
白衣鸽子4 小时前
JavaDoc:自动化生成的可维护代码说明书
后端·代码规范
xyy1234 小时前
GraphQL 入门学习指南
后端