边走边听,所见即所讲:用手机+AR眼镜构建新一代智能导览体验

边走边听,所见即所讲:用手机+AR眼镜构建新一代智能导览体验

摘要:本文基于 Rokid CXR-M SDK,设计并实现一套"手机+AR眼镜"协同的智能导览系统。该系统融合第一视角视觉识别、语音交互、实时提词与多模态反馈,打造"边走边听、所见即所讲"的沉浸式导览体验。文章详细阐述系统架构、关键技术实现(蓝牙/Wi-Fi连接、AI场景控制、提词器联动、自定义UI展示)、性能优化策略及落地场景价值,为开发者提供可复用的技术范式。


一、引言:从"看展"到"沉浸"------导览体验的范式跃迁

传统导览方式(如语音导览器、二维码扫码、人工讲解)普遍存在割裂感强、交互被动、信息滞后等问题。用户需低头看手机、手动操作,无法真正"沉浸"于展品或场景之中。

而 Rokid AR 眼镜天然具备第一视角感知、抬头即见信息、双手自由操作的优势。若能结合手机强大的计算能力与交互界面,构建"手机为大脑、眼镜为眼睛"的协同系统,即可实现真正的"边走边听,所见即所讲"------用户只需注视展品,系统便自动识别、讲解;讲解内容同步以提词形式呈现在视野中,形成视听闭环。

本文将基于 Rokid CXR-M SDK(v1.0.1-Preview),从零构建这样一套智能导览原型系统,并分享完整技术实现路径。


二、系统整体架构设计

本系统采用 "手机端(Android App) + Rokid Glasses" 的双端协同架构:

  • 手机端:负责用户登录、导览路线规划、展品数据库管理、AI模型推理(可选)、蓝牙/Wi-Fi连接管理、讲解内容生成与下发。
  • 眼镜端:负责第一视角图像采集、本地轻量识别(或接收手机指令)、语音播报、提词器显示、用户按键交互。

两者通过 CXR-M SDK 提供的蓝牙(控制信令)与 Wi-Fi P2P(媒体/数据高速传输)通道进行通信。

图1:智能导览系统架构图


三、关键技术实现详解

3.1 设备连接:建立稳定双通道

3.1.1 蓝牙连接(控制通道)

导览系统启动时,首先通过 CXR-M SDK 建立蓝牙连接:

kotlin 复制代码
// 1. 权限申请(略,参考文档)
// 2. 扫描设备(使用 Rokid UUID 过滤)
val scanFilter = ScanFilter.Builder()
    .setServiceUuid(ParcelUuid.fromString("00009100-0000-1000-8000-00805f9b34fb"))
    .build()

// 3. 初始化蓝牙
CxrApi.getInstance().initBluetooth(context, device, object : BluetoothStatusCallback {
    override fun onConnected() {
        Log.d("GuideApp", "蓝牙连接成功!")
        // 启动Wi-Fi P2P(用于后续图片/语音传输)
        initWifiP2P()
    }
    override fun onDisconnected() { /* 重连逻辑 */ }
    override fun onFailed(errorCode: ValueUtil.CxrBluetoothErrorCode?) { /* 错误处理 */ }
})

关键点:蓝牙连接是所有后续操作的前提,需处理好权限、蓝牙开关、重连等边界情况。

3.1.2 Wi-Fi P2P 连接(数据通道)

讲解语音(TTS)或高清展品图片需通过 Wi-Fi 传输:

kotlin 复制代码
fun initWifiP2P() {
    CxrApi.getInstance().initWifiP2P(object : WifiP2PStatusCallback {
        override fun onConnected() {
            Log.d("GuideApp", "Wi-Fi P2P 连接成功!")
            // 可开始同步媒体文件
        }
        override fun onFailed(errorCode: ValueUtil.CxrWifiErrorCode?) {
            // Wi-Fi 未开启?提示用户
        }
    })
}

注意:Wi-Fi 模块高耗电,仅在需要传输大文件时开启,用完即关。


3.2 核心功能一:AI场景驱动的"所见即所讲"

系统核心在于 AI场景 的触发与控制。我们利用 CXR-M SDK 的 AI 事件监听与 ASR/TTS 接口,构建闭环:

3.2.1 监听用户触发(长按功能键)

kotlin 复制代码
CxrApi.getInstance().setAiEventListener(object : AiEventListener {
    override fun onAiKeyDown() {
        // 用户长按眼镜按键,表示"想了解当前所见"
        startRecognition()
    }
    override fun onAiExit() {
        // AI场景退出,清理状态
    }
})

3.2.2 手机端处理识别结果(模拟)

实际中可调用云端视觉API(如百度AI、阿里云视觉)或本地轻量模型。此处简化为根据GPS/Beacon定位或预设ID:

kotlin 复制代码
fun startRecognition() {
    // 模拟:根据当前位置获取展品ID
    val exhibitId = getCurrentExhibitId()
    val content = getExhibitDescription(exhibitId) // 从本地DB获取

    // 发送TTS内容到眼镜
    CxrApi.getInstance().sendTtsContent(content)

    // 同时发送提词器内容(见3.3节)
    sendToTeleprompter(content)
}

3.2.3 异常处理

若无网络或识别失败,需通知眼镜端:

kotlin 复制代码
CxrApi.getInstance().notifyNoNetwork() // 无网
CxrApi.getInstance().notifyAiError()   // AI错误

3.3 核心功能二:提词器联动------"边走边看"

为强化信息留存,讲解内容同步以提词器形式显示在眼镜视野中:

3.3.1 打开提词器场景

kotlin 复制代码
CxrApi.getInstance().controlScene(
    ValueUtil.CxrSceneType.WORD_TIPS,
    true, // 打开
    null
)

3.3.2 配置提词器样式

根据导览场景,设置大字体、居中、自动滚动:

kotlin 复制代码
CxrApi.getInstance().configWordTipsText(
    textSize = 24f,
    lineSpace = 1.5f,
    mode = "normal", // 或 "ai" 模式(配合ASR自动滚动)
    startPointX = 0,
    startPointY = 300,
    width = 1200,
    height = 400
)

3.3.3 发送讲解文本

kotlin 复制代码
val text = "这是唐代三彩马,高约60厘米,出土于洛阳..."
CxrApi.getInstance().sendStream(
    ValueUtil.CxrStreamType.WORD_TIPS,
    text.toByteArray(),
    "guide_${System.currentTimeMillis()}.txt",
    object : SendStatusCallback {
        override fun onSendSucceed() { /* 成功 */ }
        override fun onSendFailed(errorCode: ValueUtil.CxrSendErrorCode?) { /* 失败 */ }
    }
)

优势:用户既可听讲解,又可随时扫一眼提词器确认关键信息,尤其适合嘈杂环境或听力障碍者。


3.4 增强体验:自定义UI展示结构化信息

对于复杂展品(如文物、建筑),纯文本不够直观。我们利用 自定义页面场景 展示图文混排信息:

3.4.1 构建JSON UI

json 复制代码
{
  "type": "LinearLayout",
  "props": {
    "layout_width": "match_parent",
    "layout_height": "match_parent",
    "orientation": "vertical",
    "paddingTop": "100dp",
    "backgroundColor": "#FF000000"
  },
  "children": [
    {
      "type": "TextView",
      "props": {
        "text": "唐代三彩马",
        "textSize": "20sp",
        "textColor": "#FF00FF00",
        "gravity": "center"
      }
    },
    {
      "type": "ImageView",
      "props": {
        "name": "exhibit_001_icon",
        "layout_width": "200dp",
        "layout_height": "200dp",
        "layout_gravity": "center"
      }
    },
    {
      "type": "TextView",
      "props": {
        "text": "年代:唐\n出土地:洛阳\n材质:陶",
        "textSize": "16sp",
        "textColor": "#FF00FF00"
      }
    }
  ]
}

3.4.2 上传图标 & 打开页面

kotlin 复制代码
// 1. 上传图标(Base64,<128x128)
val icon = IconInfo("exhibit_001_icon", base64String)
CxrApi.getInstance().sendCustomViewIcons(listOf(icon))

// 2. 打开自定义页面
CxrApi.getInstance().openCustomView(jsonUIString)

效果:用户可看到结构化信息卡片,大幅提升信息获取效率。


3.5 辅助功能:设备状态监控与续航优化

  • 电量监控:实时显示眼镜电量,低电量时提醒。
kotlin 复制代码
CxrApi.getInstance().setBatteryLevelUpdateListener { level, charging ->
    updateUI("电量: $level% ${if (charging) "(充电中)" else ""}")
}
  • 自动熄屏:设置30秒无操作自动熄屏,节省电量。
kotlin 复制代码
CxrApi.getInstance().setScreenOffTimeout(30)
  • 音量/亮度调节:根据环境光/噪音自动调整,或由用户通过手机App控制。

四、性能优化与用户体验细节

4.1 连接稳定性

  • 蓝牙断连自动重试(最多3次)。
  • Wi-Fi P2P 仅在同步图片/语音时开启,完成后立即关闭。

4.2 数据传输效率

  • TTS语音优先使用手机本地合成,避免网络延迟。
  • 图片资源预加载并压缩至128x128以内。

4.3 交互反馈

  • 按键触发时,眼镜端有"滴"声反馈。
  • 手机App显示连接状态、当前展品、操作日志。

五、落地场景与商业价值

场景 价值
博物馆/美术馆 替代传统导览器,提供沉浸式、个性化讲解
景区/历史遗迹 实现"走到哪讲到哪",支持多语言
企业展厅 自动讲解产品,提升客户体验
教育培训 学生佩戴眼镜参观,教师远程推送学习资料

案例设想:在故宫博物院,游客佩戴 Rokid 眼镜,注视"太和殿"时长按按键,眼镜立即播报:"太和殿,俗称金銮殿,是紫禁城内规模最大、等级最高的建筑......",同时视野下方滚动显示关键信息。游客双手可自由拍照,全程无需看手机。


六、总结与展望

本文基于 Rokid CXR-M SDK,完整实现了一套"手机+AR眼镜"智能导览系统,涵盖设备连接、AI场景控制、提词器联动、自定义UI展示 四大核心模块。系统具备高沉浸、低干扰、强交互的特点,为文旅、教育、企业展示等领域提供了可落地的AR解决方案。

未来可进一步:

  1. 集成视觉SLAM实现无感触发(无需按键);
  2. 支持多人协同导览;
  3. 结合大模型实现动态生成讲解内容。

关键依赖与权限清单

build.gradle.kts

kotlin 复制代码
minSdk = 28
implementation("com.rokid.cxr:client-m:1.0.1-20250812.080117-2")

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" />
相关推荐
BingoGo3 小时前
现代 PHP8+ 实战特性介绍 Enums、Fibers 和 Attributes
后端·php
三十_3 小时前
TypeORM 基础篇:项目初始化与增删改查全流程
前端·后端
泉城老铁4 小时前
tomcat 部署springboot,线程经常断开导致数据库连接池关闭,如何解决
java·spring boot·后端
白衣鸽子4 小时前
JavaDoc:自动化生成的可维护代码说明书
后端·代码规范
xyy1234 小时前
GraphQL 入门学习指南
后端
星光一影4 小时前
HIS系统天花板,十大核心模块,门诊/住院/医保全流程打通,医院数字化转型首选
java·spring boot·后端·sql·elementui·html·scss
武子康4 小时前
大数据-126 - Flink一文搞懂有状态计算:State Backend 工作原理与性能差异详解 核心原理与作用
大数据·后端·flink
Zz_waiting.5 小时前
Spring Cloud 概述
后端·spring·spring cloud
supermiketho5 小时前
springboot 实现websocket通信
spring boot·后端·websocket