v2完整版:VoxCPM2语音 + 多轮对话 + 文档重写

- 用VoxCPM2生成128条v2语音(林夏回应+NPC反应+Round3对话)
- story.js全部切换到VoxCPM2音频路径
- engine.js: BGM音量减半(0.2→0.1)、MSG-14前导语支持、结局E用周南新语音
- 林夏.md完整重写:6手势交互、主角有声音、VoxCPM2本地TTS方案
- batch_tts_voxcpm.py: 新增linxia角色、修复self_3y音色、添加全部v2台词
- 新增voice/linxia/参考音色

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
xsl
2026-05-19 14:38:28 +08:00
co-authored by Claude Opus 4.6
parent 0f1b70b1a9
commit 3f53623f12
133 changed files with 1087 additions and 498 deletions
+21 -10
View File
@@ -78,7 +78,7 @@ class GameEngine {
await Snd.startAmbience(AMBIENCE_DEFAULT, { vol: 0.15 });
await sleep(1500);
Snd.startBGM(`${MUS}/lv11_bgm_m1_main_loop_v1.mp3`, { vol: 0.2 });
Snd.startBGM(`${MUS}/lv11_bgm_m1_main_loop_v1.mp3`, { vol: 0.1 });
await sleep(1500);
this._next();
@@ -208,15 +208,25 @@ class GameEngine {
this.state = 'responding';
await this._playVoiceAsync([msg.autoReply]);
// 条件反应(MSG-14:根据 MOM_LINK 播放不同反应)
// 条件反应(MSG-14先播前导语"真的没事?",再根据 MOM_LINK 播放不同反应)
if (!this._skipRequested && msg.autoReact) {
const val = this.vars[msg.autoReact.condition];
const reactUrl = val ? msg.autoReact['true'] : msg.autoReact['false'];
if (reactUrl) {
this.state = 'reacting';
this.state = 'reacting';
// 前导语(如"真的没事?")
if (msg.autoReactPreamble) {
await sleep(500);
if (!this._skipRequested) {
await this._playVoiceAsync([reactUrl]);
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]);
}
}
}
}
@@ -253,7 +263,7 @@ class GameEngine {
this.msgState[msg.id] = 'read';
this.vars.UNREAD = Math.max(0, this.vars.UNREAD - 1);
if (msg.bgm) Snd.startBGM(msg.bgm, { vol: 0.2 });
if (msg.bgm) Snd.startBGM(msg.bgm, { vol: 0.1 });
// 系统通知(时光胶囊)
if (msg.type === 'system_notification') {
@@ -687,9 +697,10 @@ class GameEngine {
async _endingE() {
Haptic.message();
SFX_UI.notify();
await sleep(1500);
// 周南秒回:"那我下次出差来北京,请你吃饭好不好。"
await this._playVoiceAsync([`${T}/v2_ending_e_zhounan_wav_v1.mp3`]);
await sleep(2000);
Snd.playVoice([`${TDIR}/lv11_sys_goodnight_wav_v1.mp3`]);
await sleep(3000);
SFX_UI.ending();
await sleep(1000);
this._showCaption('好。');