外观
遥控器
移动端遥控面板(RemotePanel.vue + ChatInputBar.vue)是数字人系统「手机遥控大屏」体验的核心,整体仿微信对话布局,让讲解员在台下用手机即可控制大屏对话与演示。
一、面板形态
MobileEntry.vue 在 isPaired && isConnected 时切换到面板,否则显示扫码页。
- 顶部:连接状态灯 + 模式切换下拉(智能交互 / 专家问答 / 系统导览)+ 断开连接(二次确认);
- 消息区:AI Markdown 气泡 / 用户气泡 / 系统提示 + "大屏回复中…"等待气泡,消息与等待态变化均自动滚底;
- 底部
ChatInputBar:文本输入(500 字上限,回车发送)/ 按住说话,错误以 toast 层展示(标题 + 说明 + 建议列表,点击关闭); - 右下角 Fab + 左侧抽屉,两种形态:
- 系统导览 → "演示问题"抽屉(复用大屏端
demoList,点击即发送); - 智能交互 / 专家问答 → "猜你想问"(支持换一批)/ "选择知识库"抽屉;
- 系统导览 → "演示问题"抽屉(复用大屏端
- 三种模式均显示输入栏(系统导览支持自由输入,与大屏端行为对齐);
- 切出系统导览自动关闭演示抽屉,切到系统导览自动关闭猜你想问抽屉;
- 高度使用
100dvh兼容移动端地址栏伸缩,顶部/底部预留env(safe-area-inset-*)安全区。
二、移动端问答链路
手机 COMMAND → 大屏 handleMobileCommand → 按当前模式走 interactive / expert / demo 分支 → 大屏渲染回答并 TTS 播报 → RESPONSE 回推手机渲染。系统导览的自定义问题不重复走内置问答,回复由 NLU 回调通过 resolveMobileDemoAnswer 回传。
实现位置:移动端指令处理、
RESPONSE回推与配对相关逻辑都在core/connection.js(拆分前位于useAssistantCore.js)。
三、语音输入(遥控器侧)
ChatInputBar.vue + useAudioRecorder.js:
- 左侧图标在"键盘 / 语音"间切换,语音模式为按住说话按钮(
mousedown/touchstart开始,mouseup/touchend发送,移出按钮区域mouseleave/touchcancel取消); - 按钮三态:
按住 说话→录音中 Ns(红点脉冲)→识别中…(转圈); - 录音前先做
diagnoseRecordingCapability()环境诊断;时长限制 最短 1 秒、最长 60 秒; - 针对微信内置浏览器 / iOS Safari / 局域网 HTTP 给出差异化引导;
- 识别成功后直接作为用户消息发送(
type: 'voice'),不像大屏端需要二次确认。
配对码、WebSocket 通道与错误分型见 移动端与大屏交互。