语音
一次语音会话:角色就是麦克风开着的证据。
先看效果
按住说话。按住按钮打开频道;占用列表显示谁占着它;松开后这句话交给智能体,它先编排再回答。下方的输入框是通往同一个智能体的打字路径。
idle
- 麦克风暂无人使用
- 扬声器暂无人使用
占用列表里的每一行都是 StagedMark,所以有四十行的页面每种状态只花一个引擎。空行渲染成"未在使用"而不是留白,因为这个列表回答的问题是此刻有没有东西在碰这个资源,而沉默也是一种回答。
什么时候用
语音界面有一个文字界面没有的问题:屏幕上没有任何东西证明智能体正在听你说话。角色就是这个证明。麦克风打开时它在听,你说话时它变成一个电平表,转写被回答时它在编排,多个智能体都可能占用频道时它显示谁在占用。
用到的组件
CharacterMark——state="dictating"加一个带实时电平的voice表盘。HudPlate——把转写或模式作为文字显示。OccupancyList与OccupancyMark——哪些智能体占着麦克风、扬声器、频道。Composer——打字的备用路径;输入框旁的角色在获得焦点时listening,敲下键时composing。
状态怎么走
listening 是协议编号 35,dictating 是 46。listening 的点头靠脉冲而不是曲线——直接给竖直弹簧加速度——正是这一点让它读起来像在注意,而不是一段动画循环。
每个状态的样子
| 状态 | 眼睛 | 嘴 | 特效 | 编号 | HUD | |
|---|---|---|---|---|---|---|
idle空闲 | dot → dot → dot → dotLeft → dot → dotRight | none | — | 02 | — | |
listening聆听 | dotLeft → dot → dotLeft | none | — | 3537 | — | |
dictating听写 | dotLeft → dot | o | waves | 46 | voice | |
composing编排 | dotDown → dot | cat | — | 39 | — | |
sending发送 | dot → arch | smile | send | 44 | — |
dictating 把身体交给 wave:四根带伪随机包络的柱子,一个画成角色的电平表。线条脸模式下 dictating、composing 和 sending 还会让嘴在两条频率互不相关的正弦波上一张一合,读起来像说话而不是节拍器。
语音表盘
voice 就是那个表盘。level 是宿主音频表给出的 0–1;bands 是柱子的数量;mode 区分听和说,说话时的柱子更快更高。每根柱子在自己的一对正弦波上抖动——所有柱子同步运动的电平表读起来像滑块,不像声音。
listening60%
接下来
- OccupancyList——谁在说话
- HudPlate——表盘旁边的一个数字