MuCi Cue Script · Specification v1

一份带标记的字幕稿
扫一下就进眼镜

一行一条提示,纯文本直接可用。需要更多控制时,往行首加一个 [标记] —— 控制这句话什么时候出现、以什么形态出现。 就像文字转语音时给句子加 (笑) (停顿),只不过这里的标记是演给你自己看的。

零标记可用 未知标记即忽略 二维码预算优先 记事本可写

01三十秒上手

三个层次,按需要往下走。停在第一层也完全能用。

LEVEL 1 — 纯文本

粘一段文字就行

每个非空行 = 一条提示。第一行不超过 15 字则当标题。不需要学任何语法。

路演·产品介绍
我们解决的核心问题是…
市场规模 500 亿
核心壁垒是专利算法
LEVEL 2 — 加头部

声明标题和推进模式

第一行写 幕词1 开启结构化解析,--- 之前是头部。

幕词1
标题: 路演·产品介绍
模式: 定时
时长: 5
---
我们解决的核心问题是…
市场规模 500 亿
LEVEL 3 — 加标记

逐条控制

行首 […] 可连写。括号里的内容是给自己看的表演提示。

== 开场 ==
[重]市场规模 500 亿
  增速 30%,CAGR 45%
[待]等他们点头再往下(扫视全场)
[听:融资]本轮融资用途
为什么不用 JSON。 二维码的字节数是硬约束,眼镜摄像头扫的是屏幕上的码。 同样内容 JSON 要多花 30–50% 的字节在引号、括号和键名上,直接换算成「扫不上」。 况且 JSON 没法在手机备忘录里顺手改一行。

02实时校验器

左边改,右边立刻出解析结果、字节预算和眼镜端渲染预览。这里的解析器和应用侧是同一份代码。

稿本
解析结果复制稿本
二维码字节预算0 B
标题
—
模式
—
提示条
0
段落
0
眼镜端预览
解析后的内部结构 (JSON)

03生成二维码

直接由上面的稿本生成。眼镜摄像头扫的是屏幕,模块越大越好扫 —— 先点「全屏扫码」把码放到最大再试。

纠错等级
模块像素 8
扫不上先做这一步。 点「最小测试码」换成一个 20 字节左右的极短稿本,再全屏扫。 如果连它都扫不上,问题在相机链路而不是内容长度; 如果它能扫上、长稿本扫不上,那就是码太密,按上面「码预算」压缩或拆分。
点击任意处 / 按 Esc 退出

04整体结构

魔术行 → 头部 → --- → 正文。头部和分隔线都可以省。

魔术行

第一个非空行是 幕词1 或 MUCI1 时按本规范解析,结尾数字是格式主版本。 解析器遇到更高版本号应当尽力解析而不是拒绝。

没有魔术行 = 纯文本回退:每个非空行当一条提示。这条回退保证「随手粘一段文字」永远能用。

头部键

键别名取值默认
标题title任意文本未命名词稿
模式mode手动 定时 跟读 滚动手动
时长dur秒数,定时模式默认停留4
速度speed字/分钟,滚动模式200
字号size大 中 小中
作者by任意文本—

正文行的五种形态

写法类型行为
== 开场 ==段落分节标记,不作为提示显示,用于跳转与进度
// 随便写注释完全忽略
(空行)—忽略
␣␣两格缩进副文本附到上一条提示,小字显示在主文下方
其它提示条一行一条

05标记

行首的 […],可以连写多个:[重][3s]核心壁垒是专利算法

推进类 · 这条什么时候走

标记含义
[3s]停留 3 秒后自动推进。也可写 [3]
[1:30]绝对时间码,从开场计时。到点才显示这条
[待]等待手动推进(点头 / 双击)。可覆盖定时、滚动模式
[听:融资]语音里说到「融资」时推进

含 : 且形如 m:ss → 绝对时间码;纯数字或以 s 结尾 → 相对停留时长。

呈现类 · 这条长什么样

标记含义
[重]强调。更大更亮
[淡]弱化。次要信息
[警]警示。用于「别提这个」「时间到了」这类自我提醒

行内舞台提示

括号包起来的内容 = 给自己看的表演指令,弱化小字渲染,全角半角都算。

我们解决的核心问题是…(停顿,扫视全场)
所以这就是我们的护城河(笑)
这就是 TTS 情绪标记的对应物。 语音合成里 (笑) 告诉合成器怎么念;这里 (笑) 告诉你自己怎么演。 整行只有舞台提示时,它会附到上一条提示上,不单独成条。

需要显示字面括号或行首方括号时,行首加 \ 转义:\[这是字面方括号]

06四种显示模式

模式定默认值,行内标记做局部覆盖 —— 标记永远优先于模式。

手动(默认)

一次一条,点头 / 双击推进。最稳,适合问答、谈判、路演 QA。个别条目仍可用 [3s] 让它自己走。

定时

每条停留 时长 秒后自动推进。适合有严格时间控制的演讲。配 [m:ss] 绝对时间码可以全程卡点。

跟读

语音识别听到 [听:关键词] 时推进。适合已背熟、只需要防卡壳。没写 [听:] 的条目退化为等待手动推进 —— 不替你猜。

滚动

传统提词器,全文按 速度 字/分钟连续滚动。[待] 会硬停直到你推进。适合逐字稿。

07二维码预算

眼镜摄像头扫的是屏幕上显示的码,字节数直接决定能不能扫上。UTF-8 下汉字 3 字节、ASCII 1 字节。

稿本规模约合字节可扫性
≤ 100 汉字~300 B很好,随便扫
≤ 200 汉字~600 B好,推荐上限
≤ 400 汉字~1200 B一般,得凑近、屏幕要亮
> 700 汉字> 2100 B差,接近 QR 容量上限(M 级纠错 2331 B),不建议

省字节的办法,按性价比排序

  1. 删注释和舞台提示 —— 它们照样占码
  2. 提示条只写关键词,不写完整句子(提词器本来就该是关键词)
  3. 拆成多张码,一场一张
  4. 头部能省则省(默认值够用时别写)

两种载体

载体二维码内容长度联网状态
内联稿本文本本身受上表限制不需要v1 已定
引用https://muci.daduiot.com/s/<id>无限需要预留

引用载体把长度问题彻底解决,代价是必须联网、且内容离开了本地。 长逐字稿走引用,敏感内容走内联。

08解析结果

文本格式是书写与传输格式;应用内部统一转成下面这个结构。 既有的 {title, cues:[…]} JSON 是它的最小子集,保持兼容。

{
  "v": 1,
  "title": "路演·产品介绍",
  "mode": "manual",
  "defaultDur": 4,
  "speed": 200,
  "size": "medium",
  "sections": [ { "name": "开场", "from": 0 } ],
  "cues": [
    {
      "text": "我们解决的核心问题是…",
      "sub": "先讲痛点,别讲产品",
      "notes": ["停顿,扫视全场"],
      "advance": { "type": "manual" },
      "style": "normal"
    },
    {
      "text": "本轮融资用于扩团队和获客",
      "advance": { "type": "listen", "keyword": "融资" },
      "style": "strong"
    }
  ]
}
字段取值
advance.typemanual · timer(带 sec) · at(带 sec,绝对) · listen(带 keyword) · scroll
stylenormal · strong · dim · warn

09解析器实现要点

给实现者的硬性要求。参考实现就是本页加载的 cue-script.js,纯 ES5,可以原样搬进 muci/lib/。

#要求为什么
1永不抛异常任何畸形输入都要产出可用结果,最差也是「整段当一条提示」
2未知标记丢标记、留文字向前兼容的基础 —— 旧版本应用必须能读新版本稿本
3未知头部键忽略不影响其它键的解析
4\r\n / \n / \r 全认跨平台粘贴很常见
5首尾空白裁掉,但缩进在裁剪前判定副文本靠缩进识别,先 trim 就没了
60 条提示 = 明确失败让调用方退回扫码页,而不是进一个空的 Ghost 模式
第 2 条是整个格式能演进的关键。 眼镜上的应用版本很难保证同步。如果 v1 的解析器遇到 v2 的标记就整篇拒绝, 那这个格式实际上永远无法加新标记。丢标记、留文字 —— 最差也只是退化成一条普通提示。