文档整理: - 重写 game/操作说明.md 为项目主文档(6游戏/6手势/旁白/模型生成音频/TTS两步流程) - 归档过时文档至 other_docs/(林夏原始设计、旧执行文档) - 新增 docs/音频制作执行手册.md(从零制作游戏音频的完整流程) - docs/ 下保留旁白音色提示词、音频脚本 代码清理: - 删除旧架构死代码: story.js / gestures.js / profile.js - 删除耦合旧架构的过时测试目录 game/tests/ 脚本配置修正: - check_tts_env.sh: 启动脚本路径 AutoVideo → tts-server(实际位置) - gen_narrator_samples.py: 硬编码地址改为环境变量,默认对齐 tts-server 端口 8000
20 KiB
《林夏》音频素材本地制作执行文档
前置文档:
林夏.md(游戏设计)、SOP_AI音频生产.md(生产规范)
现行状态:audio_2/项目状态说明.md(v5 音色、目录、命令,以此为准)
执行环境:本机 WSL2 · RTX 5090 32GB · FFmpeg 7.0
TTS 主链路:VoxCPM2(Voice Design 试听 → 克隆 → Style Control 表演),脚本audio_2/scripts/04_gen_tts_clone.py
TTS 备用:CosyVoice2-0.5B(见附录 B)
目标:按 SOP 规范在本地生产全部音频素材
0. 本机资源清单
| 资源 | 路径 / 状态 | 用途 |
|---|---|---|
| VoxCPM2 | /home/xsl/tts-server/ · 端口 8002 · bash /home/xsl/tts-server/start-voxcpm.sh |
TTS 主链路(Voice Design + 声音克隆 + Style Control) |
| CosyVoice 2.0 (0.5B) | /home/xsl/tools/CosyVoice · conda env: cosyvoice |
TTS 备用(见附录 B) |
| ACE-Step 1.5 | /home/xsl/tools/ACE-Step-1.5 · conda env: acestep |
BGM / 铃声 / 叙事音效 / 环境音 |
| Stable Audio Open 1.0 | /home/xsl/tools/stable-audio-tools · conda env: stableaudio |
高品质音效补充 |
| FFmpeg 7.0 | /usr/local/bin/ffmpeg |
音频格式转换、响度归一化、听筒效果 |
| GPU | RTX 5090 32GB | 跑 VoxCPM2 / CosyVoice / ACE-Step 推理 |
| MuseTalk | /home/xsl/work/MuseTalk |
注意:这是唇形同步工具,不是 TTS |
端口说明:8000 被 head3d 占用,TTS 固定使用 8002(
VOXCPM_PORT=8002)。
游戏运行时音频:audio/mp3/(184 文件,仅保留story.js/engine.js引用的*_wav_v1.mp3等)。
CosyVoice2 保留作为备用,仅在 VoxCPM2 表现不佳时切换。
1. 环境部署
1.1 创建项目目录结构
cd /home/xsl/blind
mkdir -p audio/{00_raw/{tts,music,sfx,ambience,ringtone},01_processed/{tts,music,sfx,ambience,ringtone},02_final/{tts,music,sfx,ambience,ringtone},03_qa_reports,99_legal}
mkdir -p voice/{linxia,mom,azhe,xiaomei,zhounan,hr,anan,dorm_a,dorm_b,dorm_c,delivery,system} # 各角色参考音频
1.2 启动 VoxCPM2 服务
VOXCPM_PORT=8002 VOXCPM_ENABLE_DENOISER=0 bash /home/xsl/tts-server/start-voxcpm.sh
# 服务: http://127.0.0.1:8002
验证服务可用:
curl -s http://127.0.0.1:8002/health
# 预期: {"status":"ok","model":"VoxCPM2","styled_speech":true}
VoxCPM2 API 接口(详见 林夏.md §7.2、/home/xsl/tts-server/server.py):
| 接口 | 用途 |
|---|---|
POST /v1/voices |
注册参考音频(wav_base64)→ voice_id |
POST /v1/speech |
纯克隆合成(text + voice_id)→ WAV |
POST /v1/speech/styled |
Style Control / Voice Design(见下) |
- 有
voice_id→ 克隆音色 + style 表演修饰 - 无
voice_id→ 纯 Voice Design(仅提示词,无参考音频) - 输出格式:48kHz 16-bit PCM WAV
1.4 验证 FFmpeg
ffmpeg -version | head -1
# 预期输出: ffmpeg version 7.0.2-static
# 测试 loudnorm 滤镜
ffmpeg -f lavfi -i "sine=frequency=440:duration=1" -af "loudnorm=I=-16:TP=-1:LRA=11" -y /tmp/test_loudnorm.wav
echo "FFmpeg loudnorm 可用"
2. 角色参考音频准备(关键步骤)
VoxCPM2 的声音克隆需要每个角色一段参考音频(WAV)。现行方案:先用 Voice Design 生成试听变体,人工选定后作为永久参考。
2.1 现行流程(v4 → v5)
1. 03_gen_voice_samples.py → 每角色 5 条约 10s 试听(不同提示词)
2. 人工试听,每角色保留 1 条 → audio_2/tts/v4_voice_samples/{role}/
3. 04_gen_tts_clone.py → 全量克隆 + 部署 audio/mp3/tts/*_wav_v1.mp3
4. 副本同步到 voice/{角色}/{角色}_ref.wav
已选定参考(2026-05-23):
| 角色 | 文件 | 性别 |
|---|---|---|
| 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/voice_sample_prompts.py(试听)、audio_2/voice_style_prompts.py(表演修饰)。
2.2 参考音频规格(仍适用)
- 时长:5-20 秒(推荐 10 秒左右)
- 格式:WAV,16kHz mono(注册前由脚本自动转换)
- 内容:完整中文句子
- 质量:干声为主,避免底噪、混响、BGM
2.3 旧方案(人工录音 / 截取)
若 Voice Design 不满意,仍可按原方案准备参考音频放入 voice/{角色}/:
| 角色 | 音色要求 | 参考音频获取方案 |
|---|---|---|
mom 妈妈 |
50 岁,温柔克制 | 真人录音或影视截取 |
azhe 阿哲 |
27 岁男声,理性偏冷 | 播客/有声书截取 |
delivery 外卖小哥 |
30 岁北方男声 | 语速适中,非过快 |
| … | 见 林夏.md §7.3 |
— |
3. TTS 生产流程
3.0 现行主力:v5 克隆流水线 ★
前置:VoxCPM2 已启动(§1.2),参考音频已在 v4_voice_samples/ 每角色 1 条。
cd /home/xsl/blind
# 全量克隆 + 自动部署游戏目录
VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --force
# 只重跑某角色
VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --role delivery --force
# 预览任务
python audio_2/scripts/04_gen_tts_clone.py --dry-run
| 步骤 | 脚本 | 输出 |
|---|---|---|
| 试听选音色 | 03_gen_voice_samples.py |
audio_2/tts/v4_voice_samples/ |
| 全量克隆 | 04_gen_tts_clone.py |
audio_2/tts/v5_cloned/*_wav_v5.mp3 |
| 游戏部署 | (04 脚本自动) | audio/mp3/tts/*_wav_v1.mp3 |
- 台词来源:
audio/batch_tts_voxcpm.py→LINES(173 条)+EXTRA_LINES(self-3y ×3、系统 memo) - 表演修饰:
audio_2/voice_style_prompts.py→get_clone_style() - 清单:
audio_2/tts/v5_cloned/clone_manifest.tsv
游戏仅加载 *_wav_v1.mp3,不加载 *_mp3_v1.mp3。
3.1 VoxCPM2 声音克隆流程(底层原理)
单条合成步骤:
- 将角色参考音频注册为 voice_id:
POST /v1/voices - 调用:
POST /v1/speech/styled(text + voice_id + style 表演修饰) - 获得 48kHz WAV → ffmpeg atempo 调速(
ROLES配置)→ MP3 - 部署到
audio/mp3/tts/
角色语速(audio/batch_tts_voxcpm.py → ROLES,与 林夏.md §7.3 一致):
voice/
├── linxia/ # 1.00
├── mom/ # 0.92
├── azhe/ # 1.05
├── xiaomei/ # 1.10(醉态 xiaomei_drunk 0.95)
├── zhounan/ # 0.95
├── hr/ # 1.00
├── anan/ # 1.15
├── dorm_a/b/c # 1.10 / 1.00 / 0.95
├── delivery/ # 1.00(已从 1.20 调慢)
└── self_3y/ # 1.15(独立参考 self_3y_v03.wav)
3.2 旧版批量脚本(参考,已被 v5 替代)
# 旧流程:直接读 voice/ 参考,无 Style Control 表演
python audio/batch_tts_voxcpm.py --source voice --dry-run
输出原为 audio/00_raw/tts/,现正式产物见 audio_2/tts/v5_cloned/ 与 audio/mp3/tts/。
3.3 长戏分段处理
SOP §5.3 规定:超过 30 秒的台词必须分段录制。
妈妈 4'17" 长语音(第 16 条)分 8 段:
| 段号 | 文件名 | 台词 | 情绪提示 |
|---|---|---|---|
| 1 | lv11_0200_mom_voice_01_seg1 |
"夏夏。妈妈知道你今天电话不接。妈妈不催你,就是想跟你说一件事。" | gentle, hesitant |
| 2 | lv11_0200_mom_voice_01_seg2 |
"你24了对吧。妈妈24那年——你应该没听我说过——" | gentle, nostalgic |
| 3 | lv11_0200_mom_voice_01_seg3 |
"那时候妈妈在广州,给一个香港老板做秘书,1995年。那年我也被分手过。也被开除过。一模一样的春天。" | gentle, sad but holding back |
| 4 | lv11_0200_mom_voice_01_seg4 |
"那年我哭得特别难看。后来呢?后来就没什么后来了。我回了老家,认识了你爸,生了你。" | gentle, releasing |
| 5 | lv11_0200_mom_voice_01_seg5 |
"我跟你说这个不是想跟你说什么都会过去——我想跟你说,那年夏天我没死,是因为我外婆每天晚上都给我打一个电话。" | gentle, emotional |
| 6 | lv11_0200_mom_voice_01_seg6 |
"她不说什么,就问我今天吃饭了没。" | gentle, peaceful |
| 7 | lv11_0200_mom_voice_01_seg7 |
"我现在打给你,你不接也没事。妈妈给你发个语音,你什么时候想听就听。你不用回我。" | gentle, tender |
| 8 | lv11_0200_mom_voice_01_seg8 |
"你今天接了好多电话吧。妈妈不打扰你了。晚安。" | gentle, almost smiling |
每段单独合成后用 FFmpeg 拼接(见 §4.3)。
小美醉语音(第 09 条)分 4 段,speed 调低到 0.95,每段间加长停顿。
周南 4 段长讲述(第 13 条) 每段独立合成,段间留 800ms 静音。
3.4 系统 TTS
系统提示音(内容警告、暂停、热线、等待回复、memo 等)现行方案:
- 大部分系统语音用 林夏音色(
linxia_ref.wav)克隆,见LINES中v2_sys_*与lv11_sys_memo_01 - 合成走 v5 流水线,与对白同一套参考
3.5 self-3y 三版预录
现行:独立参考 self_3y_v03.wav(非复用小美),角色 key 为 self_3y,speed 1.15。
| 版本 | 文件名 | 情绪 |
|---|---|---|
| 明朗版 | lv11_0030_self3y_voice_01 |
兴奋带紧张 |
| 迷茫版 | lv11_0030_self3y_voice_02 |
疲惫假装坚强 |
| 温柔版 | lv11_0030_self3y_voice_03 |
平静有力 |
台词见 audio_2/scripts/04_gen_tts_clone.py → EXTRA_LINES。
4. 后期处理(FFmpeg)
4.1 单条 TTS 标准处理链
# 变量
INPUT="audio/00_raw/tts/lv11_2103_mom_call_01_v1.wav"
OUTPUT="audio/01_processed/tts/lv11_2103_mom_call_01_v1.wav"
# 完整处理链(一条命令):
# [1] 高通 80Hz 去低频噪
# [2] 压缩器 4:1
# [3] 响度归一化到 -16 LUFS
# [4] 限制峰值 -1 dBTP
ffmpeg -i "$INPUT" \
-af "highpass=f=80,\
acompressor=threshold=-18dB:ratio=4:attack=20:release=250,\
loudnorm=I=-16:TP=-1:LRA=11,\
alimiter=limit=0.891" \
-ar 48000 -sample_fmt s16 -ac 1 \
-y "$OUTPUT"
4.2 加听筒效果(电话 / 微信语音形态)
INPUT="audio/01_processed/tts/lv11_2103_mom_call_01_v1.wav"
OUTPUT="audio/01_processed/tts/lv11_2103_mom_call_01_v1_phone.wav"
# 模拟手机听筒: HPF 300Hz + LPF 3.4kHz + 轻微饱和
ffmpeg -i "$INPUT" \
-af "highpass=f=300:poles=2,\
lowpass=f=3400:poles=2,\
equalizer=f=1500:t=q:w=1:g=1,\
acompressor=threshold=-20dB:ratio=3:attack=5:release=50" \
-y "$OUTPUT"
例外:
mom第 16 条 4'17" 长语音不加听筒效果——SOP 设计意图是"完整音质版"。
4.3 长戏分段拼接
# 1. 先给每段加 200ms 静音头尾
for seg in audio/00_raw/tts/lv11_0200_mom_voice_01_seg*.wav; do
ffmpeg -i "$seg" \
-af "adelay=200|200,apad=pad_dur=0.2" \
-y "${seg%.wav}_padded.wav"
done
# 2. 生成拼接文件列表
ls audio/00_raw/tts/lv11_0200_mom_voice_01_seg*_padded.wav | \
sed "s/^/file '/" | sed "s/$/'/" > /tmp/concat_list.txt
# 3. 拼接 + crossfade
ffmpeg -f concat -safe 0 -i /tmp/concat_list.txt \
-af "acrossfade=d=0.05:c1=tri:c2=tri" \
-y audio/00_raw/tts/lv11_0200_mom_voice_01_full.wav
# 注意:FFmpeg concat + acrossfade 只支持两个输入。
# 多段拼接需要逐段 crossfade,或直接 concat 后人工检查接缝。
# 推荐方案:先 concat 拼接,段间 200ms 静音已经足够自然。
ffmpeg -f concat -safe 0 -i /tmp/concat_list.txt \
-c copy \
-y audio/00_raw/tts/lv11_0200_mom_voice_01_full.wav
4.4 批量后期处理脚本
#!/bin/bash
# 批量处理 00_raw/tts/ → 01_processed/tts/
# 用法: bash audio/process_tts.sh
for f in audio/00_raw/tts/lv11_*.wav; do
basename=$(basename "$f")
output="audio/01_processed/tts/$basename"
# 跳过已处理的
[ -f "$output" ] && echo "跳过: $basename" && continue
echo "处理: $basename"
ffmpeg -i "$f" \
-af "highpass=f=80,\
acompressor=threshold=-18dB:ratio=4:attack=20:release=250,\
loudnorm=I=-16:TP=-1:LRA=11" \
-ar 48000 -sample_fmt s16 -ac 1 \
-y "$output" 2>/dev/null
echo " → $output"
done
echo "TTS 后期处理完成"
4.5 最终打包(wav → ogg)
#!/bin/bash
# 01_processed → 02_final (ogg Vorbis q=5)
for f in audio/01_processed/tts/*.wav; do
basename=$(basename "${f%.wav}.ogg")
output="audio/02_final/tts/$basename"
ffmpeg -i "$f" -c:a libvorbis -q:a 5 -y "$output" 2>/dev/null
done
echo "OGG 打包完成"
4.6 角色专属后期(按 SOP §4.2 配置卡)
# mom: 高频衰减 -3dB + 轻 reverb
ffmpeg -i input.wav -af "equalizer=f=5000:t=h:w=2000:g=-3" -y output.wav
# azhe: 中频衰减 -2dB("闷"感)
ffmpeg -i input.wav -af "equalizer=f=2000:t=q:w=1:g=-2" -y output.wav
# delivery: 低频衰减 -6dB(模拟听筒)
ffmpeg -i input.wav -af "equalizer=f=200:t=h:w=200:g=-6" -y output.wav
# self-3y: 高频衰减 -2dB + 底噪(录音笔质感)
ffmpeg -i input.wav \
-af "equalizer=f=5000:t=h:w=2000:g=-2" \
-y output.wav
# 底噪可以后续叠加一层轻微白噪声
5. 音乐素材(ACE-Step 本地 + Suno 备选)
现行产出:BGM 4 轨 + 铃声 5 条,均由 ACE-Step 1.5 本地生成,已部署至 audio/mp3/music/。
Suno 仍可作为备选(按 SOP §6 操作):
5.1 操作步骤
- 登录 Suno(需要 Pro 订阅)
- 选 Custom Mode
- 按 SOP §6.2 的 4 段曲 Prompt 生成
- 每段跑 2 轮(出 4 首候选),选最佳
- 用 Extend 延长到目标时长
- 下载 WAV 格式到
audio/00_raw/music/
5.2 铃声生成
按 SOP §6.3 的 9 个角色铃声 Prompt 在 Suno 生成。
下载到 audio/00_raw/ringtone/。
5.3 音乐后期处理
# 音乐处理: 削 AI 浊感 + 响度 -18 LUFS
for f in audio/00_raw/music/*.wav; do
basename=$(basename "$f")
ffmpeg -i "$f" \
-af "equalizer=f=350:t=q:w=1.5:g=-2,\
loudnorm=I=-18:TP=-1:LRA=11" \
-ar 48000 \
-y "audio/01_processed/music/$basename" 2>/dev/null
done
6. 音效素材(ACE-Step 本地 + ElevenLabs 备选)
现行产出:叙事音效 4 条(敲门、心跳、呼吸、水壶)在 audio/mp3/sfx/,由 ACE-Step 生成。
ElevenLabs SFX 仍可作为备选:
6.1 操作步骤
- 登录 ElevenLabs(Creator 订阅,含 Sound Effects)
- 按 SOP §7.2 的 Prompt 逐条生成
- 每条跑 3 次,挑最佳
- 下载后转 WAV:
# ElevenLabs 默认 mp3,转为 wav for f in audio/00_raw/sfx/*.mp3; do ffmpeg -i "$f" -ar 48000 -y "${f%.mp3}.wav" && rm "$f" done
6.2 音效后期
# 短音效响度 -14 LUFS
for f in audio/00_raw/sfx/*.wav; do
basename=$(basename "$f")
ffmpeg -i "$f" \
-af "loudnorm=I=-14:TP=-1:LRA=11" \
-ar 48000 \
-y "audio/01_processed/sfx/$basename" 2>/dev/null
done
7. 环境底噪(Freesound)
7.1 操作步骤
- 按 SOP §8.1 的清单在 Freesound 搜索
- 过滤:CC0 优先,≥ 44.1kHz,下载 WAV
- 文件名加 Freesound ID:如
amb_apartment_night_fs123456.wav - 立刻登记到版权表
7.2 环境底噪后期
# 环境底噪处理: HPF 60Hz + LPF 12kHz + 响度 -22 LUFS
for f in audio/00_raw/ambience/*.wav; do
basename=$(basename "$f")
ffmpeg -i "$f" \
-af "highpass=f=60,lowpass=f=12000,\
loudnorm=I=-22:TP=-3:LRA=11" \
-ar 48000 -ac 2 \
-y "audio/01_processed/ambience/$basename" 2>/dev/null
done
7.3 单声道转假性立体声
# 如果下载到的是单声道,做假性立体声
INPUT="audio/01_processed/ambience/amb_apartment_night.wav"
OUTPUT="audio/01_processed/ambience/amb_apartment_night_stereo.wav"
ffmpeg -i "$INPUT" \
-filter_complex "\
[0:a]asplit=2[L][R];\
[R]adelay=12|12,equalizer=f=8000:t=q:w=1:g=1[Rd];\
[L][Rd]amerge=inputs=2[out]" \
-map "[out]" -ac 2 \
-y "$OUTPUT"
8. QA 验收
8.1 响度检查脚本
#!/bin/bash
# 检查所有已处理音频的响度
echo "=== TTS 响度检查 (目标 -16 LUFS) ==="
for f in audio/01_processed/tts/*.wav; do
result=$(ffmpeg -i "$f" -af "loudnorm=print_format=json" -f null - 2>&1 | \
grep -A1 '"input_i"' | tail -1 | tr -d ' ",' | cut -d: -f2)
echo " $(basename "$f"): ${result} LUFS"
done
echo ""
echo "=== 音乐响度检查 (目标 -18 LUFS) ==="
for f in audio/01_processed/music/*.wav; do
result=$(ffmpeg -i "$f" -af "loudnorm=print_format=json" -f null - 2>&1 | \
grep -A1 '"input_i"' | tail -1 | tr -d ' ",' | cut -d: -f2)
echo " $(basename "$f"): ${result} LUFS"
done
echo ""
echo "=== 环境底噪响度检查 (目标 -22 LUFS) ==="
for f in audio/01_processed/ambience/*.wav; do
result=$(ffmpeg -i "$f" -af "loudnorm=print_format=json" -f null - 2>&1 | \
grep -A1 '"input_i"' | tail -1 | tr -d ' ",' | cut -d: -f2)
echo " $(basename "$f"): ${result} LUFS"
done
8.2 验收流程
- 自检:跑响度检查脚本,确认所有文件在目标范围 ±1 LUFS
- 单条听感:用耳机逐条听,标记不满意的(记录到
03_qa_reports/) - 上下文听感:把同一时间段的所有音频按时间轴拼起来完整听一遍
- 不满意的重做:回到 §3 重新合成,调参或换参考音频
9. 执行顺序总结(现行状态 2026-05-23)
✅ 第 1 步 · 部署 VoxCPM2(/home/xsl/tts-server,端口 8002)
✅ 第 2 步 · Voice Design 试听 → 选定 13 角色参考 wav(v4)
✅ 第 3 步 · v5 全量克隆 + 部署 audio/mp3/tts/(04_gen_tts_clone.py)
✅ 第 4 步 · BGM / 铃声 / 音效 / 环境音(ACE-Step → audio/mp3/)
✅ 第 5 步 · 清理未引用音频(184 文件与游戏对齐)
⬜ 第 6 步 · Playtest 听感迭代 + QA(§8)
重跑 TTS(改参考或表演修饰后):
VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --force
详细目录与命令见 audio_2/项目状态说明.md。
附录 A · 常见问题
Q: VoxCPM2 生成的语音有电流声/杂音? A: 检查参考音频质量。参考音频必须干净无噪,采样率 ≥ 16kHz。
Q: 语速不自然? A: 用 FFmpeg atempo 调速(范围 0.5-2.0)。如果调速后音质下降,改为在合成文本中加标点控制节奏(句号=长停顿,逗号=短停顿)。
Q: 怎样让同一个音色听起来"醉了"? A: TTS 通常没有情绪控制参数。替代方案:
- 在文本中插入省略号、重复字来模拟口齿不清
- 后期用 FFmpeg 轻微变速+加混响:
ffmpeg -i drunk.wav -af "atempo=0.95,aecho=0.8:0.7:40:0.3" -y drunk_fx.wav
Q: VoxCPM2 服务无法启动?
A: 确认 bash /home/xsl/AutoVideo/start-voxcpm.sh 正常。确认 GPU 可用:nvidia-smi。
Q: 生成很慢? A: RTX 5090 应该很快(远超实时)。如果慢,检查是否误用了 CPU。
附录 B · CosyVoice2 备用方案
仅在 VoxCPM2 表现不佳或不可用时使用。 正常生产流程请走 §1-§3 的 VoxCPM2 主链路。
B.1 环境验证
conda activate cosyvoice
cd /home/xsl/tools/CosyVoice
python -c "
import sys
sys.path.append('third_party/Matcha-TTS')
from cosyvoice.cli.cosyvoice import CosyVoice2
model = CosyVoice2('pretrained_models/CosyVoice2-0.5B')
print('CosyVoice2 加载成功,采样率:', model.sample_rate)
"
B.2 WebUI 启动
conda activate cosyvoice
cd /home/xsl/tools/CosyVoice
python webui.py --port 8001 # 注意:用 8001 避免与 VoxCPM2 的 8000 端口冲突
模式选择:3s极速复刻(上传参考音频 + 对应文字 → 合成)。
B.3 批量脚本
CosyVoice2 版批量脚本为 audio/batch_tts.py(区别于主力脚本 audio/batch_tts_voxcpm.py)。
用法:conda activate cosyvoice && python audio/batch_tts.py