# 音频槽位清单 本文件列出启动动画里**所有会出声的槽位**、每个槽位使用的素材,以及计时规则。 > **本插件的音频零改动**:`lib/assets/` 下 8 个 mp3 与参考项目 `dsh-startup-screen` 逐字节一致。 > 视觉层换成保护伞主题后,六幕的主字与英文副标题仍与素材语义一一对应,避免「字幕和声音对不上」。 --- ## 一、人声台词 —— 6 个槽位 | 槽位 | 中文主字 | 英文副标题 | 素材文件 | 时长 | 出声时机 | |---|---|---|---|---|---| | `line-1` | 需要访问许可 | `ACCESS PERMISSION REQUIRED` | `lib/assets/line-1.mp3` | **1.96s** | 洗白后第一步,与文字渐显同时 | | `line-2` | 身份资料确认 | `IDENTITY VERIFICATION` | `lib/assets/line-2.mp3` | **1.16s** | 第二步(身份卡 + 等确认) | | `line-3` | 接收访问需求 | `ACCESS REQUEST RECEIVED` | `lib/assets/line-3.mp3` | **1.07s** | 第三步(徽记一笔画成) | | `line-4` | 开始读取权限 | `PERMISSION READ STARTED` | `lib/assets/line-4.mp3` | **1.18s** | 第四步(十六进制瀑布) | | `line-5` | 读取完毕 · 核验通过 | `READ COMPLETE · VERIFIED` | `lib/assets/line-5.mp3` | **1.70s** | 第五步(环形准星扫描) | | `line-6` | 欢迎 `<身份名称>` 访问 | `ACCESS GRANTED` | `lib/assets/line-6.mp3` | **3.73s** | 终幕欢迎文案亮起的同一刻 | ### 素材取不到时 - `voiceSource = 'asset'`(默认):五步台词优先用素材;素材缺失或解码失败时, 自动回落到 TTS,`say` 字段就是回落文本。 - 设置页可强制 `voiceSource = 'tts'`,全部改用系统语音合成。 - **终幕 `line-6` 不会念出合成腔**:调用时 `en` / `zh` 都传 `null`, 素材拿不到时即便走到 TTS 分支也没有文本可念 —— 效果是静音,只留画面与和声钟。 ### 浏览器手势限制 浏览器要求**先有一次真实用户手势**才允许出声。因此: 1. 第一幕的按钮同时承担「解锁声音」的职责; 2. 点过按钮 / 按过 `Enter` 之后,才会听到当前这一句; 3. 第一次装上时不要以为音频坏了 —— 先点一下。 --- ## 二、界面音效 —— 8 个槽位 | # | 槽位 | 出声时机 | 来源 | |---|---|---|---| | 1 | `cue` | **每次念台词之前**的两声轻提示 | 合成(1046.5 + 1568 Hz) | | 2 | `tick` | 文字逐字渐显 | `lib/assets/sfx-tick.mp3` | | 3 | `step` | 每个阶段推进 | 同上(音量不同) | | 4 | `confirm` | 点按钮 / 按 `Enter` 确认 | 同上(音量不同) | | 5 | `tickRun` | 十六进制瀑布开始滚动 | `lib/assets/sfx-ticks-run.mp3` | | 6 | `sweep` | 黑幕 → 临床白底板的洗白过场 | 合成(带通噪声扫频) | | 7 | `rise` | 黑幕上保护伞徽记出现 | 合成(220 → 990 Hz 上行) | | 8 | `chime` | 终幕揭幕 | 合成(三音和声钟) | `tick` / `step` / `confirm` 共用同一个「哒」,只是音量不同。 `rise` / `sweep` / `chime` 走合成,是因为源素材对应位置是静音或配乐,不适合直接抠。 音效开关:`sound`;音量:`soundVolume`(默认 0.5); 音效来源:`sfx = 'audio'`(默认,优先读素材)/ `'synth'`(全部现场合成)。 --- ## 三、素材清单 ``` lib/assets/ ├─ line-1.mp3 40.3 KB 需要访问许可 ├─ line-2.mp3 24.5 KB 身份资料确认 ├─ line-3.mp3 23.0 KB 接收访问需求 ├─ line-4.mp3 25.0 KB 开始读取权限 ├─ line-5.mp3 35.2 KB 读取完毕 · 核验通过 ├─ line-6.mp3 88.2 KB 终幕落幕词(3.73s / 192kbps) ├─ sfx-tick.mp3 2.1 KB 单声「哒」(20ms) └─ sfx-ticks-run.mp3 10.2 KB 整串 10 个「哒」,每 45ms 一个 ``` Host 经 `/dsh-umbrella/asset/<文件名>` 只读下发(正则白名单 + 防目录穿越)。 --- ## 四、时长怎么定 每一步的停留时间**不写死**: ```js var spoke = voice.line(step.say, step.zh, step.audio) // Promise<这一句实际播了多久> function holdFor(spoken) { var target = Math.max(ms(step.hold), (spoken || 0) + ms(240)) return wait(Math.max(0, target - (spoken || 0))) } ``` 即: ``` 每步停留 = max(视觉基准, 实际音频时长 + 240ms) ``` - 台词长 → 这一幕自动变长; - 台词短 → 不会干等; - 用户点得快 → 仍然等这一句念完,不掐断; - 只有「跳过 / 揭幕」才会真正取消语音。 `ms(x)` 会除以 `speed`,所以 2× 速度下音频时长不变、视觉基准减半, 最终仍以音频为准(不会把台词截断)。 --- ## 五、可调参数 | 字段 | 默认 | 说明 | |---|---|---| | `voice` | `true` | 女声播报总开关 | | `voiceLang` | `en` | `en` / `zh` / `both` | | `voiceName` | `''` | 空 = 自动挑神经网络女声 | | `voiceRate` | `0.88` | 语速 | | `voicePitch` | `0.85` | 音调(压低,深沉) | | `voiceVolume` | `0.9` | 音量 | | `voiceCue` | `true` | 念台词前的两声提示音 | | `voiceLead` | `240` | 提示音之后留白(ms) | | `voiceSource` | `asset` | `asset` / `tts` | | `sound` | `true` | 界面音效总开关 | | `soundVolume` | `0.5` | 音效音量 | | `sfx` | `audio` | `audio` / `synth` |