短剧里一个角色要紧张、安慰、放心,光在文字里写“带感情”太笼统。更稳的办法是先给每个角色固定一段有授权的参考音,再逐句写清情绪和说话方式;模型只负责生成初稿,最后仍要听每句有没有错字、漏字或串音。

本练习用三句原创虚构对话:阿橙听到门外有东西掉了,小北安慰她后去查看,发现是窗台花盆被风吹倒,阿橙松了口气。练习包提供 IndexTTS-2.5 与 CosyVoice 3 的本地脚本,公开包不包含参考声音、生成音频或模型权重。

先把角色和情绪写清楚

角色 参考音 这句台词的目标
阿橙 voice-a.wav 惊讶,略带紧张
小北 voice-b.wav 冷静,安慰对方
阿橙 同一段 voice-a.wav 松一口气,轻松下来

真实项目中,一名演员可以为每个角色分别录一段自己的表演参考,也可以按许可使用其他配音演员的样音;只有声音本人明确同意克隆并生成新台词时才能使用。演示音色和练习结果不要拿来冒充真人配音。

用 IndexTTS-2.5 固定角色,再逐句控制情绪

脚本在练习包的 scripts/index_tts_emotion.py。它对三句短台词分别调用 tts.infer(),角色不变就重复用同一段 spk_audio_prompt;情绪提示使用 emo_text,初始强度设为 emo_alpha=0.6。IndexTTS-2.5 的文字情绪控制要在初始化时启用 use_qwen_emo=True,否则调用会报错。官方示例也建议先从约 0.6 或更低的强度开始,再按听感调整。IndexTTS 官方说明

在 IndexTTS 项目根目录运行:

HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 MODELSCOPE_OFFLINE=1 \
python /path/to/index_tts_emotion.py \
  --model-dir /path/to/checkpoints \
  --voice-a /path/to/authorized-voice-a.wav \
  --voice-b /path/to/authorized-voice-b.wav \
  --output-dir outputs/s050-index

脚本检查模型配置和权重文件都已在本机;缺文件会停止,不会尝试下载。给每句写具体情绪,例如“我很惊讶,也有一点紧张”,不要只写“更有感情”。若情绪过度,可降低 emo_alpha;若台词读得太快,单独调整 duration_factor,不要同时改好几个参数。

用 CosyVoice 3 写一句语气指令

CosyVoice 3 的 inference_instruct2 通过自然语言指令控制情绪、语速或音量。练习包里的 scripts/cosyvoice_emotion.py 用同一角色的参考音逐句生成,并关闭可选文本规范化;参考音需在本机准备好,模型路径也必须指向已存在的本地权重。官方模型卡标注 Apache-2.0,但模型卡同时注明其中示例内容用于学术目的;不要据此推断具体输出可商用,应再核对素材权利和用途条件。CosyVoice 官方仓库 官方模型卡

在 CosyVoice 项目根目录运行:

HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 MODELSCOPE_OFFLINE=1 \
python /path/to/cosyvoice_emotion.py \
  --project-dir /path/to/CosyVoice \
  --model-dir /path/to/Fun-CosyVoice3-0.5B \
  --voice-a /path/to/authorized-voice-a.wav \
  --voice-b /path/to/authorized-voice-b.wav \
  --output-dir outputs/s050-cosyvoice

情绪指令要贴合角色关系:“冷静地安慰对方,语速稍慢”比“感情充沛”更容易检查。每轮只改一项,输出后逐句复听;指令只是控制输入,不保证每次都生成相同的情绪效果。

把三句整理成一个短场景

顺序 角色 台词 复核重点
1 阿橙 你听,门外好像有东西掉了。 惊讶但不喊叫;台词完整
2 小北 先别着急,我在这里,我去看看。 音色稳定;语气安抚,不抢戏
3 阿橙 原来是窗台的花盆,幸好没碎。 情绪从紧张转为放松;结尾自然

先分别生成和复核每一句,再按顺序拼接,句间留少量停顿。发现一个字读错时只重做对应句,避免整段重跑。完成后用耳机和手机外放再听一次,确认人声比背景清楚;本练习脚本只检查音频文件非空和采样率等属性,不能代替人工听审。

参考音和模型权利要分开核对

使用自己的录音也要确认你同意将声音用于克隆、生成新台词和目标发布渠道;使用他人声音时,每位说话人都需要明确授权。IndexTTS 官方仓库当前适用 bilibili 模型使用许可;该中文协议规定,若使用方或关联方前一自然月月活超过 1 亿,或上一自然年收入超过 1 亿元,需另行申请商业许可。使用前应核对当前协议及具体模型权重条款。CosyVoice 代码仓库与 Fun-CosyVoice3 模型卡标注 Apache-2.0,但模型卡同时说明其中示例内容用于学术目的;这些许可均不能替代参考声音本人授权。IndexTTS 中文许可

发布合成音频时,按平台流程声明并加上相应 AI 标识。模型生成成功不代表你拥有剧本、参考声音、配乐或输出的商业使用权。

本机实测

实测结果、模型标签、生成时长、结构检查和人工听审范围记录在练习包 evidence/。演示参考音由 macOS 内置语音合成生成,文件只保存在作者本机 local-only/,不会打包或发布;因此这次结果不证明任何真人授权,也不构成输出可商用或声音质量结论。

本机 IndexTTS-2.5 加载约 23.5 秒,三句推理总计约 103.38 秒,输出为单声道 22.05 kHz WAV,时长约 2.83、3.95、3.34 秒。情绪分类把三条提示分别映射为“惊讶”0.95、“平静”1.0 和“高兴”0.9;“松一口气”被归为高兴,说明文字提示会被模型压成有限情绪类别。CosyVoice 3 本次加载约 4.28 秒、生成三句总计约 40.97 秒,输出为单声道 24 kHz WAV,时长约 3.16、2.72、2.64 秒。CosyVoice 这次运行时,作者先中止了一次触发可选 ModelScope/WeText 检查的初始化,再禁用 WeText 后重跑;缓存只观察到 42 字节 .mdl 元数据更新时间变化,未观察到大型权重文件变化。两组输出都尚未人工试听,也未做 ASR 对字,因此这里只能确认脚本成功生成了可读音频文件,不能确认台词逐字正确或情绪听感理想。

练习包:下载《一个人配多个角色:情绪控制练习包》

示例剧本由人工编写,封面背景由本机 ComfyUI 生成,标题和“AI生成封面”标识由脚本排版。