diff --git a/SOP_AI音频生产.md b/SOP_AI音频生产.md deleted file mode 100644 index 15dc2e5..0000000 --- a/SOP_AI音频生产.md +++ /dev/null @@ -1,893 +0,0 @@ -# AI 音频生产 SOP · v1.0 - -> **适用项目**:《林夏》(林夏.md),同时可复用于本系列其他黑屏耳机项目。 -> **使用对象**:项目主控 1 人 + 音频执行 1–2 人,无需专业录音棚。 -> **预期产出**:约 25 分钟净时长的角色语音 + 4 段 BGM + 60+ 短音效 + 8 段环境底噪。 -> **预期工时**:4 周(含 1 周返工窗口)。 -> **预期音频成本**:¥800–1200。 - ---- - -## 0. 文档使用方法 - -- 第 1–3 章是**总规约**:所有人开工前必读。 -- 第 4 章是**项目专用配置**:每开新项目要复制一份重新填写。 -- 第 5–8 章是**四类资产的生产 SOP**:执行人按章节对照操作即可。 -- 第 9–10 章是**后期与验收**:产出每一批资产后强制走一遍。 -- 第 11 章是**版权归档**:每个文件都要登记。 -- 附录是**复用资源**:Prompt 模板库 / 命名词典 / 验收清单 PDF 版。 - ---- - -## 1. Pipeline 总览 - -``` -┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ -│ T0 脚本定稿 │ → │ T1 音频拆条 │ → │ T2 生产排期 │ -│ (编剧) │ │ (音频主控) │ │ (音频主控) │ -└──────────────────┘ └──────────────────┘ └──────────────────┘ - ↓ - ┌───────────────────────────┬───────────────────┬────────────────┐ - ↓ ↓ ↓ ↓ -┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ -│ T3a TTS生产 │ │ T3b 音乐生产 │ │ T3c 音效生产 │ │ T3d 环境采样 │ -│ MiniMax/豆包 │ │ Suno V4 │ │ ElevenLabs │ │ Freesound │ -└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ - ↓ ↓ ↓ ↓ - └───────────────────────────┴───────────────────┴────────────────┘ - ↓ - ┌─────────────────────────┐ - │ T4 后期统一处理 │ - │ (响度/降噪/淡入淡出) │ - └─────────────────────────┘ - ↓ - ┌─────────────────────────┐ - │ T5 QA 验收 │ - │ (3 副耳机盲听) │ - └─────────────────────────┘ - ↓ - ┌─────────────────────────┐ - │ T6 入库 + 交付 │ - │ (Git LFS + 版权登记) │ - └─────────────────────────┘ -``` - ---- - -## 2. 工具栈与账号清单 - -### 2.1 必备工具表 - -| 用途 | 工具 | 版本/方案 | 月费 | 国内访问 | 备注 | -|---|---|---|---|---|---| -| **中文 TTS 主力** | MiniMax Speech 02 (HD) | API | 按字数 ¥200–500 | ✅ 直连 | 中文情绪戏首选 | -| **中文 TTS 备用** | 字节豆包 Voice | API | ¥100–300 | ✅ 直连 | 系统女声 + 男声补位 | -| **TTS 兜底** | 阿里通义听悟 / 腾讯云 TTS | API | ¥100–200 | ✅ 直连 | 备选 | -| **海外 TTS** | ElevenLabs v3 | Creator $22/月 | ≈¥160 | ⚠️ 需出海 | 仅在 MiniMax 表现不够时备用 | -| **AI 音乐** | Suno V4 / V4.5 | Pro $10/月 | ≈¥75 | ⚠️ 需出海 | 国内备选:天工 SkyMusic | -| **AI 音效** | ElevenLabs Sound Effects | 含在上面套餐内 | — | ⚠️ 需出海 | 国内备选:阿里通义万相音效 | -| **环境采样** | Freesound | 免费(CC0/CC-BY) | 0 | ✅ 直连 | 注意标注作者 | -| **环境采样补充** | Epidemic Sound | $15/月 个人版 | ≈¥110 | ✅ 直连 | 有 SFX/BGM 双库 | -| **音频后期** | iZotope RX 11 + REAPER | 一次性 | ≈¥2000 | ✅ 直连 | 团队共享一份 | -| **响度计** | Youlean Loudness Meter 2 | Free 版即可 | 0 | ✅ 直连 | LUFS 监控必备 | -| **格式转换** | FFmpeg | Free | 0 | ✅ 直连 | 命令行批处理 | -| **资源管理** | Git LFS + Notion | — | 0 | ✅ 直连 | 资产 + 版权登记表 | - -### 2.2 账号准备清单(开工 D-7 完成) - -- [ ] MiniMax 开发者账号 + 充值 ¥500 起 -- [ ] 字节豆包账号 + 充值 ¥300 起 -- [ ] ElevenLabs Creator 订阅(含 Sound Effects 100k credits/月) -- [ ] Suno Pro 订阅(500 首/月,足够) -- [ ] Freesound 注册账号(用于下载追踪) -- [ ] Epidemic Sound 个人订阅 -- [ ] Git LFS 启用 + S3/OSS 备份桶 -- [ ] Notion 中建好「音频版权登记表」模板(见 §11.2) - -### 2.3 海外工具的合规访问方式 -- 团队主控通过合规企业 VPN(如阿里云国际版、腾讯云海外节点)访问。 -- 不在产品线上代码中嵌入任何海外 API key——所有 Suno / ElevenLabs 资源**全部线下生产、本地存储、入库后离线打包随 App 发布**。 -- App 运行时**不调用任何海外服务**。 - ---- - -## 3. 文件命名与目录规范 - -### 3.1 顶层目录结构 - -``` -audio/ -├── 00_raw/ # 原始生成物,不进版本库 -│ ├── tts/ -│ ├── music/ -│ ├── sfx/ -│ └── ambience/ -├── 01_processed/ # 后期处理后,进 Git LFS -│ ├── tts/ -│ ├── music/ -│ ├── sfx/ -│ └── ambience/ -├── 02_final/ # 打包入 App 的最终版 -│ └── (按关卡组织) -├── 03_qa_reports/ # 每批 QA 报告 -└── 99_legal/ # 版权登记表 + 授权证明 -``` - -### 3.2 文件命名规范 - -**格式**:`{关卡号}_{时间码}_{角色}_{形态}_{序号}_{版本}.{ext}` - -| 字段 | 取值 | 说明 | -|---|---|---| -| 关卡号 | `lv11` 等 | 项目代号 | -| 时间码 | `2103`、`2245` | 剧内时间,HHMM | -| 角色 | `mom` `azhe` `xiaomei` `zhounan` `hr` `anan` `system` `delivery` `unknown` `dorm-a` `dorm-b` `dorm-c` `self-3y` | 见 §4.1 角色代号表 | -| 形态 | `call` `voice` `text` `sys` | 通话/微信语音/文字 TTS/系统提示 | -| 序号 | `01`、`02`… | 同角色同时间码下的多条消息 | -| 版本 | `v1`、`v2`、`final` | 迭代版本 | - -**示例**: -- `lv11_2103_mom_call_01_final.wav` — 妈妈 21:03 第一通电话最终版 -- `lv11_2245_xiaomei_voice_01_v2.wav` — 小美 22:45 醉语音第二稿 - -**禁止**: -- 中文文件名(避免编码与 Git 兼容问题) -- 空格、`(`、`)`、`#` 等特殊字符 -- 大写字母(统一小写) - -### 3.3 音频技术规格统一 - -| 字段 | 规格 | 说明 | -|---|---|---| -| **采样率** | 48 kHz | 全程统一,避免重采样杂音 | -| **位深** | 24-bit(生产)/ 16-bit(最终) | 后期保留 24-bit 头,导出降到 16-bit | -| **声道** | 单声道(角色语音)/ 立体声(音乐与环境) | 严格区分 | -| **格式** | `.wav`(生产中)/ `.ogg` Vorbis q=5(入包) | 入包再压缩,节省体积 | -| **响度** | -16 LUFS(角色语音)/ -18 LUFS(音乐)/ -22 LUFS(环境) | 详见 §9.1 | -| **峰值上限** | -1 dBTP | 避免溢出 | - ---- - -## 4. 角色 Voice 配置表(项目专用) - -> 本章是项目工程师的"配音演员花名册"。**每个角色的 voice id、参数、prompt 前缀全部在这里固定下来**,避免不同执行人产出风格漂移。 - -### 4.1 角色代号表 - -| 角色 | 代号 | 净时长估算 | 主语种 | 形态 | -|---|---|---|---|---| -| 妈妈 | `mom` | ~7 min | 中文 | 电话×2 + 微信文字×1 + 语音×1(4'17"长戏) | -| 阿哲(前任) | `azhe` | ~2 min | 中文 | 微信语音×1 + 电话×1 | -| 小美(闺蜜) | `xiaomei` | ~3 min | 中文 | 微信语音×3(含 1'20"醉戏) | -| HR 王姐 | `hr` | ~1 min | 中文 | 微信语音×1 | -| 室友安安 | `anan` | ~30 s | 中文 | 微信语音×1 | -| 寝室群 A/B/C | `dorm-a` `dorm-b` `dorm-c` | ~2 min 共 | 中文 | 群语音×5 | -| 周南(同桌) | `zhounan` | ~5 min | 中文 | 微信语音×5(含 4 段长讲述) | -| 外卖小哥 | `delivery` | ~10 s | 中文(北方腔) | 电话×1 | -| 系统 TTS | `system` | ~2 min | 中文 | 全局提示 | -| 未知号码 | `unknown` | 无台词 | — | 仅环境呼吸声 | -| 3 年前的自己 | `self-3y` | ~50s × 3 版 | 中文 | 备忘录录音(明朗/迷茫/温柔三版预录) | -| 林夏的笑(隐藏) | `self-laugh` | ~3s | — | 仅结局 E 播放,全片唯一林夏自己的声音 | - -### 4.2 角色 Voice 配置卡 - -每张卡固定一个角色的所有参数。**生产时严格按卡操作**。 - ---- - -#### 卡 01 · `mom`(妈妈) - -| 项 | 值 | -|---|---| -| 主用 TTS | MiniMax Speech 02 HD | -| Voice ID | `Chinese_Mandarin_Warm_Auntie_v3`(占位,待实际选定后回填) | -| Speed | 0.92(略慢) | -| Volume | 1.0 | -| Pitch | 0 | -| Emotion | `gentle` | -| 备用方案 | 第 16 条 4 分钟长戏改用**克隆方案**:找一位 50 岁左右真人录 30 秒原声,MiniMax Voice Clone,emotion 提到 `tender` | -| Prompt 前缀 | `<语气:温柔克制,不哭不闹,西北口音淡化,语速比常人慢半拍>` | -| SSML 控制 | 长句中段加 ``,结尾"晚安"前加 `` | -| 后期处理 | 加 -3 dB 高频衰减(让"妈妈感"更柔),轻 reverb wet 8% 模拟客厅 | - ---- - -#### 卡 02 · `azhe`(阿哲 / 前任) - -| 项 | 值 | -|---|---| -| 主用 TTS | 字节豆包 Voice | -| Voice ID | `灿烂青年男声-v2`(北京口音淡,理性偏冷) | -| Speed | 1.05 | -| Volume | 0.95 | -| Pitch | -1 | -| Emotion | `neutral` | -| Prompt 前缀 | `<语气:礼貌但已抽离,像在跟同事说话,不带感情起伏>` | -| 后期处理 | -2 dB 中频,让声音"闷"一点,模拟"已经远了"的距离感 | - ---- - -#### 卡 03 · `xiaomei`(小美 / 闺蜜) - -| 项 | 值 | -|---|---| -| 主用 TTS | MiniMax Speech 02 | -| Voice ID | `Chinese_Mandarin_Lively_Girl_v2` | -| Speed | 1.10(前两条快)/ 0.95(醉语音慢) | -| Volume | 1.0 | -| Pitch | +1 | -| Emotion | `cheerful`(前两条)/ `melancholic + drunk`(第 9 条) | -| Prompt 前缀 | `<语气:北漂女孩,活泼略大大咧咧,会爆粗,醉酒段口齿模糊但不夸张>` | -| 醉戏特殊处理 | 在 SSML 中插入 `` 模拟停顿 + 末句故意拉长元音;后期再叠 5% 房间混响 + 微弱酒吧 BGM 底噪 | - ---- - -#### 卡 04 · `hr`(HR 王姐) - -| 项 | 值 | -|---|---| -| 主用 TTS | 字节豆包 Voice | -| Voice ID | `知性女声-成熟款` | -| Speed | 1.00 | -| Pitch | 0 | -| Emotion | `gentle + apologetic` | -| Prompt 前缀 | `<语气:38 岁职场女性,疲惫的善意,公事公办里带一点点歉意>` | - ---- - -#### 卡 05 · `anan`(室友安安) - -| 项 | 值 | -|---|---| -| 主用 TTS | MiniMax Speech 02 | -| Voice ID | `Chinese_Mandarin_Cute_Girl_v2` | -| Speed | 1.15(兴奋) | -| Pitch | +2 | -| Emotion | `excited` | -| Prompt 前缀 | `<语气:23 岁,撒娇感比小美更重,背景嘈杂酒吧>` | -| 后期处理 | 必须叠酒吧环境底噪(见 §8 ambience 库 `bar_loud_03.wav`),干声 -3 dB | - ---- - -#### 卡 06 · `dorm-a/b/c`(大学寝室群三女生) - -| 项 | 值 | -|---|---| -| 主用 TTS | MiniMax Speech 02,**三个不同 Voice ID 必须区分明显** | -| 候选 IDs | A: `Lively_Girl_v2` / B: `Sweet_Girl_v3` / C: `Mature_Young_Lady_v2` | -| Speed | A: 1.10 / B: 1.00 / C: 0.95 | -| Pitch | A: +1 / B: 0 / C: -1 | -| Emotion | A: `cheerful` / B: `gentle` / C: `neutral` | -| 备注 | A 是升职那位;B 是和事佬;C 是 @ 林夏的那位 | - ---- - -#### 卡 07 · `zhounan`(周南 / 初中同桌) - -| 项 | 值 | -|---|---| -| 主用 TTS | MiniMax Speech 02 | -| Voice ID | `Chinese_Mandarin_Gentleman_Young_v2` | -| Speed | 0.95 | -| Volume | 0.92(略轻,模拟拘谨) | -| Pitch | -1 | -| Emotion | `gentle + nervous` | -| Prompt 前缀 | `<语气:26 岁二三线男生,温和拘谨,明显紧张但克制,偶有自嘲>` | -| 4 段长戏 | 每段独立生成,段间留 800 ms 静音;句尾上扬避免"播音感" | - ---- - -#### 卡 08 · `delivery`(外卖小哥) - -| 项 | 值 | -|---|---| -| 主用 TTS | 字节豆包 Voice | -| Voice ID | `北方青年男声-v2` | -| Speed | 1.20(麻利) | -| Emotion | `neutral` | -| Prompt 前缀 | `<语气:30 岁,普通话+少许河南腔,工作语气,不寒暄>` | -| 后期处理 | 加 -6 dB 低频衰减 + 轻底噪,模拟手机听筒 | - ---- - -#### 卡 09 · `system`(系统 TTS) - -| 项 | 值 | -|---|---| -| 主用 TTS | 字节豆包 Voice | -| Voice ID | `通用女声-柔` | -| Speed | 1.00 | -| Pitch | 0 | -| Emotion | `flat`(无情绪) | -| Prompt 前缀 | `<语气:中性 AI 助手,类似 Siri 但更轻,不带任何情感>` | - ---- - -#### 卡 10 · `self-3y`(3 年前的自己) - -> ⚠️ **本作零麦克风权限**——本条不再使用玩家录音方案,改为**预录三版**按运行时玩家行为画像(PROFILE)动态选择。 - -| 项 | 值 | -|---|---| -| 主用 TTS | MiniMax Speech 02 HD(建议与林夏未来版本预留同一克隆音色,便于 IP 续作) | -| Voice ID | 与 `xiaomei` 同基底音色(暗示"她们曾是同类年轻女孩"),但 speed +0.05、pitch +1,模拟 3 年前更轻盈的语调 | -| 三个预录版本 | ①「**明朗版**」:3 年前刚来北京,对一切都新鲜
②「**迷茫版**」:3 年前其实已经累,只是没说
③「**温柔版**」:3 年前对未来的自己说"撑住" | -| 选择逻辑 | 按 PROFILE 标签匹配:
`engagement` → 明朗版(与今夜的投入呼应)
`avoidance` → 迷茫版(与今夜的回避呼应)
`nostalgia` → 温柔版(与今夜的怀旧呼应) | -| 时长 | 每版 ~50 秒 | -| 后期处理 | 加 -2 dB 高频衰减 + 微弱"录音笔底噪",模拟"3 年前用手机备忘录录的"质感 | -| Prompt 前缀(明朗版) | `<语气:23 岁,刚到北京半年,兴奋里带一点紧张,相信明天比今天好>` | -| Prompt 前缀(迷茫版) | `<语气:23 岁,独自在出租屋里,假装坚强,最后一句声音轻下去>` | -| Prompt 前缀(温柔版) | `<语气:23 岁,写给未来的自己,平静、有力、像在拥抱什么>` | - -#### 卡 11 · `self-laugh`(隐藏结局 E 的笑声) - -| 项 | 值 | -|---|---| -| 主用 TTS | MiniMax Speech 02 HD(同 `self-3y` 同一克隆音色) | -| 内容 | 一段 3 秒的轻笑——"噗"+ 一声短笑 + 一声轻轻的鼻息 | -| 制作方式 | TTS 难以直接生成自然笑声,**建议方案**:
① 找声线接近的 24 岁女声真人**录一次笑**(5 分钟搞定,零成本)
② 用 MiniMax Voice Clone 同款音色 + emotion `playful` 生成尝试,作为备选 | -| 用途 | 仅在结局 E 触发时播放——**全片唯一一次**林夏自己的声音 | -| 后期处理 | 与 `self-3y` 同款"录音笔底噪",让玩家感到"这是从 3 年前的备忘录里偶然飘出来的一段笑" | - ---- - -## 5. TTS 生产 SOP - -### 5.1 工作流(每条语音) - -``` -[1] 拿到脚本最终稿(编剧签字) - ↓ -[2] 拆条 → 填入「拍摄场记表」(见 §5.5) - ↓ -[3] 套用对应角色 Voice 配置卡 - ↓ -[4] 写 Prompt(含 SSML 标记) - ↓ -[5] 一键生成 3 条候选 → 听 - ↓ -[6] 满意 → 进入 [7] / 不满意 → 调参/改 prompt 重生 - ↓ -[7] 命名归档到 00_raw/tts/ - ↓ -[8] 进入后期 (§9) -``` - -### 5.2 Prompt 模板(中文 TTS) - -**通用结构**: - -``` -{角色 Voice ID} -{速度} -{情绪标签} -{角色 prompt 前缀} - -[SSML 正文] -``` - -**SSML 关键标记速查**: - -| 标记 | 作用 | 用例 | -|---|---|---| -| `` | 停顿 | 长句中喘气、"她说……(停)后来呢" | -| `` | 重读 | 关键词强调 | -| `慢句` | 局部变速 | 醉酒段、临终段 | -| `低声` | 局部降调 | 内心戏 | -| `XYZ` | 字母逐字读 | "AirPods" 等英文词 | - -### 5.3 长戏(≥1 分钟)特殊处理 - -**问题**:TTS 一次生成超过 60 秒会出现: -1. 末段质感衰减 -2. 情绪曲线扁平 -3. 偶发吞字 - -**对策**: -1. **分段录制**:每段 ≤ 30 秒,按句号/段落切。 -2. **段间留 200 ms 静音头尾**:方便后期对接。 -3. **段间情绪渐变**:在 prompt 里手动写每段的 emotion 演进,例如妈妈 4'17" 长戏分 6 段: - - 段 1: `gentle, hesitant` - - 段 2: `gentle, nostalgic` - - 段 3: `gentle, sad but holding back` - - 段 4: `gentle, releasing` - - 段 5: `gentle, peaceful` - - 段 6: `gentle, tender, almost smiling` -4. **后期 crossfade 拼接**:每段间 50 ms 交叉淡化,听觉上无缝。 - -### 5.4 候选评审"三耳法则" - -每条 TTS 出 3 条候选,必须用三种设备听过: - -| 设备 | 检查重点 | -|---|---| -| AirPods Pro / 通用入耳式 | 主验收,模拟用户实际场景 | -| 头戴式监听耳机(如 ATH-M50x) | 听细节杂音、底噪、齿音 | -| 手机外放 | 兜底,确认离线场景下可懂 | - -**通过标准**:3 副耳机里每副至少满意度 7/10 才入库。任意一副 ≤ 5/10 必须重做。 - -### 5.5 「拍摄场记表」模板(每条语音 1 行) - -| ID | 关卡 | 时间码 | 角色 | 形态 | 文字稿 | 时长目标 | 情绪 | 出 prompt 人 | 评审人 | 状态 | -|---|---|---|---|---|---|---|---|---|---|---| -| 001 | lv11 | 2103 | mom | call | "今晚煮了你爱吃的排骨…" | 35s | gentle | A | B | ✅ | -| 002 | lv11 | 2115 | xiaomei | voice | "在吗" | 2s | cheerful | A | B | ✅ | -| ... | | | | | | | | | | | - -> 该表用 Notion / 飞书表格维护,每条语音从立项到入库全周期可追。 - ---- - -## 6. 音乐生产 SOP(Suno) - -### 6.1 工作流 - -``` -[1] 编剧/导演给"音乐 brief"(场景+情绪+时长+段落结构) - ↓ -[2] 翻译成 Suno Prompt(英文,带 BPM/instrument/mood) - ↓ -[3] 一次跑 4 首候选(Suno 一次给 2 首,跑 2 轮) - ↓ -[4] 评审 → 选 1 首主稿 + 1 首备稿 - ↓ -[5] 用 Suno "Extend"功能延长到目标时长 - ↓ -[6] 用 Suno "Stem"功能(如开通)拆出干声/伴奏 - ↓ -[7] 后期:手动剪辑、loop 点处理、淡入淡出 - ↓ -[8] 导出 .wav 24-bit 入 00_raw/music/ -``` - -### 6.2 Prompt 模板(《林夏》4 段曲) - -#### M1 · 21:00 主题 / 全程低氛围 Loop - -``` -Style: lo-fi midnight bedroom, soft piano, light vinyl noise -Instruments: muted piano, subtle synth pad, occasional rain outside window -Tempo: 70 BPM -Mood: melancholy but warm, alone but not lonely -Structure: ambient loop, no drums, no clear melody peak -Duration: 90 seconds (extend to loopable) -Vocals: instrumental -``` - -**评审标准**: -- 必须能 loop 30 分钟不觉得"在重复" -- 不能有任何强旋律压过 TTS - -#### M2 · 22:30 悬疑过门 - -``` -Style: subtle ambient suspense, cinematic tension -Instruments: low drone, single hanging piano note (high register), sparse strings -Tempo: 60 BPM -Mood: unsettling but not horror, like a question mark -Structure: 30 seconds, builds slowly, ends on unresolved chord -Vocals: instrumental -``` - -#### M3 · 23:45 周南段落 - -``` -Style: gentle indie folk, intimate acoustic -Instruments: fingerpicked nylon guitar, soft male humming (no lyrics, just "mmm"), light shaker -Tempo: 75 BPM -Mood: hopeful nostalgic, like reading an old letter -Structure: 120 seconds, gradual build, soft climax at 0:80, gentle outro -Vocals: wordless humming only, very subtle -``` - -#### M4 · 02:00 结尾 - -``` -Style: warm cinematic piano, dawn moment -Instruments: solo piano, soft string pad entering at 0:30 -Tempo: 50 BPM -Mood: like the moment you realize you survived a hard night -Structure: 90 seconds, single melody line, no drums, fade out -Vocals: instrumental -``` - -### 6.3 角色铃声生成(9 个) - -每个角色一个独立铃声,玩家"听铃辨人": - -| 角色 | Suno Prompt | 时长 | -|---|---|---| -| mom | `老式诺基亚铃声风格, warm marimba, simple 4-note motif, 70bpm` | 4s loop | -| azhe | `cold minimal electronic ringtone, 2 notes only, 80bpm` | 4s loop | -| xiaomei | `cheerful pop ringtone, ukulele plucks, 4-bar phrase, 100bpm` | 4s loop | -| zhounan | `nostalgic 90s pager beep + soft chime, 70bpm` | 3s loop | -| hr | `corporate professional ringtone, neutral marimba, 90bpm` | 4s loop | -| anan | `bouncy J-pop intro, 2 seconds, 110bpm` | 3s loop | -| delivery | `standard Chinese delivery app push sound, 1 second` | 1s | -| unknown | `eerie low drone, no melody, 40bpm` | 4s loop | -| system | (不需要铃声,是震动) | — | - -### 6.4 Suno 使用 Tips - -1. **每次出双稿**:Suno 一次返回 2 首,第二首往往比第一首意外。 -2. **用"Custom Mode"**:能精确填 Lyrics(留空)+ Style,避免随机。 -3. **避免 vocal**:除非明确要 humming,否则 prompt 里加 `instrumental` `no vocals`。 -4. **Extend 不超 3 次**:第 4 次开始质感会断层。 -5. **Stem 拆轨非常省事**:拆出后可以单独调音量,比从 mix 抠声好太多。 - ---- - -## 7. 音效生产 SOP(ElevenLabs Sound Effects) - -### 7.1 项目所需音效清单(约 60 个) - -| 类别 | 数量 | 例 | -|---|---|---| -| **UI 音** | 12 | 微信咚、震动短/长、消息提示、来电铃响半秒、接通滴、挂断滴、撤回 swoosh、已读、未读、错误提示、菜单切换、确认 | -| **拟音** | 18 | 烧水壶哨响、水沸腾、键盘敲击 5 种节奏、外卖敲门 3 种、门关、钥匙、玻璃放下、椅子拉、纸张翻、笔写字、手机放在床上、手机震动桌面 | -| **角色化短音** | 8 | 阿哲消息撤回 swoosh、妈妈微信消息发出 woosh、群里@提示音、未知号码呼吸(轮询 3 段)、外卖结账提示、HR 邮件附件提示、电量 1% 警告、备忘录播放滴 | -| **过渡 / 转场** | 8 | 章节过渡轻 swell、时间流逝标记(22:00/23:00/00:00 等)、灯光熄灭暗示、心跳加速、深呼吸、玻璃碎一秒、雨势忽大、雨势忽小 | -| **结局专用** | 4 | 字幕浮现 chime、烧水壶滴一声、夜班车驶过、野猫叫一声 | -| **预留备用** | 10 | — | - -### 7.2 ElevenLabs Sound Effects Prompt 模板 - -**通用结构**: - -``` -{动作或物体}, {距离/视角}, {环境}, {时长建议} -``` - -**示例**: - -| 资产 ID | Prompt | -|---|---| -| `sfx_kettle_whistle` | `kettle whistling, close mic, small kitchen, 3 seconds, vintage` | -| `sfx_keyboard_typing` | `mechanical keyboard typing, soft, 5 seconds, intimate close mic` | -| `sfx_wechat_pop` | `short notification pop sound, soft, single high pitched 'tap', 0.5 seconds, original not WeChat` | -| `sfx_message_swoosh` | `quick whoosh of message sending, electronic, 0.3 seconds` | -| `sfx_door_knock_delivery` | `three knocks on apartment door, polite delivery, hallway echo, 2 seconds` | -| `sfx_glass_down` | `glass placed on wooden desk, soft clink, close mic, 1 second` | -| `sfx_phone_vibrate_table` | `phone vibrating on wooden bedside table, 2 seconds` | -| `sfx_cat_yowl_distant` | `single cat yowl in distance, alley, late night, 1.5 seconds` | -| `sfx_breath_unknown` | `human breathing through phone, slightly muffled, anonymous, 6 seconds` | - -### 7.3 ElevenLabs SFX 使用 Tips - -1. **每条 prompt 跑 3 次**:每次都不一样,多挑。 -2. **时长别贪长**:>10s 容易"漂"。需要长效果就做 loop。 -3. **避免品牌词**:不能写 `WeChat sound` `iPhone ringtone` `Apple notification`,直接侵权。改写为 `Chinese-style messaging app soft pop`。 -4. **要用 mp3 时再转**:默认下载 mp3 192k,**生产中先转 wav 再处理**。 - -### 7.4 音效"哪类必须找真采样而非 AI" - -| 音效 | 原因 | 采样源 | -|---|---|---| -| 30 秒以上的环境底噪 | AI 长 ambience 会"漂" | Freesound / Epidemic | -| 真实城市夜噪(远地铁、夜班车) | AI 太干净,缺真实空气感 | Freesound CC0 | -| 特定地域口音、街头叫卖 | AI 无地域性 | 自己录 | -| 情绪化的笑声、哭声、叹息 | AI SFX 还达不到 | TTS 角色化处理或真人录 | - ---- - -## 8. 环境采样 SOP(Freesound / Epidemic Sound) - -### 8.1 项目环境底噪清单 - -| ID | 用途 | 时长 | 描述 | 推荐源 | -|---|---|---|---|---| -| `amb_apartment_night_01` | 全程底噪 | 10 min loop | 合租屋夜晚,远处车声、冰箱嗡嗡、偶尔水管 | Freesound `apartment night ambience` | -| `amb_apartment_night_02` | 备用 | 5 min loop | 同上不同质感 | Freesound | -| `amb_bar_loud_01` | 室友安安电话背景 | 1 min loop | 拥挤酒吧,人声谈笑 + 电子音乐底 | Epidemic Sound | -| `amb_subway_distant` | 转场 | 30s | 远处地铁过站 | Freesound `subway distant` | -| `amb_kitchen_morning` | 结局 A | 1 min | 厨房环境,水龙头滴、冰箱嗡 | Freesound | -| `amb_rain_window` | M1 BGM 衬底 | 5 min loop | 窗外细雨 | Freesound `rain window soft` | -| `amb_late_night_bus` | 结局段 | 20s | 夜班公交驶过空街 | Epidemic Sound | -| `amb_dawn_birds` | 结局 D | 30s | 清晨鸟叫 | Freesound `dawn birds urban` | - -### 8.2 Freesound 检索 SOP - -1. 关键词搜索(英文优先)。 -2. 过滤条件: - - License: `Creative Commons 0` 优先;`Attribution` 次之;不要 `Attribution NonCommercial`(商业项目)。 - - Duration: 设最小值(避免短到没用)。 - - Sample rate: 44.1kHz / 48kHz。 -3. 听 → 下载 .wav 原始版本(不要 mp3)。 -4. **立刻**在 §11 版权登记表里登记:URL / 作者 ID / License / 下载日期。 -5. 入 `00_raw/ambience/` 命名 `amb_xxx_freesoundXXXXX.wav`(保留 Freesound ID)。 - -### 8.3 Epidemic Sound 检索 SOP - -1. Epidemic Sound 全部资源都是 Royalty-Free(订阅期内可商用)。 -2. 直接下载 .wav 24-bit。 -3. 在版权登记表登记 Track ID(Epidemic 提供)。 -4. **退订后已下载的资产仍可继续使用**,但需保留下载凭证(截图存档)。 - -### 8.4 环境采样的"假性立体声"处理 - -许多 Freesound 资源是单声道。处理成立体声: - -```bash -# REAPER / Audition 操作: -# 1. 复制单声道到 L、R 两轨 -# 2. R 轨延迟 8–15 ms -# 3. R 轨高频 EQ 微调 ±1 dB -# → 听感即获得"环境的宽度",但不影响 TTS 在中央的位置 -``` - -**禁止**:用空间音效插件做 3D 定位——本作明确**不依赖空间音效定位**。 - ---- - -## 9. 后期统一处理 SOP - -### 9.1 响度规范(关键) - -| 资产类型 | 目标 LUFS(综合) | 峰值上限 | -|---|---|---| -| 角色语音(电话/微信语音) | -16 LUFS | -1 dBTP | -| 系统 TTS | -18 LUFS | -1 dBTP | -| 主题音乐(M1–M4) | -18 LUFS | -1 dBTP | -| 环境底噪 | -22 LUFS | -3 dBTP | -| 短音效(UI 类) | -14 LUFS(短促能听清) | -1 dBTP | - -**为什么角色语音 -16 LUFS**:移动端 + 耳机场景,比影视的 -23 LUFS 响度高 7 dB,让玩家在嘈杂环境(公交、宿舍)也能听清。 - -**测量工具**:Youlean Loudness Meter 2 (Free),REAPER 内置即可。 - -### 9.2 处理链(每条 TTS 标准链) - -``` -原始 TTS (.wav, 24-bit, 48kHz, 单声道) - ↓ -[1] iZotope RX · Mouth De-click(去 TTS 偶发咔嗒声) - ↓ -[2] iZotope RX · Voice De-noise(轻档 -6 dB,去合成底噪) - ↓ -[3] EQ · 高通滤波 80 Hz(去低频噪) - ↓ -[4] EQ · 角色化频段调整(按 §4 配置卡) - ↓ -[5] Compressor · 4:1, threshold -18 dB(控动态) - ↓ -[6] 加听筒效果(仅"电话/语音"形态,详见 §9.3) - ↓ -[7] Loudness Match · -16 LUFS - ↓ -[8] Limiter · ceiling -1 dBTP - ↓ -[9] 导出 .wav 16-bit 48kHz → 01_processed/tts/ -``` - -### 9.3 「听筒效果」预设 - -模拟手机听筒/微信语音的窄频段感: - -``` -EQ: - HPF 300 Hz, 24 dB/oct - LPF 3.4 kHz, 24 dB/oct - +1 dB at 1.5 kHz(保留人声清晰度) - -Saturation: - Soft tape saturation, 5–8% drive - -Noise: - 叠极轻底噪(-50 dB),可用 ambience 库 phone_noise_floor.wav -``` - -> **例外**:`mom` 第 16 条 4 分钟长戏 **不加听筒效果** —— 这条是微信语音"完整音质版",是设计意图。 - -### 9.4 音乐处理链 - -``` -Suno 原始 (.wav, 立体声, 48kHz) - ↓ -[1] Trim 头尾静音 - ↓ -[2] Loop 点设计(找节拍重音对齐) - ↓ -[3] Crossfade 50 ms(loop 接缝) - ↓ -[4] EQ · 削掉 200–500 Hz 的"AI 浊感"(-2 dB) - ↓ -[5] Stereo Width · 控制在 70%(避免吃掉中央 TTS) - ↓ -[6] Loudness Match · -18 LUFS - ↓ -[7] Limiter · -1 dBTP - ↓ -[8] 导出 .wav → 01_processed/music/ -``` - -### 9.5 环境底噪处理链 - -``` -Freesound 原始 (.wav) - ↓ -[1] Trim 不需要的段 - ↓ -[2] iZotope RX · 去掉突兀的"事件"(突然的喊叫、关门) - ↓ -[3] HPF 60 Hz(去隆隆声) - ↓ -[4] LPF 12 kHz(去高频噪) - ↓ -[5] Loop 点设计(必须找几乎静止的 1 秒做接缝) - ↓ -[6] Crossfade 200 ms - ↓ -[7] Loudness Match · -22 LUFS - ↓ -[8] 假性立体声化(§8.4) - ↓ -[9] 导出 .wav → 01_processed/ambience/ -``` - -### 9.6 批处理脚本(FFmpeg 示例) - -格式批量转换 + 响度归一化: - -```bash -# 把 01_processed 下所有 wav 转成最终 ogg + 响度归一化到 -16 LUFS -for f in 01_processed/tts/*.wav; do - ffmpeg -i "$f" \ - -af "loudnorm=I=-16:TP=-1:LRA=11" \ - -c:a libvorbis -q:a 5 \ - "02_final/tts/$(basename "${f%.wav}.ogg")" -done -``` - ---- - -## 10. QA 验收清单(每批资产强制走一遍) - -### 10.1 自检清单(执行人) - -每条资产入 `01_processed/` 前自查: - -- [ ] 文件命名符合 §3.2 规范 -- [ ] 采样率 = 48 kHz -- [ ] 单/立体声符合 §3.3 规范 -- [ ] 响度在 §9.1 目标范围内(±1 LUFS) -- [ ] 峰值不超过 -1 dBTP -- [ ] 无明显爆音、咔嗒、底噪 -- [ ] 时长与场记表目标值偏差 ≤ 10% - -### 10.2 评审清单(评审人,不同人) - -每批 TTS 走"三耳法则"(§5.4): - -- [ ] AirPods Pro 听 → 满意度 ≥ 7/10 -- [ ] 监听耳机听 → 满意度 ≥ 7/10 -- [ ] 手机外放听 → 可懂 ≥ 7/10 -- [ ] 角色辨识度 → 与配置卡一致 -- [ ] 情绪到位度 → 与脚本意图一致 - -### 10.3 上下文听感测试(关键) - -**单条满意 ≠ 全场景满意**。每完成一个时间段(如 21:00–22:00 这一小时): - -- [ ] 把这一小时所有资产按时间轴拼起来,戴耳机完整听一遍 -- [ ] 检查:音量是否平稳?环境底噪有没有突然断层?两条 TTS 之间的"沉默"是否自然? -- [ ] 至少 3 名团队成员独立听完,给整体评分(1–10) -- [ ] 平均分 ≥ 7 才放行 - -### 10.4 玩家盲测(最终验收前) - -- 招 5 位 22–25 岁女性玩家 -- **不告知任何剧情**,让她们戴耳机黑屏完整玩一遍 -- 关键观测点: - - 哪条 TTS 让她们出戏(皱眉/摘耳机)→ 重做 - - 哪条让她们流泪/微笑/屏息 → 标记为"金条",备份保留 - - 哪个角色被说"听不出是谁" → 配置卡需调整辨识度 -- 内测报告归档到 `03_qa_reports/` - ---- - -## 11. 版权追踪与归档 - -### 11.1 强制原则 - -> **任何一条入库资产,在它被生成/下载的当天,必须登记。** -> **当天没登记的,第二天起视为不可用,必须返工补登。** - -### 11.2 版权登记表模板(Notion / 飞书表格) - -| 资产 ID | 类型 | 来源工具/平台 | URL/Track ID/Voice ID | License | 创建/下载日期 | 创建人 | 商用证明位置 | 备注 | -|---|---|---|---|---|---|---|---|---| -| `lv11_2103_mom_call_01` | TTS | MiniMax Speech 02 | voice: Warm_Auntie_v3 | MiniMax 商用许可 | 2026-05-15 | 张三 | `99_legal/minimax_terms_2026.pdf` | — | -| `amb_apartment_night_01` | ambience | Freesound | freesound.org/s/123456/ | CC0 | 2026-05-13 | 李四 | (CC0 无需) | 作者: user_xxx | -| `amb_bar_loud_01` | ambience | Epidemic Sound | track id: ES_8472993 | Epidemic 订阅 | 2026-05-14 | 李四 | `99_legal/epidemic_invoice_202605.pdf` | 订阅期内 | -| `m1_main_theme` | music | Suno V4 | song id: suno_xxx | Suno Pro 商用 | 2026-05-16 | 王五 | `99_legal/suno_pro_2026.pdf` | — | -| `sfx_wechat_pop` | sfx | ElevenLabs SFX | (SFX 不返回 ID,存 prompt) | ElevenLabs Creator 商用 | 2026-05-15 | 王五 | `99_legal/elevenlabs_terms.pdf` | prompt 存留 | - -### 11.3 各 AI 平台商用授权要点(截至 2026-05) - -> ⚠️ **每次开新项目前必须重新核对最新条款**。AI 平台条款变化频繁。 - -| 平台 | 商用许可 | 特殊条件 | -|---|---|---| -| **MiniMax Speech** | ✅ 包含在 API 服务中 | 不得用于生成深度伪造、政治敏感内容 | -| **字节豆包 Voice** | ✅ 企业 API 包含商用 | 个人版可能受限,必须开企业账户 | -| **ElevenLabs** | ✅ Creator 及以上套餐 | Free 套餐**不能商用**;TTS 需注明(部分场景) | -| **Suno** | ✅ Pro 及以上 | Free 不可商用;保留生成时的订阅状态截图 | -| **Freesound** | ⚠️ 看每条 license | CC0 自由用;CC-BY 必须署名;CC-NC 不可商用 | -| **Epidemic Sound** | ✅ 订阅期内全库商用 | 退订后已下载资产可继续用,必须存订阅凭证 | - -### 11.4 归档与备份 - -- **Git LFS**:所有 `01_processed/` 与 `02_final/` 资产入库。 -- **OSS 双备份**:每周自动同步到阿里云 OSS(主)+ AWS S3(备),保留 6 个月版本。 -- **冷备**:项目结项时,全套 raw + processed + final + 法务文件刻盘归档(蓝光 50 GB ≈ ¥30 一张)。 - ---- - -## 12. 附录 - -### 12.1 命名词典 - -| 字段 | 缩写 | -|---|---| -| 关卡 | `lv` | -| TTS 角色语音 | `tts` | -| 音乐 | `mus` / `m1`/`m2`/`m3`/`m4` | -| 短音效 | `sfx` | -| 环境底噪 | `amb` | -| 来电 | `call` | -| 微信语音 | `voice` | -| 微信文字 | `text` | -| 系统提示 | `sys` | - -### 12.2 项目专用术语 - -| 术语 | 含义 | -|---|---| -| **金条** | 玩家盲测中触发明显情感反应的语音条目,优先保留 | -| **听筒效果** | §9.3 的 EQ + saturation 处理预设 | -| **三耳法则** | §5.4 的三种设备评审标准 | -| **拍摄场记表** | §5.5 的全条目追踪表 | - -### 12.3 突发情况预案 - -| 情况 | 处理 | -|---|---| -| MiniMax 临时服务中断 | 切豆包 Voice,按角色配置卡的"备用方案"行动 | -| ElevenLabs SFX 月度 credit 用完 | 走阿里通义万相音效;或下月重做 | -| Suno 出图风格全部不满意 | 用 Udio v2 重跑同一 prompt | -| Freesound 没有合适素材 | Epidemic Sound;再不行**临时找 1 名收音师外采**(预算预留 ¥2000) | -| 玩家盲测某条全员差评 | 优先级最高,必须返工,72 小时内重做 + 复测 | - -### 12.4 工时估算(参考,单人执行) - -| 资产类型 | 单条耗时 | 总耗时 | -|---|---|---| -| 短 TTS(≤ 10 s) | 5 min(含 3 候选评审) | ~3 h(35 条) | -| 长 TTS(≥ 1 min) | 30 min(分段+拼接) | ~2 h(4 条) | -| 单段音乐(含 extend) | 40 min | ~3 h(4 段) | -| 单条音效 | 3 min | ~3 h(60 条) | -| 单段环境采样(含处理) | 20 min | ~3 h(8 段) | -| 后期统一处理 | 5 min/条 | ~6 h | -| QA 与盲测 | — | ~12 h | -| **合计** | | **~32 工时**(4 个工作日) | - -> 实际项目预留 **2 倍**时间用于反复打磨。 - ---- - -## 13. 启动检查表(Day 0 之前) - -- [ ] 所有 §2.2 账号已开通、付费、API key 已存安全位置(团队密码管理器) -- [ ] §3 文件夹结构已建好,Git LFS 已启用 -- [ ] §4 角色 Voice 配置卡已在 Notion 立表,每个 voice id 跑过 1 条试音确认可用 -- [ ] §5.5 拍摄场记表已建好,所有条目预填 -- [ ] §11.2 版权登记表已建好 -- [ ] 团队听过 1 个完整 reference 项目(推荐:《Mountain》《Florence》《Lifeline》音频部分) -- [ ] 玩家盲测候选 5 人已联系并约好测试日期 - ---- - -**文档状态**:v1.0 · 2026-05-13 · 待团队评审 -**维护人**:项目主控 -**下次修订**:每完成一个项目后,回看实际数据更新本 SOP diff --git a/audio_2/scripts/01_gen_tts_styled.py b/audio_2/scripts/01_gen_tts_styled.py deleted file mode 100644 index c3569ae..0000000 --- a/audio_2/scripts/01_gen_tts_styled.py +++ /dev/null @@ -1,225 +0,0 @@ -#!/usr/bin/env python3 -""" -《林夏》TTS v2 — VoxCPM2 Style Control 批量生成 -输出:audio_2/tts/v2_styled/ - -用法: - VOXCPM_PORT=8002 bash /home/xsl/tts-server/start-voxcpm.sh - VOXCPM_PORT=8002 python audio_2/scripts/01_gen_tts_styled.py - python audio_2/scripts/01_gen_tts_styled.py --dry-run - python audio_2/scripts/01_gen_tts_styled.py --role linxia --test -""" -import argparse -import base64 -import glob -import os -import subprocess -import sys -import tempfile -import time - -import requests - -PROJECT_DIR = "/home/xsl/blind" -VOICE_DIR = f"{PROJECT_DIR}/voice" -OUT_DIR = f"{PROJECT_DIR}/audio_2/tts/v2_styled" -HOST = os.environ.get("VOXCPM_HOST", "127.0.0.1") -PORT = os.environ.get("VOXCPM_PORT", "8002") -BASE_URL = f"http://{HOST}:{PORT}" - -sys.path.insert(0, f"{PROJECT_DIR}/audio") -sys.path.insert(0, f"{PROJECT_DIR}/audio_2") - -from batch_tts_voxcpm import ROLES, LINES # noqa: E402 -from voice_style_prompts import get_style # noqa: E402 - -os.makedirs(OUT_DIR, exist_ok=True) - - -def find_ref_audio(role_key): - role_dir = os.path.join(VOICE_DIR, ROLES[role_key]["dir"]) - for ext in ("*.wav", "*.mp3", "*.flac"): - files = sorted(glob.glob(os.path.join(role_dir, ext))) - if files: - return files[0] - return None - - -def convert_to_wav(src, dst): - subprocess.run( - ["ffmpeg", "-y", "-i", src, "-ar", "16000", "-ac", "1", "-acodec", "pcm_s16le", dst], - check=True, - capture_output=True, - ) - - -def wav_to_base64(path): - with open(path, "rb") as f: - return base64.b64encode(f.read()).decode() - - -def apply_speed(src, speed, dst): - if abs(speed - 1.0) < 0.01: - import shutil - - shutil.copy2(src, dst) - return - subprocess.run( - ["ffmpeg", "-y", "-i", src, "-filter:a", f"atempo={speed}", "-acodec", "pcm_s16le", dst], - check=True, - capture_output=True, - ) - - -def wav_to_mp3(src, dst): - subprocess.run( - [ - "ffmpeg", "-y", "-i", src, - "-codec:a", "libmp3lame", "-b:a", "128k", "-ar", "24000", "-ac", "1", - dst, - ], - check=True, - capture_output=True, - ) - - -def check_server(): - try: - r = requests.get(f"{BASE_URL}/health", timeout=5) - if r.status_code != 200: - return False - data = r.json() - return data.get("status") == "ok" - except Exception: - return False - - -def register_voice(wav_path): - r = requests.post( - f"{BASE_URL}/v1/voices", - json={"wav_base64": wav_to_base64(wav_path)}, - timeout=60, - ) - r.raise_for_status() - return r.json()["voice_id"] - - -def synthesize_styled(voice_id, text, style, cfg=2.0, steps=10): - r = requests.post( - f"{BASE_URL}/v1/speech/styled", - json={ - "text": text, - "style": style, - "voice_id": voice_id, - "cfg_value": cfg, - "inference_timesteps": steps, - }, - timeout=180, - ) - r.raise_for_status() - return r.content - - -def main(): - parser = argparse.ArgumentParser(description="《林夏》Style Control 批量 TTS → audio_2") - parser.add_argument("--role", help="只合成指定角色") - parser.add_argument("--test", action="store_true", help="只合成第一条") - parser.add_argument("--dry-run", action="store_true", help="只打印 style 分配") - parser.add_argument("--force", action="store_true", help="覆盖已存在文件") - parser.add_argument("--cfg", type=float, default=2.0) - parser.add_argument("--steps", type=int, default=10) - args = parser.parse_args() - - lines = LINES - if args.role: - lines = [(f, r, t) for f, r, t in lines if r == args.role or r.startswith(args.role)] - if args.test: - lines = lines[:1] - - print(f"\n{'=' * 60}") - print(" 《林夏》TTS v2 — Style Control") - print(f" 服务: {BASE_URL}") - print(f" 输出: {OUT_DIR}") - print(f" 共 {len(lines)} 条") - print(f"{'=' * 60}\n") - - if args.dry_run: - for fname, role, text in lines: - style = get_style(fname, role, text) - out = os.path.join(OUT_DIR, f"{fname}_wav_v2.mp3") - mark = "✓" if os.path.exists(out) else "·" - print(f" [{mark}] {fname} [{role}]") - print(f" style: {style}") - print(f" text: {text[:50]}{'...' if len(text) > 50 else ''}\n") - return - - if not check_server(): - print(f"[错误] VoxCPM2 服务未就绪: {BASE_URL}/health") - print("请先启动:") - print(f" VOXCPM_PORT={PORT} bash /home/xsl/tts-server/start-voxcpm.sh") - sys.exit(1) - - voice_ids = {} - tmp = tempfile.mkdtemp(prefix="voxcpm2_") - for role_key in sorted(set(r for _, r, _ in lines)): - ref = find_ref_audio(role_key) - if not ref: - print(f" [跳过] {role_key}: 未找到参考音频") - continue - wav = ref if ref.endswith(".wav") else os.path.join(tmp, f"{role_key}.wav") - if not ref.endswith(".wav"): - convert_to_wav(ref, wav) - print(f" 注册音色: {role_key} ... ", end="", flush=True) - voice_ids[role_key] = register_voice(wav) - print(f"ok ({voice_ids[role_key][:10]}...)") - - ok = skip = fail = 0 - manifest_path = os.path.join(OUT_DIR, "style_manifest.tsv") - manifest_lines = ["filename\trole\tstyle\ttext\n"] - - for i, (fname, role, text) in enumerate(lines, 1): - out_mp3 = os.path.join(OUT_DIR, f"{fname}_wav_v2.mp3") - style = get_style(fname, role, text) - manifest_lines.append( - f"{fname}\t{role}\t{style.replace(chr(9), ' ')}\t{text.replace(chr(9), ' ')}\n" - ) - - if os.path.exists(out_mp3) and not args.force: - print(f" [{i:3d}/{len(lines)}] SKIP {fname}") - skip += 1 - continue - - if role not in voice_ids: - print(f" [{i:3d}/{len(lines)}] MISS {fname} (无音色)") - fail += 1 - continue - - print(f" [{i:3d}/{len(lines)}] {fname} ... ", end="", flush=True) - t0 = time.time() - try: - wav_bytes = synthesize_styled( - voice_ids[role], text, style, cfg=args.cfg, steps=args.steps - ) - raw_wav = os.path.join(tmp, f"{fname}_raw.wav") - spd_wav = os.path.join(tmp, f"{fname}_spd.wav") - with open(raw_wav, "wb") as f: - f.write(wav_bytes) - apply_speed(raw_wav, ROLES[role]["speed"], spd_wav) - wav_to_mp3(spd_wav, out_mp3) - kb = os.path.getsize(out_mp3) // 1024 - print(f"ok ({time.time() - t0:.1f}s, {kb}KB)") - ok += 1 - except Exception as e: - print(f"FAIL: {e}") - fail += 1 - - with open(manifest_path, "w", encoding="utf-8") as f: - f.writelines(manifest_lines) - - print(f"\n完成: {ok} ok, {skip} skip, {fail} fail") - print(f"输出: {OUT_DIR}") - print(f"清单: {manifest_path}") - - -if __name__ == "__main__": - main() diff --git a/audio_2/scripts/02_gen_tts_voice_design.py b/audio_2/scripts/02_gen_tts_voice_design.py deleted file mode 100644 index 1f85800..0000000 --- a/audio_2/scripts/02_gen_tts_voice_design.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python3 -""" -《林夏》TTS v3 — VoxCPM2 Voice Design 批量生成 -纯提示词生成音色,不使用参考音频。 - -输出:audio_2/tts/v3_voice_design/ - -用法: - VOXCPM_PORT=8002 bash /home/xsl/tts-server/start-voxcpm.sh - VOXCPM_PORT=8002 python audio_2/scripts/02_gen_tts_voice_design.py - python audio_2/scripts/02_gen_tts_voice_design.py --dry-run - python audio_2/scripts/02_gen_tts_voice_design.py --role delivery --test -""" -import argparse -import os -import subprocess -import sys -import tempfile -import time - -import requests - -PROJECT_DIR = "/home/xsl/blind" -OUT_DIR = f"{PROJECT_DIR}/audio_2/tts/v3_voice_design" -HOST = os.environ.get("VOXCPM_HOST", "127.0.0.1") -PORT = os.environ.get("VOXCPM_PORT", "8002") -BASE_URL = f"http://{HOST}:{PORT}" - -sys.path.insert(0, f"{PROJECT_DIR}/audio") -sys.path.insert(0, f"{PROJECT_DIR}/audio_2") - -from batch_tts_voxcpm import ROLES, LINES # noqa: E402 -from voice_style_prompts import get_voice_design # noqa: E402 - -os.makedirs(OUT_DIR, exist_ok=True) - - -def apply_speed(src, speed, dst): - if abs(speed - 1.0) < 0.01: - import shutil - - shutil.copy2(src, dst) - return - subprocess.run( - ["ffmpeg", "-y", "-i", src, "-filter:a", f"atempo={speed}", "-acodec", "pcm_s16le", dst], - check=True, - capture_output=True, - ) - - -def wav_to_mp3(src, dst): - subprocess.run( - [ - "ffmpeg", "-y", "-i", src, - "-codec:a", "libmp3lame", "-b:a", "128k", "-ar", "24000", "-ac", "1", - dst, - ], - check=True, - capture_output=True, - ) - - -def check_server(): - try: - r = requests.get(f"{BASE_URL}/health", timeout=5) - return r.status_code == 200 and r.json().get("status") == "ok" - except Exception: - return False - - -def synthesize_design(text, style, cfg=2.0, steps=10): - """Voice Design: 不传 voice_id。""" - r = requests.post( - f"{BASE_URL}/v1/speech/styled", - json={ - "text": text, - "style": style, - "voice_id": None, - "cfg_value": cfg, - "inference_timesteps": steps, - }, - timeout=180, - ) - r.raise_for_status() - return r.content - - -def main(): - parser = argparse.ArgumentParser(description="《林夏》Voice Design 批量 TTS → audio_2") - parser.add_argument("--role", help="只合成指定角色") - parser.add_argument("--test", action="store_true", help="只合成第一条") - parser.add_argument("--dry-run", action="store_true") - parser.add_argument("--force", action="store_true") - parser.add_argument("--cfg", type=float, default=2.0) - parser.add_argument("--steps", type=int, default=10) - args = parser.parse_args() - - lines = LINES - if args.role: - lines = [(f, r, t) for f, r, t in lines if r == args.role or r.startswith(args.role)] - if args.test: - lines = lines[:1] - - print(f"\n{'=' * 60}") - print(" 《林夏》TTS v3 — Voice Design(无参考音频)") - print(f" 服务: {BASE_URL}") - print(f" 输出: {OUT_DIR}") - print(f" 共 {len(lines)} 条") - print(f"{'=' * 60}\n") - - if args.dry_run: - for fname, role, text in lines: - style = get_voice_design(fname, role, text) - out = os.path.join(OUT_DIR, f"{fname}_wav_v3.mp3") - mark = "✓" if os.path.exists(out) else "·" - print(f" [{mark}] {fname} [{role}]") - print(f" design: {style}") - print(f" text: {text[:50]}{'...' if len(text) > 50 else ''}\n") - return - - if not check_server(): - print(f"[错误] VoxCPM2 服务未就绪: {BASE_URL}/health") - print(f" VOXCPM_PORT={PORT} bash /home/xsl/tts-server/start-voxcpm.sh") - sys.exit(1) - - tmp = tempfile.mkdtemp(prefix="voxcpm3_") - ok = skip = fail = 0 - manifest_path = os.path.join(OUT_DIR, "voice_design_manifest.tsv") - manifest_lines = ["filename\trole\tdesign_prompt\ttext\n"] - - for i, (fname, role, text) in enumerate(lines, 1): - out_mp3 = os.path.join(OUT_DIR, f"{fname}_wav_v3.mp3") - style = get_voice_design(fname, role, text) - manifest_lines.append( - f"{fname}\t{role}\t{style.replace(chr(9), ' ')}\t{text.replace(chr(9), ' ')}\n" - ) - - if os.path.exists(out_mp3) and not args.force: - print(f" [{i:3d}/{len(lines)}] SKIP {fname}") - skip += 1 - continue - - print(f" [{i:3d}/{len(lines)}] {fname} [{role}] ... ", end="", flush=True) - t0 = time.time() - try: - wav_bytes = synthesize_design(text, style, cfg=args.cfg, steps=args.steps) - raw_wav = os.path.join(tmp, f"{fname}_raw.wav") - spd_wav = os.path.join(tmp, f"{fname}_spd.wav") - with open(raw_wav, "wb") as f: - f.write(wav_bytes) - apply_speed(raw_wav, ROLES[role]["speed"], spd_wav) - wav_to_mp3(spd_wav, out_mp3) - print(f"ok ({time.time() - t0:.1f}s, {os.path.getsize(out_mp3) // 1024}KB)") - ok += 1 - except Exception as e: - print(f"FAIL: {e}") - fail += 1 - - with open(manifest_path, "w", encoding="utf-8") as f: - f.writelines(manifest_lines) - - print(f"\n完成: {ok} ok, {skip} skip, {fail} fail") - print(f"输出: {OUT_DIR}") - print(f"清单: {manifest_path}") - - -if __name__ == "__main__": - main() diff --git a/audio_2/scripts/03_gen_voice_samples.py b/audio_2/scripts/03_gen_voice_samples.py deleted file mode 100644 index fb69764..0000000 --- a/audio_2/scripts/03_gen_voice_samples.py +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python3 -""" -《林夏》Voice Design 试听样本 — 每角色 5 条约 10 秒音频 - -输出:audio_2/tts/v4_voice_samples/{role}/{role}_v01.mp3 … v05.mp3 - -用法: - VOXCPM_PORT=8002 python audio_2/scripts/03_gen_voice_samples.py - python audio_2/scripts/03_gen_voice_samples.py --role delivery - python audio_2/scripts/03_gen_voice_samples.py --dry-run -""" -import argparse -import os -import subprocess -import sys -import tempfile -import time - -import requests - -PROJECT_DIR = "/home/xsl/blind" -OUT_ROOT = f"{PROJECT_DIR}/audio_2/tts/v4_voice_samples" -os.makedirs(OUT_ROOT, exist_ok=True) -HOST = os.environ.get("VOXCPM_HOST", "127.0.0.1") -PORT = os.environ.get("VOXCPM_PORT", "8002") -BASE_URL = f"http://{HOST}:{PORT}" - -sys.path.insert(0, f"{PROJECT_DIR}/audio_2") -from voice_sample_prompts import AUDITION_TEXT, ROLE_VOICE_VARIANTS # noqa: E402 - - -def wav_to_mp3(src, dst): - subprocess.run( - [ - "ffmpeg", "-y", "-i", src, - "-codec:a", "libmp3lame", "-b:a", "128k", "-ar", "24000", "-ac", "1", - dst, - ], - check=True, - capture_output=True, - ) - - -def wav_duration(path): - r = subprocess.run( - [ - "ffprobe", "-v", "error", "-show_entries", "format=duration", - "-of", "default=noprint_wrappers=1:nokey=1", path, - ], - capture_output=True, - text=True, - check=True, - ) - return float(r.stdout.strip()) - - -def check_server(): - try: - r = requests.get(f"{BASE_URL}/health", timeout=5) - return r.status_code == 200 and r.json().get("status") == "ok" - except Exception: - return False - - -def synthesize_design(text, style, cfg=2.0, steps=10): - r = requests.post( - f"{BASE_URL}/v1/speech/styled", - json={ - "text": text, - "style": style, - "voice_id": None, - "cfg_value": cfg, - "inference_timesteps": steps, - }, - timeout=180, - ) - r.raise_for_status() - return r.content - - -def main(): - parser = argparse.ArgumentParser(description="生成每角色 5 条 Voice Design 试听样本") - parser.add_argument("--role", help="只生成指定角色") - parser.add_argument("--dry-run", action="store_true") - parser.add_argument("--force", action="store_true") - parser.add_argument("--cfg", type=float, default=2.0) - parser.add_argument("--steps", type=int, default=10) - args = parser.parse_args() - - roles = sorted(ROLE_VOICE_VARIANTS.keys()) - if args.role: - roles = [r for r in roles if r == args.role or r.startswith(args.role)] - if not roles: - print(f"[错误] 未知角色: {args.role}") - sys.exit(1) - - total = sum(len(ROLE_VOICE_VARIANTS[r]) for r in roles) - print(f"\n{'=' * 60}") - print(" 《林夏》Voice Design 试听样本(每角色 5 条)") - print(f" 服务: {BASE_URL}") - print(f" 输出: {OUT_ROOT}") - print(f" 角色: {len(roles)} 样本: {total}") - print(f"{'=' * 60}\n") - - if args.dry_run: - for role in roles: - text = AUDITION_TEXT[role] - print(f"[{role}] ({len(text)} 字) {text[:40]}...") - for i, prompt in enumerate(ROLE_VOICE_VARIANTS[role], 1): - print(f" v{i:02d}: {prompt}") - print() - return - - if not check_server(): - print(f"[错误] VoxCPM2 未就绪: {BASE_URL}/health") - sys.exit(1) - - os.makedirs(OUT_ROOT, exist_ok=True) - tmp = tempfile.mkdtemp(prefix="voxcpm_sample_") - manifest_path = os.path.join(OUT_ROOT, "samples_manifest.tsv") - manifest = ["role\tvariant\tseconds\tprompt\ttext\tfile\n"] - ok = skip = fail = 0 - n = 0 - - for role in roles: - role_dir = os.path.join(OUT_ROOT, role) - os.makedirs(role_dir, exist_ok=True) - text = AUDITION_TEXT[role] - variants = ROLE_VOICE_VARIANTS[role] - - for i, prompt in enumerate(variants, 1): - n += 1 - tag = f"v{i:02d}" - out_mp3 = os.path.join(role_dir, f"{role}_{tag}.mp3") - out_wav = os.path.join(role_dir, f"{role}_{tag}.wav") - - if os.path.exists(out_mp3) and not args.force: - print(f" [{n}/{total}] SKIP {role}_{tag}") - skip += 1 - continue - - print(f" [{n}/{total}] {role}_{tag} ... ", end="", flush=True) - t0 = time.time() - try: - wav_bytes = synthesize_design(text, prompt, cfg=args.cfg, steps=args.steps) - raw_wav = os.path.join(tmp, f"{role}_{tag}.wav") - with open(raw_wav, "wb") as f: - f.write(wav_bytes) - subprocess.run( - ["ffmpeg", "-y", "-i", raw_wav, "-acodec", "pcm_s16le", "-ar", "24000", "-ac", "1", out_wav], - check=True, - capture_output=True, - ) - wav_to_mp3(out_wav, out_mp3) - dur = wav_duration(out_mp3) - manifest.append( - f"{role}\t{tag}\t{dur:.1f}\t{prompt.replace(chr(9), ' ')}\t" - f"{text.replace(chr(9), ' ')}\t{role}/{role}_{tag}.mp3\n" - ) - print(f"ok ({time.time() - t0:.1f}s, {dur:.1f}s)") - ok += 1 - except Exception as e: - print(f"FAIL: {e}") - fail += 1 - - with open(manifest_path, "w", encoding="utf-8") as f: - f.writelines(manifest) - - print(f"\n完成: {ok} ok, {skip} skip, {fail} fail") - print(f"试听目录: {OUT_ROOT}") - print(f"清单: {manifest_path}") - print("\n选定样本后告诉我,例如: delivery v03, linxia v02") - print("我会把对应 wav 注册为参考音频,再跑全量克隆。") - - -if __name__ == "__main__": - main() diff --git a/audio_2/scripts/04_gen_tts_clone.py b/audio_2/scripts/04_gen_tts_clone.py deleted file mode 100644 index f7d21d3..0000000 --- a/audio_2/scripts/04_gen_tts_clone.py +++ /dev/null @@ -1,271 +0,0 @@ -#!/usr/bin/env python3 -""" -《林夏》TTS v5 — 选定试听样本克隆 + Style Control 表演 - -参考音频:audio_2/tts/v4_voice_samples/{role}/*.wav(每角色保留 1 条) -输出:audio_2/tts/v5_cloned/*_wav_v5.mp3 -部署:audio/mp3/tts/*_wav_v1.mp3(游戏直接可用) - -用法: - VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --force - python audio_2/scripts/04_gen_tts_clone.py --role delivery --test - python audio_2/scripts/04_gen_tts_clone.py --no-deploy -""" -import argparse -import base64 -import glob -import os -import shutil -import subprocess -import sys -import tempfile -import time - -import requests - -PROJECT_DIR = "/home/xsl/blind" -SAMPLE_DIR = f"{PROJECT_DIR}/audio_2/tts/v4_voice_samples" -OUT_DIR = f"{PROJECT_DIR}/audio_2/tts/v5_cloned" -DEPLOY_DIR = f"{PROJECT_DIR}/audio/mp3/tts" -HOST = os.environ.get("VOXCPM_HOST", "127.0.0.1") -PORT = os.environ.get("VOXCPM_PORT", "8002") -BASE_URL = f"http://{HOST}:{PORT}" - -sys.path.insert(0, f"{PROJECT_DIR}/audio") -sys.path.insert(0, f"{PROJECT_DIR}/audio_2") - -from batch_tts_voxcpm import ROLES, LINES # noqa: E402 -from voice_style_prompts import get_clone_style # noqa: E402 - -# story.js 引用但不在 LINES 中的台词 -EXTRA_LINES = [ - ( - "lv11_0030_self3y_voice_01", - "self_3y", - "哦对,今天是我来北京的第一百天。妈,我没跟你说,我自己数的。" - "这个城市好大。我走了很多路,见了很多人。我觉得我还没准备好," - "但我又觉得好像准备了很久很久了。你们不用担心我。我很好。" - "以后的我,如果你听到这条,记得要好好的。", - ), - ( - "lv11_0030_self3y_voice_02", - "self_3y", - "我今天又没睡好。不是失眠,就是睡不踏实。" - "北京这个地方,它会让你觉得你随时都要更好,随时都要更努力。" - "我在努力。但我不知道在努力什么。" - "我就想留下一条记录。今天,今天是……算了,就今天吧。", - ), - ( - "lv11_0030_self3y_voice_03", - "self_3y", - "是我。23岁的我。我设了三年后打开。" - "我不知道那时候的你怎么样了。如果你很好,就当我多虑了。" - "如果你不好——你看,你熬过来了对不对。" - "你23岁的时候,也觉得很难。但你还是过来了。" - "所以……撑住啊。", - ), - ("lv11_sys_memo_01", "linxia", "三年前今天,一条未听的录音"), -] - -os.makedirs(OUT_DIR, exist_ok=True) -os.makedirs(DEPLOY_DIR, exist_ok=True) - - -def find_selected_ref(role_key): - role_dir = os.path.join(SAMPLE_DIR, role_key) - wavs = sorted(glob.glob(os.path.join(role_dir, "*.wav"))) - if not wavs: - return None - if len(wavs) > 1: - print(f" [警告] {role_key} 有多条参考音频,使用: {os.path.basename(wavs[0])}") - return wavs[0] - - -def convert_to_wav(src, dst): - subprocess.run( - ["ffmpeg", "-y", "-i", src, "-ar", "16000", "-ac", "1", "-acodec", "pcm_s16le", dst], - check=True, - capture_output=True, - ) - - -def wav_to_base64(path): - with open(path, "rb") as f: - return base64.b64encode(f.read()).decode() - - -def apply_speed(src, speed, dst): - if abs(speed - 1.0) < 0.01: - shutil.copy2(src, dst) - return - subprocess.run( - ["ffmpeg", "-y", "-i", src, "-filter:a", f"atempo={speed}", "-acodec", "pcm_s16le", dst], - check=True, - capture_output=True, - ) - - -def wav_to_mp3(src, dst): - subprocess.run( - [ - "ffmpeg", "-y", "-i", src, - "-codec:a", "libmp3lame", "-b:a", "128k", "-ar", "24000", "-ac", "1", - dst, - ], - check=True, - capture_output=True, - ) - - -def check_server(): - try: - r = requests.get(f"{BASE_URL}/health", timeout=5) - return r.status_code == 200 and r.json().get("status") == "ok" - except Exception: - return False - - -def register_voice(wav_path): - r = requests.post( - f"{BASE_URL}/v1/voices", - json={"wav_base64": wav_to_base64(wav_path)}, - timeout=60, - ) - r.raise_for_status() - return r.json()["voice_id"] - - -def synthesize_styled(voice_id, text, style, cfg=2.0, steps=10): - payload = { - "text": text, - "style": style, - "voice_id": voice_id, - "cfg_value": cfg, - "inference_timesteps": steps, - } - r = requests.post(f"{BASE_URL}/v1/speech/styled", json=payload, timeout=180) - r.raise_for_status() - return r.content - - -def main(): - parser = argparse.ArgumentParser(description="选定样本克隆 → v5 + 部署游戏目录") - parser.add_argument("--role", help="只合成指定角色") - parser.add_argument("--test", action="store_true", help="只合成第一条") - parser.add_argument("--dry-run", action="store_true") - parser.add_argument("--force", action="store_true") - parser.add_argument("--no-deploy", action="store_true", help="不复制到 audio/mp3/tts") - parser.add_argument("--cfg", type=float, default=2.0) - parser.add_argument("--steps", type=int, default=10) - args = parser.parse_args() - - lines = LINES + EXTRA_LINES - if args.role: - lines = [(f, r, t) for f, r, t in lines if r == args.role or r.startswith(args.role)] - if args.test: - lines = lines[:1] - - roles_needed = sorted(set(r for _, r, _ in lines)) - - print(f"\n{'=' * 60}") - print(" 《林夏》TTS v5 — 试听样本克隆") - print(f" 参考: {SAMPLE_DIR}") - print(f" 输出: {OUT_DIR}") - if not args.no_deploy: - print(f" 部署: {DEPLOY_DIR} (*_wav_v1.mp3)") - print(f" 台词: {len(lines)} 条 角色: {len(roles_needed)}") - print(f"{'=' * 60}\n") - - refs = {} - for role in roles_needed: - ref = find_selected_ref(role) - if ref: - refs[role] = ref - print(f" [{role}] ← {os.path.basename(ref)}") - else: - print(f" [{role}] ✗ 未找到参考音频") - - if args.dry_run: - print() - for fname, role, text in lines: - style = get_clone_style(fname, role, text) or "(无表演修饰)" - print(f" {fname} [{role}] style={style}") - print(f" ref={'yes' if role in refs else 'NO'} text={text[:40]}...") - return - - missing = [r for r in roles_needed if r not in refs] - if missing: - print(f"\n[错误] 缺少参考音频: {', '.join(missing)}") - sys.exit(1) - - if not check_server(): - print(f"[错误] VoxCPM2 未就绪: {BASE_URL}/health") - sys.exit(1) - - tmp = tempfile.mkdtemp(prefix="voxcpm5_") - voice_ids = {} - for role, ref_path in sorted(refs.items()): - wav = os.path.join(tmp, f"{role}_ref.wav") - convert_to_wav(ref_path, wav) - print(f" 注册音色: {role} ... ", end="", flush=True) - voice_ids[role] = register_voice(wav) - print(f"ok ({voice_ids[role][:10]}...)") - - ok = skip = fail = 0 - manifest_path = os.path.join(OUT_DIR, "clone_manifest.tsv") - manifest_lines = ["filename\trole\tref\tstyle\ttext\n"] - - for i, (fname, role, text) in enumerate(lines, 1): - out_v5 = os.path.join(OUT_DIR, f"{fname}_wav_v5.mp3") - out_game = os.path.join(DEPLOY_DIR, f"{fname}_wav_v1.mp3") - style = get_clone_style(fname, role, text) - ref_name = os.path.basename(refs[role]) - manifest_lines.append( - f"{fname}\t{role}\t{ref_name}\t{(style or '自然说话').replace(chr(9), ' ')}\t" - f"{text.replace(chr(9), ' ')}\n" - ) - - if os.path.exists(out_v5) and not args.force: - print(f" [{i:3d}/{len(lines)}] SKIP {fname}") - skip += 1 - continue - - if role not in voice_ids: - print(f" [{i:3d}/{len(lines)}] MISS {fname}") - fail += 1 - continue - - print(f" [{i:3d}/{len(lines)}] {fname} [{role}] ... ", end="", flush=True) - t0 = time.time() - try: - wav_bytes = synthesize_styled( - voice_ids[role], text, style, cfg=args.cfg, steps=args.steps - ) - raw_wav = os.path.join(tmp, f"{fname}_raw.wav") - spd_wav = os.path.join(tmp, f"{fname}_spd.wav") - with open(raw_wav, "wb") as f: - f.write(wav_bytes) - speed = ROLES.get(role, {}).get("speed", 1.0) - apply_speed(raw_wav, speed, spd_wav) - wav_to_mp3(spd_wav, out_v5) - if not args.no_deploy: - shutil.copy2(out_v5, out_game) - kb = os.path.getsize(out_v5) // 1024 - print(f"ok ({time.time() - t0:.1f}s, {kb}KB)") - ok += 1 - except Exception as e: - print(f"FAIL: {e}") - fail += 1 - - with open(manifest_path, "w", encoding="utf-8") as f: - f.writelines(manifest_lines) - - print(f"\n完成: {ok} ok, {skip} skip, {fail} fail") - print(f"输出: {OUT_DIR}") - print(f"清单: {manifest_path}") - if not args.no_deploy: - print(f"游戏目录: {DEPLOY_DIR}") - - -if __name__ == "__main__": - main() diff --git a/audio_2/tts/v4_voice_samples/README.md b/audio_2/tts/v4_voice_samples/README.md deleted file mode 100644 index 7cb1b88..0000000 --- a/audio_2/tts/v4_voice_samples/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Voice Design 试听样本(v4) - -每角色 **5 条**约 **7–10 秒**试听,用不同提示词生成不同音色。 -选定后注册为 `voice/{角色}/` 参考音频,再跑全量 Style Control 克隆。 - -## 试听目录 - -``` -audio_2/tts/v4_voice_samples/ - linxia/ linxia_v01.mp3 … v05.mp3 - mom/ - azhe/ - xiaomei/ - xiaomei_drunk/ - zhounan/ - hr/ - anan/ - dorm_a/ dorm_b/ dorm_c/ - delivery/ ← 5 条均为男声,语速已调慢 - self_3y/ -``` - -完整清单(含时长与提示词):`samples_manifest.tsv` - -## 外卖小哥(delivery)变体说明 - -| 编号 | 侧重点 | -|------|--------| -| v01 | 北方男声,中低音,**语速适中偏慢**,礼貌直接 | -| v02 | 偏低沉稳,**语速慢**,熟手外卖员 | -| v03 | 普通青年男声,语速正常 | -| v04 | 略粗中音,语速适中,不催促 | -| v05 | 清爽青年音,**语速偏慢**,清楚有条理 | - -## 选定后告诉我 - -格式示例: - -``` -linxia v02, mom v01, azhe v03, delivery v02, ... -``` - -我会把对应 `.wav` 复制到 `voice/{角色}/`,再全量生成最终对白。 - -## 重新生成某角色样本 - -```bash -VOXCPM_PORT=8002 python audio_2/scripts/03_gen_voice_samples.py --role delivery --force -``` - -提示词配置:`audio_2/voice_sample_prompts.py` diff --git a/audio_2/tts/v4_voice_samples/anan/anan_v04.mp3 b/audio_2/tts/v4_voice_samples/anan/anan_v04.mp3 deleted file mode 100644 index 838f4f5..0000000 Binary files a/audio_2/tts/v4_voice_samples/anan/anan_v04.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/anan/anan_v04.wav b/audio_2/tts/v4_voice_samples/anan/anan_v04.wav deleted file mode 100644 index 06271eb..0000000 Binary files a/audio_2/tts/v4_voice_samples/anan/anan_v04.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/azhe/azhe_v03.mp3 b/audio_2/tts/v4_voice_samples/azhe/azhe_v03.mp3 deleted file mode 100644 index 91b160c..0000000 Binary files a/audio_2/tts/v4_voice_samples/azhe/azhe_v03.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/azhe/azhe_v03.wav b/audio_2/tts/v4_voice_samples/azhe/azhe_v03.wav deleted file mode 100644 index 88060cf..0000000 Binary files a/audio_2/tts/v4_voice_samples/azhe/azhe_v03.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/delivery/delivery_v04.mp3 b/audio_2/tts/v4_voice_samples/delivery/delivery_v04.mp3 deleted file mode 100644 index 54620a6..0000000 Binary files a/audio_2/tts/v4_voice_samples/delivery/delivery_v04.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/delivery/delivery_v04.wav b/audio_2/tts/v4_voice_samples/delivery/delivery_v04.wav deleted file mode 100644 index 6fbd0fa..0000000 Binary files a/audio_2/tts/v4_voice_samples/delivery/delivery_v04.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/dorm_a/dorm_a_v03.mp3 b/audio_2/tts/v4_voice_samples/dorm_a/dorm_a_v03.mp3 deleted file mode 100644 index 2181fdc..0000000 Binary files a/audio_2/tts/v4_voice_samples/dorm_a/dorm_a_v03.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/dorm_a/dorm_a_v03.wav b/audio_2/tts/v4_voice_samples/dorm_a/dorm_a_v03.wav deleted file mode 100644 index e3c9020..0000000 Binary files a/audio_2/tts/v4_voice_samples/dorm_a/dorm_a_v03.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/dorm_b/dorm_b_v02.mp3 b/audio_2/tts/v4_voice_samples/dorm_b/dorm_b_v02.mp3 deleted file mode 100644 index 47d858f..0000000 Binary files a/audio_2/tts/v4_voice_samples/dorm_b/dorm_b_v02.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/dorm_b/dorm_b_v02.wav b/audio_2/tts/v4_voice_samples/dorm_b/dorm_b_v02.wav deleted file mode 100644 index 38d08ce..0000000 Binary files a/audio_2/tts/v4_voice_samples/dorm_b/dorm_b_v02.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/dorm_c/dorm_c_v03.mp3 b/audio_2/tts/v4_voice_samples/dorm_c/dorm_c_v03.mp3 deleted file mode 100644 index f5c0b43..0000000 Binary files a/audio_2/tts/v4_voice_samples/dorm_c/dorm_c_v03.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/dorm_c/dorm_c_v03.wav b/audio_2/tts/v4_voice_samples/dorm_c/dorm_c_v03.wav deleted file mode 100644 index 533816c..0000000 Binary files a/audio_2/tts/v4_voice_samples/dorm_c/dorm_c_v03.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/hr/hr_v05.mp3 b/audio_2/tts/v4_voice_samples/hr/hr_v05.mp3 deleted file mode 100644 index 646c055..0000000 Binary files a/audio_2/tts/v4_voice_samples/hr/hr_v05.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/hr/hr_v05.wav b/audio_2/tts/v4_voice_samples/hr/hr_v05.wav deleted file mode 100644 index 2833e76..0000000 Binary files a/audio_2/tts/v4_voice_samples/hr/hr_v05.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/linxia/linxia_v05.mp3 b/audio_2/tts/v4_voice_samples/linxia/linxia_v05.mp3 deleted file mode 100644 index 94f7f88..0000000 Binary files a/audio_2/tts/v4_voice_samples/linxia/linxia_v05.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/linxia/linxia_v05.wav b/audio_2/tts/v4_voice_samples/linxia/linxia_v05.wav deleted file mode 100644 index 11176ba..0000000 Binary files a/audio_2/tts/v4_voice_samples/linxia/linxia_v05.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/mom/mom_v01.mp3 b/audio_2/tts/v4_voice_samples/mom/mom_v01.mp3 deleted file mode 100644 index 8394d61..0000000 Binary files a/audio_2/tts/v4_voice_samples/mom/mom_v01.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/mom/mom_v01.wav b/audio_2/tts/v4_voice_samples/mom/mom_v01.wav deleted file mode 100644 index 779d1ca..0000000 Binary files a/audio_2/tts/v4_voice_samples/mom/mom_v01.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/samples_manifest.tsv b/audio_2/tts/v4_voice_samples/samples_manifest.tsv deleted file mode 100644 index 8053a83..0000000 --- a/audio_2/tts/v4_voice_samples/samples_manifest.tsv +++ /dev/null @@ -1,66 +0,0 @@ -role variant seconds prompt text file -anan v01 7.4 23岁中国女性,甜亮高音女声,语速快,比闺蜜更嗲,像在酒吧里喊,背景略吵 夏夏!我在海伦斯呢!要不要过来,我请客!才两杯……好吧三杯,对面那个我给你留了位置,赶紧赶紧! anan/anan_v01.mp3 -anan v02 9.2 22岁中国女性,尖亮女声,兴奋,像在Helens里喊朋友 夏夏!我在海伦斯呢!要不要过来,我请客!才两杯……好吧三杯,对面那个我给你留了位置,赶紧赶紧! anan/anan_v02.mp3 -anan v03 10.1 24岁中国女性,偏高女声,带醉意,活泼,像夜场里发语音 夏夏!我在海伦斯呢!要不要过来,我请客!才两杯……好吧三杯,对面那个我给你留了位置,赶紧赶紧! anan/anan_v03.mp3 -anan v04 7.6 23岁中国女性,甜腻高音,快语速,像撒娇式喊话 夏夏!我在海伦斯呢!要不要过来,我请客!才两杯……好吧三杯,对面那个我给你留了位置,赶紧赶紧! anan/anan_v04.mp3 -anan v05 9.8 22岁中国女性,明亮女声,能量很高,像在嘈杂环境里说话 夏夏!我在海伦斯呢!要不要过来,我请客!才两杯……好吧三杯,对面那个我给你留了位置,赶紧赶紧! anan/anan_v05.mp3 -azhe v01 8.1 27岁中国男性,清朗偏低男声,城市口音,理性偏冷,语速平稳,用词克制,略带距离感 夏夏,我明天要出差。那个充电盒好像落你那儿了,你方便的时候帮我寄一下,地址我等下发你。 azhe/azhe_v01.mp3 -azhe v02 7.6 28岁中国男性,中低音男声,冷静直接,不多废话,像同事发工作语音 夏夏,我明天要出差。那个充电盒好像落你那儿了,你方便的时候帮我寄一下,地址我等下发你。 azhe/azhe_v02.mp3 -azhe v03 7.6 26岁中国男性,偏薄男声,语速正常,礼貌但疏离,都市青年 夏夏,我明天要出差。那个充电盒好像落你那儿了,你方便的时候帮我寄一下,地址我等下发你。 azhe/azhe_v03.mp3 -azhe v04 6.9 29岁中国男性,低沉男中音,慢语速,克制,像鼓足勇气打电话 夏夏,我明天要出差。那个充电盒好像落你那儿了,你方便的时候帮我寄一下,地址我等下发你。 azhe/azhe_v04.mp3 -azhe v05 8.5 27岁中国男性,清爽男声,平稳,略带紧张,真诚但不油 夏夏,我明天要出差。那个充电盒好像落你那儿了,你方便的时候帮我寄一下,地址我等下发你。 azhe/azhe_v05.mp3 -delivery v01 7.9 30岁中国北方男性,男声,中低音,语速适中偏慢,北方口音,礼貌直接,像外卖小哥打电话 你好,您的麻辣烫到了,我现在在您楼下。方便的话我放门口,不方便您说一声,我马上上来。 delivery/delivery_v01.mp3 -delivery v02 8.5 32岁中国北方男性,男声,偏低沉稳,语速慢,普通话带北方味,熟手外卖员通知取餐 你好,您的麻辣烫到了,我现在在您楼下。方便的话我放门口,不方便您说一声,我马上上来。 delivery/delivery_v02.mp3 -delivery v03 7.1 28岁中国男性,男声,普通青年音,语速正常,清楚有条理,送餐到了打电话 你好,您的麻辣烫到了,我现在在您楼下。方便的话我放门口,不方便您说一声,我马上上来。 delivery/delivery_v03.mp3 -delivery v04 6.3 35岁中国北方男性,男声,略粗中音,语速适中,直接但不催,外卖电话 你好,您的麻辣烫到了,我现在在您楼下。方便的话我放门口,不方便您说一声,我马上上来。 delivery/delivery_v04.mp3 -delivery v05 7.6 30岁中国男性,男声,清爽青年音,语速偏慢,礼貌清楚,放门口前确认 你好,您的麻辣烫到了,我现在在您楼下。方便的话我放门口,不方便您说一声,我马上上来。 delivery/delivery_v05.mp3 -dorm_a v01 7.1 22岁中国女性,兴奋尖亮女声,语速很快,像群里报喜,充满喜悦 夏夏我告诉你个好消息!我升职了!说来话长,我们老板走了我就顶上了,哈哈太厉害了真的! dorm_a/dorm_a_v01.mp3 -dorm_a v02 7.7 21岁中国女性,高音女声,极快语速,像刚得知好消息 夏夏我告诉你个好消息!我升职了!说来话长,我们老板走了我就顶上了,哈哈太厉害了真的! dorm_a/dorm_a_v02.mp3 -dorm_a v03 7.4 23岁中国女性,明亮女声,兴奋,像室友群里连发 夏夏我告诉你个好消息!我升职了!说来话长,我们老板走了我就顶上了,哈哈太厉害了真的! dorm_a/dorm_a_v03.mp3 -dorm_a v04 8.2 22岁中国女性,清脆女声,快,带笑,报喜语气 夏夏我告诉你个好消息!我升职了!说来话长,我们老板走了我就顶上了,哈哈太厉害了真的! dorm_a/dorm_a_v04.mp3 -dorm_a v05 7.4 20岁中国女性,年轻尖声,语速很快,像大学生群聊 夏夏我告诉你个好消息!我升职了!说来话长,我们老板走了我就顶上了,哈哈太厉害了真的! dorm_a/dorm_a_v05.mp3 -dorm_b v01 7.1 23岁中国女性,普通随和女声,中音,语速正常,像室友起哄 真的啊恭喜恭喜!太厉害了!你是不是有事啊?没事可以跟我们说,夏夏在忙吧也别硬撑。 dorm_b/dorm_b_v01.mp3 -dorm_b v02 5.5 22岁中国女性,平和女声,中等语速,像关心室友 真的啊恭喜恭喜!太厉害了!你是不是有事啊?没事可以跟我们说,夏夏在忙吧也别硬撑。 dorm_b/dorm_b_v02.mp3 -dorm_b v03 7.7 24岁中国女性,随和中音,正常语速,像群里接话 真的啊恭喜恭喜!太厉害了!你是不是有事啊?没事可以跟我们说,夏夏在忙吧也别硬撑。 dorm_b/dorm_b_v03.mp3 -dorm_b v04 10.6 23岁中国女性,略低女声,温和,像怕打扰又忍不住说 真的啊恭喜恭喜!太厉害了!你是不是有事啊?没事可以跟我们说,夏夏在忙吧也别硬撑。 dorm_b/dorm_b_v04.mp3 -dorm_b v05 9.3 22岁中国女性,普通青年女声,自然,像宿舍闲聊 真的啊恭喜恭喜!太厉害了!你是不是有事啊?没事可以跟我们说,夏夏在忙吧也别硬撑。 dorm_b/dorm_b_v05.mp3 -dorm_c v01 9.8 23岁中国女性,温柔低声女声,语速略慢,像注意到朋友沉默的室友 夏夏,你最近是不是有心事啊?我看你群里不怎么说话了。要是方便的话,可以跟我们聊聊,我们都在。 dorm_c/dorm_c_v01.mp3 -dorm_c v02 11.4 22岁中国女性,轻声女声,慢语速,体贴,像悄悄关心 夏夏,你最近是不是有心事啊?我看你群里不怎么说话了。要是方便的话,可以跟我们聊聊,我们都在。 dorm_c/dorm_c_v02.mp3 -dorm_c v03 8.2 24岁中国女性,温软中音,语速慢,像怕戳痛对方 夏夏,你最近是不是有心事啊?我看你群里不怎么说话了。要是方便的话,可以跟我们聊聊,我们都在。 dorm_c/dorm_c_v03.mp3 -dorm_c v04 9.6 23岁中国女性,低柔女声,轻声,像宿舍熄灯后说话 夏夏,你最近是不是有心事啊?我看你群里不怎么说话了。要是方便的话,可以跟我们聊聊,我们都在。 dorm_c/dorm_c_v04.mp3 -dorm_c v05 9.3 22岁中国女性,温柔女声,慢而稳,像递一杯水那样说话 夏夏,你最近是不是有心事啊?我看你群里不怎么说话了。要是方便的话,可以跟我们聊聊,我们都在。 dorm_c/dorm_c_v05.mp3 -hr v01 8.9 38岁中国女性,成熟职场女声,中音区,知性干练,疲惫的善意,像HR发工作语音 夏夏啊,离职流程你下周三之前办完哈,公积金那边记得跟进。辛苦啦,外面有合适的工作我帮你留意。 hr/hr_v01.mp3 -hr v02 11.7 40岁中国女性,沉稳职场女声,语速正常,专业但不冷漠 夏夏啊,离职流程你下周三之前办完哈,公积金那边记得跟进。辛苦啦,外面有合适的工作我帮你留意。 hr/hr_v02.mp3 -hr v03 10.3 36岁中国女性,温和职场女声,像前辈善意提醒 夏夏啊,离职流程你下周三之前办完哈,公积金那边记得跟进。辛苦啦,外面有合适的工作我帮你留意。 hr/hr_v03.mp3 -hr v04 8.7 38岁中国女性,中低音职场女声,干脆,像办完离职手续的叮嘱 夏夏啊,离职流程你下周三之前办完哈,公积金那边记得跟进。辛苦啦,外面有合适的工作我帮你留意。 hr/hr_v04.mp3 -hr v05 7.6 42岁中国女性,略哑成熟女声,阅历感,疲惫但真诚 夏夏啊,离职流程你下周三之前办完哈,公积金那边记得跟进。辛苦啦,外面有合适的工作我帮你留意。 hr/hr_v05.mp3 -linxia v01 9.8 24岁中国女性,中低音女声,声线偏薄,疲惫但清醒,克制有温度,普通话,像深夜发微信语音 你刚才发的那句话,我看了很久。其实我不是不想回你,我只是……不知道该怎么开口。 linxia/linxia_v01.mp3 -linxia v02 9.8 24岁中国女性,略带气声的中音,慢语速,柔软但有分寸,像刚下班躺床上回消息 你刚才发的那句话,我看了很久。其实我不是不想回你,我只是……不知道该怎么开口。 linxia/linxia_v02.mp3 -linxia v03 6.8 25岁中国女性,稳而轻的中音女声,有距离感但不冷,都市年轻人,普通话标准 你刚才发的那句话,我看了很久。其实我不是不想回你,我只是……不知道该怎么开口。 linxia/linxia_v03.mp3 -linxia v04 9.2 23岁中国女性,声线略低,清醒克制,字句短,像怕吵醒室友的轻声 你刚才发的那句话,我看了很久。其实我不是不想回你,我只是……不知道该怎么开口。 linxia/linxia_v04.mp3 -linxia v05 7.4 24岁中国女性,清朗中音,疲惫里藏一点温度,语速偏慢,像对自己说话 你刚才发的那句话,我看了很久。其实我不是不想回你,我只是……不知道该怎么开口。 linxia/linxia_v05.mp3 -mom v01 9.3 52岁中国女性,温厚中老年女声,音色略哑,轻微西部口音,说话慢而稳,像母亲打电话 女儿啊,妈妈今晚给你做了排骨。你在外面别总吃外卖,记得按时吃饭,累了就给家里打个电话。 mom/mom_v01.mp3 -mom v02 9.0 50岁中国女性,柔和中音,带一点鼻音,语速慢,温柔试探,像怕打扰女儿 女儿啊,妈妈今晚给你做了排骨。你在外面别总吃外卖,记得按时吃饭,累了就给家里打个电话。 mom/mom_v02.mp3 -mom v03 10.0 55岁中国女性,低沉温厚女声,轻微方言感,像回忆往事时说话 女儿啊,妈妈今晚给你做了排骨。你在外面别总吃外卖,记得按时吃饭,累了就给家里打个电话。 mom/mom_v03.mp3 -mom v04 8.4 48岁中国女性,清亮一点的中老年女声,关切但不啰嗦,母亲语气 女儿啊,妈妈今晚给你做了排骨。你在外面别总吃外卖,记得按时吃饭,累了就给家里打个电话。 mom/mom_v04.mp3 -mom v05 8.5 52岁中国女性,沙哑温声,情感克制,像深夜给女儿发长语音 女儿啊,妈妈今晚给你做了排骨。你在外面别总吃外卖,记得按时吃饭,累了就给家里打个电话。 mom/mom_v05.mp3 -self_3y v01 9.0 21岁中国女性,比林夏更亮更高的女声,刚来北京,兴奋带紧张,声音更年轻 刚来北京的时候,地铁里人挤人,我还紧张得不敢说话。但是看见国贸的灯,真的觉得一切都值得。 self_3y/self_3y_v01.mp3 -self_3y v02 7.7 20岁中国女性,明亮高音,年轻,带一点紧张,像初到北京 刚来北京的时候,地铁里人挤人,我还紧张得不敢说话。但是看见国贸的灯,真的觉得一切都值得。 self_3y/self_3y_v02.mp3 -self_3y v03 7.7 22岁中国女性,清亮女声,兴奋,像第一次看见大城市 刚来北京的时候,地铁里人挤人,我还紧张得不敢说话。但是看见国贸的灯,真的觉得一切都值得。 self_3y/self_3y_v03.mp3 -self_3y v04 8.9 21岁中国女性,偏高女声,语速快,紧张又期待,刚毕业 刚来北京的时候,地铁里人挤人,我还紧张得不敢说话。但是看见国贸的灯,真的觉得一切都值得。 self_3y/self_3y_v04.mp3 -self_3y v05 8.7 20岁中国女性,少女音,亮而轻,像给闺蜜发语音报喜 刚来北京的时候,地铁里人挤人,我还紧张得不敢说话。但是看见国贸的灯,真的觉得一切都值得。 self_3y/self_3y_v05.mp3 -xiaomei v01 7.1 24岁中国女性,明亮偏高的女声,语速快,活泼直接,像闺蜜连发语音,能量足 夏夏你怎么又不理我!我跟你说啊,今天公司发生一件超离谱的事,你必须得听,笑死我了真的! xiaomei/xiaomei_v01.mp3 -xiaomei v02 7.4 23岁中国女性,甜亮高音,语速很快,兴奋,像群里@你 夏夏你怎么又不理我!我跟你说啊,今天公司发生一件超离谱的事,你必须得听,笑死我了真的! xiaomei/xiaomei_v02.mp3 -xiaomei v03 6.9 25岁中国女性,明亮女声,语速中等偏快,直来直去,闺蜜语气 夏夏你怎么又不理我!我跟你说啊,今天公司发生一件超离谱的事,你必须得听,笑死我了真的! xiaomei/xiaomei_v03.mp3 -xiaomei v04 9.2 24岁中国女性,偏高女声,带笑说话,活泼,像分享八卦 夏夏你怎么又不理我!我跟你说啊,今天公司发生一件超离谱的事,你必须得听,笑死我了真的! xiaomei/xiaomei_v04.mp3 -xiaomei v05 6.8 22岁中国女性,清脆女声,快语速,热情,像连珠炮 夏夏你怎么又不理我!我跟你说啊,今天公司发生一件超离谱的事,你必须得听,笑死我了真的! xiaomei/xiaomei_v05.mp3 -xiaomei_drunk v01 12.0 24岁中国女性,同闺蜜音色但喝醉了,口齿略含糊,情绪起伏大,时而哭时而笑 夏夏……我跟你说啊……今天我喝多了……你别嫌我烦,阿哲他……大三那年他还追过我呢…… xiaomei_drunk/xiaomei_drunk_v01.mp3 -xiaomei_drunk v02 8.5 24岁中国女性,醉态女声,黏糊,语速忽快忽慢,带哭腔 夏夏……我跟你说啊……今天我喝多了……你别嫌我烦,阿哲他……大三那年他还追过我呢…… xiaomei_drunk/xiaomei_drunk_v02.mp3 -xiaomei_drunk v03 6.3 25岁中国女性,喝醉的女声,舌头打结,情绪上来,委屈又笑 夏夏……我跟你说啊……今天我喝多了……你别嫌我烦,阿哲他……大三那年他还追过我呢…… xiaomei_drunk/xiaomei_drunk_v03.mp3 -xiaomei_drunk v04 9.3 23岁中国女性,微醺女声,含混,像深夜酒后的语音 夏夏……我跟你说啊……今天我喝多了……你别嫌我烦,阿哲他……大三那年他还追过我呢…… xiaomei_drunk/xiaomei_drunk_v04.mp3 -xiaomei_drunk v05 9.0 24岁中国女性,醉酒后女声,鼻音重,情绪不稳定,像倾诉秘密 夏夏……我跟你说啊……今天我喝多了……你别嫌我烦,阿哲他……大三那年他还追过我呢…… xiaomei_drunk/xiaomei_drunk_v05.mp3 -zhounan v01 9.0 26岁中国男性,温和偏闷的男中音,略拘谨,语速偏慢,像很久没联系的老同学,真诚不油 今年第一次来北京出差。来之前我想着要不要找你,找了很久,才在一个校友群里看到你。你现在怎么样? zhounan/zhounan_v01.mp3 -zhounan v02 12.5 27岁中国男性,低沉男声,慢语速,略带怀旧,像回忆往事 今年第一次来北京出差。来之前我想着要不要找你,找了很久,才在一个校友群里看到你。你现在怎么样? zhounan/zhounan_v02.mp3 -zhounan v03 8.4 25岁中国男性,普通青年男声,真诚,略紧张,老同学语气 今年第一次来北京出差。来之前我想着要不要找你,找了很久,才在一个校友群里看到你。你现在怎么样? zhounan/zhounan_v03.mp3 -zhounan v04 14.4 28岁中国男性,温厚男中音,语速慢,像生日夜独自说话 今年第一次来北京出差。来之前我想着要不要找你,找了很久,才在一个校友群里看到你。你现在怎么样? zhounan/zhounan_v04.mp3 -zhounan v05 7.9 26岁中国男性,清爽男声,克制,小心翼翼,不想打扰对方 今年第一次来北京出差。来之前我想着要不要找你,找了很久,才在一个校友群里看到你。你现在怎么样? zhounan/zhounan_v05.mp3 diff --git a/audio_2/tts/v4_voice_samples/self_3y/self_3y_v03.mp3 b/audio_2/tts/v4_voice_samples/self_3y/self_3y_v03.mp3 deleted file mode 100644 index c333a74..0000000 Binary files a/audio_2/tts/v4_voice_samples/self_3y/self_3y_v03.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/self_3y/self_3y_v03.wav b/audio_2/tts/v4_voice_samples/self_3y/self_3y_v03.wav deleted file mode 100644 index 3b08a8a..0000000 Binary files a/audio_2/tts/v4_voice_samples/self_3y/self_3y_v03.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/xiaomei/xiaomei_v05.mp3 b/audio_2/tts/v4_voice_samples/xiaomei/xiaomei_v05.mp3 deleted file mode 100644 index a86afe2..0000000 Binary files a/audio_2/tts/v4_voice_samples/xiaomei/xiaomei_v05.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/xiaomei/xiaomei_v05.wav b/audio_2/tts/v4_voice_samples/xiaomei/xiaomei_v05.wav deleted file mode 100644 index 7dd7f70..0000000 Binary files a/audio_2/tts/v4_voice_samples/xiaomei/xiaomei_v05.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/xiaomei_drunk/xiaomei_drunk_v05.mp3 b/audio_2/tts/v4_voice_samples/xiaomei_drunk/xiaomei_drunk_v05.mp3 deleted file mode 100644 index a7a609c..0000000 Binary files a/audio_2/tts/v4_voice_samples/xiaomei_drunk/xiaomei_drunk_v05.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/xiaomei_drunk/xiaomei_drunk_v05.wav b/audio_2/tts/v4_voice_samples/xiaomei_drunk/xiaomei_drunk_v05.wav deleted file mode 100644 index 9e14fd3..0000000 Binary files a/audio_2/tts/v4_voice_samples/xiaomei_drunk/xiaomei_drunk_v05.wav and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/zhounan/zhounan_v05.mp3 b/audio_2/tts/v4_voice_samples/zhounan/zhounan_v05.mp3 deleted file mode 100644 index 5abdf9a..0000000 Binary files a/audio_2/tts/v4_voice_samples/zhounan/zhounan_v05.mp3 and /dev/null differ diff --git a/audio_2/tts/v4_voice_samples/zhounan/zhounan_v05.wav b/audio_2/tts/v4_voice_samples/zhounan/zhounan_v05.wav deleted file mode 100644 index e7ccac0..0000000 Binary files a/audio_2/tts/v4_voice_samples/zhounan/zhounan_v05.wav and /dev/null differ diff --git a/audio_2/tts/v5_cloned/clone_manifest.tsv b/audio_2/tts/v5_cloned/clone_manifest.tsv deleted file mode 100644 index 01df2d7..0000000 --- a/audio_2/tts/v5_cloned/clone_manifest.tsv +++ /dev/null @@ -1,178 +0,0 @@ -filename role ref style text -lv11_2103_mom_call_01 mom mom_v01.wav 自然说话 今晚煮了你爱吃的排骨,给你拍张照啊。下周五回来一趟,你高中物理老师的儿子,挺好的。 -lv11_2115_xiaomei_voice_01 xiaomei xiaomei_v05.wav 自然说话 在吗 -lv11_2115_xiaomei_voice_02 xiaomei xiaomei_v05.wav 自然说话 你被甩了我都听说了 -lv11_2115_xiaomei_voice_03 xiaomei xiaomei_v05.wav 自然说话 明天晚上喝酒,海底捞旁边那家,不许放鸽子 -lv11_2120_delivery_call_01 delivery delivery_v04.wav 自然说话 你好你的麻辣烫到了,放门口可以吗? -lv11_2130_azhe_voice_01 azhe azhe_v03.wav 自然说话 嗯……夏夏。我那个AirPods充电盒,好像落你抽屉里了。你方便的时候帮我寄一下吗,工位还要用。地址我等下发你。 -lv11_2145_hr_voice_01 hr hr_v05.wav 自然说话 夏夏啊,离职流程你下周三之前办完哈,公积金那边记得跟进。辛苦啦,外面有合适的工作我帮你留意。 -lv11_2200_anan_voice_01 anan anan_v04.wav 自然说话 夏夏!我在helens!要不要过来!我请客! -lv11_2215_dorm_a_voice_01 dorm_a dorm_a_v03.wav 自然说话 哎你们看,我今天升职了! -lv11_2215_dorm_b_voice_01 dorm_b dorm_b_v02.wav 自然说话 真的啊!恭喜恭喜!太厉害了! -lv11_2215_dorm_c_voice_01 dorm_c dorm_c_v03.wav 自然说话 厉害!那要请客啊! -lv11_2215_dorm_a_voice_02 dorm_a dorm_a_v03.wav 自然说话 哈哈哈必须的!夏夏你怎么不说话呀 -lv11_2215_dorm_b_voice_02 dorm_b dorm_b_v02.wav 自然说话 夏夏在忙吧,别打扰她了 -lv11_2245_xiaomei_voice_01_seg1 xiaomei_drunk xiaomei_drunk_v05.wav 醉态开场,黏糊 夏夏夏夏夏。你睡了吗?我跟你说,我跟你说啊……今天我喝多了…… -lv11_2245_xiaomei_voice_01_seg2 xiaomei_drunk xiaomei_drunk_v05.wav 醉态爆料,情绪上来 你别嫌我烦哈,我跟你说……其实啊……阿哲他,大三那年,他来追过我。我没答应他。我那时候就觉得他这人,呵,差点意思。 -lv11_2245_xiaomei_voice_01_seg3 xiaomei_drunk xiaomei_drunk_v05.wav 醉态解释,委屈 你跟他在一起的时候,我没说,因为说了也没意义嘛对吧。现在他甩了你,我才敢说。 -lv11_2245_xiaomei_voice_01_seg4 xiaomei_drunk xiaomei_drunk_v05.wav 醉态收尾,失落 夏夏,你听到了吗?你别恨我啊。……喂?算了。 -lv11_2300_mom_text_01 mom mom_v01.wav 自然说话 睡了吗? -lv11_2315_azhe_call_01 azhe azhe_v03.wav 电话里略紧张,像鼓足勇气 我能过去拿吗?就5分钟 -lv11_2330_zhounan_voice_01 zhounan zhounan_v05.wav 自然说话 林夏,是我,周南。你应该不记得我了吧,初三坐你后桌那个 -lv11_2345_zhounan_voice_01 zhounan zhounan_v05.wav 自然说话 其实我一直想找机会跟你说声谢谢。初三那年你借我笔记,那次考试我才没挂科。 -lv11_2345_zhounan_voice_02 zhounan zhounan_v05.wav 自然说话 后来高考,我没考好。复读了一年,去了一个二本。然后就回老家了,没什么好说的。 -lv11_2345_zhounan_voice_03 zhounan zhounan_v05.wav 自然说话 今年第一次来北京出差。来之前我想着,要不要找你。找了很久,才在一个校友群里看到你。你现在过得怎么样? -lv11_2345_zhounan_voice_04 zhounan zhounan_v05.wav 自然说话 今天我生日。本来就想跟你说一声,对不起这么晚。 -lv11_0015_mom_call_01 mom mom_v01.wav 担心女儿,语气轻但着急 夏夏,你不接电话我有点担心。妈妈知道你工作忙,你早点睡。 -lv11_0200_mom_voice_01_seg1 mom mom_v01.wav 温柔试探,像怕打扰女儿 夏夏。妈妈知道你今天电话不接。妈妈不催你,就是想跟你说一件事。 -lv11_0200_mom_voice_01_seg2 mom mom_v01.wav 平静追忆 你24了对吧。妈妈24那年——你应该没听我说过—— -lv11_0200_mom_voice_01_seg3 mom mom_v01.wav 克制回忆痛苦 那时候妈妈在广州,给一个香港老板做秘书,1995年。那年我也被分手过。也被开除过。一模一样的春天。 -lv11_0200_mom_voice_01_seg4 mom mom_v01.wav 释然 那年我哭得特别难看。后来呢?后来就没什么后来了。我回了老家,认识了你爸,生了你。 -lv11_0200_mom_voice_01_seg5 mom mom_v01.wav 深沉情感,声音更轻 我跟你说这个不是想跟你说什么都会过去——我想跟你说,那年夏天我没死,是因为我外婆每天晚上都给我打一个电话。 -lv11_0200_mom_voice_01_seg6 mom mom_v01.wav 极简温柔 她不说什么,就问我今天吃饭了没。 -lv11_0200_mom_voice_01_seg7 mom mom_v01.wav 不要求回应的 tender 我现在打给你,你不接也没事。妈妈给你发个语音,你什么时候想听就听。你不用回我。 -lv11_0200_mom_voice_01_seg8 mom mom_v01.wav 几乎微笑的晚安 你今天接了好多电话吧。妈妈不打扰你了。晚安。 -v2_msg01_linxia_auto linxia linxia_v05.wav 疲惫克制,轻声 嗯……好。 -v2_msg02_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 好啊,明天不见不散。 -v2_msg02_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 再说吧。 -v2_msg02_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 你怎么知道的啊? -v2_msg02_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 嗯。 -v2_msg02_react_warm xiaomei xiaomei_v05.wav 语气更温暖积极 行!那我叫上安安!老地方见!别放鸽子啊! -v2_msg02_react_cold xiaomei xiaomei_v05.wav 语气更冷淡 ……好吧。你要是改主意了随时说。 -v2_msg02_react_curious xiaomei xiaomei_v05.wav 语气好奇,略追问 还不是阿哲自己发朋友圈!你不知道吗?他发了又秒删…… -v2_msg02_react_silent xiaomei xiaomei_v05.wav 语气犹豫,像等对方回应 ??你还活着吗哈哈。好了不烦你了,有事找我。 -v2_msg02_react_tap xiaomei xiaomei_v05.wav 自然说话 嗯是什么意思啊哈哈!行吧你休息。 -v2_msg02_r3_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 他……发了什么? -v2_msg02_r3_react xiaomei xiaomei_v05.wav 自然说话 就发了一张你们以前的照片,配了一句'值得'。两分钟就删了。 -v2_msg03_linxia_auto linxia linxia_v05.wav 疲惫克制,轻声 好,我下来拿。 -v2_msg04_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 你那边……还好吗。 -v2_msg04_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 知道了。明天寄。 -v2_msg04_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 你怎么不自己来拿。 -v2_msg04_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 好。 -v2_msg04_react_warm azhe azhe_v03.wav 语气更温暖积极 我……挺好的。你呢? -v2_msg04_react_cold azhe azhe_v03.wav 语气更冷淡 嗯……谢了。 -v2_msg04_react_curious azhe azhe_v03.wav 语气好奇,略追问 我……不太方便过去。 -v2_msg04_react_silent azhe azhe_v03.wav 语气犹豫,像等对方回应 那……我晚点再说吧。 -v2_msg04_react_tap azhe azhe_v03.wav 自然说话 谢谢。 -v2_msg04_r3w_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 不太好。 -v2_msg04_r3w_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 挺好的。 -v2_msg04_r3w_react_warm azhe azhe_v03.wav 语气更温暖积极 ……对不起。 -v2_msg04_r3w_react_cold azhe azhe_v03.wav 语气更冷淡 那就好。 -v2_msg04_r3w_react_silent azhe azhe_v03.wav 语气犹豫,像等对方回应 ……那,晚安。 -v2_msg04_r3c_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 为什么。 -v2_msg04_r3c_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 算了,不问了。 -v2_msg04_r3c_react_curious azhe azhe_v03.wav 语气好奇,略追问 我……没什么。你寄吧。 -v2_msg05_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 谢谢王姐。 -v2_msg05_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 好的,知道了。 -v2_msg05_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 王姐……有什么建议吗? -v2_msg05_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 好。 -v2_msg05_react_warm hr hr_v05.wav 语气更温暖积极 别客气。你还年轻,出去看看也好。这行业你知道的。 -v2_msg05_react_curious hr hr_v05.wav 语气好奇,略追问 你想听真话?别在这行耗了。你有本事,去试试别的。 -v2_msg06_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 在哪儿啊?我看看吧。 -v2_msg06_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 不了,你们玩好。 -v2_msg06_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 你喝了多少了? -v2_msg06_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 嗯。 -v2_msg06_react_warm anan anan_v04.wav 语气更温暖积极 对面那个!我给你留了位置!赶紧赶紧! -v2_msg06_react_cold anan anan_v04.wav 语气更冷淡 好吧!那我给你寄一杯! -v2_msg06_react_curious anan anan_v04.wav 语气好奇,略追问 才两杯!我清醒得很!……好吧三杯。快来! -v2_msg06_react_silent anan anan_v04.wav 语气犹豫,像等对方回应 喂?信号不好吗?好吧以后再约! -v2_msg06_react_tap anan anan_v04.wav 自然说话 嗯是来还是不来啊!算了回头聊! -v2_msg07_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 恭喜恭喜!太厉害了! -v2_msg07_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 恭喜。 -v2_msg07_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 怎么升的啊?讲讲! -v2_msg07_react_warm dorm_a dorm_a_v03.wav 语气更温暖积极 哈哈谢谢!我请客!你最近怎么样啊? -v2_msg07_react_curious dorm_a dorm_a_v03.wav 语气好奇,略追问 说来话长!我们老板走了我就顶上了哈哈 -v2_msg07_react_tap dorm_b dorm_b_v02.wav 自然说话 林夏发表情了哈哈 -v2_msg07_r3_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 挺好的~你请客我去! -v2_msg07_r3_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 还行。 -v2_msg07_r3_react_cold dorm_b dorm_b_v02.wav 语气更冷淡 你是不是有事啊?没事可以跟我们说 -v2_msg09_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 小美……你没事吧。 -v2_msg09_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 我知道了。 -v2_msg09_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 你……为什么现在才说。 -v2_msg09_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 嗯。 -v2_msg09_react_warm xiaomei_drunk xiaomei_drunk_v05.wav 语气更温暖积极 我没事……我就是喝多了想告诉你……你别怪我。 -v2_msg09_react_curious xiaomei_drunk xiaomei_drunk_v05.wav 语气好奇,略追问 因为你今天……我怕你以后恨我…… -v2_msg09_react_tap xiaomei_drunk xiaomei_drunk_v05.wav 自然说话 你不生气吗?算了……当我没说。 -v2_msg09_r3_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 我不恨你。 -v2_msg09_r3_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 我得想想。 -v2_msg09_r3_react_warm xiaomei_drunk xiaomei_drunk_v05.wav 语气更温暖积极 谢谢你……谢谢你林夏。 -v2_msg09_r3_react_cold xiaomei_drunk xiaomei_drunk_v05.wav 语气更冷淡 好……对不起。 -v2_msg09_r3_react_silent_q xiaomei_drunk xiaomei_drunk_v05.wav 语气犹豫,像等对方回应 你还在吗? -v2_msg10_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 没有,怎么了? -v2_msg10_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 嗯,要睡了。 -v2_msg10_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 妈……你能打电话给我吗? -v2_msg10_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 嗯。 -v2_msg10_react_warm mom mom_v01.wav 语气更温暖积极 没事,就是想起来问一下。今天怎么样? -v2_msg10_react_cold mom mom_v01.wav 语气更冷淡 好,早点睡。 -v2_msg10_react_silent mom mom_v01.wav 语气犹豫,像等对方回应 看到了回一下。 -v2_msg10_react_tap mom mom_v01.wav 自然说话 嗯就是睡了?晚安。 -v2_msg10_call_mom mom mom_v01.wav 电话里听到女儿声音不对,担心但克制 怎么了夏夏?你声音不对。 -v2_msg10_call_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 没什么……就是有点累。 -v2_msg10_call_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 妈,我辞职了。 -v2_msg10_call_react_warm mom mom_v01.wav 语气更温暖积极 累了就回家歇几天。妈煮了排骨。 -v2_msg10_call_react_curious mom mom_v01.wav 语气好奇,略追问 辞了就辞了。回来再说。 -v2_msg10_call_react_silent mom mom_v01.wav 语气犹豫,像等对方回应 不想说就不说。妈在这呢。 -v2_msg10_rw_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 还好。 -v2_msg10_rw_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 不太好。 -v2_msg10_rw_react_warm mom mom_v01.wav 语气更温暖积极 那就好。别太晚了。 -v2_msg10_rw_react_curious mom mom_v01.wav 语气好奇,略追问 怎么了? -v2_msg11_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 可以。但只有5分钟。 -v2_msg11_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 不方便。我明天寄给你。 -v2_msg11_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 为什么非要今天来? -v2_msg11_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 不了。 -v2_msg11_react_warm azhe azhe_v03.wav 语气更温暖积极 好,我马上过来。谢谢。 -v2_msg11_react_cold azhe azhe_v03.wav 语气更冷淡 好吧……那谢了。 -v2_msg11_react_curious azhe azhe_v03.wav 语气好奇,略追问 我……明天要出差。就5分钟。 -v2_msg11_react_tap azhe azhe_v03.wav 电话里略紧张,像鼓足勇气 好。 -v2_msg12_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 周南!你还记得我啊! -v2_msg12_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 嗯,你好。 -v2_msg12_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 你怎么有我微信的? -v2_msg12_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 嗯……好久不见。 -v2_msg12_react_warm zhounan zhounan_v05.wav 语气更温暖积极 当然记得。你是我们班最安静的那个。 -v2_msg12_react_cold zhounan zhounan_v05.wav 语气更冷淡 嗯……好久不见。你现在在哪呢? -v2_msg12_react_curious zhounan zhounan_v05.wav 语气好奇,略追问 你忘了吗?毕业那天你加的我。不过你可能早忘了哈哈。 -v2_msg12_react_silent zhounan zhounan_v05.wav 语气犹豫,像等对方回应 你是不是不记得我了?没关系的。就是突然想说声嗨。 -v2_msg12_react_tap zhounan zhounan_v05.wav 自然说话 是啊,好久不见。 -v2_msg13_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 一个人在北京,还好吗? -v2_msg13_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 你讲了好多。 -v2_msg13_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 ……生日快乐。 -v2_msg13_linxia_tap linxia linxia_v05.wav 极简回应,中性敷衍 嗯,我都听到了。 -v2_msg13_react_warm zhounan zhounan_v05.wav 语气更温暖积极 还行吧。习惯了。你呢?你在北京过得好吗? -v2_msg13_react_cold zhounan zhounan_v05.wav 语气更冷淡 是吗?不好意思,话太多了。 -v2_msg13_react_curious zhounan zhounan_v05.wav 语气好奇,略追问 谢谢你。你是今天第一个跟我说的。 -v2_msg13_react_silent zhounan zhounan_v05.wav 语气犹豫,像等对方回应 不好意思突然说这么多……那,晚安。 -v2_msg13_react_tap zhounan zhounan_v05.wav 自然说话 嗯。谢谢你听我说。 -v2_msg13_r3_linxia_warm linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 不太好。今天也是我的坏日子。 -v2_msg13_r3_linxia_cold linxia linxia_v05.wav 语气冷淡疏离,短促 还行吧。 -v2_msg13_r3_linxia_curious linxia linxia_v05.wav 语气好奇,略带追问 你为什么突然联系我? -v2_msg13_r3_react_warm zhounan zhounan_v05.wav 语气更温暖积极 那我们算是难兄难妹了。 -v2_msg13_r3_react_cold zhounan zhounan_v05.wav 语气更冷淡 那就好。 -v2_msg13_r3_react_curious zhounan zhounan_v05.wav 语气好奇,略追问 因为……今天生日嘛,想起以前的事。想起你。 -v2_msg14_linxia_auto linxia linxia_v05.wav 疲惫克制,轻声 嗯,我没事。 -v2_msg14_mom_ask mom mom_v01.wav 自然说话 真的没事? -v2_msg14_react_linked mom mom_v01.wav 自然说话 好。那早点睡。妈爱你。 -v2_msg14_react_unlinked mom mom_v01.wav 自然说话 你今天怎么都不理妈妈?出什么事了吗? -v2_ending_e_zhounan zhounan zhounan_v05.wav 轻快一点,像看到希望 那我下次出差来北京,请你吃饭好不好。 -v2_linxia_generic_hmm linxia linxia_v05.wav 自然说话 嗯。 -v2_linxia_generic_ok linxia linxia_v05.wav 自然说话 好。 -v2_linxia_generic_warm_ok linxia linxia_v05.wav 语气温暖开放,柔软但有分寸 嗯~好啊。 -v2_linxia_generic_cold_know linxia linxia_v05.wav 语气冷淡疏离,短促 知道了。 -v2_linxia_generic_cold_fine linxia linxia_v05.wav 语气冷淡疏离,短促 行吧。 -v2_linxia_generic_curious linxia linxia_v05.wav 语气好奇,略带追问 嗯? -v2_linxia_generic_then linxia linxia_v05.wav 自然说话 然后呢? -v2_ending_a_linxia linxia linxia_v05.wav 结局独白,轻声自语 明天再说。 -v2_ending_b_linxia linxia linxia_v05.wav 结局独白,轻声自语 寄出去了。 -v2_ending_c_linxia linxia linxia_v05.wav 结局独白,轻声自语 今晚就这样。 -v2_ending_d_linxia linxia linxia_v05.wav 结局独白,轻声自语 早上好。 -v2_ending_e_linxia linxia linxia_v05.wav 结局独白,轻声自语 好。 -v2_sys_wait_reply linxia linxia_v05.wav 平静清晰,像对自己说话 等待回复。 -v2_sys_paused linxia linxia_v05.wav 平静清晰,像对自己说话 游戏已暂停。单击继续,三指点击退出。 -v2_sys_content_warning linxia linxia_v05.wav 平静清晰,像对自己说话 本游戏涉及孤独、家庭关系等情感话题,请在舒适的状态下体验。 -v2_sys_hotline linxia linxia_v05.wav 平静清晰,像对自己说话 如需倾诉,全国心理援助热线,400-161-9995。 -v2_msg10_rw_react_silent mom mom_v01.wav 语气犹豫,像等对方回应 那早点睡啊。 -v2_msg10_call_react_down mom mom_v01.wav 电话里听到女儿声音不对,担心但克制 没事就好。早点睡。 -v2_msg11_r3_react_silent azhe azhe_v03.wav 语气犹豫,像等对方回应 行吧,那我不来了。 -lv11_0030_self3y_voice_01 self_3y self_3y_v03.wav 兴奋带紧张,像刚来北京 哦对,今天是我来北京的第一百天。妈,我没跟你说,我自己数的。这个城市好大。我走了很多路,见了很多人。我觉得我还没准备好,但我又觉得好像准备了很久很久了。你们不用担心我。我很好。以后的我,如果你听到这条,记得要好好的。 -lv11_0030_self3y_voice_02 self_3y self_3y_v03.wav 疲惫但假装坚强 我今天又没睡好。不是失眠,就是睡不踏实。北京这个地方,它会让你觉得你随时都要更好,随时都要更努力。我在努力。但我不知道在努力什么。我就想留下一条记录。今天,今天是……算了,就今天吧。 -lv11_0030_self3y_voice_03 self_3y self_3y_v03.wav 平静有力,像对未来的自己说话 是我。23岁的我。我设了三年后打开。我不知道那时候的你怎么样了。如果你很好,就当我多虑了。如果你不好——你看,你熬过来了对不对。你23岁的时候,也觉得很难。但你还是过来了。所以……撑住啊。 -lv11_sys_memo_01 linxia linxia_v05.wav 平静清晰,像对自己说话 三年前今天,一条未听的录音 diff --git a/audio_2/tts/v5_cloned/lv11_0015_mom_call_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0015_mom_call_01_wav_v5.mp3 deleted file mode 100644 index b2d9a8a..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0015_mom_call_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_01_wav_v5.mp3 deleted file mode 100644 index 2aeefad..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_02_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_02_wav_v5.mp3 deleted file mode 100644 index dc84f5d..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_02_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_03_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_03_wav_v5.mp3 deleted file mode 100644 index 73ebcb3..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0030_self3y_voice_03_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg1_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg1_wav_v5.mp3 deleted file mode 100644 index 0d2cfdf..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg1_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg2_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg2_wav_v5.mp3 deleted file mode 100644 index 5a0f56a..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg2_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg3_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg3_wav_v5.mp3 deleted file mode 100644 index 2a1550c..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg3_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg4_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg4_wav_v5.mp3 deleted file mode 100644 index 45d3825..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg4_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg5_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg5_wav_v5.mp3 deleted file mode 100644 index ec55605..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg5_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg6_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg6_wav_v5.mp3 deleted file mode 100644 index 40f8ba6..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg6_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg7_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg7_wav_v5.mp3 deleted file mode 100644 index f851bbd..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg7_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg8_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg8_wav_v5.mp3 deleted file mode 100644 index 6bc690f..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_0200_mom_voice_01_seg8_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2103_mom_call_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2103_mom_call_01_wav_v5.mp3 deleted file mode 100644 index 9b3df48..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2103_mom_call_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_01_wav_v5.mp3 deleted file mode 100644 index baedeaf..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_02_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_02_wav_v5.mp3 deleted file mode 100644 index 46508e6..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_02_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_03_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_03_wav_v5.mp3 deleted file mode 100644 index ea9f2de..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2115_xiaomei_voice_03_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2120_delivery_call_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2120_delivery_call_01_wav_v5.mp3 deleted file mode 100644 index e4e8be8..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2120_delivery_call_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2130_azhe_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2130_azhe_voice_01_wav_v5.mp3 deleted file mode 100644 index 5094e57..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2130_azhe_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2145_hr_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2145_hr_voice_01_wav_v5.mp3 deleted file mode 100644 index bade663..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2145_hr_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2200_anan_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2200_anan_voice_01_wav_v5.mp3 deleted file mode 100644 index cc7a446..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2200_anan_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2215_dorm_a_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2215_dorm_a_voice_01_wav_v5.mp3 deleted file mode 100644 index d43e2f2..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2215_dorm_a_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2215_dorm_a_voice_02_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2215_dorm_a_voice_02_wav_v5.mp3 deleted file mode 100644 index 9335247..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2215_dorm_a_voice_02_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2215_dorm_b_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2215_dorm_b_voice_01_wav_v5.mp3 deleted file mode 100644 index 25113ab..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2215_dorm_b_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2215_dorm_b_voice_02_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2215_dorm_b_voice_02_wav_v5.mp3 deleted file mode 100644 index 508e113..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2215_dorm_b_voice_02_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2215_dorm_c_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2215_dorm_c_voice_01_wav_v5.mp3 deleted file mode 100644 index d435e95..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2215_dorm_c_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg1_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg1_wav_v5.mp3 deleted file mode 100644 index afefbe2..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg1_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg2_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg2_wav_v5.mp3 deleted file mode 100644 index 02ca1e2..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg2_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg3_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg3_wav_v5.mp3 deleted file mode 100644 index e006268..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg3_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg4_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg4_wav_v5.mp3 deleted file mode 100644 index 11ee9dc..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2245_xiaomei_voice_01_seg4_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2300_mom_text_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2300_mom_text_01_wav_v5.mp3 deleted file mode 100644 index d4f467e..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2300_mom_text_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2315_azhe_call_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2315_azhe_call_01_wav_v5.mp3 deleted file mode 100644 index 2fc01e0..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2315_azhe_call_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2330_zhounan_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2330_zhounan_voice_01_wav_v5.mp3 deleted file mode 100644 index 9237449..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2330_zhounan_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_01_wav_v5.mp3 deleted file mode 100644 index 4eff38b..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_02_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_02_wav_v5.mp3 deleted file mode 100644 index 39eb117..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_02_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_03_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_03_wav_v5.mp3 deleted file mode 100644 index 0a64f6a..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_03_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_04_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_04_wav_v5.mp3 deleted file mode 100644 index c6fe3bc..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_2345_zhounan_voice_04_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/lv11_sys_memo_01_wav_v5.mp3 b/audio_2/tts/v5_cloned/lv11_sys_memo_01_wav_v5.mp3 deleted file mode 100644 index ab9ab7c..0000000 Binary files a/audio_2/tts/v5_cloned/lv11_sys_memo_01_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_ending_a_linxia_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_ending_a_linxia_wav_v5.mp3 deleted file mode 100644 index 4941b47..0000000 Binary files a/audio_2/tts/v5_cloned/v2_ending_a_linxia_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_ending_b_linxia_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_ending_b_linxia_wav_v5.mp3 deleted file mode 100644 index 34ed92a..0000000 Binary files a/audio_2/tts/v5_cloned/v2_ending_b_linxia_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_ending_c_linxia_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_ending_c_linxia_wav_v5.mp3 deleted file mode 100644 index 6b5a27c..0000000 Binary files a/audio_2/tts/v5_cloned/v2_ending_c_linxia_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_ending_d_linxia_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_ending_d_linxia_wav_v5.mp3 deleted file mode 100644 index 19c913d..0000000 Binary files a/audio_2/tts/v5_cloned/v2_ending_d_linxia_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_ending_e_linxia_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_ending_e_linxia_wav_v5.mp3 deleted file mode 100644 index 39185f7..0000000 Binary files a/audio_2/tts/v5_cloned/v2_ending_e_linxia_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_ending_e_zhounan_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_ending_e_zhounan_wav_v5.mp3 deleted file mode 100644 index 9e0511b..0000000 Binary files a/audio_2/tts/v5_cloned/v2_ending_e_zhounan_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_linxia_generic_cold_fine_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_linxia_generic_cold_fine_wav_v5.mp3 deleted file mode 100644 index 3a8ccc9..0000000 Binary files a/audio_2/tts/v5_cloned/v2_linxia_generic_cold_fine_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_linxia_generic_cold_know_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_linxia_generic_cold_know_wav_v5.mp3 deleted file mode 100644 index 371ae7c..0000000 Binary files a/audio_2/tts/v5_cloned/v2_linxia_generic_cold_know_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_linxia_generic_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_linxia_generic_curious_wav_v5.mp3 deleted file mode 100644 index 5144d0d..0000000 Binary files a/audio_2/tts/v5_cloned/v2_linxia_generic_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_linxia_generic_hmm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_linxia_generic_hmm_wav_v5.mp3 deleted file mode 100644 index 6aa72d5..0000000 Binary files a/audio_2/tts/v5_cloned/v2_linxia_generic_hmm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_linxia_generic_ok_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_linxia_generic_ok_wav_v5.mp3 deleted file mode 100644 index c4adeea..0000000 Binary files a/audio_2/tts/v5_cloned/v2_linxia_generic_ok_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_linxia_generic_then_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_linxia_generic_then_wav_v5.mp3 deleted file mode 100644 index ef6f74c..0000000 Binary files a/audio_2/tts/v5_cloned/v2_linxia_generic_then_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_linxia_generic_warm_ok_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_linxia_generic_warm_ok_wav_v5.mp3 deleted file mode 100644 index a40b8c1..0000000 Binary files a/audio_2/tts/v5_cloned/v2_linxia_generic_warm_ok_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg01_linxia_auto_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg01_linxia_auto_wav_v5.mp3 deleted file mode 100644 index bd6813a..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg01_linxia_auto_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 9e9097e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_linxia_curious_wav_v5.mp3 deleted file mode 100644 index 7c0770d..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_linxia_tap_wav_v5.mp3 deleted file mode 100644 index 7370060..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 3175be0..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_r3_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_r3_linxia_curious_wav_v5.mp3 deleted file mode 100644 index eb0f92b..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_r3_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_r3_react_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_r3_react_wav_v5.mp3 deleted file mode 100644 index 0b248a0..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_r3_react_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_react_cold_wav_v5.mp3 deleted file mode 100644 index 41c92d6..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_react_curious_wav_v5.mp3 deleted file mode 100644 index efe99f0..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_react_silent_wav_v5.mp3 deleted file mode 100644 index 54019a8..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_react_tap_wav_v5.mp3 deleted file mode 100644 index bdd2676..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg02_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg02_react_warm_wav_v5.mp3 deleted file mode 100644 index f94430e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg02_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg03_linxia_auto_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg03_linxia_auto_wav_v5.mp3 deleted file mode 100644 index b85eec1..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg03_linxia_auto_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 282eff1..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_linxia_curious_wav_v5.mp3 deleted file mode 100644 index 581aa53..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_linxia_tap_wav_v5.mp3 deleted file mode 100644 index 35dbfcc..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 885fbb5..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_r3c_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_r3c_linxia_curious_wav_v5.mp3 deleted file mode 100644 index 75e491f..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_r3c_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_r3c_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_r3c_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 889ede2..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_r3c_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_r3c_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_r3c_react_curious_wav_v5.mp3 deleted file mode 100644 index c555279..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_r3c_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_r3w_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_r3w_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 69a5816..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_r3w_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_r3w_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_r3w_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 4ec2c5a..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_r3w_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_r3w_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_r3w_react_cold_wav_v5.mp3 deleted file mode 100644 index aefe725..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_r3w_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_r3w_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_r3w_react_silent_wav_v5.mp3 deleted file mode 100644 index 520fea7..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_r3w_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_r3w_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_r3w_react_warm_wav_v5.mp3 deleted file mode 100644 index c0d85d3..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_r3w_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_react_cold_wav_v5.mp3 deleted file mode 100644 index 15c9be6..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_react_curious_wav_v5.mp3 deleted file mode 100644 index 9465d82..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_react_silent_wav_v5.mp3 deleted file mode 100644 index a7a44fe..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_react_tap_wav_v5.mp3 deleted file mode 100644 index c504c84..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg04_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg04_react_warm_wav_v5.mp3 deleted file mode 100644 index f11dc98..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg04_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg05_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg05_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 576e504..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg05_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg05_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg05_linxia_curious_wav_v5.mp3 deleted file mode 100644 index 9f53497..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg05_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg05_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg05_linxia_tap_wav_v5.mp3 deleted file mode 100644 index 69a9a43..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg05_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg05_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg05_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 3c11bd4..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg05_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg05_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg05_react_curious_wav_v5.mp3 deleted file mode 100644 index 4d4d024..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg05_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg05_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg05_react_warm_wav_v5.mp3 deleted file mode 100644 index 177a776..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg05_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 1704575..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_linxia_curious_wav_v5.mp3 deleted file mode 100644 index a42bde4..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_linxia_tap_wav_v5.mp3 deleted file mode 100644 index 0ee3427..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 944e12e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_react_cold_wav_v5.mp3 deleted file mode 100644 index 6ed5ebf..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_react_curious_wav_v5.mp3 deleted file mode 100644 index 347a77f..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_react_silent_wav_v5.mp3 deleted file mode 100644 index a6f7330..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_react_tap_wav_v5.mp3 deleted file mode 100644 index 5bb9ab0..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg06_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg06_react_warm_wav_v5.mp3 deleted file mode 100644 index 81029e7..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg06_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 28bd0cd..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_linxia_curious_wav_v5.mp3 deleted file mode 100644 index ba0e4c1..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_linxia_warm_wav_v5.mp3 deleted file mode 100644 index f1d9c59..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_r3_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_r3_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 2a3e482..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_r3_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_r3_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_r3_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 37f03e1..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_r3_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_r3_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_r3_react_cold_wav_v5.mp3 deleted file mode 100644 index 76398a7..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_r3_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_react_curious_wav_v5.mp3 deleted file mode 100644 index bb7a78e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_react_tap_wav_v5.mp3 deleted file mode 100644 index b811cd4..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg07_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg07_react_warm_wav_v5.mp3 deleted file mode 100644 index 35ae795..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg07_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_linxia_cold_wav_v5.mp3 deleted file mode 100644 index d286823..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_linxia_curious_wav_v5.mp3 deleted file mode 100644 index b8b0006..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_linxia_tap_wav_v5.mp3 deleted file mode 100644 index 27fb3b2..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 969e424..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_r3_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_r3_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 2e5e9eb..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_r3_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_r3_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_r3_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 91a81c2..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_r3_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_r3_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_r3_react_cold_wav_v5.mp3 deleted file mode 100644 index 16d1172..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_r3_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_r3_react_silent_q_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_r3_react_silent_q_wav_v5.mp3 deleted file mode 100644 index 840a078..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_r3_react_silent_q_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_r3_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_r3_react_warm_wav_v5.mp3 deleted file mode 100644 index ac799b5..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_r3_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_react_curious_wav_v5.mp3 deleted file mode 100644 index db41b6e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_react_tap_wav_v5.mp3 deleted file mode 100644 index 7195f9b..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg09_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg09_react_warm_wav_v5.mp3 deleted file mode 100644 index 7e4d612..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg09_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_call_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_call_linxia_curious_wav_v5.mp3 deleted file mode 100644 index 2ec5d0c..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_call_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_call_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_call_linxia_warm_wav_v5.mp3 deleted file mode 100644 index cf545d4..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_call_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_call_mom_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_call_mom_wav_v5.mp3 deleted file mode 100644 index b54bdbf..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_call_mom_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_call_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_call_react_curious_wav_v5.mp3 deleted file mode 100644 index 1db41f0..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_call_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_call_react_down_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_call_react_down_wav_v5.mp3 deleted file mode 100644 index 55f8596..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_call_react_down_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_call_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_call_react_silent_wav_v5.mp3 deleted file mode 100644 index 495627d..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_call_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_call_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_call_react_warm_wav_v5.mp3 deleted file mode 100644 index 230cea2..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_call_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 9d00177..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_linxia_curious_wav_v5.mp3 deleted file mode 100644 index 4009613..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_linxia_tap_wav_v5.mp3 deleted file mode 100644 index a50c803..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 646721e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_react_cold_wav_v5.mp3 deleted file mode 100644 index 437cb8e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_react_silent_wav_v5.mp3 deleted file mode 100644 index 44bfcfd..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_react_tap_wav_v5.mp3 deleted file mode 100644 index ac5f172..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_react_warm_wav_v5.mp3 deleted file mode 100644 index f166235..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_rw_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_rw_linxia_curious_wav_v5.mp3 deleted file mode 100644 index ddf2c68..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_rw_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_rw_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_rw_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 9ba9672..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_rw_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_rw_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_rw_react_curious_wav_v5.mp3 deleted file mode 100644 index 56145fd..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_rw_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_rw_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_rw_react_silent_wav_v5.mp3 deleted file mode 100644 index 116685c..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_rw_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg10_rw_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg10_rw_react_warm_wav_v5.mp3 deleted file mode 100644 index 2b81a63..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg10_rw_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 3c05ddb..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_linxia_curious_wav_v5.mp3 deleted file mode 100644 index e636e2a..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_linxia_tap_wav_v5.mp3 deleted file mode 100644 index 7cb85e1..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 2480496..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_r3_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_r3_react_silent_wav_v5.mp3 deleted file mode 100644 index 3c73acb..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_r3_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_react_cold_wav_v5.mp3 deleted file mode 100644 index 3a800aa..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_react_curious_wav_v5.mp3 deleted file mode 100644 index beb146e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_react_tap_wav_v5.mp3 deleted file mode 100644 index 8f35746..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg11_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg11_react_warm_wav_v5.mp3 deleted file mode 100644 index 200cf5c..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg11_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 6eb5aab..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_linxia_curious_wav_v5.mp3 deleted file mode 100644 index b20d8a2..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_linxia_tap_wav_v5.mp3 deleted file mode 100644 index 4267fca..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 370e851..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_react_cold_wav_v5.mp3 deleted file mode 100644 index 499a3f8..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_react_curious_wav_v5.mp3 deleted file mode 100644 index 959c121..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_react_silent_wav_v5.mp3 deleted file mode 100644 index 4706be8..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_react_tap_wav_v5.mp3 deleted file mode 100644 index 64551db..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg12_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg12_react_warm_wav_v5.mp3 deleted file mode 100644 index 27adbab..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg12_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 49093b9..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_linxia_curious_wav_v5.mp3 deleted file mode 100644 index 5d6b956..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_linxia_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_linxia_tap_wav_v5.mp3 deleted file mode 100644 index e3552ab..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_linxia_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 4cd2f01..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_cold_wav_v5.mp3 deleted file mode 100644 index 3834fdb..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_curious_wav_v5.mp3 deleted file mode 100644 index 6b848c5..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_warm_wav_v5.mp3 deleted file mode 100644 index 2c5854e..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_r3_linxia_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_r3_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_r3_react_cold_wav_v5.mp3 deleted file mode 100644 index e98a740..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_r3_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_r3_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_r3_react_curious_wav_v5.mp3 deleted file mode 100644 index e0b26c4..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_r3_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_r3_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_r3_react_warm_wav_v5.mp3 deleted file mode 100644 index 69197fa..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_r3_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_react_cold_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_react_cold_wav_v5.mp3 deleted file mode 100644 index c4fe873..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_react_cold_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_react_curious_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_react_curious_wav_v5.mp3 deleted file mode 100644 index aa8180a..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_react_curious_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_react_silent_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_react_silent_wav_v5.mp3 deleted file mode 100644 index 9a66267..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_react_silent_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_react_tap_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_react_tap_wav_v5.mp3 deleted file mode 100644 index 2e50c46..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_react_tap_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg13_react_warm_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg13_react_warm_wav_v5.mp3 deleted file mode 100644 index d7f7524..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg13_react_warm_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg14_linxia_auto_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg14_linxia_auto_wav_v5.mp3 deleted file mode 100644 index 4913b4f..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg14_linxia_auto_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg14_mom_ask_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg14_mom_ask_wav_v5.mp3 deleted file mode 100644 index db66a13..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg14_mom_ask_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg14_react_linked_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg14_react_linked_wav_v5.mp3 deleted file mode 100644 index 9bec9f4..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg14_react_linked_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_msg14_react_unlinked_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_msg14_react_unlinked_wav_v5.mp3 deleted file mode 100644 index 78cb2fa..0000000 Binary files a/audio_2/tts/v5_cloned/v2_msg14_react_unlinked_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_sys_content_warning_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_sys_content_warning_wav_v5.mp3 deleted file mode 100644 index 5925bc0..0000000 Binary files a/audio_2/tts/v5_cloned/v2_sys_content_warning_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_sys_hotline_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_sys_hotline_wav_v5.mp3 deleted file mode 100644 index 9b669bf..0000000 Binary files a/audio_2/tts/v5_cloned/v2_sys_hotline_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_sys_paused_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_sys_paused_wav_v5.mp3 deleted file mode 100644 index a0e928d..0000000 Binary files a/audio_2/tts/v5_cloned/v2_sys_paused_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/tts/v5_cloned/v2_sys_wait_reply_wav_v5.mp3 b/audio_2/tts/v5_cloned/v2_sys_wait_reply_wav_v5.mp3 deleted file mode 100644 index afa807a..0000000 Binary files a/audio_2/tts/v5_cloned/v2_sys_wait_reply_wav_v5.mp3 and /dev/null differ diff --git a/audio_2/voice_sample_prompts.py b/audio_2/voice_sample_prompts.py deleted file mode 100644 index 6814e90..0000000 --- a/audio_2/voice_sample_prompts.py +++ /dev/null @@ -1,156 +0,0 @@ -""" -《林夏》Voice Design 试听样本 — 每角色 5 种音色变体 + 统一试听文本 - -用途:生成约 10 秒试听,用户选定后注册为 voice/{角色}/ 参考音频,再全量克隆。 -""" - -# 每角色统一试听文本(约 10 秒) -AUDITION_TEXT = { - "linxia": ( - "你刚才发的那句话,我看了很久。" - "其实我不是不想回你,我只是……不知道该怎么开口。" - ), - "mom": ( - "女儿啊,妈妈今晚给你做了排骨。" - "你在外面别总吃外卖,记得按时吃饭,累了就给家里打个电话。" - ), - "azhe": ( - "夏夏,我明天要出差。" - "那个充电盒好像落你那儿了,你方便的时候帮我寄一下,地址我等下发你。" - ), - "xiaomei": ( - "夏夏你怎么又不理我!我跟你说啊,今天公司发生一件超离谱的事," - "你必须得听,笑死我了真的!" - ), - "xiaomei_drunk": ( - "夏夏……我跟你说啊……今天我喝多了……" - "你别嫌我烦,阿哲他……大三那年他还追过我呢……" - ), - "zhounan": ( - "今年第一次来北京出差。来之前我想着要不要找你," - "找了很久,才在一个校友群里看到你。你现在怎么样?" - ), - "hr": ( - "夏夏啊,离职流程你下周三之前办完哈,公积金那边记得跟进。" - "辛苦啦,外面有合适的工作我帮你留意。" - ), - "anan": ( - "夏夏!我在海伦斯呢!要不要过来,我请客!" - "才两杯……好吧三杯,对面那个我给你留了位置,赶紧赶紧!" - ), - "dorm_a": ( - "夏夏我告诉你个好消息!我升职了!说来话长," - "我们老板走了我就顶上了,哈哈太厉害了真的!" - ), - "dorm_b": ( - "真的啊恭喜恭喜!太厉害了!" - "你是不是有事啊?没事可以跟我们说,夏夏在忙吧也别硬撑。" - ), - "dorm_c": ( - "夏夏,你最近是不是有心事啊?我看你群里不怎么说话了。" - "要是方便的话,可以跟我们聊聊,我们都在。" - ), - "delivery": ( - "你好,您的麻辣烫到了,我现在在您楼下。" - "方便的话我放门口,不方便您说一声,我马上上来。" - ), - "self_3y": ( - "刚来北京的时候,地铁里人挤人,我还紧张得不敢说话。" - "但是看见国贸的灯,真的觉得一切都值得。" - ), -} - -# 每角色 5 种 Voice Design 变体(编号 v01–v05,供试听挑选) -ROLE_VOICE_VARIANTS = { - "linxia": [ - "24岁中国女性,中低音女声,声线偏薄,疲惫但清醒,克制有温度,普通话,像深夜发微信语音", - "24岁中国女性,略带气声的中音,慢语速,柔软但有分寸,像刚下班躺床上回消息", - "25岁中国女性,稳而轻的中音女声,有距离感但不冷,都市年轻人,普通话标准", - "23岁中国女性,声线略低,清醒克制,字句短,像怕吵醒室友的轻声", - "24岁中国女性,清朗中音,疲惫里藏一点温度,语速偏慢,像对自己说话", - ], - "mom": [ - "52岁中国女性,温厚中老年女声,音色略哑,轻微西部口音,说话慢而稳,像母亲打电话", - "50岁中国女性,柔和中音,带一点鼻音,语速慢,温柔试探,像怕打扰女儿", - "55岁中国女性,低沉温厚女声,轻微方言感,像回忆往事时说话", - "48岁中国女性,清亮一点的中老年女声,关切但不啰嗦,母亲语气", - "52岁中国女性,沙哑温声,情感克制,像深夜给女儿发长语音", - ], - "azhe": [ - "27岁中国男性,清朗偏低男声,城市口音,理性偏冷,语速平稳,用词克制,略带距离感", - "28岁中国男性,中低音男声,冷静直接,不多废话,像同事发工作语音", - "26岁中国男性,偏薄男声,语速正常,礼貌但疏离,都市青年", - "29岁中国男性,低沉男中音,慢语速,克制,像鼓足勇气打电话", - "27岁中国男性,清爽男声,平稳,略带紧张,真诚但不油", - ], - "xiaomei": [ - "24岁中国女性,明亮偏高的女声,语速快,活泼直接,像闺蜜连发语音,能量足", - "23岁中国女性,甜亮高音,语速很快,兴奋,像群里@你", - "25岁中国女性,明亮女声,语速中等偏快,直来直去,闺蜜语气", - "24岁中国女性,偏高女声,带笑说话,活泼,像分享八卦", - "22岁中国女性,清脆女声,快语速,热情,像连珠炮", - ], - "xiaomei_drunk": [ - "24岁中国女性,同闺蜜音色但喝醉了,口齿略含糊,情绪起伏大,时而哭时而笑", - "24岁中国女性,醉态女声,黏糊,语速忽快忽慢,带哭腔", - "25岁中国女性,喝醉的女声,舌头打结,情绪上来,委屈又笑", - "23岁中国女性,微醺女声,含混,像深夜酒后的语音", - "24岁中国女性,醉酒后女声,鼻音重,情绪不稳定,像倾诉秘密", - ], - "zhounan": [ - "26岁中国男性,温和偏闷的男中音,略拘谨,语速偏慢,像很久没联系的老同学,真诚不油", - "27岁中国男性,低沉男声,慢语速,略带怀旧,像回忆往事", - "25岁中国男性,普通青年男声,真诚,略紧张,老同学语气", - "28岁中国男性,温厚男中音,语速慢,像生日夜独自说话", - "26岁中国男性,清爽男声,克制,小心翼翼,不想打扰对方", - ], - "hr": [ - "38岁中国女性,成熟职场女声,中音区,知性干练,疲惫的善意,像HR发工作语音", - "40岁中国女性,沉稳职场女声,语速正常,专业但不冷漠", - "36岁中国女性,温和职场女声,像前辈善意提醒", - "38岁中国女性,中低音职场女声,干脆,像办完离职手续的叮嘱", - "42岁中国女性,略哑成熟女声,阅历感,疲惫但真诚", - ], - "anan": [ - "23岁中国女性,甜亮高音女声,语速快,比闺蜜更嗲,像在酒吧里喊,背景略吵", - "22岁中国女性,尖亮女声,兴奋,像在Helens里喊朋友", - "24岁中国女性,偏高女声,带醉意,活泼,像夜场里发语音", - "23岁中国女性,甜腻高音,快语速,像撒娇式喊话", - "22岁中国女性,明亮女声,能量很高,像在嘈杂环境里说话", - ], - "dorm_a": [ - "22岁中国女性,兴奋尖亮女声,语速很快,像群里报喜,充满喜悦", - "21岁中国女性,高音女声,极快语速,像刚得知好消息", - "23岁中国女性,明亮女声,兴奋,像室友群里连发", - "22岁中国女性,清脆女声,快,带笑,报喜语气", - "20岁中国女性,年轻尖声,语速很快,像大学生群聊", - ], - "dorm_b": [ - "23岁中国女性,普通随和女声,中音,语速正常,像室友起哄", - "22岁中国女性,平和女声,中等语速,像关心室友", - "24岁中国女性,随和中音,正常语速,像群里接话", - "23岁中国女性,略低女声,温和,像怕打扰又忍不住说", - "22岁中国女性,普通青年女声,自然,像宿舍闲聊", - ], - "dorm_c": [ - "23岁中国女性,温柔低声女声,语速略慢,像注意到朋友沉默的室友", - "22岁中国女性,轻声女声,慢语速,体贴,像悄悄关心", - "24岁中国女性,温软中音,语速慢,像怕戳痛对方", - "23岁中国女性,低柔女声,轻声,像宿舍熄灯后说话", - "22岁中国女性,温柔女声,慢而稳,像递一杯水那样说话", - ], - "delivery": [ - "30岁中国北方男性,男声,中低音,语速适中偏慢,北方口音,礼貌直接,像外卖小哥打电话", - "32岁中国北方男性,男声,偏低沉稳,语速慢,普通话带北方味,熟手外卖员通知取餐", - "28岁中国男性,男声,普通青年音,语速正常,清楚有条理,送餐到了打电话", - "35岁中国北方男性,男声,略粗中音,语速适中,直接但不催,外卖电话", - "30岁中国男性,男声,清爽青年音,语速偏慢,礼貌清楚,放门口前确认", - ], - "self_3y": [ - "21岁中国女性,比林夏更亮更高的女声,刚来北京,兴奋带紧张,声音更年轻", - "20岁中国女性,明亮高音,年轻,带一点紧张,像初到北京", - "22岁中国女性,清亮女声,兴奋,像第一次看见大城市", - "21岁中国女性,偏高女声,语速快,紧张又期待,刚毕业", - "20岁中国女性,少女音,亮而轻,像给闺蜜发语音报喜", - ], -} diff --git a/audio_2/voice_style_prompts.py b/audio_2/voice_style_prompts.py deleted file mode 100644 index e49ad5e..0000000 --- a/audio_2/voice_style_prompts.py +++ /dev/null @@ -1,177 +0,0 @@ -""" -《林夏》角色 Voice Design 提示词 - -纯提示词生成音色,不使用 reference_wav_path。 -API: POST /v1/speech/styled { text, style } (不传 voice_id) - -每个角色有独立的「音色描述」;同角色不同台词仅叠加「表演修饰」。 -""" - -# ── 角色音色(Voice Design 核心:决定“谁在说”) ───────────── -# 男声角色:azhe / zhounan / delivery — 必须含「男声/男性」 -ROLE_VOICE_DESIGN = { - "linxia": ( - "24岁中国女性,中低音女声,声线偏薄但稳定," - "疲惫但清醒,克制有温度,普通话,像深夜发微信语音" - ), - "mom": ( - "52岁中国女性,温厚的中老年女声,音色略哑," - "轻微西部口音,说话慢而稳,像母亲打电话" - ), - "azhe": ( - "27岁中国男性,清朗偏低男声,城市口音," - "理性偏冷,语速平稳,用词克制,略带距离感" - ), - "xiaomei": ( - "24岁中国女性,明亮偏高的女声,语速快," - "活泼直接,像闺蜜连发语音,能量足" - ), - "xiaomei_drunk": ( - "24岁中国女性,同闺蜜音色但喝醉了," - "口齿略含糊,情绪起伏大,时而哭时而笑" - ), - "zhounan": ( - "26岁中国男性,温和偏闷的男中音,略拘谨," - "语速偏慢,像很久没联系的老同学,真诚不油" - ), - "hr": ( - "38岁中国女性,成熟职场女声,中音区," - "知性干练,疲惫的善意,像HR发工作语音" - ), - "anan": ( - "23岁中国女性,甜亮高音女声,语速快," - "比闺蜜更嗲,像在酒吧里喊,背景略吵" - ), - "dorm_a": ( - "22岁中国女性,兴奋尖亮女声,语速很快," - "像群里报喜,充满喜悦" - ), - "dorm_b": ( - "23岁中国女性,普通随和女声,中音," - "语速正常,像室友起哄" - ), - "dorm_c": ( - "23岁中国女性,温柔低声女声," - "语速略慢,像注意到朋友沉默的室友" - ), - "delivery": ( - "30岁中国北方男性,男声,中低音," - "语速适中偏慢,北方口音,礼貌直接,像外卖小哥打电话" - ), - "self_3y": ( - "21岁中国女性,比林夏更亮更高的女声," - "刚来北京,兴奋带紧张,声音更年轻" - ), -} - -# ── 表演修饰(同角色内:决定“怎么说”) ───────────────────── -LINXIA_PERFORMANCE = { - "_warm": "语气温暖开放,柔软但有分寸", - "_cold": "语气冷淡疏离,短促", - "_curious": "语气好奇,略带追问", - "_tap": "极简回应,中性敷衍", - "_auto": "疲惫克制,轻声", - "_silent": "极度退缩,气声很重", - "ending_": "结局独白,轻声自语", - "sys_": "平静清晰,像对自己说话", -} - -MOM_SEGMENT_PERFORMANCE = { - "seg1": "温柔试探,像怕打扰女儿", - "seg2": "平静追忆", - "seg3": "克制回忆痛苦", - "seg4": "释然", - "seg5": "深沉情感,声音更轻", - "seg6": "极简温柔", - "seg7": "不要求回应的 tender", - "seg8": "几乎微笑的晚安", -} - -ZHOUNAN_SEGMENT_PERFORMANCE = { - "_seg1": "真诚回忆,略带感激", - "_seg2": "自嘲平淡", - "_seg3": "小心翼翼", - "_seg4": "生日夜的孤独", -} - -XIAOMEI_DRUNK_PERFORMANCE = { - "seg1": "醉态开场,黏糊", - "seg2": "醉态爆料,情绪上来", - "seg3": "醉态解释,委屈", - "seg4": "醉态收尾,失落", -} - - -def _performance(filename: str, role: str) -> str | None: - name = filename.lower() - - if role == "linxia": - for key, perf in LINXIA_PERFORMANCE.items(): - if key in name: - return perf - - if role == "mom" and "mom_voice_01" in name: - for seg, perf in MOM_SEGMENT_PERFORMANCE.items(): - if seg in name: - return perf - - if role == "zhounan" and "2345_zhounan" in name: - for seg, perf in ZHOUNAN_SEGMENT_PERFORMANCE.items(): - if seg in name: - return perf - - if role == "xiaomei_drunk": - for seg, perf in XIAOMEI_DRUNK_PERFORMANCE.items(): - if seg in name: - return perf - - if "_react_warm" in name or "_r3_react_warm" in name: - return "语气更温暖积极" - if "_react_cold" in name or "_r3_react_cold" in name: - return "语气更冷淡" - if "_react_curious" in name: - return "语气好奇,略追问" - if "_react_silent" in name: - return "语气犹豫,像等对方回应" - - if role == "mom": - if "v2_msg10_call" in name or name.endswith("_call_mom"): - return "电话里听到女儿声音不对,担心但克制" - if "0015_mom_call" in name: - return "担心女儿,语气轻但着急" - - if role == "azhe" and ("2315_azhe_call" in name or "v2_msg11" in name): - return "电话里略紧张,像鼓足勇气" - - if "ending_e" in name and role == "zhounan": - return "轻快一点,像看到希望" - - return None - - -def get_clone_style(filename: str, role: str, text: str) -> str: - """Style Control 克隆模式:仅返回表演修饰,音色由参考音频提供。""" - perf = _performance(filename, role) - if perf: - return perf - if role == "self_3y": - if "voice_01" in filename: - return "兴奋带紧张,像刚来北京" - if "voice_02" in filename: - return "疲惫但假装坚强" - if "voice_03" in filename: - return "平静有力,像对未来的自己说话" - return "" - - -def get_style(filename: str, role: str, text: str) -> str: - """返回 Voice Design 完整提示词(音色 + 可选表演)。""" - voice = ROLE_VOICE_DESIGN.get(role, ROLE_VOICE_DESIGN["linxia"]) - perf = _performance(filename, role) - if perf: - return f"{voice},{perf}" - return voice - - -# 兼容旧名 -get_voice_design = get_style diff --git a/audio_2/角色语音风格提示词.md b/audio_2/角色语音风格提示词.md deleted file mode 100644 index 3a872d8..0000000 --- a/audio_2/角色语音风格提示词.md +++ /dev/null @@ -1,74 +0,0 @@ -# 《林夏》角色语音提示词 - -> **现行生产(v5)**:参考 wav 锚定音色 + `get_clone_style()` 表演修饰 → `04_gen_tts_clone.py` -> **试听选音色(v4)**:Voice Design 纯提示词 → `03_gen_voice_samples.py` -> **详细状态**:`audio_2/项目状态说明.md` - ---- - -## 1. 三阶段关系 - -| 阶段 | 脚本 | 音色来源 | 状态 | -|------|------|----------|------| -| v4 试听 | `03_gen_voice_samples.py` | Voice Design 提示词(无参考) | 已选定 13 角色参考 | -| **v5 克隆** | `04_gen_tts_clone.py` | 选定 wav + 表演修饰 | **游戏正在使用** | -| v3 纯设计 | `02_gen_tts_voice_design.py` | 仅提示词 | 已废弃 | - -v5 克隆时**不再**叠加 `ROLE_VOICE_DESIGN` 音色描述,音色由 `v4_voice_samples/` 中选定 wav 决定。 - ---- - -## 2. 已选定参考音色(v4 试听结果) - -| 角色 | 文件 | 性别 | -|------|------|------| -| linxia | `linxia_v05.wav` | 女 | -| mom | `mom_v01.wav` | 女 | -| azhe | `azhe_v03.wav` | 男 | -| xiaomei | `xiaomei_v05.wav` | 女 | -| xiaomei_drunk | `xiaomei_drunk_v05.wav` | 女 | -| zhounan | `zhounan_v05.wav` | 男 | -| hr | `hr_v05.wav` | 女 | -| anan | `anan_v04.wav` | 女 | -| dorm_a/b/c | `v03` / `v02` / `v03` | 女 | -| delivery | `delivery_v04.wav` | **男** | -| self_3y | `self_3y_v03.wav` | 女 | - -路径:`audio_2/tts/v4_voice_samples/{角色}/` · 副本:`voice/{角色}/{角色}_ref.wav` - ---- - -## 3. 表演修饰(v5 克隆时使用) - -由 `audio_2/voice_style_prompts.py` → `get_clone_style()` 按文件名返回,例如: - -- 林夏 `_warm` / `_cold` / `_curious` / `ending_` / `sys_` -- 妈妈长语音 `seg1`–`seg8`、周南 `seg1`–`seg4`、小美醉 `seg1`–`seg4` -- self-3y 三版:`voice_01` 兴奋带紧张 / `voice_02` 疲惫假装坚强 / `voice_03` 平静有力 - ---- - -## 4. Voice Design 提示词(v4 试听用) - -试听变体配置:`audio_2/voice_sample_prompts.py` → `ROLE_VOICE_VARIANTS` -统一试听文本:`AUDITION_TEXT`(每角色约 10 秒) - -重新生成某角色试听: - -```bash -VOXCPM_PORT=8002 python audio_2/scripts/03_gen_voice_samples.py --role delivery --force -``` - -选定后替换 `v4_voice_samples/{role}/` 中 wav,再跑: - -```bash -VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --role delivery --force -``` - ---- - -## 5. 注意事项 - -1. **Voice Design 音色会漂移**——因此正式版必须「试听选定 → 克隆锚定」。 -2. **男声角色**:`azhe`、`zhounan`、`delivery`(delivery 语速已调慢,后处理倍率 1.00)。 -3. **游戏仅加载** `audio/mp3/tts/*_wav_v1.mp3`。 diff --git a/audio_2/项目状态说明.md b/audio_2/项目状态说明.md deleted file mode 100644 index da435e7..0000000 --- a/audio_2/项目状态说明.md +++ /dev/null @@ -1,235 +0,0 @@ -# 《林夏》音频制作 — 当前状态说明 - -> 更新日期:2026-05-23 -> 本文档记录 TTS 音色选型、全量生成、游戏部署的**现行状态**,便于下次继续迭代。 - ---- - -## 1. 一句话总结 - -**游戏当前使用的是 v5 克隆音色**:从 Voice Design 试听样本中选定参考音频 → VoxCPM2 Style Control 克隆 → 部署到 `audio/mp3/tts/*_wav_v1.mp3`。 -`audio/mp3/` 已清理,仅保留游戏引用的 **184** 个文件。 - ---- - -## 2. 游戏实际加载哪些音频 - -游戏代码在 `game/js/story.js`、`game/js/engine.js`,根路径: - -``` -../audio/mp3/ -├── tts/ 对白(169 条,游戏引用) -├── music/ BGM、铃声 -├── sfx/ 音效 -└── ambience/ 环境音 -``` - -### 命名规则(重要) - -| 文件名 | 游戏是否使用 | -|--------|-------------| -| `*_wav_v1.mp3` | **是** — 全部对白、系统语音都用这种 | -| `*_mp3_v1.mp3` | **否** — 旧流水线遗留,已全部删除 | - -后缀里的 `wav` 表示「用 WAV 参考音色生成的 v1 版」,文件格式仍是 MP3。 - -### 示例 - -``` -game/js/story.js → npc('lv11_0015_mom_call_01_wav_v1.mp3') -实际文件 → audio/mp3/tts/lv11_0015_mom_call_01_wav_v1.mp3 -``` - -**不需要改 `story.js`**,只要更新 `audio/mp3/tts/` 里对应的 `*_wav_v1.mp3` 即可。 - ---- - -## 3. TTS 服务 - -| 项目 | 路径 / 值 | -|------|-----------| -| 服务目录 | `/home/xsl/tts-server/` | -| 启动脚本 | `VOXCPM_PORT=8002 VOXCPM_ENABLE_DENOISER=0 bash /home/xsl/tts-server/start-voxcpm.sh` | -| 端口 | **8002**(8000 被 head3d 占用) | -| 健康检查 | `curl http://127.0.0.1:8002/health` | -| 主要接口 | `POST /v1/voices` 注册参考音频 | -| | `POST /v1/speech/styled` 合成(`voice_id` + `style` = 克隆;无 `voice_id` = Voice Design) | - ---- - -## 4. 音色演进(v1 → v5) - -| 版本 | 目录 | 方式 | 状态 | -|------|------|------|------| -| v1 | `audio_1/tts/v1_voxcpm2/` | 旧参考音频直接克隆,无 style | 已被 v5 替代 | -| v2 | `audio_2/tts/v2_styled/`(已不在磁盘) | 旧参考 + Style Control 表演 | 已废弃 | -| v3 | `audio_2/tts/v3_voice_design/`(已不在磁盘) | 纯 Voice Design,无参考 | 已废弃 | -| v4 | `audio_2/tts/v4_voice_samples/` | 每角色 5 条试听,用户挑选 | **保留选定样本** | -| **v5** | `audio_2/tts/v5_cloned/` | 选定样本克隆 + 表演修饰 | **当前正式版** | -| 游戏 | `audio/mp3/tts/*_wav_v1.mp3` | v5 自动部署副本 | **游戏正在使用** | - ---- - -## 5. 各角色选定的参考音色(v4 试听挑选) - -参考文件位于 `audio_2/tts/v4_voice_samples/{角色}/`,每角色仅保留 1 条 `.wav`: - -| 角色 | 选定文件 | 性别 | -|------|----------|------| -| linxia | `linxia_v05.wav` | 女 | -| mom | `mom_v01.wav` | 女 | -| azhe | `azhe_v03.wav` | 男 | -| xiaomei | `xiaomei_v05.wav` | 女 | -| xiaomei_drunk | `xiaomei_drunk_v05.wav` | 女 | -| zhounan | `zhounan_v05.wav` | 男 | -| hr | `hr_v05.wav` | 女 | -| anan | `anan_v04.wav` | 女 | -| dorm_a | `dorm_a_v03.wav` | 女 | -| dorm_b | `dorm_b_v02.wav` | 女 | -| dorm_c | `dorm_c_v03.wav` | 女 | -| delivery | `delivery_v04.wav` | **男** | -| self_3y | `self_3y_v03.wav` | 女 | - -副本已同步到 `voice/{角色}/{角色}_ref.wav`(`xiaomei_drunk` → `voice/xiaomei/xiaomei_drunk_ref.wav`,`self_3y` → `voice/linxia/self_3y_ref.wav`)。 - ---- - -## 6. v5 全量生成结果 - -- **177 条** MP3:`audio_2/tts/v5_cloned/*_wav_v5.mp3` -- **177 条**已部署:`audio/mp3/tts/*_wav_v1.mp3` -- 生成清单:`audio_2/tts/v5_cloned/clone_manifest.tsv` - -来源台词表:`audio/batch_tts_voxcpm.py` 中 `LINES`(173 条)+ 脚本内 `EXTRA_LINES`(4 条): - -| 额外文件 | 角色 | 说明 | -|----------|------|------| -| `lv11_0030_self3y_voice_01/02/03` | self_3y | 三年前录音三版 | -| `lv11_sys_memo_01` | linxia | 系统提示「三年前今天…」 | - -克隆时**只用表演修饰**(warm/cold/分段等),音色完全由参考 wav 决定。配置见 `audio_2/voice_style_prompts.py` 中 `get_clone_style()`。 - ---- - -## 7. 目录结构速查 - -``` -blind/ -├── game/js/story.js 游戏剧情 + 音频引用 -├── game/js/engine.js 系统语音、结局、BGM -├── audio/ -│ ├── batch_tts_voxcpm.py 台词表 LINES + 角色语速 ROLES -│ └── mp3/ 游戏运行时音频(184 文件,已清理) -│ ├── tts/ 169 条对白(游戏引用) -│ ├── music/ -│ ├── sfx/ -│ └── ambience/ -├── voice/ 各角色参考音频(含 v5 选定副本) -└── audio_2/ - ├── 项目状态说明.md ← 本文档 - ├── 角色语音风格提示词.md Voice Design 说明(历史参考) - ├── voice_style_prompts.py 表演修饰 + Voice Design 提示词 - ├── voice_sample_prompts.py v4 试听:5 变体/角色 + 统一试听文本 - ├── scripts/ - │ ├── 01_gen_tts_styled.py v2 Style Control(旧) - │ ├── 02_gen_tts_voice_design.py v3 Voice Design(旧) - │ ├── 03_gen_voice_samples.py v4 生成试听样本 - │ └── 04_gen_tts_clone.py v5 克隆 + 部署游戏 ★ - └── tts/ - ├── v4_voice_samples/ 选定参考音色(每角色 1 wav + mp3) - └── v5_cloned/ 正式产物 + clone_manifest.tsv -``` - ---- - -## 8. 常用命令 - -### 启动 TTS - -```bash -VOXCPM_PORT=8002 VOXCPM_ENABLE_DENOISER=0 bash /home/xsl/tts-server/start-voxcpm.sh -curl http://127.0.0.1:8002/health -``` - -### 重跑全量克隆(改参考音频或提示词后) - -```bash -cd /home/xsl/blind -VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --force -``` - -- 输出:`audio_2/tts/v5_cloned/*_wav_v5.mp3` -- 自动覆盖:`audio/mp3/tts/*_wav_v1.mp3` - -### 只重跑某角色 - -```bash -VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --role mom --force -``` - -### 重新生成某角色试听(换提示词挑音色) - -```bash -VOXCPM_PORT=8002 python audio_2/scripts/03_gen_voice_samples.py --role delivery --force -``` - -### 预览任务不合成 - -```bash -python audio_2/scripts/04_gen_tts_clone.py --dry-run -``` - ---- - -## 9. 其他音频服务(非 TTS) - -| 用途 | 位置 | -|------|------| -| 音乐 / 音效生成 | `/home/xsl/tools/ACE-Step-1.5` | -| Stable Audio | `/home/xsl/tools/stable-audio-tools` | -| UI 短音效 | Web Audio(浏览器内合成) | - -VoxCPM2 **不能**用提示词生成敲门、心跳等 SFX,只能做人声 TTS。 - ---- - -## 10. 已知注意点 - -1. **Voice Design 音色不稳定**:同角色各条可能漂移,因此最终方案是「试听选定 → 克隆锚定」。 -2. **外卖小哥语速**:`delivery` 提示词已调慢,`ROLES["delivery"]["speed"]` 已从 1.20 改为 **1.00**。 -3. **男声角色**:`azhe`、`zhounan`、`delivery`。 -4. **重新清理未使用音频**:扫描 `game/js/*.js` 与 `audio/mp3/` 对比删除;当前已对齐(184 = 184)。 -5. **改游戏引用**:若将来改用 `_wav_v5.mp3` 等新后缀,需批量改 `story.js` / `engine.js`;目前无需改动。 - ---- - -## 11. 下次可继续的事 - -- [ ] 实机/playtest 听一遍各角色,标记需重跑的台词或角色 -- [ ] 若某角色不满意:改 `voice_sample_prompts.py` → 重跑 `03` 挑选 → 替换 `v4_voice_samples/{role}/` → 重跑 `04` -- [ ] 微调单条表演:改 `voice_style_prompts.py` 中 `_performance` 规则 → `--role xxx --force` - ---- - -## 12. 快速验证游戏音频是否正常 - -```bash -# 游戏引用的文件是否都存在 -python3 - <<'PY' -import re -from pathlib import Path -root = Path("/home/xsl/blind") -text = "".join((root/"game/js/story.js").read_text() + (root/"game/js/engine.js").read_text()) -refs = set() -for m in re.finditer(r'\$\{(MUS|SFX|AMB|T)\}/([^`\']+\.mp3)', text): - sub = {'MUS':'music','SFX':'sfx','AMB':'ambience','T':'tts'}[m.group(1)] - refs.add(root/f"audio/mp3/{sub}/{m.group(2)}") -for m in re.finditer(r"(?:npc|lx|rx)\('([^']+\.mp3)'\)", text): - refs.add(root/f"audio/mp3/tts/{m.group(1)}") -missing = [r for r in refs if not r.exists()] -print(f"引用 {len(refs)} 缺失 {len(missing)}") -for p in sorted(missing): print(" MISSING:", p.relative_to(root)) -PY -``` - -预期输出:`缺失 0`。 diff --git a/game1/index.html b/game1/index.html deleted file mode 100644 index 0eb54dc..0000000 --- a/game1/index.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - 林夏 - - - -
- -
-

林夏

-
- 今晚 16 条消息
- 你接谁,不接谁
- 决定明天的自己 -
-
-
操 作 说 明
- -
-
来电时
-
单击 / 右滑接听
-
左滑 / 双击拒接
-
- -
-
收到消息
-
单击播放
-
双击 / 左滑跳过
-
- -
-
选择回复
-
单击简单回应
-
右滑温暖回应
-
左滑冷淡回应
-
上滑追问
-
下滑沉默
-
双击不回复
-
- -
-
播放中
-
双击跳过
-
长按重播
-
- -
-
随时可用
-
两指长按暂停
-
三指点击退出(暂停后)
-
长按播报未读数
-
-
- -
· 轻触屏幕开始 ·
-
- 建议关灯 · 戴上耳机
- 按你的节奏来 -
-
- 本游戏涉及孤独、家庭关系等情感话题
- 请在舒适的状态下体验 -
-
- -
-
-
- - - - - - - - - - - diff --git a/game1/js/audio.js b/game1/js/audio.js deleted file mode 100644 index 50b5c27..0000000 --- a/game1/js/audio.js +++ /dev/null @@ -1,283 +0,0 @@ -// audio.js — 音频管理器 + 合成 UI 音效 - -class AudioManager { - constructor() { - this._ctx = null; - this._master = null; - this._voiceQueue = []; - this._voiceEl = null; - this._ringEl = null; - this._bgmEl = null; - this._ambEl = null; - this._preloaded = {}; - } - - // ── 初始化(必须在用户手势后调用)── - async init() { - this._ctx = new (window.AudioContext || window.webkitAudioContext)(); - if (this._ctx.state === 'suspended') await this._ctx.resume(); - this._master = this._ctx.createGain(); - this._master.gain.value = 1.0; - this._master.connect(this._ctx.destination); - } - - // ── 合成短音(UI 反馈音效)── - synth({ freq = 440, freq2 = null, dur = 100, type = 'sine', vol = 0.3 } = {}) { - if (!this._ctx) return; - const t = this._ctx.currentTime; - const d = dur / 1000; - - const osc = this._ctx.createOscillator(); - const gain = this._ctx.createGain(); - - osc.type = type; - osc.frequency.setValueAtTime(freq, t); - if (freq2 != null) { - osc.frequency.linearRampToValueAtTime(freq2, t + d); - } - - gain.gain.setValueAtTime(vol, t); - gain.gain.setValueAtTime(vol, t + d * 0.75); - gain.gain.linearRampToValueAtTime(0, t + d); - - osc.connect(gain); - gain.connect(this._master); - osc.start(t); - osc.stop(t + d + 0.05); - } - - // ── 预加载短音效 ── - async preload(key, url) { - if (this._preloaded[key]) return; - try { - const res = await fetch(url); - const buf = await res.arrayBuffer(); - this._preloaded[key] = await this._ctx.decodeAudioData(buf); - } catch (e) { - console.warn('[Audio] preload failed:', key, e); - } - } - - // ── 播放预加载音效 ── - playFX(key, { vol = 1.0, loop = false } = {}) { - const buf = this._preloaded[key]; - if (!buf) return null; - const src = this._ctx.createBufferSource(); - src.buffer = buf; - src.loop = loop; - const gain = this._ctx.createGain(); - gain.gain.value = vol; - src.connect(gain); - gain.connect(this._master); - src.start(); - return { src, gain, stop: () => { try { src.stop(); } catch (_) {} } }; - } - - // ── 铃声(循环)── - async startRingtone(url) { - this.stopRingtone(); - this._ringEl = new Audio(url); - this._ringEl.loop = true; - this._ringEl.volume = 1.0; - try { await this._ringEl.play(); } catch (e) { console.warn('[Audio] ring error', e); } - } - - stopRingtone() { - if (this._ringEl) { - this._ringEl.pause(); - this._ringEl.src = ''; - this._ringEl = null; - } - } - - // ── 语音播放(多段顺序)── - playVoice(urls, { vol = 1.0, onEnd = null } = {}) { - this.stopVoice(); - this._voiceQueue = [...urls]; - this._playNext(vol, onEnd); - } - - _playNext(vol, onEnd) { - if (this._voiceQueue.length === 0) { - this._voiceEl = null; - if (onEnd) onEnd(); - return; - } - const url = this._voiceQueue.shift(); - const el = new Audio(url); - el.volume = vol; - this._voiceEl = el; - el.onended = () => this._playNext(vol, onEnd); - el.onerror = () => { - console.warn('[Audio] voice error:', url); - this._playNext(vol, onEnd); - }; - el.play().catch(e => console.warn('[Audio] play error', e)); - } - - stopVoice() { - this._voiceQueue = []; - if (this._voiceEl) { - this._voiceEl.onended = null; - this._voiceEl.pause(); - this._voiceEl = null; - } - } - - isVoicePlaying() { - return !!(this._voiceEl && !this._voiceEl.paused); - } - - // ── BGM(淡入淡出切换)── - async startBGM(url, { vol = 0.35, fade = 2000 } = {}) { - if (this._bgmEl) { - const old = this._bgmEl; - this._fadeOut(old, fade / 2).then(() => { old.pause(); old.src = ''; }); - } - const el = new Audio(url); - el.loop = true; - el.volume = 0; - this._bgmEl = el; - try { - await el.play(); - this._fadeTo(el, vol, fade); - } catch (e) { console.warn('[Audio] BGM error', e); } - } - - stopBGM(fade = 2000) { - if (this._bgmEl) { - const el = this._bgmEl; - this._bgmEl = null; - this._fadeOut(el, fade).then(() => { el.pause(); el.src = ''; }); - } - } - - // ── 环境音 ── - async startAmbience(url, { vol = 0.25 } = {}) { - if (this._ambEl) { this._ambEl.pause(); this._ambEl.src = ''; } - const el = new Audio(url); - el.loop = true; - el.volume = vol; - this._ambEl = el; - try { await el.play(); } catch (e) { console.warn('[Audio] ambience error', e); } - } - - stopAmbience() { - if (this._ambEl) { this._ambEl.pause(); this._ambEl.src = ''; this._ambEl = null; } - } - - // ── 音量渐变 ── - _fadeTo(el, target, duration) { - const start = el.volume; - const steps = 30; - const dt = duration / steps; - const dv = (target - start) / steps; - let i = 0; - const t = setInterval(() => { - el.volume = Math.max(0, Math.min(1, start + dv * i)); - if (++i >= steps) clearInterval(t); - }, dt); - } - - _fadeOut(el, duration) { - return new Promise(resolve => { - const start = el.volume; - const steps = 20; - const dt = duration / steps; - const dv = start / steps; - let i = 0; - const t = setInterval(() => { - el.volume = Math.max(0, start - dv * i); - if (++i >= steps) { clearInterval(t); resolve(); } - }, dt); - }); - } -} - -const Snd = new AudioManager(); - -// ══════════════════════════════════════════════════ -// SFX_UI — 合成 UI 音效(不依赖音频文件) -// ══════════════════════════════════════════════════ - -const SFX_UI = { - // 确认操作(单击) - tap() { - Snd.synth({ freq: 880, dur: 45, vol: 0.2 }); - }, - - // 滑动确认 - swipe() { - Snd.synth({ freq: 660, dur: 60, vol: 0.18 }); - }, - - // 无效操作 - error() { - Snd.synth({ freq: 200, dur: 100, type: 'square', vol: 0.1 }); - }, - - // 新消息到达 - notify() { - Snd.synth({ freq: 523, dur: 100, vol: 0.25 }); - setTimeout(() => Snd.synth({ freq: 659, dur: 130, vol: 0.2 }), 130); - }, - - // 进入选择模式(三音上行) - choiceReady() { - Snd.synth({ freq: 440, dur: 80, type: 'triangle', vol: 0.18 }); - setTimeout(() => Snd.synth({ freq: 523, dur: 80, type: 'triangle', vol: 0.18 }), 100); - setTimeout(() => Snd.synth({ freq: 659, dur: 120, type: 'triangle', vol: 0.18 }), 200); - }, - - // 选择:温暖/接受(右滑)— 上行音 - choiceWarm() { - Snd.synth({ freq: 440, freq2: 659, dur: 140, vol: 0.22 }); - }, - - // 选择:冷淡/拒绝(左滑)— 下行音 - choiceCold() { - Snd.synth({ freq: 523, freq2: 349, dur: 140, vol: 0.22 }); - }, - - // 选择:好奇/追问(上滑)— 快速上行 - choiceCurious() { - Snd.synth({ freq: 523, freq2: 784, dur: 120, vol: 0.22 }); - }, - - // 选择:沉默/退缩(下滑)— 极轻低音 - choiceSilent() { - Snd.synth({ freq: 330, dur: 200, vol: 0.08 }); - }, - - // 跳过 / 忽略 - skip() { - Snd.synth({ freq: 587, freq2: 392, dur: 80, vol: 0.12 }); - }, - - // 下一条消息即将到来 - next() { - Snd.synth({ freq: 440, dur: 80, vol: 0.1 }); - setTimeout(() => Snd.synth({ freq: 523, dur: 100, vol: 0.13 }), 120); - }, - - // 打字/录音音效(~800ms) - typing() { - for (let i = 0; i < 6; i++) { - setTimeout(() => { - Snd.synth({ freq: 600 + Math.random() * 200, dur: 30, type: 'sine', vol: 0.1 }); - }, i * 120); - } - }, - - // 发送音效 - send() { - Snd.synth({ freq: 400, freq2: 900, dur: 120, type: 'sine', vol: 0.18 }); - }, - - // 结局音效 - ending() { - Snd.synth({ freq: 523, dur: 400, vol: 0.25 }); - setTimeout(() => Snd.synth({ freq: 659, dur: 400, vol: 0.2 }), 450); - setTimeout(() => Snd.synth({ freq: 784, dur: 600, vol: 0.15 }), 900); - }, -}; diff --git a/game1/js/engine.js b/game1/js/engine.js deleted file mode 100644 index 6915907..0000000 --- a/game1/js/engine.js +++ /dev/null @@ -1,825 +0,0 @@ -// engine.js — 游戏引擎 v2(多轮对话 + 林夏语音 + NPC反应) -// -// 状态流:idle → notification/ringing → playing → choosing -// → responding → reacting → [choosing | idle] → …… → ending -// -// 新增状态: -// responding — 林夏说话中(打字音效 + 语音播放) -// reacting — NPC反应播放中 -// paused — 游戏暂停(两指长按触发) - -class GameEngine { - constructor() { - this._state = 'idle'; - - // 剧情变量 - this.vars = { - MOM_LINK: false, - HE_BACK: null, - GROUP_REPLY: false, - ZHOUNAN_DEPTH: 0, - ZHOUNAN_SHARE: false, - SELF_RECORD: false, - UNREAD: 0, - REPLY_COUNT: 0, - }; - - this.profile = new ProfileTracker(); - this.msgState = {}; - this.currentMsg = null; - - this._queue = []; - this._endingTriggered = false; - this._reminderTimer = null; - - // v2: 对话系统 - this._currentChoices = null; // 当前可用的选项集 - this._pendingResolve = null; // 用于中断语音播放的 resolve - this._skipRequested = false; // 跳过标志 - - // 暂停系统 - this._pausedState = null; // 暂停前的状态 - - this.gest = null; - } - - // ── 状态 getter/setter ── - get state() { return this._state; } - set state(s) { - this._state = s; - dbg(`state: ${s}`); - const el = document.getElementById('hint'); - if (!el) return; - const H = { - idle: '', - notification: '单击 播放 · 双击 跳过', - ringing: '单击 接听 · 左滑 拒接', - playing: '双击 跳过 · 长按 重播', - choosing: '→温暖 ←冷淡 ↑追问 ↓沉默', - responding: '双击 跳过', - reacting: '双击 跳过', - paused: '单击 继续 · 三指点击 退出', - ending: '', - }; - el.textContent = H[s] || ''; - } - - // ══════════════════════════════════════════ - // 初始化 & 启动 - // ══════════════════════════════════════════ - - init(gestureDetector) { - this.gest = gestureDetector; - this.gest - .on('singletap', () => this._onTap()) - .on('doubletap', () => this._onDoubleTap()) - .on('swipe_left', () => this._onSwipe('left')) - .on('swipe_right', () => this._onSwipe('right')) - .on('swipe_up', () => this._onSwipe('up')) - .on('swipe_down', () => this._onSwipe('down')) - .on('longpress', () => this._onLongPress()) - .on('twofinger_longpress', () => this._onPause()) - .on('threefinger_tap', () => this._onExit()); - } - - async start() { - this._queue = [...MESSAGES]; - - // 内容预警 - await this._playVoiceAsync([`${T}/v2_sys_content_warning_wav_v1.mp3`]); - await sleep(1000); - - await Snd.startAmbience(AMBIENCE_DEFAULT, { vol: 0.15 }); - await sleep(1500); - Snd.startBGM(`${MUS}/lv11_bgm_m1_main_loop_v1.mp3`, { vol: 0.1 }); - await sleep(1500); - - this._next(); - } - - // ══════════════════════════════════════════ - // 语音播放(异步 + 可中断) - // ══════════════════════════════════════════ - - _playVoiceAsync(urls) { - return new Promise(resolve => { - this._pendingResolve = resolve; - Snd.playVoice(urls, { - onEnd: () => { - this._pendingResolve = null; - resolve(); - }, - }); - }); - } - - _interruptVoice() { - Snd.stopVoice(); - TTS.stop(); - if (this._pendingResolve) { - this._pendingResolve(); - this._pendingResolve = null; - } - } - - // 打字 + 发送音效 - async _playTypingSend() { - SFX_UI.typing(); - await sleep(800); - if (this._skipRequested) return; - SFX_UI.send(); - await sleep(300); - } - - // ══════════════════════════════════════════ - // 消息队列推进 - // ══════════════════════════════════════════ - - async _next() { - if (this._endingTriggered) return; - - const msg = this._queue.shift(); - if (!msg) { - this.triggerFinalEnding(); - return; - } - - if (msg.requiresMomLink && !this.vars.MOM_LINK) { - this.triggerFinalEnding(); - return; - } - - this.currentMsg = msg; - this._currentChoices = msg.choices || null; - this.msgState[msg.id] = 'unread'; - this.vars.UNREAD++; - - if (msg.type === 'call') { - this._startRinging(msg); - } else { - this._notifyMessage(msg); - } - } - - _notifyMessage(msg) { - this.state = 'notification'; - Haptic.message(); - SFX_UI.notify(); - this._startReminder(); - } - - async _startRinging(msg) { - this.state = 'ringing'; - Haptic.ring(); - await Snd.startRingtone(msg.ringtone); - this._startReminder(); - } - - // ══════════════════════════════════════════ - // 通话流程(异步) - // ══════════════════════════════════════════ - - async _answerCall(msg) { - Snd.stopRingtone(); - Haptic.stop(); - Haptic.confirm(); - SFX_UI.tap(); - this._clearReminder(); - - this.state = 'playing'; - this.msgState[msg.id] = 'read'; - this.vars.UNREAD = Math.max(0, this.vars.UNREAD - 1); - - if (msg.stateOnAnswer) this._applyState(msg.stateOnAnswer); - if (msg.profileOnAnswer) this.profile.add(msg.profileOnAnswer); - - this._skipRequested = false; - - // 播放通话内容 - await this._playVoiceAsync(msg.audio); - - // _onDoubleTap 在 'playing' 状态下会直接处理状态转换 - // 所以如果状态已不是 'playing',说明跳过已被处理,直接返回 - if (this.state !== 'playing') return; - - // 自动挂断(MSG-08 未知号码) - if (msg.autoHangup) { - if (msg.sfxAfter) { - const sfx = Array.isArray(msg.sfxAfter) ? msg.sfxAfter[0] : msg.sfxAfter; - await this._playVoiceAsync([sfx]); - if (this.state !== 'playing') return; - } - this._proceedToNext(); - return; - } - - // 自动回复(MSG-01/03/14 妈妈电话、外卖、妈妈第二次电话) - if (msg.autoReply) { - await this._playTypingSend(); - if (this.state !== 'playing') return; - - this.state = 'responding'; - await this._playVoiceAsync([msg.autoReply]); - - // 条件反应(MSG-14:先播前导语"真的没事?",再根据 MOM_LINK 播放不同反应) - if (!this._skipRequested && msg.autoReact) { - this.state = 'reacting'; - // 前导语(如"真的没事?") - if (msg.autoReactPreamble) { - await sleep(500); - if (!this._skipRequested) { - await this._playVoiceAsync([msg.autoReactPreamble]); - } - } - // 条件分支反应 - if (!this._skipRequested) { - const val = this.vars[msg.autoReact.condition]; - const reactUrl = val ? msg.autoReact['true'] : msg.autoReact['false']; - if (reactUrl) { - await sleep(400); - if (!this._skipRequested) { - await this._playVoiceAsync([reactUrl]); - } - } - } - } - this._proceedToNext(); - return; - } - - // 通话后有选择(MSG-11 阿哲) - if (msg.choices) { - this._enterChoosing(msg.choices); - return; - } - - this._proceedToNext(); - } - - _rejectCall(msg) { - Snd.stopRingtone(); - Haptic.reject(); - SFX_UI.skip(); - this._clearReminder(); - this.msgState[msg.id] = 'missed'; - if (msg.profileOnMiss) this.profile.add(msg.profileOnMiss); - this._proceedToNext(); - } - - // ══════════════════════════════════════════ - // 消息播放(异步) - // ══════════════════════════════════════════ - - async _playMessage(msg) { - this._clearReminder(); - this.state = 'playing'; - this.msgState[msg.id] = 'read'; - this.vars.UNREAD = Math.max(0, this.vars.UNREAD - 1); - - if (msg.bgm) Snd.startBGM(msg.bgm, { vol: 0.1 }); - - // 系统通知(时光胶囊) - if (msg.type === 'system_notification') { - this._playSystemNotification(msg); - return; - } - - this._skipRequested = false; - - // 文字消息(TTS 朗读) - if (msg.type === 'wechat_text' && msg.text) { - await TTS.speak(msg.text); - } - // 语音消息 - else if (msg.audio?.length > 0) { - await this._playVoiceAsync(msg.audio); - } - - if (this._skipRequested) return; - if (this.state !== 'playing') return; - - this._afterPlayed(msg); - } - - _playSystemNotification(msg) { - Snd.playVoice([msg.systemAudio], { - onEnd: () => { - if (this.state !== 'playing') return; - const audio = msg.audioByProfile?.[this.profile.label]; - if (audio) { - if (msg.stateOnPlay) this._applyState(msg.stateOnPlay); - if (msg.profileOnPlay) this.profile.add(msg.profileOnPlay); - setTimeout(() => { - if (this.state !== 'playing') return; - Snd.playVoice([audio], { - onEnd: () => this._proceedToNext(), - }); - }, 800); - } else { - this._proceedToNext(); - } - }, - }); - } - - _afterPlayed(msg) { - if (this.state !== 'playing') return; - - if (msg.isEnding) { - this.triggerFinalEnding(); - return; - } - - if (msg.choices) { - this._enterChoosing(msg.choices); - return; - } - - this._proceedToNext(); - } - - // ══════════════════════════════════════════ - // 选择系统(v2 多轮对话核心) - // ══════════════════════════════════════════ - - _enterChoosing(choices) { - this._currentChoices = choices; - this.state = 'choosing'; - SFX_UI.choiceReady(); - Haptic.confirm(); - Snd.playVoice([`${T}/v2_sys_wait_reply_wav_v1.mp3`]); - this._startReminder(); - } - - async _handleChoice(dir) { - const choices = this._currentChoices; - if (!choices) { - SFX_UI.error(); - Haptic.error(); - return; - } - - const choice = choices[dir]; - if (!choice) { - SFX_UI.error(); - Haptic.error(); - return; - } - - this._clearReminder(); - this._skipRequested = false; - - // 1. 播放方向对应的情感音效 - const sfxMap = { - tap: 'tap', - right: 'choiceWarm', - left: 'choiceCold', - up: 'choiceCurious', - down: 'choiceSilent', - }; - if (sfxMap[dir]) SFX_UI[sfxMap[dir]](); - Haptic.select(); - - // 2. 应用状态和画像 - if (!choice.isSilence) { - this.msgState[this.currentMsg.id] = 'replied'; - this.vars.REPLY_COUNT++; - } - if (choice.state) this._applyState(choice.state); - if (choice.profile) this.profile.add(choice.profile); - - // 3. 林夏回应 - this.state = 'responding'; - - if (choice.isSilence) { - // 沉默:短暂停顿 - await sleep(1500); - } else if (choice.linxia) { - // 打字 → 发送 → 林夏语音 - await this._playTypingSend(); - if (!this._skipRequested) { - await this._playVoiceAsync([choice.linxia]); - } - } - - if (this._skipRequested) { - // 跳过了林夏回应 → 如有 followUp 进入选择,否则跳到下一条 - if (choice.followUp?.choices) { - this._enterChoosing(choice.followUp.choices); - return; - } - this._proceedToNext(); - return; - } - - // 4. NPC 反应 - if (choice.npcReact?.length > 0) { - this.state = 'reacting'; - await sleep(400); - if (!this._skipRequested) { - await this._playVoiceAsync(choice.npcReact); - } - } - - if (this._skipRequested) { - if (choice.followUp?.choices) { - this._enterChoosing(choice.followUp.choices); - return; - } - this._proceedToNext(); - return; - } - - // 5. 如有后续对话 → 再次进入选择 - if (choice.followUp?.choices) { - await sleep(300); - this._enterChoosing(choice.followUp.choices); - return; - } - - // 6. 推进到下一条 - this._proceedToNext(); - } - - _skipChoice() { - this._clearReminder(); - SFX_UI.skip(); - Haptic.confirm(); - this.profile.add({ avoidance: 1 }); - this._proceedToNext(); - } - - // ══════════════════════════════════════════ - // 推进到下一条 - // ══════════════════════════════════════════ - - async _proceedToNext() { - const prev = this.currentMsg; - this.currentMsg = null; - this._currentChoices = null; - this.state = 'idle'; - this._clearReminder(); - - if (this._endingTriggered) return; - - // 特殊事件:阿哲来了(门铃) - if (prev?.id === 11 && this.vars.HE_BACK === true) { - await sleep(1500); - Snd.playVoice([`${SFX}/sfx_door_knock_gentle_v1.mp3`]); - Haptic.ring(); - await sleep(3000); - } - - // 检查结局D:未读过多 - const triggered = MESSAGES.length - this._queue.length; - if (this.vars.UNREAD >= 8 && triggered >= 14) { - this._triggerEnding('D'); - return; - } - - // 短暂停顿后推进 - SFX_UI.next(); - await sleep(DEV ? 200 : 2000); - this._next(); - } - - // ══════════════════════════════════════════ - // 提醒定时器 - // ══════════════════════════════════════════ - - _startReminder() { - this._clearReminder(); - this._reminderTimer = setInterval(() => { - if (this.state === 'notification') { - SFX_UI.notify(); - Haptic.message(); - } else if (this.state === 'choosing') { - SFX_UI.choiceReady(); - Haptic.confirm(); - } else if (this.state === 'ringing') { - Haptic.ring(); - } else { - this._clearReminder(); - } - }, 8000); - } - - _clearReminder() { - if (this._reminderTimer) { - clearInterval(this._reminderTimer); - this._reminderTimer = null; - } - } - - // ══════════════════════════════════════════ - // 状态变量 - // ══════════════════════════════════════════ - - _applyState(changes) { - for (const [k, v] of Object.entries(changes)) { - if (k === 'ZHOUNAN_DEPTH_ADD') { - this.vars.ZHOUNAN_DEPTH += (v || 1); - } else if (v !== null) { - this.vars[k] = v; - } - } - } - - // ══════════════════════════════════════════ - // 手势处理 - // ══════════════════════════════════════════ - - _onTap() { - const s = this.state; - - // 暂停中 → 恢复 - if (s === 'paused') { - this._onResume(); - return; - } - - if (s === 'ringing') { - this._answerCall(this.currentMsg); - } else if (s === 'notification') { - SFX_UI.tap(); - Haptic.confirm(); - this._playMessage(this.currentMsg); - } else if (s === 'choosing') { - this._handleChoice('tap'); - } - } - - _onDoubleTap() { - const s = this.state; - - if (s === 'paused') return; - - if (s === 'ringing') { - this._rejectCall(this.currentMsg); - return; - } - - if (s === 'notification') { - this._clearReminder(); - SFX_UI.skip(); - Haptic.confirm(); - const msg = this.currentMsg; - if (msg?.profileOnSkip) this.profile.add(msg.profileOnSkip); - else this.profile.add({ avoidance: 1 }); - this._proceedToNext(); - return; - } - - if (s === 'playing') { - this._skipRequested = true; - this._interruptVoice(); - SFX_UI.skip(); - Haptic.confirm(); - const msg = this.currentMsg; - if (msg?.isEnding) { - this.triggerFinalEnding(); - } else if (msg?.choices) { - this._enterChoosing(msg.choices); - } else { - this._proceedToNext(); - } - return; - } - - if (s === 'responding' || s === 'reacting') { - this._skipRequested = true; - this._interruptVoice(); - SFX_UI.skip(); - Haptic.confirm(); - return; - } - - if (s === 'choosing') { - this._skipChoice(); - return; - } - } - - _onSwipe(dir) { - const s = this.state; - - if (s === 'paused') return; - - if (s === 'ringing') { - if (dir === 'left') this._rejectCall(this.currentMsg); - else if (dir === 'right') this._answerCall(this.currentMsg); - return; - } - - if (s === 'notification') { - if (dir === 'left') { - this._clearReminder(); - SFX_UI.skip(); - Haptic.confirm(); - this.profile.add({ avoidance: 1 }); - this._proceedToNext(); - } - return; - } - - if (s === 'choosing') { - this._handleChoice(dir); - return; - } - } - - // ── 长按:重播 / 状态广播 ── - _onLongPress() { - const s = this.state; - - if (s === 'paused' || s === 'ending') return; - - Haptic.confirm(); - - // playing/responding/reacting/choosing → 重播当前消息音频 - if ((s === 'playing' || s === 'responding' || s === 'reacting' || s === 'choosing') && this.currentMsg) { - this._interruptVoice(); - if (this.currentMsg.audio?.length > 0) { - this._playVoiceAsync(this.currentMsg.audio); - } else if (this.currentMsg.type === 'wechat_text' && this.currentMsg.text) { - TTS.speak(this.currentMsg.text); - } - return; - } - - // idle/notification → 广播未读数 - TTS.speak(`当前未读${this.vars.UNREAD}条消息`); - } - - // ── 暂停 ── - _onPause() { - const s = this.state; - if (s === 'ending' || s === 'paused') return; - - this._pausedState = s; - this._interruptVoice(); - this._clearReminder(); - Haptic.stop(); - this.state = 'paused'; - Snd.playVoice([`${T}/v2_sys_paused_wav_v1.mp3`]); - } - - // ── 恢复 ── - _onResume() { - Snd.stopVoice(); - const prev = this._pausedState || 'idle'; - this._pausedState = null; - - // 语音无法断点续播,根据暂停前状态决定恢复行为 - if (prev === 'choosing' && this._currentChoices) { - this.state = 'choosing'; - SFX_UI.choiceReady(); - Haptic.confirm(); - this._startReminder(); - } else if (prev === 'notification' || prev === 'ringing') { - this.state = prev; - this._startReminder(); - } else { - // playing/responding/reacting → 无法续播,推进到下一条或回到选择 - if (this._currentChoices) { - this._enterChoosing(this._currentChoices); - } else { - this._proceedToNext(); - } - } - } - - // ── 退出 ── - _onExit() { - if (this.state !== 'paused') return; - - this._endingTriggered = true; - this._interruptVoice(); - // 退出不需要特殊音频,直接返回开始页 - setTimeout(() => { - const startEl = document.getElementById('start'); - if (startEl) { - startEl.style.opacity = '1'; - startEl.style.display = 'flex'; - } - }, 2000); - } - - // ══════════════════════════════════════════ - // 结局系统 - // ══════════════════════════════════════════ - - async triggerFinalEnding() { - if (this._endingTriggered) return; - - const v = this.vars; - - // 结局E(隐藏)— 优先级 1 - if (v.ZHOUNAN_DEPTH >= 2 && v.ZHOUNAN_SHARE && - (this.profile.label === 'engagement' || this.profile.label === 'nostalgia')) { - return this._triggerEnding('E'); - } - - // 结局A:妈妈连接 + 自己录音 — 优先级 2 - if (v.MOM_LINK && v.SELF_RECORD) { - return this._triggerEnding('A'); - } - - // 结局B:拒了阿哲 + 回了周南 — 优先级 3 - if (v.HE_BACK === false && v.ZHOUNAN_DEPTH >= 1) { - return this._triggerEnding('B'); - } - - // 结局C:全部已读但极少回复 — 优先级 4 - const read = Object.values(this.msgState).filter(s => s !== 'unread').length; - if (read >= MESSAGES.length - 2 && v.REPLY_COUNT <= 2) { - return this._triggerEnding('C'); - } - - // 结局D(兜底)— 优先级 5 - this._triggerEnding('D'); - } - - async _triggerEnding(type) { - if (this._endingTriggered) return; - this._endingTriggered = true; - - this.state = 'ending'; - this._clearReminder(); - this._interruptVoice(); - Snd.stopRingtone(); - Snd.stopBGM(3000); - await sleep(2000); - - dbg(`ending: ${type}`); - - const fn = { - A: () => this._endingA(), - B: () => this._endingB(), - C: () => this._endingC(), - D: () => this._endingD(), - E: () => this._endingE(), - }[type]; - if (fn) await fn(); - - // 结局后播报心理支持热线 - await sleep(3000); - await this._playVoiceAsync([`${T}/v2_sys_hotline_wav_v1.mp3`]); - } - - async _endingA() { - Snd.startAmbience(`${AMB}/amb_kitchen_morning_v1.mp3`, { vol: 0.3 }); - await sleep(2000); - Snd.playVoice([`${SFX}/sfx_kettle_whistle_v1.mp3`]); - await sleep(4000); - SFX_UI.ending(); - this._showCaption('明天再说。'); - await this._playVoiceAsync([`${T}/v2_ending_a_linxia_wav_v1.mp3`]); - } - - async _endingB() { - await sleep(2000); - SFX_UI.ending(); - await sleep(1000); - this._showCaption('寄出去了。'); - await this._playVoiceAsync([`${T}/v2_ending_b_linxia_wav_v1.mp3`]); - } - - async _endingC() { - await sleep(3000); - SFX_UI.ending(); - await sleep(1000); - this._showCaption('今晚就这样。'); - await this._playVoiceAsync([`${T}/v2_ending_c_linxia_wav_v1.mp3`]); - } - - async _endingD() { - Haptic.system(); - await sleep(2000); - Haptic.ring(); - await sleep(4000); - Snd.startAmbience(`${AMB}/amb_dawn_birds_v1.mp3`, { vol: 0.4 }); - await sleep(4000); - this._showCaption('早上好。'); - await this._playVoiceAsync([`${T}/v2_ending_d_linxia_wav_v1.mp3`]); - } - - async _endingE() { - Haptic.message(); - SFX_UI.notify(); - await sleep(1500); - // 周南秒回:"那我下次出差来北京,请你吃饭好不好。" - await this._playVoiceAsync([`${T}/v2_ending_e_zhounan_wav_v1.mp3`]); - await sleep(2000); - SFX_UI.ending(); - await sleep(1000); - this._showCaption('好。'); - await this._playVoiceAsync([`${T}/v2_ending_e_linxia_wav_v1.mp3`]); - } - - _showCaption(text) { - const el = document.getElementById('caption'); - el.textContent = text; - el.style.display = 'flex'; - } -} diff --git a/game1/js/gestures.js b/game1/js/gestures.js deleted file mode 100644 index 8185a57..0000000 --- a/game1/js/gestures.js +++ /dev/null @@ -1,262 +0,0 @@ -// gestures.js — 触控手势检测器 -// -// 支持 9 种手势: -// 单击 · 双击 · 长按(1s) · 左滑 · 右滑 · 上滑 · 下滑 -// 两指长按(1s) · 三指点击 - -class GestureDetector { - constructor(el) { - this._el = el; - this._handlers = {}; - - this._startX = 0; - this._startY = 0; - this._startTime = 0; - this._tapTimer = null; - this._tapCount = 0; - - // 长按检测 - this._longPressTimer = null; - this._longPressTriggered = false; - - // 多指检测 - this._maxTouches = 0; // 本次触摸中同时出现的最大手指数 - this._multiTouchLPTimer = null; // 两指长按计时器 - this._multiTouchHandled = false; - - this._bindTouch(); - this._bindMouse(); - this._bindKeyboard(); - } - - on(evt, fn) { this._handlers[evt] = fn; return this; } - - _emit(evt) { - dbg(evt); - const fn = this._handlers[evt]; - if (fn) fn(); - } - - // ── 触摸事件 ── - _bindTouch() { - const el = this._el; - - el.addEventListener('touchstart', e => { - e.preventDefault(); - const count = e.touches.length; - - // 记录本次触摸出现过的最大手指数 - if (count > this._maxTouches) this._maxTouches = count; - - if (count === 1) { - // 单指:记录起点 + 启动长按计时 - const t = e.touches[0]; - this._startX = t.clientX; - this._startY = t.clientY; - this._startTime = Date.now(); - this._longPressTriggered = false; - - this._longPressTimer = setTimeout(() => { - this._longPressTriggered = true; - this._longPressTimer = null; - this._emit('longpress'); - }, 1000); - - } else if (count === 2) { - // 两指:取消单指长按,启动两指长按计时 - this._cancelLongPress(); - this._multiTouchLPTimer = setTimeout(() => { - this._multiTouchHandled = true; - this._multiTouchLPTimer = null; - this._emit('twofinger_longpress'); - }, 1000); - - } else if (count >= 3) { - // 三指+:取消所有计时 - this._cancelLongPress(); - this._cancelMultiTouchLP(); - } - }, { passive: false }); - - el.addEventListener('touchmove', e => { - e.preventDefault(); - // 移动超 15px 取消长按 - if (this._longPressTimer && e.touches.length === 1) { - const t = e.touches[0]; - const dx = t.clientX - this._startX; - const dy = t.clientY - this._startY; - if (Math.sqrt(dx * dx + dy * dy) > 15) { - this._cancelLongPress(); - } - } - // 两指移动也取消两指长按 - if (this._multiTouchLPTimer) { - this._cancelMultiTouchLP(); - } - }, { passive: false }); - - el.addEventListener('touchend', e => { - e.preventDefault(); - - // 还有手指在屏幕上,等全部抬起再处理 - if (e.touches.length > 0) return; - - // 全部手指抬起 — 根据 maxTouches 判定手势类型 - const max = this._maxTouches; - - // 清理计时器 - this._cancelLongPress(); - this._cancelMultiTouchLP(); - - // 已在计时器中处理过(长按 / 两指长按) - if (this._longPressTriggered || this._multiTouchHandled) { - this._resetMultiTouch(); - return; - } - - // 三指点击 - if (max >= 3) { - this._resetMultiTouch(); - this._emit('threefinger_tap'); - return; - } - - // 两指快速触摸(< 1s)→ 忽略 - if (max === 2) { - this._resetMultiTouch(); - return; - } - - // 单指:正常处理(滑动 / 点击) - this._resetMultiTouch(); - const t = e.changedTouches[0]; - this._process(t.clientX, t.clientY); - }, { passive: false }); - - el.addEventListener('touchcancel', () => { - this._cancelLongPress(); - this._cancelMultiTouchLP(); - this._resetMultiTouch(); - this._reset(); - }, { passive: false }); - } - - // ── 鼠标事件(桌面调试)── - _bindMouse() { - this._el.addEventListener('mousedown', e => { - this._startX = e.clientX; - this._startY = e.clientY; - this._startTime = Date.now(); - this._longPressTriggered = false; - - this._longPressTimer = setTimeout(() => { - this._longPressTriggered = true; - this._longPressTimer = null; - this._emit('longpress'); - }, 1000); - }); - this._el.addEventListener('mouseup', e => { - this._cancelLongPress(); - if (this._longPressTriggered) { - this._longPressTriggered = false; - return; - } - this._process(e.clientX, e.clientY); - }); - this._el.addEventListener('mousemove', e => { - if (this._longPressTimer) { - const dx = e.clientX - this._startX; - const dy = e.clientY - this._startY; - if (Math.sqrt(dx * dx + dy * dy) > 15) { - this._cancelLongPress(); - } - } - }); - } - - // ── 键盘事件(桌面调试)── - _bindKeyboard() { - document.addEventListener('keydown', e => { - switch (e.code) { - case 'Space': e.preventDefault(); this._emit('singletap'); break; - case 'Enter': e.preventDefault(); this._emit('doubletap'); break; - case 'ArrowLeft': e.preventDefault(); this._emit('swipe_left'); break; - case 'ArrowRight': e.preventDefault(); this._emit('swipe_right'); break; - case 'ArrowUp': e.preventDefault(); this._emit('swipe_up'); break; - case 'ArrowDown': e.preventDefault(); this._emit('swipe_down'); break; - case 'KeyL': e.preventDefault(); this._emit('longpress'); break; - case 'KeyP': e.preventDefault(); this._emit('twofinger_longpress'); break; - case 'KeyQ': e.preventDefault(); this._emit('threefinger_tap'); break; - } - }); - } - - // ── 手势判定(单指) ── - _process(endX, endY) { - const dx = endX - this._startX; - const dy = endY - this._startY; - const dist = Math.sqrt(dx * dx + dy * dy); - const dt = Date.now() - this._startTime; - - // 滑动:距离 > 35px - if (dist > 35) { - const angle = Math.abs(Math.atan2(dy, dx) * 180 / Math.PI); - let dir = null; - - if (angle < 45) dir = 'right'; - else if (angle > 135) dir = 'left'; - else if (dy < 0 && Math.abs(dy) > Math.abs(dx)) dir = 'up'; - else if (dy > 0 && Math.abs(dy) > Math.abs(dx)) dir = 'down'; - - if (dir) { - this._tapCount = 0; - clearTimeout(this._tapTimer); - this._emit(`swipe_${dir}`); - return; - } - } - - // 点击:距离 < 20px,时间 < 500ms - if (dist < 20 && dt < 500) { - this._tapCount++; - if (this._tapCount === 1) { - this._tapTimer = setTimeout(() => { - this._tapCount = 0; - this._emit('singletap'); - }, 250); - } else if (this._tapCount >= 2) { - clearTimeout(this._tapTimer); - this._tapCount = 0; - this._emit('doubletap'); - } - } - } - - // ── 工具方法 ── - - _cancelLongPress() { - if (this._longPressTimer) { - clearTimeout(this._longPressTimer); - this._longPressTimer = null; - } - } - - _cancelMultiTouchLP() { - if (this._multiTouchLPTimer) { - clearTimeout(this._multiTouchLPTimer); - this._multiTouchLPTimer = null; - } - } - - _resetMultiTouch() { - this._maxTouches = 0; - this._multiTouchHandled = false; - } - - _reset() { - clearTimeout(this._tapTimer); - this._tapCount = 0; - this._longPressTriggered = false; - this._resetMultiTouch(); - } -} diff --git a/game1/js/haptics.js b/game1/js/haptics.js deleted file mode 100644 index 02bbbce..0000000 --- a/game1/js/haptics.js +++ /dev/null @@ -1,35 +0,0 @@ -// haptics.js — 震动反馈(Android Chrome 支持,iOS 降级为无震动) - -const Haptic = { - _ok: typeof navigator !== 'undefined' && !!navigator.vibrate, - - _v(pattern) { - if (this._ok) navigator.vibrate(pattern); - }, - - // 来电震动(长震 + 停顿,循环由来电循环调用) - ring() { this._v([400, 200, 400]); }, - - // 微信消息(两短震) - message() { this._v([80, 60, 80]); }, - - // 确认操作 - confirm() { this._v(60); }, - - // 拒绝 / 挂断 - reject() { this._v([100, 50, 100, 50, 100]); }, - - // 进入细回复模式 - detailMode() { this._v([30, 30, 60]); }, - - // 选项选中 - select() { this._v(80); }, - - // 系统通知 - system() { this._v([200, 100, 100, 100, 200]); }, - - // 错误 / 无效手势 - error() { this._v([50, 30, 50]); }, - - stop() { if (this._ok) navigator.vibrate(0); }, -}; diff --git a/game1/js/main.js b/game1/js/main.js deleted file mode 100644 index fbd60bc..0000000 --- a/game1/js/main.js +++ /dev/null @@ -1,55 +0,0 @@ -// main.js — 游戏入口 - -let engine = null; -let gestures = null; - -async function main() { - TTS.init(); - - // 初始化音频(必须在用户手势后) - await Snd.init(); - - // 请求屏幕常亮 - try { - if ('wakeLock' in navigator) { - window._wakeLock = await navigator.wakeLock.request('screen'); - } - } catch (_) {} - - // 绑定手势 - const gameEl = document.getElementById('game'); - gestures = new GestureDetector(gameEl); - - // 创建并启动引擎 - engine = new GameEngine(); - engine.init(gestures); - await engine.start(); - - if (DEV) { - document.getElementById('dbg').style.display = 'block'; - document.title = '林夏 [DEV]'; - } -} - -// 触摸启动(手机) -document.getElementById('start').addEventListener('touchend', async function onStart(e) { - e.preventDefault(); - this.removeEventListener('touchend', onStart); - this.style.transition = 'opacity 0.8s'; - this.style.opacity = '0'; - setTimeout(() => { this.style.display = 'none'; }, 800); - await main(); -}, { once: true }); - -// 鼠标点击(电脑调试) -document.getElementById('start').addEventListener('click', async function onClick() { - this.removeEventListener('click', onClick); - this.style.transition = 'opacity 0.8s'; - this.style.opacity = '0'; - setTimeout(() => { this.style.display = 'none'; }, 800); - await main(); -}, { once: true }); - -// 防止页面滚动/缩放 -document.addEventListener('touchmove', e => e.preventDefault(), { passive: false }); -document.addEventListener('gesturestart', e => e.preventDefault()); diff --git a/game1/js/profile.js b/game1/js/profile.js deleted file mode 100644 index c5d6024..0000000 --- a/game1/js/profile.js +++ /dev/null @@ -1,39 +0,0 @@ -// profile.js — 行为画像追踪器(avoidance / engagement / nostalgia) - -class ProfileTracker { - constructor() { - this.scores = { avoidance: 0, engagement: 0, nostalgia: 0 }; - } - - add(effects) { - if (!effects) return; - for (const k of ['avoidance', 'engagement', 'nostalgia']) { - if (effects[k]) this.scores[k] += effects[k]; - } - } - - // 漏接电话 - onMissedCall() { this.add({ avoidance: 2 }); } - // 单点回"嗯" - onSimpleReply() { this.add({ avoidance: 1 }); } - // 双指上滑已读不回 - onReadNoReply() { this.add({ avoidance: 2 }); } - // 进入细回复 - onDetailReply() { this.add({ engagement: 2 }); } - // 细回复选"主动追问"(engagement 方向) - onEngage() { this.add({ engagement: 2 }); } - // 细回复选"分享自己" - onShare() { this.add({ engagement: 1, nostalgia: 1 }); } - // 反复重听同一条 - onReplay() { this.add({ nostalgia: 2 }); } - // 听完长语音未回应 - onListenNoReact(){ this.add({ avoidance: 1, nostalgia: 1 }); } - - // 获取最终画像标签 - get label() { - const s = this.scores; - if (s.engagement >= s.avoidance && s.engagement >= s.nostalgia) return 'engagement'; - if (s.nostalgia >= s.avoidance) return 'nostalgia'; - return 'avoidance'; - } -} diff --git a/game1/js/story.js b/game1/js/story.js deleted file mode 100644 index de63bc0..0000000 --- a/game1/js/story.js +++ /dev/null @@ -1,674 +0,0 @@ -// story.js — 消息数据 v2(CosyVoice2 语音 + 多轮对话) -// -// 选择方向的情感含义(全局一致): -// 单击(tap) → 简单回应 -// 双击 → 不回复 / 跳过 -// 右滑(right) → 温暖 / 接受 / 开放 -// 左滑(left) → 冷淡 / 拒绝 / 疏远 -// 上滑(up) → 好奇 / 主动 / 追问 -// 下滑(down) → 沉默 / 退缩 -// -// 每个 choice 结构: -// linxia: 林夏回应的音频路径(null/缺省 = 沉默) -// npcReact: NPC反应音频数组(缺省 = 无反应) -// isSilence: 沉默选项标记 -// state: 剧情状态变更 -// profile: 画像分数变更 -// followUp: 可选的下一轮对话 { choices: { ... } } - -const A = 'mp3'; -const T = `${A}/tts`; // CosyVoice2 生成的所有语音 -const MUS = `${A}/music`; -const SFX = `${A}/sfx`; -const AMB = `${A}/ambience`; - -// ── 快捷函数 ── -const npc = f => `${T}/${f}`; // NPC Round 1 台词 -const lx = f => `${T}/${f}`; // 林夏回应 -const rx = f => `${T}/${f}`; // NPC 反应 - -const MESSAGES = [ - - // ══════════════════════════════════════════ - // 01 · 妈妈 · 电话 - // ══════════════════════════════════════════ - { - id: 1, type: 'call', - sender: 'mom', senderName: '妈妈', - ringtone: `${MUS}/lv11_ring_mom_v1.mp3`, - audio: [npc('lv11_2103_mom_call_01_wav_v1.mp3')], - autoReply: lx('v2_msg01_linxia_auto_wav_v1.mp3'), - stateOnAnswer: { MOM_LINK: true }, - profileOnMiss: { avoidance: 2 }, - profileOnAnswer: { engagement: 1 }, - }, - - // ══════════════════════════════════════════ - // 02 · 小美 · 语音 ×3(教学关) - // ══════════════════════════════════════════ - { - id: 2, type: 'wechat_voice', - sender: 'xiaomei', senderName: '小美', - audio: [ - npc('lv11_2115_xiaomei_voice_01_wav_v1.mp3'), - npc('lv11_2115_xiaomei_voice_02_wav_v1.mp3'), - npc('lv11_2115_xiaomei_voice_03_wav_v1.mp3'), - ], - choices: { - right: { - linxia: lx('v2_msg02_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg02_react_warm_wav_v1.mp3')], - profile: { engagement: 2 }, - }, - left: { - linxia: lx('v2_msg02_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg02_react_cold_wav_v1.mp3')], - profile: { avoidance: 1 }, - }, - up: { - linxia: lx('v2_msg02_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg02_react_curious_wav_v1.mp3')], - profile: { engagement: 1 }, - followUp: { - choices: { - right: { - linxia: lx('v2_msg02_r3_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg02_r3_react_wav_v1.mp3')], - profile: { nostalgia: 1 }, - }, - }, - }, - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg02_react_silent_wav_v1.mp3')], - profile: { avoidance: 2 }, - }, - tap: { - linxia: lx('v2_msg02_linxia_tap_wav_v1.mp3'), - npcReact: [rx('v2_msg02_react_tap_wav_v1.mp3')], - }, - }, - }, - - // ══════════════════════════════════════════ - // 03 · 外卖小哥 · 电话 - // ══════════════════════════════════════════ - { - id: 3, type: 'call', - sender: 'delivery', senderName: '外卖小哥', - ringtone: `${MUS}/lv11_ring_delivery_v1.mp3`, - audio: [npc('lv11_2120_delivery_call_01_wav_v1.mp3')], - autoReply: lx('v2_msg03_linxia_auto_wav_v1.mp3'), - profileOnMiss: { avoidance: 1 }, - profileOnAnswer: { engagement: 1 }, - }, - - // ══════════════════════════════════════════ - // 04 · 阿哲 · 语音(前男友要东西) - // ══════════════════════════════════════════ - { - id: 4, type: 'wechat_voice', - sender: 'azhe', senderName: '阿哲', - audio: [npc('lv11_2130_azhe_voice_01_wav_v1.mp3')], - choices: { - right: { - linxia: lx('v2_msg04_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg04_react_warm_wav_v1.mp3')], - profile: { engagement: 2 }, - followUp: { - // 阿哲问"你呢?"后 - choices: { - right: { - linxia: lx('v2_msg04_r3w_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg04_r3w_react_warm_wav_v1.mp3')], - }, - left: { - linxia: lx('v2_msg04_r3w_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg04_r3w_react_cold_wav_v1.mp3')], - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg04_r3w_react_silent_wav_v1.mp3')], - }, - }, - }, - }, - left: { - linxia: lx('v2_msg04_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg04_react_cold_wav_v1.mp3')], - state: { HE_BACK: false }, - profile: { avoidance: 1 }, - }, - up: { - linxia: lx('v2_msg04_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg04_react_curious_wav_v1.mp3')], - profile: { engagement: 2 }, - followUp: { - // 阿哲说"不太方便"后 - choices: { - up: { - linxia: lx('v2_msg04_r3c_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg04_r3c_react_curious_wav_v1.mp3')], - state: { HE_BACK: false }, - }, - right: { - linxia: lx('v2_msg04_r3c_linxia_warm_wav_v1.mp3'), - }, - }, - }, - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg04_react_silent_wav_v1.mp3')], - state: { HE_BACK: null }, - profile: { avoidance: 2 }, - }, - tap: { - linxia: lx('v2_msg04_linxia_tap_wav_v1.mp3'), - npcReact: [rx('v2_msg04_react_tap_wav_v1.mp3')], - state: { HE_BACK: false }, - profile: { engagement: 1 }, - }, - }, - }, - - // ══════════════════════════════════════════ - // 05 · HR王姐 · 语音 - // ══════════════════════════════════════════ - { - id: 5, type: 'wechat_voice', - sender: 'hr', senderName: 'HR王姐', - audio: [npc('lv11_2145_hr_voice_01_wav_v1.mp3')], - choices: { - right: { - linxia: lx('v2_msg05_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg05_react_warm_wav_v1.mp3')], - profile: { engagement: 1 }, - }, - left: { - linxia: lx('v2_msg05_linxia_cold_wav_v1.mp3'), - }, - up: { - linxia: lx('v2_msg05_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg05_react_curious_wav_v1.mp3')], - profile: { engagement: 2 }, - }, - down: { - isSilence: true, - profile: { avoidance: 1 }, - }, - tap: { - linxia: lx('v2_msg05_linxia_tap_wav_v1.mp3'), - }, - }, - }, - - // ══════════════════════════════════════════ - // 06 · 安安 · 语音(酒吧邀约) - // ══════════════════════════════════════════ - { - id: 6, type: 'wechat_voice', - sender: 'anan', senderName: '安安', - audio: [npc('lv11_2200_anan_voice_01_wav_v1.mp3')], - choices: { - right: { - linxia: lx('v2_msg06_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg06_react_warm_wav_v1.mp3')], - profile: { engagement: 2 }, - }, - left: { - linxia: lx('v2_msg06_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg06_react_cold_wav_v1.mp3')], - }, - up: { - linxia: lx('v2_msg06_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg06_react_curious_wav_v1.mp3')], - profile: { engagement: 1 }, - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg06_react_silent_wav_v1.mp3')], - profile: { avoidance: 1 }, - }, - tap: { - linxia: lx('v2_msg06_linxia_tap_wav_v1.mp3'), - npcReact: [rx('v2_msg06_react_tap_wav_v1.mp3')], - }, - }, - }, - - // ══════════════════════════════════════════ - // 07 · 寝室群 · 5条语音 - // ══════════════════════════════════════════ - { - id: 7, type: 'wechat_voice', - sender: 'dorm', senderName: '寝室群', - audio: [ - npc('lv11_2215_dorm_a_voice_01_wav_v1.mp3'), - npc('lv11_2215_dorm_b_voice_01_wav_v1.mp3'), - npc('lv11_2215_dorm_c_voice_01_wav_v1.mp3'), - npc('lv11_2215_dorm_a_voice_02_wav_v1.mp3'), - npc('lv11_2215_dorm_b_voice_02_wav_v1.mp3'), - ], - choices: { - right: { - linxia: lx('v2_msg07_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg07_react_warm_wav_v1.mp3')], - state: { GROUP_REPLY: true }, - profile: { engagement: 2 }, - followUp: { - // 室友A问"你最近怎么样"后 - choices: { - right: { - linxia: lx('v2_msg07_r3_linxia_warm_wav_v1.mp3'), - profile: { engagement: 1 }, - }, - left: { - linxia: lx('v2_msg07_r3_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg07_r3_react_cold_wav_v1.mp3')], - }, - }, - }, - }, - left: { - linxia: lx('v2_msg07_linxia_cold_wav_v1.mp3'), - profile: { avoidance: 1 }, - }, - up: { - linxia: lx('v2_msg07_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg07_react_curious_wav_v1.mp3')], - state: { GROUP_REPLY: true }, - profile: { engagement: 2 }, - }, - down: { - isSilence: true, - profile: { avoidance: 2 }, - }, - tap: { - linxia: lx('v2_linxia_generic_hmm_wav_v1.mp3'), - npcReact: [rx('v2_msg07_react_tap_wav_v1.mp3')], - state: { GROUP_REPLY: true }, - }, - }, - }, - - // ══════════════════════════════════════════ - // 08 · 未知号码 · 电话(悬疑钩子) - // ══════════════════════════════════════════ - { - id: 8, type: 'call', - sender: 'unknown', senderName: '未知号码', - ringtone: `${MUS}/lv11_ring_unknown_v1.mp3`, - audio: [`${SFX}/sfx_breathing_unknown_v1.mp3`], - autoHangup: true, - sfxAfter: `${SFX}/sfx_heartbeat_fast_v1.mp3`, - profileOnMiss: { avoidance: 1 }, - profileOnAnswer: { nostalgia: 1 }, - }, - - // ══════════════════════════════════════════ - // 09 · 小美(醉)· 4段语音 - // ══════════════════════════════════════════ - { - id: 9, type: 'wechat_voice', - sender: 'xiaomei', senderName: '小美', - audio: [ - npc('lv11_2245_xiaomei_voice_01_seg1_wav_v1.mp3'), - npc('lv11_2245_xiaomei_voice_01_seg2_wav_v1.mp3'), - npc('lv11_2245_xiaomei_voice_01_seg3_wav_v1.mp3'), - npc('lv11_2245_xiaomei_voice_01_seg4_wav_v1.mp3'), - ], - bgm: `${MUS}/lv11_bgm_m2_suspense_v1.mp3`, - choices: { - right: { - linxia: lx('v2_msg09_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg09_react_warm_wav_v1.mp3')], - profile: { engagement: 2 }, - }, - left: { - linxia: lx('v2_msg09_linxia_cold_wav_v1.mp3'), - profile: { avoidance: 1 }, - }, - up: { - linxia: lx('v2_msg09_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg09_react_curious_wav_v1.mp3')], - profile: { engagement: 2 }, - followUp: { - // 小美说"怕你恨我"后 - choices: { - right: { - linxia: lx('v2_msg09_r3_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg09_r3_react_warm_wav_v1.mp3')], - }, - left: { - linxia: lx('v2_msg09_r3_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg09_r3_react_cold_wav_v1.mp3')], - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg09_r3_react_silent_q_wav_v1.mp3')], - }, - }, - }, - }, - down: { - isSilence: true, - profile: { avoidance: 2, nostalgia: 1 }, - }, - tap: { - linxia: lx('v2_msg09_linxia_tap_wav_v1.mp3'), - npcReact: [rx('v2_msg09_react_tap_wav_v1.mp3')], - profile: { nostalgia: 1 }, - }, - }, - }, - - // ══════════════════════════════════════════ - // 10 · 妈妈 · 文字消息(多层嵌套对话) - // ══════════════════════════════════════════ - { - id: 10, type: 'wechat_text', - sender: 'mom', senderName: '妈妈', - text: '睡了吗?', - choices: { - right: { - linxia: lx('v2_msg10_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg10_react_warm_wav_v1.mp3')], - state: { MOM_LINK: true }, - profile: { engagement: 2 }, - followUp: { - // 妈妈问"今天怎么样"后 - choices: { - right: { - linxia: lx('v2_msg10_rw_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg10_rw_react_warm_wav_v1.mp3')], - }, - up: { - linxia: lx('v2_msg10_rw_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg10_rw_react_curious_wav_v1.mp3')], - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg10_rw_react_silent_wav_v1.mp3')], - profile: { avoidance: 1 }, - }, - }, - }, - }, - left: { - linxia: lx('v2_msg10_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg10_react_cold_wav_v1.mp3')], - state: { MOM_LINK: true }, - profile: { avoidance: 1 }, - }, - up: { - linxia: lx('v2_msg10_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg10_call_mom_wav_v1.mp3')], - state: { MOM_LINK: true }, - profile: { engagement: 3 }, - followUp: { - // 妈妈打来电话说"怎么了夏夏?"后 - choices: { - right: { - linxia: lx('v2_msg10_call_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg10_call_react_warm_wav_v1.mp3')], - }, - up: { - linxia: lx('v2_msg10_call_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg10_call_react_curious_wav_v1.mp3')], - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg10_call_react_down_wav_v1.mp3')], - profile: { avoidance: 1 }, - }, - }, - }, - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg10_react_silent_wav_v1.mp3')], - profile: { avoidance: 2 }, - }, - tap: { - linxia: lx('v2_msg10_linxia_tap_wav_v1.mp3'), - npcReact: [rx('v2_msg10_react_tap_wav_v1.mp3')], - state: { MOM_LINK: true }, - }, - }, - }, - - // ══════════════════════════════════════════ - // 11 · 阿哲 · 电话(关键分支:来不来) - // ══════════════════════════════════════════ - { - id: 11, type: 'call', - sender: 'azhe', senderName: '阿哲', - ringtone: `${MUS}/lv11_ring_azhe_v1.mp3`, - audio: [npc('lv11_2315_azhe_call_01_wav_v1.mp3')], - profileOnMiss: { avoidance: 2 }, - profileOnAnswer: { engagement: 1 }, - choices: { - right: { - linxia: lx('v2_msg11_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg11_react_warm_wav_v1.mp3')], - state: { HE_BACK: true }, - }, - left: { - linxia: lx('v2_msg11_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg11_react_cold_wav_v1.mp3')], - state: { HE_BACK: false }, - }, - up: { - linxia: lx('v2_msg11_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg11_react_curious_wav_v1.mp3')], - followUp: { - choices: { - right: { - linxia: lx('v2_msg11_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg11_react_warm_wav_v1.mp3')], - state: { HE_BACK: true }, - }, - left: { - linxia: lx('v2_msg11_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg11_react_cold_wav_v1.mp3')], - state: { HE_BACK: false }, - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg11_r3_react_silent_wav_v1.mp3')], - state: { HE_BACK: false }, - profile: { avoidance: 1 }, - }, - }, - }, - }, - down: { - isSilence: true, - state: { HE_BACK: false }, - }, - tap: { - linxia: lx('v2_msg11_linxia_tap_wav_v1.mp3'), - npcReact: [rx('v2_msg11_react_tap_wav_v1.mp3')], - state: { HE_BACK: false }, - }, - }, - }, - - // ══════════════════════════════════════════ - // 12 · 周南 · 语音(老同学) - // ══════════════════════════════════════════ - { - id: 12, type: 'wechat_voice', - sender: 'zhounan', senderName: '周南', - audio: [npc('lv11_2330_zhounan_voice_01_wav_v1.mp3')], - choices: { - right: { - linxia: lx('v2_msg12_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg12_react_warm_wav_v1.mp3')], - state: { ZHOUNAN_DEPTH: 1 }, - profile: { engagement: 2, nostalgia: 1 }, - }, - left: { - linxia: lx('v2_msg12_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg12_react_cold_wav_v1.mp3')], - state: { ZHOUNAN_DEPTH: 1 }, - profile: { nostalgia: 1 }, - }, - up: { - linxia: lx('v2_msg12_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg12_react_curious_wav_v1.mp3')], - state: { ZHOUNAN_DEPTH: 1 }, - profile: { nostalgia: 2 }, - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg12_react_silent_wav_v1.mp3')], - profile: { nostalgia: 1 }, - }, - tap: { - linxia: lx('v2_msg12_linxia_tap_wav_v1.mp3'), - npcReact: [rx('v2_msg12_react_tap_wav_v1.mp3')], - state: { ZHOUNAN_DEPTH: 1 }, - }, - }, - }, - - // ══════════════════════════════════════════ - // 13 · 周南 · 4条长语音(他的十年) - // ══════════════════════════════════════════ - { - id: 13, type: 'wechat_voice', - sender: 'zhounan', senderName: '周南', - audio: [ - npc('lv11_2345_zhounan_voice_01_wav_v1.mp3'), - npc('lv11_2345_zhounan_voice_02_wav_v1.mp3'), - npc('lv11_2345_zhounan_voice_03_wav_v1.mp3'), - npc('lv11_2345_zhounan_voice_04_wav_v1.mp3'), - ], - bgm: `${MUS}/lv11_bgm_m3_zhounan_v1.mp3`, - choices: { - right: { - linxia: lx('v2_msg13_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg13_react_warm_wav_v1.mp3')], - state: { ZHOUNAN_DEPTH_ADD: 1 }, - profile: { engagement: 2 }, - followUp: { - // 周南问"你在北京过得好吗"后 - choices: { - right: { - linxia: lx('v2_msg13_r3_linxia_warm_wav_v1.mp3'), - npcReact: [rx('v2_msg13_r3_react_warm_wav_v1.mp3')], - state: { ZHOUNAN_SHARE: true }, - }, - left: { - linxia: lx('v2_msg13_r3_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg13_r3_react_cold_wav_v1.mp3')], - }, - up: { - linxia: lx('v2_msg13_r3_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg13_r3_react_curious_wav_v1.mp3')], - }, - }, - }, - }, - left: { - linxia: lx('v2_msg13_linxia_cold_wav_v1.mp3'), - npcReact: [rx('v2_msg13_react_cold_wav_v1.mp3')], - state: { ZHOUNAN_DEPTH_ADD: 1 }, - profile: { nostalgia: 1 }, - }, - up: { - linxia: lx('v2_msg13_linxia_curious_wav_v1.mp3'), - npcReact: [rx('v2_msg13_react_curious_wav_v1.mp3')], - state: { ZHOUNAN_DEPTH_ADD: 1, ZHOUNAN_SHARE: true }, - profile: { nostalgia: 2, engagement: 1 }, - }, - down: { - isSilence: true, - npcReact: [rx('v2_msg13_react_silent_wav_v1.mp3')], - profile: { avoidance: 1 }, - }, - tap: { - linxia: lx('v2_msg13_linxia_tap_wav_v1.mp3'), - npcReact: [rx('v2_msg13_react_tap_wav_v1.mp3')], - state: { ZHOUNAN_DEPTH_ADD: 1 }, - }, - }, - }, - - // ══════════════════════════════════════════ - // 14 · 妈妈 · 第二次电话 - // ══════════════════════════════════════════ - { - id: 14, type: 'call', - sender: 'mom', senderName: '妈妈', - ringtone: `${MUS}/lv11_ring_mom_v1.mp3`, - audio: [npc('lv11_0015_mom_call_01_wav_v1.mp3')], - autoReply: lx('v2_msg14_linxia_auto_wav_v1.mp3'), - autoReact: { - condition: 'MOM_LINK', - true: rx('v2_msg14_react_linked_wav_v1.mp3'), - false: rx('v2_msg14_react_unlinked_wav_v1.mp3'), - }, - autoReactPreamble: rx('v2_msg14_mom_ask_wav_v1.mp3'), - stateOnAnswer: { MOM_LINK: true }, - profileOnMiss: { avoidance: 2 }, - profileOnAnswer: { engagement: 2 }, - }, - - // ══════════════════════════════════════════ - // 15 · 时光胶囊 · 系统通知 - // ══════════════════════════════════════════ - { - id: 15, type: 'system_notification', - sender: 'self', senderName: '时光胶囊', - systemAudio: npc('lv11_sys_memo_01_wav_v1.mp3'), - audioByProfile: { - avoidance: npc('lv11_0030_self3y_voice_02_wav_v1.mp3'), - engagement: npc('lv11_0030_self3y_voice_01_wav_v1.mp3'), - nostalgia: npc('lv11_0030_self3y_voice_03_wav_v1.mp3'), - }, - stateOnPlay: { SELF_RECORD: true }, - profileOnPlay: { nostalgia: 2 }, - profileOnSkip: { avoidance: 2 }, - }, - - // ══════════════════════════════════════════ - // 16 · 妈妈 · 长语音 ×8(结局前奏) - // ══════════════════════════════════════════ - { - id: 16, type: 'wechat_voice', - sender: 'mom', senderName: '妈妈', - audio: [ - npc('lv11_0200_mom_voice_01_seg1_wav_v1.mp3'), - npc('lv11_0200_mom_voice_01_seg2_wav_v1.mp3'), - npc('lv11_0200_mom_voice_01_seg3_wav_v1.mp3'), - npc('lv11_0200_mom_voice_01_seg4_wav_v1.mp3'), - npc('lv11_0200_mom_voice_01_seg5_wav_v1.mp3'), - npc('lv11_0200_mom_voice_01_seg6_wav_v1.mp3'), - npc('lv11_0200_mom_voice_01_seg7_wav_v1.mp3'), - npc('lv11_0200_mom_voice_01_seg8_wav_v1.mp3'), - ], - bgm: `${MUS}/lv11_bgm_m4_ending_v1.mp3`, - isEnding: true, - requiresMomLink: true, - }, -]; - -// 角色信息 -const SENDERS = { - mom: { name: '妈妈' }, - azhe: { name: '阿哲' }, - xiaomei: { name: '小美' }, - delivery: { name: '外卖小哥' }, - hr: { name: 'HR王姐' }, - anan: { name: '安安' }, - dorm: { name: '寝室群' }, - unknown: { name: '未知号码' }, - zhounan: { name: '周南' }, - self: { name: '时光胶囊' }, -}; - -const AMBIENCE_DEFAULT = `${AMB}/amb_apartment_night_01_v1.mp3`; diff --git a/game1/js/utils.js b/game1/js/utils.js deleted file mode 100644 index 29a1f93..0000000 --- a/game1/js/utils.js +++ /dev/null @@ -1,38 +0,0 @@ -// utils.js — 工具函数 - -const DEV = new URLSearchParams(location.search).has('dev'); - -const sleep = ms => new Promise(r => setTimeout(r, ms)); - -function dbg(msg) { - const el = document.getElementById('dbg'); - if (el && el.style.display !== 'none') el.textContent = msg; -} - -// TTS — 仅用于朗读文字消息内容,不用于任何 UI 反馈 -const TTS = { - _voices: [], - init() { - if (!window.speechSynthesis) return; - const load = () => { this._voices = speechSynthesis.getVoices(); }; - load(); - speechSynthesis.onvoiceschanged = load; - }, - _pick() { - return this._voices.find(v => v.lang.startsWith('zh') || v.name.includes('Chinese')) - || this._voices[0] || null; - }, - speak(text, { rate = 0.85, volume = 0.8 } = {}) { - return new Promise(resolve => { - if (!window.speechSynthesis) { resolve(); return; } - speechSynthesis.cancel(); - const u = new SpeechSynthesisUtterance(text); - u.lang = 'zh-CN'; u.rate = rate; u.volume = volume; - const v = this._pick(); - if (v) u.voice = v; - u.onend = resolve; u.onerror = resolve; - speechSynthesis.speak(u); - }); - }, - stop() { if (window.speechSynthesis) speechSynthesis.cancel(); }, -}; diff --git a/game1/manifest.json b/game1/manifest.json deleted file mode 100644 index af6abcf..0000000 --- a/game1/manifest.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "林夏", - "short_name": "林夏", - "description": "一款全黑屏的情感叙事游戏。今晚16条消息,你接谁不接谁,决定明天的自己。", - "start_url": "/game/", - "display": "fullscreen", - "orientation": "portrait", - "background_color": "#000000", - "theme_color": "#000000", - "icons": [ - { "src": "icon.png", "sizes": "192x192", "type": "image/png" } - ] -} diff --git a/game1/mp3/ambience/amb_apartment_night_01_v1.mp3 b/game1/mp3/ambience/amb_apartment_night_01_v1.mp3 deleted file mode 100644 index a9f24a6..0000000 Binary files a/game1/mp3/ambience/amb_apartment_night_01_v1.mp3 and /dev/null differ diff --git a/game1/mp3/ambience/amb_apartment_night_02_v1.mp3 b/game1/mp3/ambience/amb_apartment_night_02_v1.mp3 deleted file mode 100644 index 53cbc0c..0000000 Binary files a/game1/mp3/ambience/amb_apartment_night_02_v1.mp3 and /dev/null differ diff --git a/game1/mp3/ambience/amb_bar_loud_01_v1.mp3 b/game1/mp3/ambience/amb_bar_loud_01_v1.mp3 deleted file mode 100644 index 91dc7fa..0000000 Binary files a/game1/mp3/ambience/amb_bar_loud_01_v1.mp3 and /dev/null differ diff --git a/game1/mp3/ambience/amb_dawn_birds_v1.mp3 b/game1/mp3/ambience/amb_dawn_birds_v1.mp3 deleted file mode 100644 index a128b9a..0000000 Binary files a/game1/mp3/ambience/amb_dawn_birds_v1.mp3 and /dev/null differ diff --git a/game1/mp3/ambience/amb_kitchen_morning_v1.mp3 b/game1/mp3/ambience/amb_kitchen_morning_v1.mp3 deleted file mode 100644 index b078374..0000000 Binary files a/game1/mp3/ambience/amb_kitchen_morning_v1.mp3 and /dev/null differ diff --git a/game1/mp3/ambience/amb_rain_window_01_v1.mp3 b/game1/mp3/ambience/amb_rain_window_01_v1.mp3 deleted file mode 100644 index 473affa..0000000 Binary files a/game1/mp3/ambience/amb_rain_window_01_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_bgm_m1_main_loop_v1.mp3 b/game1/mp3/music/lv11_bgm_m1_main_loop_v1.mp3 deleted file mode 100644 index 3d01a59..0000000 Binary files a/game1/mp3/music/lv11_bgm_m1_main_loop_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_bgm_m2_suspense_v1.mp3 b/game1/mp3/music/lv11_bgm_m2_suspense_v1.mp3 deleted file mode 100644 index cd469bc..0000000 Binary files a/game1/mp3/music/lv11_bgm_m2_suspense_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_bgm_m3_zhounan_v1.mp3 b/game1/mp3/music/lv11_bgm_m3_zhounan_v1.mp3 deleted file mode 100644 index 81b2d1e..0000000 Binary files a/game1/mp3/music/lv11_bgm_m3_zhounan_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_bgm_m4_ending_v1.mp3 b/game1/mp3/music/lv11_bgm_m4_ending_v1.mp3 deleted file mode 100644 index 0fa430b..0000000 Binary files a/game1/mp3/music/lv11_bgm_m4_ending_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_anan_v1.mp3 b/game1/mp3/music/lv11_ring_anan_v1.mp3 deleted file mode 100644 index 4d325a2..0000000 Binary files a/game1/mp3/music/lv11_ring_anan_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_azhe_v1.mp3 b/game1/mp3/music/lv11_ring_azhe_v1.mp3 deleted file mode 100644 index 8985486..0000000 Binary files a/game1/mp3/music/lv11_ring_azhe_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_delivery_v1.mp3 b/game1/mp3/music/lv11_ring_delivery_v1.mp3 deleted file mode 100644 index 7b4b214..0000000 Binary files a/game1/mp3/music/lv11_ring_delivery_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_dorm_group_v1.mp3 b/game1/mp3/music/lv11_ring_dorm_group_v1.mp3 deleted file mode 100644 index ff2b3f7..0000000 Binary files a/game1/mp3/music/lv11_ring_dorm_group_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_hr_v1.mp3 b/game1/mp3/music/lv11_ring_hr_v1.mp3 deleted file mode 100644 index 6ffe655..0000000 Binary files a/game1/mp3/music/lv11_ring_hr_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_mom_v1.mp3 b/game1/mp3/music/lv11_ring_mom_v1.mp3 deleted file mode 100644 index 87fc941..0000000 Binary files a/game1/mp3/music/lv11_ring_mom_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_unknown_v1.mp3 b/game1/mp3/music/lv11_ring_unknown_v1.mp3 deleted file mode 100644 index 6a8b1fd..0000000 Binary files a/game1/mp3/music/lv11_ring_unknown_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_xiaomei_v1.mp3 b/game1/mp3/music/lv11_ring_xiaomei_v1.mp3 deleted file mode 100644 index 1de1dd1..0000000 Binary files a/game1/mp3/music/lv11_ring_xiaomei_v1.mp3 and /dev/null differ diff --git a/game1/mp3/music/lv11_ring_zhounan_v1.mp3 b/game1/mp3/music/lv11_ring_zhounan_v1.mp3 deleted file mode 100644 index 3764934..0000000 Binary files a/game1/mp3/music/lv11_ring_zhounan_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_breathing_unknown_v1.mp3 b/game1/mp3/sfx/sfx_breathing_unknown_v1.mp3 deleted file mode 100644 index dbd3e48..0000000 Binary files a/game1/mp3/sfx/sfx_breathing_unknown_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_cat_yowl_v1.mp3 b/game1/mp3/sfx/sfx_cat_yowl_v1.mp3 deleted file mode 100644 index 1511547..0000000 Binary files a/game1/mp3/sfx/sfx_cat_yowl_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_deep_breath_v1.mp3 b/game1/mp3/sfx/sfx_deep_breath_v1.mp3 deleted file mode 100644 index b94989d..0000000 Binary files a/game1/mp3/sfx/sfx_deep_breath_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_door_knock_firm_v1.mp3 b/game1/mp3/sfx/sfx_door_knock_firm_v1.mp3 deleted file mode 100644 index 9941247..0000000 Binary files a/game1/mp3/sfx/sfx_door_knock_firm_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_door_knock_gentle_v1.mp3 b/game1/mp3/sfx/sfx_door_knock_gentle_v1.mp3 deleted file mode 100644 index 119c09e..0000000 Binary files a/game1/mp3/sfx/sfx_door_knock_gentle_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_ending_chime_v1.mp3 b/game1/mp3/sfx/sfx_ending_chime_v1.mp3 deleted file mode 100644 index 6395e47..0000000 Binary files a/game1/mp3/sfx/sfx_ending_chime_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_glass_shatter_short_v1.mp3 b/game1/mp3/sfx/sfx_glass_shatter_short_v1.mp3 deleted file mode 100644 index edaf152..0000000 Binary files a/game1/mp3/sfx/sfx_glass_shatter_short_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_heartbeat_fast_v1.mp3 b/game1/mp3/sfx/sfx_heartbeat_fast_v1.mp3 deleted file mode 100644 index 5a822ec..0000000 Binary files a/game1/mp3/sfx/sfx_heartbeat_fast_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_kettle_whistle_v1.mp3 b/game1/mp3/sfx/sfx_kettle_whistle_v1.mp3 deleted file mode 100644 index 83b8ca8..0000000 Binary files a/game1/mp3/sfx/sfx_kettle_whistle_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_keyboard_fast_v1.mp3 b/game1/mp3/sfx/sfx_keyboard_fast_v1.mp3 deleted file mode 100644 index 899c876..0000000 Binary files a/game1/mp3/sfx/sfx_keyboard_fast_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_keyboard_slow_v1.mp3 b/game1/mp3/sfx/sfx_keyboard_slow_v1.mp3 deleted file mode 100644 index 51a6e48..0000000 Binary files a/game1/mp3/sfx/sfx_keyboard_slow_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_night_bus_v1.mp3 b/game1/mp3/sfx/sfx_night_bus_v1.mp3 deleted file mode 100644 index 0ad7bc4..0000000 Binary files a/game1/mp3/sfx/sfx_night_bus_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_paper_turning_v1.mp3 b/game1/mp3/sfx/sfx_paper_turning_v1.mp3 deleted file mode 100644 index a2ab4e1..0000000 Binary files a/game1/mp3/sfx/sfx_paper_turning_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_phone_vibrate_v1.mp3 b/game1/mp3/sfx/sfx_phone_vibrate_v1.mp3 deleted file mode 100644 index bd58ac7..0000000 Binary files a/game1/mp3/sfx/sfx_phone_vibrate_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_rain_heavier_v1.mp3 b/game1/mp3/sfx/sfx_rain_heavier_v1.mp3 deleted file mode 100644 index 12c93d3..0000000 Binary files a/game1/mp3/sfx/sfx_rain_heavier_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_rain_lighter_v1.mp3 b/game1/mp3/sfx/sfx_rain_lighter_v1.mp3 deleted file mode 100644 index 650f9a3..0000000 Binary files a/game1/mp3/sfx/sfx_rain_lighter_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_transition_chapter_v1.mp3 b/game1/mp3/sfx/sfx_transition_chapter_v1.mp3 deleted file mode 100644 index f8b9666..0000000 Binary files a/game1/mp3/sfx/sfx_transition_chapter_v1.mp3 and /dev/null differ diff --git a/game1/mp3/sfx/sfx_water_boiling_v1.mp3 b/game1/mp3/sfx/sfx_water_boiling_v1.mp3 deleted file mode 100644 index dfd4193..0000000 Binary files a/game1/mp3/sfx/sfx_water_boiling_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0015_mom_call_01_wav_v1.mp3 b/game1/mp3/tts/lv11_0015_mom_call_01_wav_v1.mp3 deleted file mode 100644 index ab955a8..0000000 Binary files a/game1/mp3/tts/lv11_0015_mom_call_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0030_self3y_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_0030_self3y_voice_01_wav_v1.mp3 deleted file mode 100644 index f3b5631..0000000 Binary files a/game1/mp3/tts/lv11_0030_self3y_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0030_self3y_voice_02_wav_v1.mp3 b/game1/mp3/tts/lv11_0030_self3y_voice_02_wav_v1.mp3 deleted file mode 100644 index c760746..0000000 Binary files a/game1/mp3/tts/lv11_0030_self3y_voice_02_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0030_self3y_voice_03_wav_v1.mp3 b/game1/mp3/tts/lv11_0030_self3y_voice_03_wav_v1.mp3 deleted file mode 100644 index c16c063..0000000 Binary files a/game1/mp3/tts/lv11_0030_self3y_voice_03_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0200_mom_voice_01_seg1_wav_v1.mp3 b/game1/mp3/tts/lv11_0200_mom_voice_01_seg1_wav_v1.mp3 deleted file mode 100644 index fbc7b1c..0000000 Binary files a/game1/mp3/tts/lv11_0200_mom_voice_01_seg1_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0200_mom_voice_01_seg2_wav_v1.mp3 b/game1/mp3/tts/lv11_0200_mom_voice_01_seg2_wav_v1.mp3 deleted file mode 100644 index dce6d7a..0000000 Binary files a/game1/mp3/tts/lv11_0200_mom_voice_01_seg2_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0200_mom_voice_01_seg3_wav_v1.mp3 b/game1/mp3/tts/lv11_0200_mom_voice_01_seg3_wav_v1.mp3 deleted file mode 100644 index 37672ac..0000000 Binary files a/game1/mp3/tts/lv11_0200_mom_voice_01_seg3_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0200_mom_voice_01_seg4_wav_v1.mp3 b/game1/mp3/tts/lv11_0200_mom_voice_01_seg4_wav_v1.mp3 deleted file mode 100644 index 1900d33..0000000 Binary files a/game1/mp3/tts/lv11_0200_mom_voice_01_seg4_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0200_mom_voice_01_seg5_wav_v1.mp3 b/game1/mp3/tts/lv11_0200_mom_voice_01_seg5_wav_v1.mp3 deleted file mode 100644 index 86a666e..0000000 Binary files a/game1/mp3/tts/lv11_0200_mom_voice_01_seg5_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0200_mom_voice_01_seg6_wav_v1.mp3 b/game1/mp3/tts/lv11_0200_mom_voice_01_seg6_wav_v1.mp3 deleted file mode 100644 index 79e6ee5..0000000 Binary files a/game1/mp3/tts/lv11_0200_mom_voice_01_seg6_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0200_mom_voice_01_seg7_wav_v1.mp3 b/game1/mp3/tts/lv11_0200_mom_voice_01_seg7_wav_v1.mp3 deleted file mode 100644 index 829ab95..0000000 Binary files a/game1/mp3/tts/lv11_0200_mom_voice_01_seg7_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_0200_mom_voice_01_seg8_wav_v1.mp3 b/game1/mp3/tts/lv11_0200_mom_voice_01_seg8_wav_v1.mp3 deleted file mode 100644 index f45e7b8..0000000 Binary files a/game1/mp3/tts/lv11_0200_mom_voice_01_seg8_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2103_mom_call_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2103_mom_call_01_wav_v1.mp3 deleted file mode 100644 index ba73fc7..0000000 Binary files a/game1/mp3/tts/lv11_2103_mom_call_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2115_xiaomei_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2115_xiaomei_voice_01_wav_v1.mp3 deleted file mode 100644 index 96478de..0000000 Binary files a/game1/mp3/tts/lv11_2115_xiaomei_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2115_xiaomei_voice_02_wav_v1.mp3 b/game1/mp3/tts/lv11_2115_xiaomei_voice_02_wav_v1.mp3 deleted file mode 100644 index 62681e3..0000000 Binary files a/game1/mp3/tts/lv11_2115_xiaomei_voice_02_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2115_xiaomei_voice_03_wav_v1.mp3 b/game1/mp3/tts/lv11_2115_xiaomei_voice_03_wav_v1.mp3 deleted file mode 100644 index 9405253..0000000 Binary files a/game1/mp3/tts/lv11_2115_xiaomei_voice_03_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2120_delivery_call_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2120_delivery_call_01_wav_v1.mp3 deleted file mode 100644 index 984a5cd..0000000 Binary files a/game1/mp3/tts/lv11_2120_delivery_call_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2130_azhe_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2130_azhe_voice_01_wav_v1.mp3 deleted file mode 100644 index 300a91d..0000000 Binary files a/game1/mp3/tts/lv11_2130_azhe_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2145_hr_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2145_hr_voice_01_wav_v1.mp3 deleted file mode 100644 index eaca2e9..0000000 Binary files a/game1/mp3/tts/lv11_2145_hr_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2200_anan_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2200_anan_voice_01_wav_v1.mp3 deleted file mode 100644 index d7d1f86..0000000 Binary files a/game1/mp3/tts/lv11_2200_anan_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2215_dorm_a_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2215_dorm_a_voice_01_wav_v1.mp3 deleted file mode 100644 index fc607c0..0000000 Binary files a/game1/mp3/tts/lv11_2215_dorm_a_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2215_dorm_a_voice_02_wav_v1.mp3 b/game1/mp3/tts/lv11_2215_dorm_a_voice_02_wav_v1.mp3 deleted file mode 100644 index 9aad740..0000000 Binary files a/game1/mp3/tts/lv11_2215_dorm_a_voice_02_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2215_dorm_b_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2215_dorm_b_voice_01_wav_v1.mp3 deleted file mode 100644 index dd53219..0000000 Binary files a/game1/mp3/tts/lv11_2215_dorm_b_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2215_dorm_b_voice_02_wav_v1.mp3 b/game1/mp3/tts/lv11_2215_dorm_b_voice_02_wav_v1.mp3 deleted file mode 100644 index c85edf8..0000000 Binary files a/game1/mp3/tts/lv11_2215_dorm_b_voice_02_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2215_dorm_c_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2215_dorm_c_voice_01_wav_v1.mp3 deleted file mode 100644 index 6c08f4a..0000000 Binary files a/game1/mp3/tts/lv11_2215_dorm_c_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg1_wav_v1.mp3 b/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg1_wav_v1.mp3 deleted file mode 100644 index c4df688..0000000 Binary files a/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg1_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg2_wav_v1.mp3 b/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg2_wav_v1.mp3 deleted file mode 100644 index 15b76e6..0000000 Binary files a/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg2_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg3_wav_v1.mp3 b/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg3_wav_v1.mp3 deleted file mode 100644 index 0cab5ec..0000000 Binary files a/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg3_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg4_wav_v1.mp3 b/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg4_wav_v1.mp3 deleted file mode 100644 index 283603d..0000000 Binary files a/game1/mp3/tts/lv11_2245_xiaomei_voice_01_seg4_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2300_mom_text_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2300_mom_text_01_wav_v1.mp3 deleted file mode 100644 index 0a001d7..0000000 Binary files a/game1/mp3/tts/lv11_2300_mom_text_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2315_azhe_call_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2315_azhe_call_01_wav_v1.mp3 deleted file mode 100644 index bf2a0da..0000000 Binary files a/game1/mp3/tts/lv11_2315_azhe_call_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2330_zhounan_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2330_zhounan_voice_01_wav_v1.mp3 deleted file mode 100644 index 19520c7..0000000 Binary files a/game1/mp3/tts/lv11_2330_zhounan_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2345_zhounan_voice_01_wav_v1.mp3 b/game1/mp3/tts/lv11_2345_zhounan_voice_01_wav_v1.mp3 deleted file mode 100644 index 3725075..0000000 Binary files a/game1/mp3/tts/lv11_2345_zhounan_voice_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2345_zhounan_voice_02_wav_v1.mp3 b/game1/mp3/tts/lv11_2345_zhounan_voice_02_wav_v1.mp3 deleted file mode 100644 index 2f56c42..0000000 Binary files a/game1/mp3/tts/lv11_2345_zhounan_voice_02_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2345_zhounan_voice_03_wav_v1.mp3 b/game1/mp3/tts/lv11_2345_zhounan_voice_03_wav_v1.mp3 deleted file mode 100644 index 4550edf..0000000 Binary files a/game1/mp3/tts/lv11_2345_zhounan_voice_03_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_2345_zhounan_voice_04_wav_v1.mp3 b/game1/mp3/tts/lv11_2345_zhounan_voice_04_wav_v1.mp3 deleted file mode 100644 index a654c35..0000000 Binary files a/game1/mp3/tts/lv11_2345_zhounan_voice_04_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/lv11_sys_memo_01_wav_v1.mp3 b/game1/mp3/tts/lv11_sys_memo_01_wav_v1.mp3 deleted file mode 100644 index 22f07f8..0000000 Binary files a/game1/mp3/tts/lv11_sys_memo_01_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_ending_a_linxia_wav_v1.mp3 b/game1/mp3/tts/v2_ending_a_linxia_wav_v1.mp3 deleted file mode 100644 index bedb00d..0000000 Binary files a/game1/mp3/tts/v2_ending_a_linxia_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_ending_b_linxia_wav_v1.mp3 b/game1/mp3/tts/v2_ending_b_linxia_wav_v1.mp3 deleted file mode 100644 index 25931dc..0000000 Binary files a/game1/mp3/tts/v2_ending_b_linxia_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_ending_c_linxia_wav_v1.mp3 b/game1/mp3/tts/v2_ending_c_linxia_wav_v1.mp3 deleted file mode 100644 index b264580..0000000 Binary files a/game1/mp3/tts/v2_ending_c_linxia_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_ending_d_linxia_wav_v1.mp3 b/game1/mp3/tts/v2_ending_d_linxia_wav_v1.mp3 deleted file mode 100644 index 1a1a906..0000000 Binary files a/game1/mp3/tts/v2_ending_d_linxia_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_ending_e_linxia_wav_v1.mp3 b/game1/mp3/tts/v2_ending_e_linxia_wav_v1.mp3 deleted file mode 100644 index 4157e7b..0000000 Binary files a/game1/mp3/tts/v2_ending_e_linxia_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_ending_e_zhounan_wav_v1.mp3 b/game1/mp3/tts/v2_ending_e_zhounan_wav_v1.mp3 deleted file mode 100644 index b3ce3fd..0000000 Binary files a/game1/mp3/tts/v2_ending_e_zhounan_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_linxia_generic_cold_fine_wav_v1.mp3 b/game1/mp3/tts/v2_linxia_generic_cold_fine_wav_v1.mp3 deleted file mode 100644 index 9b5d455..0000000 Binary files a/game1/mp3/tts/v2_linxia_generic_cold_fine_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_linxia_generic_cold_know_wav_v1.mp3 b/game1/mp3/tts/v2_linxia_generic_cold_know_wav_v1.mp3 deleted file mode 100644 index eab1222..0000000 Binary files a/game1/mp3/tts/v2_linxia_generic_cold_know_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_linxia_generic_curious_wav_v1.mp3 b/game1/mp3/tts/v2_linxia_generic_curious_wav_v1.mp3 deleted file mode 100644 index 4a4ff71..0000000 Binary files a/game1/mp3/tts/v2_linxia_generic_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_linxia_generic_hmm_wav_v1.mp3 b/game1/mp3/tts/v2_linxia_generic_hmm_wav_v1.mp3 deleted file mode 100644 index ae87492..0000000 Binary files a/game1/mp3/tts/v2_linxia_generic_hmm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_linxia_generic_ok_wav_v1.mp3 b/game1/mp3/tts/v2_linxia_generic_ok_wav_v1.mp3 deleted file mode 100644 index f5f5a60..0000000 Binary files a/game1/mp3/tts/v2_linxia_generic_ok_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_linxia_generic_then_wav_v1.mp3 b/game1/mp3/tts/v2_linxia_generic_then_wav_v1.mp3 deleted file mode 100644 index 112b1f0..0000000 Binary files a/game1/mp3/tts/v2_linxia_generic_then_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_linxia_generic_warm_ok_wav_v1.mp3 b/game1/mp3/tts/v2_linxia_generic_warm_ok_wav_v1.mp3 deleted file mode 100644 index 1ef930c..0000000 Binary files a/game1/mp3/tts/v2_linxia_generic_warm_ok_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg01_linxia_auto_wav_v1.mp3 b/game1/mp3/tts/v2_msg01_linxia_auto_wav_v1.mp3 deleted file mode 100644 index ee1e95e..0000000 Binary files a/game1/mp3/tts/v2_msg01_linxia_auto_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_linxia_cold_wav_v1.mp3 deleted file mode 100644 index b255a8a..0000000 Binary files a/game1/mp3/tts/v2_msg02_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_linxia_curious_wav_v1.mp3 deleted file mode 100644 index c6eb5c8..0000000 Binary files a/game1/mp3/tts/v2_msg02_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_linxia_tap_wav_v1.mp3 deleted file mode 100644 index 10f1acd..0000000 Binary files a/game1/mp3/tts/v2_msg02_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_linxia_warm_wav_v1.mp3 deleted file mode 100644 index bdd1d6e..0000000 Binary files a/game1/mp3/tts/v2_msg02_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_r3_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_r3_linxia_curious_wav_v1.mp3 deleted file mode 100644 index ba69bbf..0000000 Binary files a/game1/mp3/tts/v2_msg02_r3_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_r3_react_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_r3_react_wav_v1.mp3 deleted file mode 100644 index 8e4cf0e..0000000 Binary files a/game1/mp3/tts/v2_msg02_r3_react_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_react_cold_wav_v1.mp3 deleted file mode 100644 index d57ab7b..0000000 Binary files a/game1/mp3/tts/v2_msg02_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_react_curious_wav_v1.mp3 deleted file mode 100644 index 0687871..0000000 Binary files a/game1/mp3/tts/v2_msg02_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_react_silent_wav_v1.mp3 deleted file mode 100644 index 7ac3711..0000000 Binary files a/game1/mp3/tts/v2_msg02_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_react_tap_wav_v1.mp3 deleted file mode 100644 index d4e91f8..0000000 Binary files a/game1/mp3/tts/v2_msg02_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg02_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg02_react_warm_wav_v1.mp3 deleted file mode 100644 index 729809c..0000000 Binary files a/game1/mp3/tts/v2_msg02_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg03_linxia_auto_wav_v1.mp3 b/game1/mp3/tts/v2_msg03_linxia_auto_wav_v1.mp3 deleted file mode 100644 index 12216d0..0000000 Binary files a/game1/mp3/tts/v2_msg03_linxia_auto_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_linxia_cold_wav_v1.mp3 deleted file mode 100644 index 3f25573..0000000 Binary files a/game1/mp3/tts/v2_msg04_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 44051d2..0000000 Binary files a/game1/mp3/tts/v2_msg04_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_linxia_tap_wav_v1.mp3 deleted file mode 100644 index 2f98073..0000000 Binary files a/game1/mp3/tts/v2_msg04_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_linxia_warm_wav_v1.mp3 deleted file mode 100644 index b9924ef..0000000 Binary files a/game1/mp3/tts/v2_msg04_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_r3c_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_r3c_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 64cbc51..0000000 Binary files a/game1/mp3/tts/v2_msg04_r3c_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_r3c_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_r3c_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 1144657..0000000 Binary files a/game1/mp3/tts/v2_msg04_r3c_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_r3c_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_r3c_react_curious_wav_v1.mp3 deleted file mode 100644 index 7c17a91..0000000 Binary files a/game1/mp3/tts/v2_msg04_r3c_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_r3w_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_r3w_linxia_cold_wav_v1.mp3 deleted file mode 100644 index 373e258..0000000 Binary files a/game1/mp3/tts/v2_msg04_r3w_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_r3w_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_r3w_linxia_warm_wav_v1.mp3 deleted file mode 100644 index d469d12..0000000 Binary files a/game1/mp3/tts/v2_msg04_r3w_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_r3w_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_r3w_react_cold_wav_v1.mp3 deleted file mode 100644 index bed53f4..0000000 Binary files a/game1/mp3/tts/v2_msg04_r3w_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_r3w_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_r3w_react_silent_wav_v1.mp3 deleted file mode 100644 index b077ccc..0000000 Binary files a/game1/mp3/tts/v2_msg04_r3w_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_r3w_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_r3w_react_warm_wav_v1.mp3 deleted file mode 100644 index d63d290..0000000 Binary files a/game1/mp3/tts/v2_msg04_r3w_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_react_cold_wav_v1.mp3 deleted file mode 100644 index 40f82a8..0000000 Binary files a/game1/mp3/tts/v2_msg04_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_react_curious_wav_v1.mp3 deleted file mode 100644 index c8f6570..0000000 Binary files a/game1/mp3/tts/v2_msg04_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_react_silent_wav_v1.mp3 deleted file mode 100644 index 7a16cb3..0000000 Binary files a/game1/mp3/tts/v2_msg04_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_react_tap_wav_v1.mp3 deleted file mode 100644 index 2e19929..0000000 Binary files a/game1/mp3/tts/v2_msg04_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg04_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg04_react_warm_wav_v1.mp3 deleted file mode 100644 index 9cac590..0000000 Binary files a/game1/mp3/tts/v2_msg04_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg05_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg05_linxia_cold_wav_v1.mp3 deleted file mode 100644 index 5be3ef4..0000000 Binary files a/game1/mp3/tts/v2_msg05_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg05_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg05_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 42f0c0e..0000000 Binary files a/game1/mp3/tts/v2_msg05_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg05_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg05_linxia_tap_wav_v1.mp3 deleted file mode 100644 index c39b88d..0000000 Binary files a/game1/mp3/tts/v2_msg05_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg05_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg05_linxia_warm_wav_v1.mp3 deleted file mode 100644 index cae2d59..0000000 Binary files a/game1/mp3/tts/v2_msg05_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg05_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg05_react_curious_wav_v1.mp3 deleted file mode 100644 index da8b70a..0000000 Binary files a/game1/mp3/tts/v2_msg05_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg05_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg05_react_warm_wav_v1.mp3 deleted file mode 100644 index 65d24fe..0000000 Binary files a/game1/mp3/tts/v2_msg05_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_linxia_cold_wav_v1.mp3 deleted file mode 100644 index 8f9fa23..0000000 Binary files a/game1/mp3/tts/v2_msg06_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 4679fe0..0000000 Binary files a/game1/mp3/tts/v2_msg06_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_linxia_tap_wav_v1.mp3 deleted file mode 100644 index 36b126a..0000000 Binary files a/game1/mp3/tts/v2_msg06_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 986c64d..0000000 Binary files a/game1/mp3/tts/v2_msg06_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_react_cold_wav_v1.mp3 deleted file mode 100644 index e49287d..0000000 Binary files a/game1/mp3/tts/v2_msg06_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_react_curious_wav_v1.mp3 deleted file mode 100644 index 1126cd2..0000000 Binary files a/game1/mp3/tts/v2_msg06_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_react_silent_wav_v1.mp3 deleted file mode 100644 index ff65d87..0000000 Binary files a/game1/mp3/tts/v2_msg06_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_react_tap_wav_v1.mp3 deleted file mode 100644 index ab08f60..0000000 Binary files a/game1/mp3/tts/v2_msg06_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg06_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg06_react_warm_wav_v1.mp3 deleted file mode 100644 index 9e630be..0000000 Binary files a/game1/mp3/tts/v2_msg06_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_linxia_cold_wav_v1.mp3 deleted file mode 100644 index ec54bc4..0000000 Binary files a/game1/mp3/tts/v2_msg07_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 6b0c07f..0000000 Binary files a/game1/mp3/tts/v2_msg07_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 35cb0f7..0000000 Binary files a/game1/mp3/tts/v2_msg07_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_r3_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_r3_linxia_cold_wav_v1.mp3 deleted file mode 100644 index 7b307a9..0000000 Binary files a/game1/mp3/tts/v2_msg07_r3_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_r3_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_r3_linxia_warm_wav_v1.mp3 deleted file mode 100644 index ae83f85..0000000 Binary files a/game1/mp3/tts/v2_msg07_r3_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_r3_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_r3_react_cold_wav_v1.mp3 deleted file mode 100644 index b8c987e..0000000 Binary files a/game1/mp3/tts/v2_msg07_r3_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_react_curious_wav_v1.mp3 deleted file mode 100644 index 24c8a42..0000000 Binary files a/game1/mp3/tts/v2_msg07_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_react_tap_wav_v1.mp3 deleted file mode 100644 index e9cf2e0..0000000 Binary files a/game1/mp3/tts/v2_msg07_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg07_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg07_react_warm_wav_v1.mp3 deleted file mode 100644 index 203dee9..0000000 Binary files a/game1/mp3/tts/v2_msg07_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_linxia_cold_wav_v1.mp3 deleted file mode 100644 index f842aed..0000000 Binary files a/game1/mp3/tts/v2_msg09_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 2190c0a..0000000 Binary files a/game1/mp3/tts/v2_msg09_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_linxia_tap_wav_v1.mp3 deleted file mode 100644 index cdf9096..0000000 Binary files a/game1/mp3/tts/v2_msg09_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 6f56481..0000000 Binary files a/game1/mp3/tts/v2_msg09_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_r3_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_r3_linxia_cold_wav_v1.mp3 deleted file mode 100644 index 2cea7d5..0000000 Binary files a/game1/mp3/tts/v2_msg09_r3_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_r3_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_r3_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 3e52b25..0000000 Binary files a/game1/mp3/tts/v2_msg09_r3_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_r3_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_r3_react_cold_wav_v1.mp3 deleted file mode 100644 index 9619b57..0000000 Binary files a/game1/mp3/tts/v2_msg09_r3_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_r3_react_silent_q_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_r3_react_silent_q_wav_v1.mp3 deleted file mode 100644 index 2be04fc..0000000 Binary files a/game1/mp3/tts/v2_msg09_r3_react_silent_q_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_r3_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_r3_react_warm_wav_v1.mp3 deleted file mode 100644 index 9ae5ff3..0000000 Binary files a/game1/mp3/tts/v2_msg09_r3_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_react_curious_wav_v1.mp3 deleted file mode 100644 index 9e88260..0000000 Binary files a/game1/mp3/tts/v2_msg09_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_react_tap_wav_v1.mp3 deleted file mode 100644 index 4891cf0..0000000 Binary files a/game1/mp3/tts/v2_msg09_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg09_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg09_react_warm_wav_v1.mp3 deleted file mode 100644 index 3d7ce10..0000000 Binary files a/game1/mp3/tts/v2_msg09_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_call_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_call_linxia_curious_wav_v1.mp3 deleted file mode 100644 index c90447c..0000000 Binary files a/game1/mp3/tts/v2_msg10_call_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_call_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_call_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 1aa0411..0000000 Binary files a/game1/mp3/tts/v2_msg10_call_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_call_mom_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_call_mom_wav_v1.mp3 deleted file mode 100644 index 67d61f5..0000000 Binary files a/game1/mp3/tts/v2_msg10_call_mom_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_call_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_call_react_curious_wav_v1.mp3 deleted file mode 100644 index 6b5a97d..0000000 Binary files a/game1/mp3/tts/v2_msg10_call_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_call_react_down_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_call_react_down_wav_v1.mp3 deleted file mode 100644 index b40fde5..0000000 Binary files a/game1/mp3/tts/v2_msg10_call_react_down_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_call_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_call_react_silent_wav_v1.mp3 deleted file mode 100644 index 62d541e..0000000 Binary files a/game1/mp3/tts/v2_msg10_call_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_call_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_call_react_warm_wav_v1.mp3 deleted file mode 100644 index d3255e7..0000000 Binary files a/game1/mp3/tts/v2_msg10_call_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_linxia_cold_wav_v1.mp3 deleted file mode 100644 index e4bf056..0000000 Binary files a/game1/mp3/tts/v2_msg10_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 85db7ba..0000000 Binary files a/game1/mp3/tts/v2_msg10_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_linxia_tap_wav_v1.mp3 deleted file mode 100644 index 387aedd..0000000 Binary files a/game1/mp3/tts/v2_msg10_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 137f860..0000000 Binary files a/game1/mp3/tts/v2_msg10_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_react_cold_wav_v1.mp3 deleted file mode 100644 index f0f7e9e..0000000 Binary files a/game1/mp3/tts/v2_msg10_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_react_silent_wav_v1.mp3 deleted file mode 100644 index 4bacdf2..0000000 Binary files a/game1/mp3/tts/v2_msg10_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_react_tap_wav_v1.mp3 deleted file mode 100644 index c4e37f9..0000000 Binary files a/game1/mp3/tts/v2_msg10_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_react_warm_wav_v1.mp3 deleted file mode 100644 index c1f7617..0000000 Binary files a/game1/mp3/tts/v2_msg10_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_rw_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_rw_linxia_curious_wav_v1.mp3 deleted file mode 100644 index edf0ed4..0000000 Binary files a/game1/mp3/tts/v2_msg10_rw_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_rw_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_rw_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 62213ae..0000000 Binary files a/game1/mp3/tts/v2_msg10_rw_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_rw_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_rw_react_curious_wav_v1.mp3 deleted file mode 100644 index 40d1059..0000000 Binary files a/game1/mp3/tts/v2_msg10_rw_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_rw_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_rw_react_silent_wav_v1.mp3 deleted file mode 100644 index 36b7f7c..0000000 Binary files a/game1/mp3/tts/v2_msg10_rw_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg10_rw_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg10_rw_react_warm_wav_v1.mp3 deleted file mode 100644 index 5586814..0000000 Binary files a/game1/mp3/tts/v2_msg10_rw_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_linxia_cold_wav_v1.mp3 deleted file mode 100644 index 880c397..0000000 Binary files a/game1/mp3/tts/v2_msg11_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 897ae19..0000000 Binary files a/game1/mp3/tts/v2_msg11_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_linxia_tap_wav_v1.mp3 deleted file mode 100644 index 68fae6d..0000000 Binary files a/game1/mp3/tts/v2_msg11_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 70fa7f8..0000000 Binary files a/game1/mp3/tts/v2_msg11_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_r3_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_r3_react_silent_wav_v1.mp3 deleted file mode 100644 index 6c8af63..0000000 Binary files a/game1/mp3/tts/v2_msg11_r3_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_react_cold_wav_v1.mp3 deleted file mode 100644 index f28d879..0000000 Binary files a/game1/mp3/tts/v2_msg11_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_react_curious_wav_v1.mp3 deleted file mode 100644 index 2d70636..0000000 Binary files a/game1/mp3/tts/v2_msg11_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_react_tap_wav_v1.mp3 deleted file mode 100644 index 48ae195..0000000 Binary files a/game1/mp3/tts/v2_msg11_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg11_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg11_react_warm_wav_v1.mp3 deleted file mode 100644 index b794c8c..0000000 Binary files a/game1/mp3/tts/v2_msg11_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_linxia_cold_wav_v1.mp3 deleted file mode 100644 index ea1aaeb..0000000 Binary files a/game1/mp3/tts/v2_msg12_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 8239e17..0000000 Binary files a/game1/mp3/tts/v2_msg12_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_linxia_tap_wav_v1.mp3 deleted file mode 100644 index dd888aa..0000000 Binary files a/game1/mp3/tts/v2_msg12_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_linxia_warm_wav_v1.mp3 deleted file mode 100644 index de8c3d2..0000000 Binary files a/game1/mp3/tts/v2_msg12_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_react_cold_wav_v1.mp3 deleted file mode 100644 index 1d38cac..0000000 Binary files a/game1/mp3/tts/v2_msg12_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_react_curious_wav_v1.mp3 deleted file mode 100644 index fae8afd..0000000 Binary files a/game1/mp3/tts/v2_msg12_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_react_silent_wav_v1.mp3 deleted file mode 100644 index c724270..0000000 Binary files a/game1/mp3/tts/v2_msg12_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_react_tap_wav_v1.mp3 deleted file mode 100644 index 0501fdd..0000000 Binary files a/game1/mp3/tts/v2_msg12_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg12_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg12_react_warm_wav_v1.mp3 deleted file mode 100644 index 30aa6c2..0000000 Binary files a/game1/mp3/tts/v2_msg12_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_linxia_cold_wav_v1.mp3 deleted file mode 100644 index eaf929a..0000000 Binary files a/game1/mp3/tts/v2_msg13_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_linxia_curious_wav_v1.mp3 deleted file mode 100644 index 02693c8..0000000 Binary files a/game1/mp3/tts/v2_msg13_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_linxia_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_linxia_tap_wav_v1.mp3 deleted file mode 100644 index 3bd68e5..0000000 Binary files a/game1/mp3/tts/v2_msg13_linxia_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_linxia_warm_wav_v1.mp3 deleted file mode 100644 index 780319b..0000000 Binary files a/game1/mp3/tts/v2_msg13_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_r3_linxia_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_r3_linxia_cold_wav_v1.mp3 deleted file mode 100644 index 0981656..0000000 Binary files a/game1/mp3/tts/v2_msg13_r3_linxia_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_r3_linxia_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_r3_linxia_curious_wav_v1.mp3 deleted file mode 100644 index c0cfbf3..0000000 Binary files a/game1/mp3/tts/v2_msg13_r3_linxia_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_r3_linxia_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_r3_linxia_warm_wav_v1.mp3 deleted file mode 100644 index a9db32f..0000000 Binary files a/game1/mp3/tts/v2_msg13_r3_linxia_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_r3_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_r3_react_cold_wav_v1.mp3 deleted file mode 100644 index 12a65cf..0000000 Binary files a/game1/mp3/tts/v2_msg13_r3_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_r3_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_r3_react_curious_wav_v1.mp3 deleted file mode 100644 index 6b2b01a..0000000 Binary files a/game1/mp3/tts/v2_msg13_r3_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_r3_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_r3_react_warm_wav_v1.mp3 deleted file mode 100644 index f64314e..0000000 Binary files a/game1/mp3/tts/v2_msg13_r3_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_react_cold_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_react_cold_wav_v1.mp3 deleted file mode 100644 index 6f90571..0000000 Binary files a/game1/mp3/tts/v2_msg13_react_cold_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_react_curious_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_react_curious_wav_v1.mp3 deleted file mode 100644 index 1f83e85..0000000 Binary files a/game1/mp3/tts/v2_msg13_react_curious_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_react_silent_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_react_silent_wav_v1.mp3 deleted file mode 100644 index 326d9fa..0000000 Binary files a/game1/mp3/tts/v2_msg13_react_silent_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_react_tap_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_react_tap_wav_v1.mp3 deleted file mode 100644 index 98a03e5..0000000 Binary files a/game1/mp3/tts/v2_msg13_react_tap_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg13_react_warm_wav_v1.mp3 b/game1/mp3/tts/v2_msg13_react_warm_wav_v1.mp3 deleted file mode 100644 index 6bb7685..0000000 Binary files a/game1/mp3/tts/v2_msg13_react_warm_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg14_linxia_auto_wav_v1.mp3 b/game1/mp3/tts/v2_msg14_linxia_auto_wav_v1.mp3 deleted file mode 100644 index efff5b3..0000000 Binary files a/game1/mp3/tts/v2_msg14_linxia_auto_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg14_mom_ask_wav_v1.mp3 b/game1/mp3/tts/v2_msg14_mom_ask_wav_v1.mp3 deleted file mode 100644 index b498e6f..0000000 Binary files a/game1/mp3/tts/v2_msg14_mom_ask_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg14_react_linked_wav_v1.mp3 b/game1/mp3/tts/v2_msg14_react_linked_wav_v1.mp3 deleted file mode 100644 index 8f821b9..0000000 Binary files a/game1/mp3/tts/v2_msg14_react_linked_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_msg14_react_unlinked_wav_v1.mp3 b/game1/mp3/tts/v2_msg14_react_unlinked_wav_v1.mp3 deleted file mode 100644 index dad36e7..0000000 Binary files a/game1/mp3/tts/v2_msg14_react_unlinked_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_sys_content_warning_wav_v1.mp3 b/game1/mp3/tts/v2_sys_content_warning_wav_v1.mp3 deleted file mode 100644 index 608bbda..0000000 Binary files a/game1/mp3/tts/v2_sys_content_warning_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_sys_hotline_wav_v1.mp3 b/game1/mp3/tts/v2_sys_hotline_wav_v1.mp3 deleted file mode 100644 index def43b8..0000000 Binary files a/game1/mp3/tts/v2_sys_hotline_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_sys_paused_wav_v1.mp3 b/game1/mp3/tts/v2_sys_paused_wav_v1.mp3 deleted file mode 100644 index 112ae2d..0000000 Binary files a/game1/mp3/tts/v2_sys_paused_wav_v1.mp3 and /dev/null differ diff --git a/game1/mp3/tts/v2_sys_wait_reply_wav_v1.mp3 b/game1/mp3/tts/v2_sys_wait_reply_wav_v1.mp3 deleted file mode 100644 index f3669ca..0000000 Binary files a/game1/mp3/tts/v2_sys_wait_reply_wav_v1.mp3 and /dev/null differ diff --git a/game1/操作说明.md b/game1/操作说明.md deleted file mode 100644 index 9601460..0000000 --- a/game1/操作说明.md +++ /dev/null @@ -1,237 +0,0 @@ -# 《林夏》操作说明 - ---- - -## 一、游戏简介 - -全黑屏叙事游戏。玩家扮演 24 岁的林夏,用一部碎屏手机度过今晚 21:00–02:00 的 5 个小时。 - -- **没有视觉界面**,只有声音和触感 -- **全程约 60 分钟**(5 小时游戏时间压缩) -- **16 条消息**,5 种结局 -- **不需要说话**,不需要麦克风 - ---- - -## 二、开始前准备 - -1. 手机和电脑连接**同一 Wi-Fi** -2. 打开手机浏览器,输入地址: - - ``` - http://172.28.107.97:8765/game/ - ``` - -3. **关灯,戴上耳机** -4. 将手机音量调到适中(建议 60–80%) -5. 轻触屏幕任意位置开始游戏 - -> **iOS 用户注意**:Safari 不支持震动反馈,操作正常但无震感。建议使用 Android Chrome。 - ---- - -## 三、消息类型与接收方式 - -游戏中有三种消息形态: - -### 来电 -- 触发:手机长震 + 角色专属铃声 -- 响 **20–30 秒**后自动漏接 - -| 操作 | 效果 | -|------|------| -| **单点** | 接听 | -| **左滑** | 拒接 | -| **不动** | 漏接(对方挂断) | - -### 微信语音 / 微信文字 -- 触发:两短震 + 系统提示音(TTS 报出发件人) - -| 操作 | 效果 | -|------|------| -| **单点** | 播放语音 / 念出文字 | -| **左滑** | 忽略(保持未读) | -| **不动** | 保持未读,晚些再听 | - ---- - -## 四、回复消息 - -**听完语音 / 文字念完后**,进入等待回复状态: - -| 操作 | 发送内容 | -|------|----------| -| **单点** | 发"嗯。"(最简单的回执) | -| **双点** | 发标准回复(针对该消息的一句话) | -| **长按 1 秒** | 进入**细回复**模式 | -| **左滑** | 已读不回 | -| **不动** | 维持"已读未回"状态 | - ---- - -## 五、细回复(核心机制) - -长按 1 秒后,震动确认进入细回复。系统会依次念出 **4 个候选回复**: - -``` -一…… "好,明天寄。" -二…… "你怎么不自己来拿。" -三…… "你那边……都好吗。" -四…… (什么都不说) -``` - -**在听到目标选项时,朝对应方向滑动:** - -| 滑动方向 | 对应选项 | -|----------|----------| -| **左滑** | 一 | -| **右滑** | 二 | -| **上滑** | 三 | -| **下滑** | 四 | - -> **没听清?** 单点屏幕可重听所有选项,或长按 1 秒重新播放。 -> 选错了也没关系——每条消息只影响行为画像,不会"game over"。 - ---- - -## 六、查看当前状态 - -**随时下滑**,系统会用语音告诉你当前在哪个页面,以及可以做什么操作。 - -例如: -- 主屏幕时下滑 → "主屏幕,3条未读。上滑查看收件箱。" -- 来电时下滑 → "妈妈来电中。单点接听,左滑拒接。" -- 听完消息后下滑 → "阿哲的消息已播完。单点回嗯,双点标准回复,长按细回复,左滑已读不回。" - -> 不确定自己在哪?下滑就对了。 - ---- - -## 七、查看未读列表(收件箱) - -在主屏幕**上滑**,进入收件箱模式。 - -系统会依次念出所有未读消息: -``` -"收件箱:4条未读。妈妈,来电。阿哲,语音。周南,语音。……" -``` - -- **单点** → 跳转至列表第一条 -- **左滑** → 返回主屏幕 -- **等待 8 秒** → 自动关闭收件箱,返回游戏 - ---- - -## 八、游戏内时间 - -游戏将现实的 21:00–02:00(5 小时)压缩为 **60 分钟**真实时间。 - -| 游戏时间 | 真实等待 | -|----------|----------| -| 21:03 | 约 36 秒 | -| 21:30 | 约 6 分钟 | -| 22:30 | 约 18 分钟 | -| 23:45 | 约 33 分钟 | -| 02:00 | 约 60 分钟 | - -消息到来时间固定,**漏接 / 不听是合法选择**,但漏掉的内容不会重发。 - ---- - -## 九、结局说明(不含剧透) - -共 **5 种结局**,由以下 5 个变量决定: - -| 变量 | 触发条件 | -|------|----------| -| 与妈妈的连接 | 是否接了妈妈的电话 / 回了文字 | -| 阿哲是否回来 | 23:15 那通电话的选择 | -| 群里是否发言 | 寝室群消息的回应 | -| 与周南的深度 | 回应周南的次数与方式 | -| 是否听自己 | 00:30 时光胶囊是否播放 | - -另有一个**隐藏结局 E**,需要与某位角色深度互动才能触发。 - ---- - -## 十、行为画像 - -游戏全程追踪三个维度(玩家不可见): - -| 维度 | 含义 | 触发行为 | -|------|------|----------| -| **avoidance**(回避) | 林夏今晚想一个人待着 | 漏接、不回、已读不回 | -| **engagement**(投入) | 林夏在认真面对每一个人 | 细回复、主动追问 | -| **nostalgia**(怀旧) | 林夏在这一夜反复回望 | 重听同一条消息、分享自己 | - -画像决定 **00:30 时光胶囊**播放哪个版本(明朗 / 迷茫 / 温柔)。 - ---- - -## 十一、彩蛋 - -- **夜间启动**(现实时间 22:00–04:00 之间打开游戏):开场多一句话 -- **消息09**:小美醉语音结束后会有一个撤回事件 -- **消息04**:如果一直不回阿哲,会听到一个小细节 - ---- - -## 十二、开发者 / 测试模式 - -在 URL 末尾加 `?dev` 可开启**10倍速**模式: - -``` -http://172.28.107.97:8765/game/?dev -``` - -- 所有消息的触发时间缩短为原来的 1/10 -- 全程约 **6 分钟**可打通 -- 适合测试结局分支 - ---- - -## 十三、启动服务器 - -关机重启后需要重新启动 HTTP 服务器: - -```bash -cd /home/xsl/blind -python3 -m http.server 8765 --bind 0.0.0.0 & -``` - -查看当前 IP: - -```bash -hostname -I | awk '{print $1}' -``` - ---- - -## 十四、文件结构 - -``` -/home/xsl/blind/ -├── game/ -│ ├── index.html 主页面(黑屏) -│ ├── manifest.json PWA 配置 -│ ├── 操作说明.md 本文件 -│ └── js/ -│ ├── utils.js 工具函数 + 浏览器 TTS -│ ├── haptics.js 震动反馈 -│ ├── audio.js 音频管理器 -│ ├── gestures.js 单指手势检测 -│ ├── profile.js 行为画像评分 -│ ├── story.js 16条消息数据 -│ ├── engine.js 游戏状态机 -│ └── main.js 入口 -└── audio/ - └── 00_raw/ - ├── tts/ 角色语音(68条) - ├── music/ BGM + 铃声 - ├── sfx/ 音效 - └── ambience/ 环境底噪 -``` - ---- - -*"屏幕坏了,但她的一夜还没结束。"* diff --git a/case_doc/gpt_case/03_盲语审判.md b/other_docs/case_doc/gpt_case/03_盲语审判.md similarity index 100% rename from case_doc/gpt_case/03_盲语审判.md rename to other_docs/case_doc/gpt_case/03_盲语审判.md diff --git a/case_doc/gpt_case/08_最后热线.md b/other_docs/case_doc/gpt_case/08_最后热线.md similarity index 100% rename from case_doc/gpt_case/08_最后热线.md rename to other_docs/case_doc/gpt_case/08_最后热线.md diff --git a/case_doc/opus_case/00_总览.md b/other_docs/case_doc/opus_case/00_总览.md similarity index 100% rename from case_doc/opus_case/00_总览.md rename to other_docs/case_doc/opus_case/00_总览.md diff --git a/case_doc/opus_case/01_盲打字员的最后一天.md b/other_docs/case_doc/opus_case/01_盲打字员的最后一天.md similarity index 100% rename from case_doc/opus_case/01_盲打字员的最后一天.md rename to other_docs/case_doc/opus_case/01_盲打字员的最后一天.md diff --git a/case_doc/opus_case/02_梦的接线员.md b/other_docs/case_doc/opus_case/02_梦的接线员.md similarity index 100% rename from case_doc/opus_case/02_梦的接线员.md rename to other_docs/case_doc/opus_case/02_梦的接线员.md diff --git a/case_doc/opus_case/03_空房子的调律师.md b/other_docs/case_doc/opus_case/03_空房子的调律师.md similarity index 100% rename from case_doc/opus_case/03_空房子的调律师.md rename to other_docs/case_doc/opus_case/03_空房子的调律师.md diff --git a/case_doc/opus_case/04_晚安电台FM87.6.md b/other_docs/case_doc/opus_case/04_晚安电台FM87.6.md similarity index 100% rename from case_doc/opus_case/04_晚安电台FM87.6.md rename to other_docs/case_doc/opus_case/04_晚安电台FM87.6.md diff --git a/case_doc/opus_case/05_桌底摩斯.md b/other_docs/case_doc/opus_case/05_桌底摩斯.md similarity index 100% rename from case_doc/opus_case/05_桌底摩斯.md rename to other_docs/case_doc/opus_case/05_桌底摩斯.md diff --git a/case_doc/opus_case/06_妻子失踪的48小时.md b/other_docs/case_doc/opus_case/06_妻子失踪的48小时.md similarity index 100% rename from case_doc/opus_case/06_妻子失踪的48小时.md rename to other_docs/case_doc/opus_case/06_妻子失踪的48小时.md diff --git a/case_doc/opus_case/07_静修营Day7.md b/other_docs/case_doc/opus_case/07_静修营Day7.md similarity index 100% rename from case_doc/opus_case/07_静修营Day7.md rename to other_docs/case_doc/opus_case/07_静修营Day7.md diff --git a/case_doc/opus_case/08_平安夜的电话.md b/other_docs/case_doc/opus_case/08_平安夜的电话.md similarity index 100% rename from case_doc/opus_case/08_平安夜的电话.md rename to other_docs/case_doc/opus_case/08_平安夜的电话.md diff --git a/case_doc/opus_case/09_第七幕观众即角色.md b/other_docs/case_doc/opus_case/09_第七幕观众即角色.md similarity index 100% rename from case_doc/opus_case/09_第七幕观众即角色.md rename to other_docs/case_doc/opus_case/09_第七幕观众即角色.md diff --git a/case_doc/opus_case/10_死者通讯录.md b/other_docs/case_doc/opus_case/10_死者通讯录.md similarity index 100% rename from case_doc/opus_case/10_死者通讯录.md rename to other_docs/case_doc/opus_case/10_死者通讯录.md diff --git a/gdd/02-心跳连线.md b/other_docs/gdd/02-心跳连线.md similarity index 100% rename from gdd/02-心跳连线.md rename to other_docs/gdd/02-心跳连线.md diff --git a/gdd/04-深渊电台.md b/other_docs/gdd/04-深渊电台.md similarity index 100% rename from gdd/04-深渊电台.md rename to other_docs/gdd/04-深渊电台.md diff --git a/gdd/06-回声神探.md b/other_docs/gdd/06-回声神探.md similarity index 100% rename from gdd/06-回声神探.md rename to other_docs/gdd/06-回声神探.md diff --git a/gdd/07-冥河摆渡人.md b/other_docs/gdd/07-冥河摆渡人.md similarity index 100% rename from gdd/07-冥河摆渡人.md rename to other_docs/gdd/07-冥河摆渡人.md diff --git a/gdd/09-心音诊所.md b/other_docs/gdd/09-心音诊所.md similarity index 100% rename from gdd/09-心音诊所.md rename to other_docs/gdd/09-心音诊所.md diff --git a/gdd/redesign_v2.md b/other_docs/gdd/redesign_v2.md similarity index 100% rename from gdd/redesign_v2.md rename to other_docs/gdd/redesign_v2.md diff --git a/tools/generate_voices.py b/tools/generate_voices.py deleted file mode 100644 index 1c471e7..0000000 --- a/tools/generate_voices.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python3 -""" -生成《林夏》v2 全部新增语音资源 - -使用 edge-tts(微软 Azure 语音合成) -运行: python3 tools/generate_voices.py - -角色 → 声优映射: - 林夏 → zh-CN-XiaoxiaoNeural (温暖年轻女声) - 小美 → zh-CN-XiaoyiNeural (活泼年轻女声) - 阿哲 → zh-CN-YunxiNeural (年轻男声) - 王姐 → zh-CN-XiaoxiaoNeural (用较慢语速模拟成熟感) - 安安 → zh-CN-XiaoyiNeural (活泼,用较快语速) - 室友A → zh-CN-XiaoyiNeural - 室友B → zh-CN-XiaoxiaoNeural - 妈妈 → zh-CN-XiaoxiaoNeural (慢速 + 柔和,模拟妈妈) - 周南 → zh-CN-YunyangNeural (沉稳男声) - 外卖小哥 → zh-CN-YunjianNeural (干脆男声) -""" - -import asyncio -import os -import edge_tts - -# ── 输出目录 ── -BASE = os.path.join(os.path.dirname(__file__), '..', 'audio', 'mp3') -DIR_LINXIA = os.path.join(BASE, 'linxia') -DIR_REACT = os.path.join(BASE, 'react') - -# ── 声优配置 ── -V_LINXIA = 'zh-CN-XiaoxiaoNeural' -V_XIAOMEI = 'zh-CN-XiaoyiNeural' -V_AZHE = 'zh-CN-YunxiNeural' -V_WANGJIE = 'zh-CN-XiaoxiaoNeural' # 慢速 -V_ANAN = 'zh-CN-XiaoyiNeural' # 快速 -V_DORM_A = 'zh-CN-XiaoyiNeural' -V_DORM_B = 'zh-CN-XiaoxiaoNeural' -V_MOM = 'zh-CN-XiaoxiaoNeural' # 慢速 + 柔和 -V_ZHOUNAN = 'zh-CN-YunyangNeural' -V_DELIVERY = 'zh-CN-YunjianNeural' - -# ── 语速配置 (rate: "-20%" 较慢, "+10%" 较快) ── -# edge-tts rate 格式: "+0%", "-20%", "+15%" 等 - -# ══════════════════════════════════════════ -# 林夏语音列表 -# ══════════════════════════════════════════ - -LINXIA_LINES = [ - # ── 通用短句 ── - ('generic_hmm', '嗯。', '-5%'), - ('generic_ok', '好。', '-5%'), - ('generic_warm_ok', '嗯,好啊。', '-10%'), - ('generic_cold_know', '知道了。', '+0%'), - ('generic_cold_fine', '行吧。', '+0%'), - ('generic_curious', '嗯?', '-5%'), - ('generic_then', '然后呢?', '-5%'), - - # ── MSG-01 妈妈电话 ── - ('msg01_auto', '嗯……好。', '-15%'), - - # ── MSG-02 小美 ── - ('msg02_warm', '好啊,明天不见不散。', '-5%'), - ('msg02_cold', '再说吧。', '+0%'), - ('msg02_curious', '你怎么知道的啊?', '-5%'), - ('msg02_r3_curious', '他……发了什么?', '-10%'), - - # ── MSG-03 外卖 ── - ('msg03_auto', '好,我下来拿。', '+0%'), - - # ── MSG-04 阿哲 ── - ('msg04_warm', '你那边……还好吗。', '-15%'), - ('msg04_cold', '知道了。明天寄。', '+0%'), - ('msg04_curious', '你怎么不自己来拿。', '-5%'), - ('msg04_r3w_warm', '不太好。', '-20%'), - ('msg04_r3w_cold', '挺好的。', '+0%'), - ('msg04_r3c_curious', '为什么。', '-10%'), - ('msg04_r3c_warm', '算了,不问了。', '-10%'), - - # ── MSG-05 王姐 ── - ('msg05_warm', '谢谢王姐。', '-5%'), - ('msg05_cold', '好的,知道了。', '+0%'), - ('msg05_curious', '王姐……有什么建议吗?', '-10%'), - - # ── MSG-06 安安 ── - ('msg06_warm', '在哪儿啊?我看看吧。', '-5%'), - ('msg06_cold', '不了,你们玩好。', '+0%'), - ('msg06_curious', '你喝了多少了?', '-5%'), - - # ── MSG-07 寝室群 ── - ('msg07_warm', '恭喜恭喜!太厉害了!', '-5%'), - ('msg07_cold', '恭喜。', '+0%'), - ('msg07_curious', '怎么升的啊?讲讲!', '-5%'), - ('msg07_r3_warm', '挺好的,你请客我去!', '-5%'), - ('msg07_r3_cold', '还行。', '+0%'), - - # ── MSG-09 小美(醉)── - ('msg09_warm', '小美……你没事吧。', '-15%'), - ('msg09_cold', '我知道了。', '+0%'), - ('msg09_curious', '你……为什么现在才说。', '-15%'), - ('msg09_r3_warm', '我不恨你。', '-20%'), - ('msg09_r3_cold', '我得想想。', '-10%'), - - # ── MSG-10 妈妈文字 ── - ('msg10_warm', '没有,怎么了?', '-5%'), - ('msg10_cold', '嗯,要睡了。', '-10%'), - ('msg10_curious', '妈……你能打电话给我吗?', '-15%'), - ('msg10_call_warm', '没什么……就是有点累。', '-20%'), - ('msg10_call_curious','妈,我辞职了。', '-15%'), - ('msg10_rw_warm', '还好。', '-10%'), - ('msg10_rw_curious', '不太好。', '-15%'), - - # ── MSG-11 阿哲电话 ── - ('msg11_warm', '可以。但只有五分钟。', '-5%'), - ('msg11_cold', '不方便。我明天寄给你。', '+0%'), - ('msg11_curious', '为什么非要今天来?', '-5%'), - ('msg11_tap', '不了。', '+0%'), - - # ── MSG-12 周南 ── - ('msg12_warm', '周南!你还记得我啊!', '-5%'), - ('msg12_cold', '嗯,你好。', '+0%'), - ('msg12_curious', '你怎么有我微信的?', '-5%'), - ('msg12_tap', '嗯……好久不见。', '-10%'), - - # ── MSG-13 周南长语音 ── - ('msg13_warm', '一个人在北京,还好吗?', '-10%'), - ('msg13_cold', '你讲了好多。', '-5%'), - ('msg13_curious', '生日快乐。', '-15%'), - ('msg13_tap', '嗯,我都听到了。', '-10%'), - ('msg13_r3_warm', '不太好。今天也是我的坏日子。', '-15%'), - ('msg13_r3_cold', '还行吧。', '-5%'), - ('msg13_r3_curious', '你为什么突然联系我?', '-10%'), - - # ── MSG-14 妈妈电话 ── - ('msg14_auto', '嗯,我没事。', '-10%'), -] - -# ══════════════════════════════════════════ -# NPC 反应语音列表 -# ══════════════════════════════════════════ - -NPC_LINES = [ - # ── MSG-02 小美反应 ── - ('msg02_react_warm', V_XIAOMEI, '行!那我叫上安安!老地方见!别放鸽子啊!', '+5%'), - ('msg02_react_cold', V_XIAOMEI, '……好吧。你要是改主意了随时说。', '-5%'), - ('msg02_react_curious', V_XIAOMEI, '还不是阿哲自己发朋友圈!你不知道吗?他发了又秒删……', '+0%'), - ('msg02_react_silent', V_XIAOMEI, '你还活着吗哈哈。好了不烦你了,有事找我。', '+5%'), - ('msg02_react_tap', V_XIAOMEI, '嗯是什么意思啊哈哈!行吧你休息。', '+5%'), - ('msg02_r3_curious', V_XIAOMEI, '就发了一张你们以前的照片,配了一句值得。两分钟就删了。', '-5%'), - - # ── MSG-04 阿哲反应 ── - ('msg04_react_warm', V_AZHE, '我……挺好的。你呢?', '-10%'), - ('msg04_react_cold', V_AZHE, '嗯……谢了。', '-5%'), - ('msg04_react_curious', V_AZHE, '我……不太方便过去。', '-10%'), - ('msg04_react_silent', V_AZHE, '那……我晚点再说吧。', '-10%'), - ('msg04_react_tap', V_AZHE, '谢谢。', '-5%'), - ('msg04_r3w_sorry', V_AZHE, '……对不起。', '-20%'), - ('msg04_r3w_good', V_AZHE, '那就好。', '-5%'), - ('msg04_r3w_night', V_AZHE, '……那,晚安。', '-15%'), - ('msg04_r3c_nevermind', V_AZHE, '我……没什么。你寄吧。', '-10%'), - - # ── MSG-05 王姐反应 ── - ('msg05_react_warm', V_WANGJIE, '别客气。你还年轻,出去看看也好。这行业你知道的。', '-15%'), - ('msg05_react_curious', V_WANGJIE, '你想听真话?别在这行耗了。你有本事,去试试别的。', '-10%'), - - # ── MSG-06 安安反应 ── - ('msg06_react_warm', V_ANAN, '对面那个!我给你留了位置!赶紧赶紧!', '+10%'), - ('msg06_react_cold', V_ANAN, '好吧!那我给你寄一杯!', '+10%'), - ('msg06_react_curious', V_ANAN, '才两杯!我清醒得很!……好吧三杯。快来!', '+5%'), - ('msg06_react_silent', V_ANAN, '喂?信号不好吗?好吧以后再约!', '+5%'), - ('msg06_react_tap', V_ANAN, '嗯是来还是不来啊!算了回头聊!', '+5%'), - - # ── MSG-07 寝室群反应 ── - ('msg07_react_warm', V_DORM_A, '哈哈谢谢!我请客!你最近怎么样啊?', '+5%'), - ('msg07_react_curious', V_DORM_A, '说来话长!我们老板走了我就顶上了哈哈。', '+5%'), - ('msg07_react_tap', V_DORM_B, '林夏发表情了哈哈。', '+0%'), - ('msg07_r3_cold', V_DORM_B, '你是不是有事啊?没事可以跟我们说。', '-5%'), - - # ── MSG-09 小美(醉)反应 ── - ('msg09_react_warm', V_XIAOMEI, '我没事……我就是喝多了想告诉你……你别怪我。', '-15%'), - ('msg09_react_tap', V_XIAOMEI, '你不生气吗?算了……当我没说。', '-10%'), - ('msg09_react_curious', V_XIAOMEI, '因为你今天……我怕你以后恨我……', '-15%'), - ('msg09_r3_warm', V_XIAOMEI, '谢谢你……谢谢你林夏。', '-20%'), - ('msg09_r3_cold', V_XIAOMEI, '好……对不起。', '-15%'), - - # ── MSG-10 妈妈反应 ── - ('msg10_react_warm', V_MOM, '没事,就是想起来问一下。今天怎么样?', '-20%'), - ('msg10_react_curious', V_MOM, '怎么了夏夏?你声音不对。', '-15%'), - ('msg10_call_warm', V_MOM, '累了就回家歇几天。妈煮了排骨。', '-20%'), - ('msg10_call_curious', V_MOM, '辞了就辞了。回来再说。', '-15%'), - ('msg10_call_silent', V_MOM, '不想说就不说。妈在这呢。', '-20%'), - ('msg10_rw_warm', V_MOM, '那就好。别太晚了。', '-15%'), - ('msg10_rw_curious', V_MOM, '怎么了?', '-10%'), - - # ── MSG-11 阿哲反应 ── - ('msg11_react_warm', V_AZHE, '好,我马上过来。谢谢。', '-5%'), - ('msg11_react_cold', V_AZHE, '好吧……那谢了。', '-10%'), - ('msg11_react_curious', V_AZHE, '我……明天要出差。就五分钟。', '-10%'), - ('msg11_react_tap', V_AZHE, '好。', '-5%'), - - # ── MSG-12 周南反应 ── - ('msg12_react_warm', V_ZHOUNAN, '当然记得。你是我们班最安静的那个。', '-10%'), - ('msg12_react_cold', V_ZHOUNAN, '嗯……好久不见。你现在在哪呢?', '-10%'), - ('msg12_react_curious', V_ZHOUNAN, '你忘了吗?毕业那天你加的我。不过你可能早忘了哈哈。', '-5%'), - ('msg12_react_silent', V_ZHOUNAN, '你是不是不记得我了?没关系的。就是突然想说声嗨。', '-10%'), - ('msg12_react_tap', V_ZHOUNAN, '是啊,好久不见。', '-10%'), - - # ── MSG-13 周南反应 ── - ('msg13_react_warm', V_ZHOUNAN, '还行吧。习惯了。你呢?你在北京过得好吗?', '-10%'), - ('msg13_react_cold', V_ZHOUNAN, '是吗?不好意思,话太多了。', '-10%'), - ('msg13_react_curious', V_ZHOUNAN, '谢谢你。你是今天第一个跟我说的。', '-15%'), - ('msg13_react_silent', V_ZHOUNAN, '不好意思突然说这么多……那,晚安。', '-10%'), - ('msg13_react_tap', V_ZHOUNAN, '嗯。谢谢你听我说。', '-10%'), - ('msg13_r3_warm', V_ZHOUNAN, '那我们算是难兄难妹了。', '-5%'), - ('msg13_r3_cold', V_ZHOUNAN, '那就好。', '-5%'), - ('msg13_r3_curious', V_ZHOUNAN, '因为……今天生日嘛,想起以前的事。想起你。', '-15%'), - - # ── MSG-14 妈妈反应 ── - ('msg14_react_linked', V_MOM, '好。那早点睡。妈爱你。', '-20%'), - ('msg14_react_unlinked', V_MOM, '你今天怎么都不理妈妈?出什么事了吗?', '-15%'), -] - - -async def generate_one(voice, text, rate, outpath): - """用 edge-tts 生成单条语音""" - comm = edge_tts.Communicate(text, voice, rate=rate) - await comm.save(outpath) - - -async def main(): - os.makedirs(DIR_LINXIA, exist_ok=True) - os.makedirs(DIR_REACT, exist_ok=True) - - tasks = [] - total = len(LINXIA_LINES) + len(NPC_LINES) - done = 0 - - # ── 生成林夏语音 ── - for name, text, rate in LINXIA_LINES: - outpath = os.path.join(DIR_LINXIA, f'{name}.mp3') - if os.path.exists(outpath): - done += 1 - continue - tasks.append((V_LINXIA, text, rate, outpath, name)) - - # ── 生成 NPC 反应语音 ── - for name, voice, text, rate in NPC_LINES: - outpath = os.path.join(DIR_REACT, f'{name}.mp3') - if os.path.exists(outpath): - done += 1 - continue - tasks.append((voice, text, rate, outpath, name)) - - if not tasks: - print(f'所有 {total} 条语音已存在,无需生成。') - return - - print(f'需要生成 {len(tasks)} 条语音(已跳过 {done} 条已存在的)...\n') - - # 逐条生成(避免并发过高被限流) - for i, (voice, text, rate, outpath, name) in enumerate(tasks): - try: - await generate_one(voice, text, rate, outpath) - print(f' [{i+1}/{len(tasks)}] {name}: "{text}"') - except Exception as e: - print(f' [{i+1}/{len(tasks)}] FAILED {name}: {e}') - - print(f'\n完成!共生成 {len(tasks)} 条语音。') - print(f' 林夏语音目录: {DIR_LINXIA}') - print(f' NPC反应目录: {DIR_REACT}') - - -if __name__ == '__main__': - asyncio.run(main()) diff --git a/voice/anan/anan_extra_13.wav b/voice/anan/anan_extra_13.wav deleted file mode 100644 index 387758c..0000000 Binary files a/voice/anan/anan_extra_13.wav and /dev/null differ diff --git a/voice/anan/anan_ref.wav b/voice/anan/anan_ref.wav deleted file mode 100644 index 06271eb..0000000 Binary files a/voice/anan/anan_ref.wav and /dev/null differ diff --git a/voice/azhe/azhe_extra_05.wav b/voice/azhe/azhe_extra_05.wav deleted file mode 100644 index ced6c7c..0000000 Binary files a/voice/azhe/azhe_extra_05.wav and /dev/null differ diff --git a/voice/azhe/azhe_ref.wav b/voice/azhe/azhe_ref.wav deleted file mode 100644 index 88060cf..0000000 Binary files a/voice/azhe/azhe_ref.wav and /dev/null differ diff --git a/voice/delivery/delivery_01.wav b/voice/delivery/delivery_01.wav deleted file mode 100644 index bb6c004..0000000 Binary files a/voice/delivery/delivery_01.wav and /dev/null differ diff --git a/voice/delivery/delivery_02.wav b/voice/delivery/delivery_02.wav deleted file mode 100644 index 486dc63..0000000 Binary files a/voice/delivery/delivery_02.wav and /dev/null differ diff --git a/voice/delivery/delivery_03.wav b/voice/delivery/delivery_03.wav deleted file mode 100644 index ce5981f..0000000 Binary files a/voice/delivery/delivery_03.wav and /dev/null differ diff --git a/voice/delivery/delivery_04.wav b/voice/delivery/delivery_04.wav deleted file mode 100644 index 69204f9..0000000 Binary files a/voice/delivery/delivery_04.wav and /dev/null differ diff --git a/voice/delivery/delivery_05.wav b/voice/delivery/delivery_05.wav deleted file mode 100644 index c43cdec..0000000 Binary files a/voice/delivery/delivery_05.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_01.wav b/voice/delivery/delivery_extra_01.wav deleted file mode 100644 index 5f17407..0000000 Binary files a/voice/delivery/delivery_extra_01.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_02.wav b/voice/delivery/delivery_extra_02.wav deleted file mode 100644 index 50b655f..0000000 Binary files a/voice/delivery/delivery_extra_02.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_03.wav b/voice/delivery/delivery_extra_03.wav deleted file mode 100644 index 06253a1..0000000 Binary files a/voice/delivery/delivery_extra_03.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_04.wav b/voice/delivery/delivery_extra_04.wav deleted file mode 100644 index c266eb5..0000000 Binary files a/voice/delivery/delivery_extra_04.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_05.wav b/voice/delivery/delivery_extra_05.wav deleted file mode 100644 index dc3f80a..0000000 Binary files a/voice/delivery/delivery_extra_05.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_06.wav b/voice/delivery/delivery_extra_06.wav deleted file mode 100644 index 63f3d75..0000000 Binary files a/voice/delivery/delivery_extra_06.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_07.wav b/voice/delivery/delivery_extra_07.wav deleted file mode 100644 index 4041137..0000000 Binary files a/voice/delivery/delivery_extra_07.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_08.wav b/voice/delivery/delivery_extra_08.wav deleted file mode 100644 index 01093e3..0000000 Binary files a/voice/delivery/delivery_extra_08.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_09.wav b/voice/delivery/delivery_extra_09.wav deleted file mode 100644 index 3a29143..0000000 Binary files a/voice/delivery/delivery_extra_09.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_10.wav b/voice/delivery/delivery_extra_10.wav deleted file mode 100644 index d6f2e69..0000000 Binary files a/voice/delivery/delivery_extra_10.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_11.wav b/voice/delivery/delivery_extra_11.wav deleted file mode 100644 index 88976fb..0000000 Binary files a/voice/delivery/delivery_extra_11.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_12.wav b/voice/delivery/delivery_extra_12.wav deleted file mode 100644 index 11cc97c..0000000 Binary files a/voice/delivery/delivery_extra_12.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_13.wav b/voice/delivery/delivery_extra_13.wav deleted file mode 100644 index a378c28..0000000 Binary files a/voice/delivery/delivery_extra_13.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_14.wav b/voice/delivery/delivery_extra_14.wav deleted file mode 100644 index 3d756c3..0000000 Binary files a/voice/delivery/delivery_extra_14.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_15.wav b/voice/delivery/delivery_extra_15.wav deleted file mode 100644 index 146540d..0000000 Binary files a/voice/delivery/delivery_extra_15.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_16.wav b/voice/delivery/delivery_extra_16.wav deleted file mode 100644 index fe5d403..0000000 Binary files a/voice/delivery/delivery_extra_16.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_17.wav b/voice/delivery/delivery_extra_17.wav deleted file mode 100644 index cf164cd..0000000 Binary files a/voice/delivery/delivery_extra_17.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_18.wav b/voice/delivery/delivery_extra_18.wav deleted file mode 100644 index 171269d..0000000 Binary files a/voice/delivery/delivery_extra_18.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_19.wav b/voice/delivery/delivery_extra_19.wav deleted file mode 100644 index 707bad9..0000000 Binary files a/voice/delivery/delivery_extra_19.wav and /dev/null differ diff --git a/voice/delivery/delivery_extra_20.wav b/voice/delivery/delivery_extra_20.wav deleted file mode 100644 index 2ddd878..0000000 Binary files a/voice/delivery/delivery_extra_20.wav and /dev/null differ diff --git a/voice/delivery/delivery_ref.wav b/voice/delivery/delivery_ref.wav deleted file mode 100644 index 6fbd0fa..0000000 Binary files a/voice/delivery/delivery_ref.wav and /dev/null differ diff --git a/voice/dorm_a/000017e3-c450-4ec6-ae77-d1e8a6a57897.wav b/voice/dorm_a/000017e3-c450-4ec6-ae77-d1e8a6a57897.wav deleted file mode 100644 index eb0b9fb..0000000 Binary files a/voice/dorm_a/000017e3-c450-4ec6-ae77-d1e8a6a57897.wav and /dev/null differ diff --git a/voice/dorm_a/dorm_a_ref.wav b/voice/dorm_a/dorm_a_ref.wav deleted file mode 100644 index e3c9020..0000000 Binary files a/voice/dorm_a/dorm_a_ref.wav and /dev/null differ diff --git a/voice/dorm_b/a001c446-ef9b-47fe-a690-9d359f67ae90.wav b/voice/dorm_b/a001c446-ef9b-47fe-a690-9d359f67ae90.wav deleted file mode 100644 index ca6fce5..0000000 Binary files a/voice/dorm_b/a001c446-ef9b-47fe-a690-9d359f67ae90.wav and /dev/null differ diff --git a/voice/dorm_b/dorm_b_ref.wav b/voice/dorm_b/dorm_b_ref.wav deleted file mode 100644 index 38d08ce..0000000 Binary files a/voice/dorm_b/dorm_b_ref.wav and /dev/null differ diff --git a/voice/dorm_c/dorm_c_extra_15.wav b/voice/dorm_c/dorm_c_extra_15.wav deleted file mode 100644 index cf637ec..0000000 Binary files a/voice/dorm_c/dorm_c_extra_15.wav and /dev/null differ diff --git a/voice/dorm_c/dorm_c_ref.wav b/voice/dorm_c/dorm_c_ref.wav deleted file mode 100644 index 533816c..0000000 Binary files a/voice/dorm_c/dorm_c_ref.wav and /dev/null differ diff --git a/voice/hr/hr_extra_18.wav b/voice/hr/hr_extra_18.wav deleted file mode 100644 index 67b0911..0000000 Binary files a/voice/hr/hr_extra_18.wav and /dev/null differ diff --git a/voice/hr/hr_extra_18_trimmed.wav b/voice/hr/hr_extra_18_trimmed.wav deleted file mode 100644 index 3a5338d..0000000 Binary files a/voice/hr/hr_extra_18_trimmed.wav and /dev/null differ diff --git a/voice/hr/hr_ref.wav b/voice/hr/hr_ref.wav deleted file mode 100644 index 2833e76..0000000 Binary files a/voice/hr/hr_ref.wav and /dev/null differ diff --git a/voice/linxia/linxia_ref.wav b/voice/linxia/linxia_ref.wav deleted file mode 100644 index 11176ba..0000000 Binary files a/voice/linxia/linxia_ref.wav and /dev/null differ diff --git a/voice/linxia/self_3y_ref.wav b/voice/linxia/self_3y_ref.wav deleted file mode 100644 index 3b08a8a..0000000 Binary files a/voice/linxia/self_3y_ref.wav and /dev/null differ diff --git a/voice/mom/mom_extra_04.wav b/voice/mom/mom_extra_04.wav deleted file mode 100644 index fdcc3c2..0000000 Binary files a/voice/mom/mom_extra_04.wav and /dev/null differ diff --git a/voice/mom/mom_ref.wav b/voice/mom/mom_ref.wav deleted file mode 100644 index 779d1ca..0000000 Binary files a/voice/mom/mom_ref.wav and /dev/null differ diff --git a/voice/xiaomei/xiaomei_03.wav b/voice/xiaomei/xiaomei_03.wav deleted file mode 100644 index 12e55de..0000000 Binary files a/voice/xiaomei/xiaomei_03.wav and /dev/null differ diff --git a/voice/xiaomei/xiaomei_drunk_ref.wav b/voice/xiaomei/xiaomei_drunk_ref.wav deleted file mode 100644 index 9e14fd3..0000000 Binary files a/voice/xiaomei/xiaomei_drunk_ref.wav and /dev/null differ diff --git a/voice/xiaomei/xiaomei_ref.wav b/voice/xiaomei/xiaomei_ref.wav deleted file mode 100644 index 7dd7f70..0000000 Binary files a/voice/xiaomei/xiaomei_ref.wav and /dev/null differ diff --git a/voice/zhounan/zhounan_extra_10.wav b/voice/zhounan/zhounan_extra_10.wav deleted file mode 100644 index 36cb646..0000000 Binary files a/voice/zhounan/zhounan_extra_10.wav and /dev/null differ diff --git a/voice/zhounan/zhounan_ref.wav b/voice/zhounan/zhounan_ref.wav deleted file mode 100644 index e7ccac0..0000000 Binary files a/voice/zhounan/zhounan_ref.wav and /dev/null differ diff --git a/voice_mp3/anan/candidate_04.mp3 b/voice_mp3/anan/candidate_04.mp3 deleted file mode 100644 index 7fc076c..0000000 Binary files a/voice_mp3/anan/candidate_04.mp3 and /dev/null differ diff --git a/voice_mp3/azhe/candidate_05.mp3 b/voice_mp3/azhe/candidate_05.mp3 deleted file mode 100644 index d11b4d0..0000000 Binary files a/voice_mp3/azhe/candidate_05.mp3 and /dev/null differ diff --git a/voice_mp3/delivery/candidate_03.mp3 b/voice_mp3/delivery/candidate_03.mp3 deleted file mode 100644 index 8e0d966..0000000 Binary files a/voice_mp3/delivery/candidate_03.mp3 and /dev/null differ diff --git a/voice_mp3/dorm_a/candidate_03.mp3 b/voice_mp3/dorm_a/candidate_03.mp3 deleted file mode 100644 index e335077..0000000 Binary files a/voice_mp3/dorm_a/candidate_03.mp3 and /dev/null differ diff --git a/voice_mp3/dorm_b/candidate_02.mp3 b/voice_mp3/dorm_b/candidate_02.mp3 deleted file mode 100644 index b645fe2..0000000 Binary files a/voice_mp3/dorm_b/candidate_02.mp3 and /dev/null differ diff --git a/voice_mp3/dorm_c/candidate_08.mp3 b/voice_mp3/dorm_c/candidate_08.mp3 deleted file mode 100644 index 1a477d5..0000000 Binary files a/voice_mp3/dorm_c/candidate_08.mp3 and /dev/null differ diff --git a/voice_mp3/hr/candidate_02.mp3 b/voice_mp3/hr/candidate_02.mp3 deleted file mode 100644 index 9b1ed60..0000000 Binary files a/voice_mp3/hr/candidate_02.mp3 and /dev/null differ diff --git a/voice_mp3/mom/candidate_11.mp3 b/voice_mp3/mom/candidate_11.mp3 deleted file mode 100644 index 79d072f..0000000 Binary files a/voice_mp3/mom/candidate_11.mp3 and /dev/null differ diff --git a/voice_mp3/xiaomei/candidate_15.mp3 b/voice_mp3/xiaomei/candidate_15.mp3 deleted file mode 100644 index 2c78134..0000000 Binary files a/voice_mp3/xiaomei/candidate_15.mp3 and /dev/null differ diff --git a/voice_mp3/xiaomei/candidate_19.mp3 b/voice_mp3/xiaomei/candidate_19.mp3 deleted file mode 100644 index 651c4a5..0000000 Binary files a/voice_mp3/xiaomei/candidate_19.mp3 and /dev/null differ diff --git a/voice_mp3/zhounan/candidate_12.mp3 b/voice_mp3/zhounan/candidate_12.mp3 deleted file mode 100644 index a81a814..0000000 Binary files a/voice_mp3/zhounan/candidate_12.mp3 and /dev/null differ diff --git a/任务文档_v2收尾.md b/任务文档_v2收尾.md deleted file mode 100644 index 5ccee38..0000000 --- a/任务文档_v2收尾.md +++ /dev/null @@ -1,250 +0,0 @@ -# 林夏 v2 收尾任务文档 - -## 一、游戏开发任务 - -### G1: 手势系统升级 — gestures.js - -**现状**: 仅支持 6 种手势(单击/双击/四方向滑动),无长按、无多指手势 -**目标**: 新增长按(1s)、两指长按(暂停)、三指点击(退出) - -**交付物**: -- 长按检测:touchstart 后 1000ms 无移动 → emit `longpress` -- 两指长按检测:两指同时触屏 1000ms → emit `twofinger_longpress` -- 三指点击检测:三指同时触屏后抬起 → emit `threefinger_tap` -- touchmove 监听:移动超阈值取消长按 -- 键盘映射:L=长按, P=暂停, Q=退出 - -**测试case**: -1. 单指按住 1.5s 不动 → 触发 longpress,不触发 singletap -2. 单指按住 0.3s 抬起 → 触发 singletap,不触发 longpress -3. 单指按住后滑动 → 触发 swipe,不触发 longpress -4. 双指按住 1.5s → 触发 twofinger_longpress -5. 双指快速点击(<1s)→ 不触发任何事件(忽略) -6. 三指同时触屏后抬起 → 触发 threefinger_tap -7. 键盘 L/P/Q 分别触发对应事件 - ---- - -### G2: 变量系统补全 — engine.js - -**现状**: 使用 `UNREAD` 变量,缺少 `REPLY_COUNT` -**目标**: 添加 `REPLY_COUNT`,在玩家做出非沉默选择时递增 - -**交付物**: -- `vars` 对象新增 `REPLY_COUNT: 0` -- `_handleChoice()` 中非沉默选择时 `REPLY_COUNT++` -- 结局 C 判定改用 `REPLY_COUNT <= 2` - -**测试case**: -1. 选择右滑(温暖) → REPLY_COUNT 递增 1 -2. 选择下滑(沉默, isSilence=true) → REPLY_COUNT 不变 -3. 双击跳过选择 → REPLY_COUNT 不变 -4. 全程极少回复(REPLY_COUNT<=2) + 全部已读 → 触发结局 C - ---- - -### G3: 长按手势处理 — engine.js - -**现状**: 无长按处理 -**目标**: playing/choosing 状态重播当前消息音频;其他状态广播未读数 - -**交付物**: -- `_onLongPress()` 方法 -- playing/responding/reacting → 中断当前播放,重播 currentMsg.audio -- choosing → 重播 currentMsg.audio(不退出选择状态) -- idle/notification → TTS 播报 "当前未读 N 条消息" - -**测试case**: -1. playing 状态长按 → 当前语音重头播放 -2. choosing 状态长按 → 重播 NPC 问题,仍可继续选择 -3. idle 状态长按 → TTS 播报未读数 -4. ending 状态长按 → 无反应 - ---- - -### G4: 暂停/退出机制 — engine.js - -**现状**: 无暂停/退出功能 -**目标**: 两指长按暂停,单击恢复,三指点击退出 - -**交付物**: -- 新状态 `paused` -- `_onPause()`: 保存当前状态、停止所有音频/震动、TTS 播报暂停提示 -- `_onResume()`: 恢复到 choosing/idle(语音无法断点续播) -- `_onExit()`: 仅 paused 状态可用,TTS 播报感谢后返回开始页 -- hint 栏显示暂停状态提示 - -**测试case**: -1. playing 状态两指长按 → 音频停止,进入 paused,TTS 播报暂停 -2. paused 状态单击 → 恢复游戏 -3. paused 状态三指点击 → 退出到开始页 -4. 非 paused 状态三指点击 → 无反应 -5. ending 状态两指长按 → 无反应(结局不可暂停) - ---- - -### G5: 选择状态语音提示 — engine.js - -**现状**: 进入 choosing 仅播放 choiceReady 音效 + confirm 震动 -**目标**: 追加 TTS 播报 "等待回复" - -**交付物**: -- `_enterChoosing()` 中 SFX_UI.choiceReady() 后追加 TTS.speak('等待回复') - -**测试case**: -1. 播放完 NPC 语音进入选择 → 听到 "叮" + TTS "等待回复" -2. 快速双击跳过 → TTS 被中断,不卡住 - ---- - -### G6: 结局语音化 — engine.js - -**现状**: 结局使用 `_showCaption(text)` 显示视觉文字(与零视觉设计矛盾) -**目标**: 结局台词通过 TTS 朗读(后续替换为预录音频) - -**交付物**: -- `_endingA/B/C/D/E` 中 `_showCaption(text)` → `TTS.speak(text)`(保留 caption 作为补充) -- 结局 E 周南语音播完后 TTS 说 "好" - -**测试case**: -1. 触发结局 A → 听到水壶声 + TTS "明天再说" -2. 触发结局 D → 听到鸟鸣声 + TTS "早上好" -3. 触发结局 E → 周南语音 + TTS "好" -4. TTS 不可用时 → caption 仍然显示(降级方案) - ---- - -### G7: 内容安全 — engine.js + index.html - -**现状**: 无内容预警和求助信息 -**目标**: 游戏开始前播报内容预警,结局后显示心理支持热线 - -**交付物**: -- `start()` 开头:TTS 播报 "本游戏涉及孤独、家庭关系等情感话题,请在舒适的状态下体验" -- 结局播完后:TTS 播报 "如需倾诉,全国心理援助热线 400-161-9995" -- index.html 开始页添加内容预警文字 - -**测试case**: -1. 游戏启动 → 先听到内容预警,再开始环境音 -2. 任意结局完成后 → 听到热线播报 -3. 开始页可见内容预警文字 - ---- - -### G8: 分支补全 — story.js - -**现状**: MSG-10/11 follow-up 缺少沉默(down)选项 -**目标**: 补全所有未闭合分支 - -**交付物**: -- MSG-10 right follow-up: 添加 down(沉默) 选项 -- MSG-10 up follow-up: 添加 down(沉默) 选项 -- MSG-11 up follow-up: 添加 down(沉默) 选项 - -**测试case**: -1. MSG-10 温暖回复后 → 可选右滑/上滑/下滑(沉默) -2. MSG-10 追问后通话 → 可选右滑/上滑/下滑(沉默) -3. MSG-11 追问后 → 可选右滑/左滑/下滑(沉默) - ---- - -### G9: 操作指南更新 — index.html - -**现状**: 开始页操作说明缺少长按和安全手势 -**目标**: 补充完整操作说明 - -**交付物**: -- 添加 "播放中" 长按重播说明 -- 添加 "随时可用" 安全手势分组(两指长按暂停、三指点击退出) - -**测试case**: -1. 开始页显示完整操作说明,含长按和安全手势 - ---- - -## 二、音频制作任务(需 VoxCPM2 服务) - -### A1: 结局旁白音频 - -**现状**: 结局台词无预录音频,依赖 TTS -**目标**: 用林夏声线生成 5 条结局旁白 - -**交付物** (5 个 MP3): -| 文件名 | 台词 | -|---------|------| -| `v2_ending_a_linxia_wav_v1.mp3` | "明天再说。" | -| `v2_ending_b_linxia_wav_v1.mp3` | "寄出去了。" | -| `v2_ending_c_linxia_wav_v1.mp3` | "今晚就这样。" | -| `v2_ending_d_linxia_wav_v1.mp3` | "早上好。" | -| `v2_ending_e_linxia_wav_v1.mp3` | "好。" | - -**测试case**: -1. 每个文件 < 3s,采样率 24kHz+,音色一致 -2. 语气匹配情境(A 疲惫温柔、D 平静、E 轻快) - ---- - -### A2: 系统提示音频 - -**现状**: 无系统提示预录音频 -**目标**: 生成游戏流程中的系统语音提示 - -**交付物** (4 个 MP3): -| 文件名 | 台词 | -|---------|------| -| `v2_sys_wait_reply_wav_v1.mp3` | "等待回复" | -| `v2_sys_paused_wav_v1.mp3` | "游戏已暂停。单击继续,三指点击退出" | -| `v2_sys_content_warning_wav_v1.mp3` | "本游戏涉及孤独、家庭关系等情感话题,请在舒适的状态下体验" | -| `v2_sys_hotline_wav_v1.mp3` | "如需倾诉,全国心理援助热线 400-161-9995" | - -**测试case**: -1. 音色使用林夏声线,语速适中 -2. 暂停提示 < 5s,内容预警 < 8s - ---- - -### A3: 新增分支台词音频 - -**现状**: MSG-10/11 补全的 down 分支缺音频 -**目标**: 生成沉默后 NPC 反应音频 - -**交付物** (3 个 MP3): -| 文件名 | 角色 | 台词 | -|---------|------|------| -| `v2_msg10_rw_react_silent_wav_v1.mp3` | 妈妈 | "那早点睡啊。" | -| `v2_msg10_call_react_down_wav_v1.mp3` | 妈妈 | "……没事就好。早点睡。" | -| `v2_msg11_r3_react_silent_wav_v1.mp3` | 阿哲 | "行吧,那我不来了。" | - -**测试case**: -1. 音色与对应角色现有音频一致 -2. 语气自然,符合上下文 - ---- - -### A4: MSG-16 后期处理 - -**现状**: seg5-6 是奶奶无声电话的描述段,需要电话底噪叠加 -**目标**: 与 MSG-08 未知号码呼吸声使用匹配的底噪 - -**交付物**: -- `lv11_0200_mom_voice_01_seg5_wav_v1.mp3` 叠加电话底噪 -- `lv11_0200_mom_voice_01_seg6_wav_v1.mp3` 叠加电话底噪 - -**测试case**: -1. seg5-6 可听到轻微电话底噪(与 MSG-08 sfx_breathing_unknown_v1.mp3 风格匹配) -2. 底噪不盖过妈妈说话声(底噪 -18dB 以下) - ---- - -## 三、执行顺序 - -``` -阶段一(代码 — 立即执行): - G1 → G2 → G3/G4/G5 → G6 → G7 → G8 → G9 - -阶段二(音频 — 需 VoxCPM2): - A1 → A2 → A3 → A4 - -阶段三(集成): - 结局音频替换 TTS → 系统提示音替换 TTS → 回归测试 -```