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 → 回归测试
-```