本地部署 EmotiVoice 实现多音色情感 TTS
在语音合成技术飞速发展的今天,我们早已不再满足于“能说话”的机器声音。真正打动人的,是那些带有情绪、有温度、仿佛真实存在的声音——比如虚拟主播温柔的问候,游戏角色愤怒的怒吼,或是有声书中细腻的情感起伏。
而 EmotiVoice 正是为此而生。这个由网易有道开源的中文 TTS 系统,不仅支持高质量的中英文混合语音生成,更关键的是它具备强大的情感表达能力和零样本声音克隆特性。只需几秒钟的参考音频,就能复现目标音色,并注入喜悦、愤怒、悲伤、惊讶等多种情绪,让文本真正“活”起来。
更重要的是,整个系统可以完全本地运行,无需依赖云端服务,既保护隐私又便于集成到各类应用中。无论是做个性化语音助手、游戏 NPC 配音,还是自动化生成带情绪的有声内容,EmotiVoice 都是一个极具潜力的选择。
下面我们就一步步带你完成本地部署,从环境搭建到实际推理,全面掌握这一高表现力 TTS 引擎的使用方法。
准备工作:代码与环境
首先,在本地克隆项目仓库:
git clone https://github.com/netease-youdao/EmotiVoice.git
cd EmotiVoice
建议使用 Conda 创建独立环境以避免依赖冲突:
conda create -n emotivoice python=3.10 -y
conda activate emotivoice
⚠️ 注意:推荐使用 Python 3.10。部分依赖对更高版本存在兼容性问题,尤其是
transformers和某些底层库之间的耦合关系较敏感。
安装核心依赖与 CUDA 支持
安装 PyTorch(GPU 加速版)
为了获得更快的推理速度,强烈建议启用 GPU 支持。安装命令如下:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
如果你的显卡驱动对应的是其他 CUDA 版本(如 cu118),请前往 PyTorch 官网 获取匹配的安装指令。
验证 CUDA 是否可用:
python -c "import torch; print(torch.cuda.is_available())"
输出 True 表示 GPU 已准备就绪。若为 False,需检查显卡驱动、CUDA 版本及 PyTorch 安装是否一致。
安装其余 Python 包
接下来安装必要的依赖项:
pip install numpy numba scipy transformers==4.26.1 soundfile yacs g2p_en jieba pypinyin
这里有几个关键点需要注意:
transformers==4.26.1是一个明确指定的旧版本,原因在于 EmotiVoice 使用了特定结构的 HuggingFace 模型加载逻辑,新版可能存在接口变更导致报错。g2p_en负责英文文本转音素,处理中英混杂语句时至关重要。jieba和pypinyin提供中文分词与拼音标注能力,是前端处理的基础组件。soundfile用于读写.wav音频文件,确保合成结果可播放。
安装完成后,基本的运行环境已经搭建完毕。
下载并配置模型文件
EmotiVoice 的语音生成流程涉及两个主要模型:风格编码器(Style Encoder) 和 主合成模型(Prompt-TTS)。此外,还需额外下载 SimBERT 来辅助情感语义理解。
下载 SimBERT 中文语义模型
该模型用于提取输入文本的情感特征,提升语义匹配精度。
首先确保已安装 Git LFS(用于拉取大文件):
git lfs install
然后执行克隆:
git clone https://huggingface.co/WangZeJun/simbert-base-chinese WangZeJun/simbert-base-chinese
此目录将被自动识别并加载,无需手动配置路径。
获取预训练主模型
官方提供了完整的模型权重包,可通过以下链接下载:
你需要获取两组核心文件:
- Style Encoder 模型:以
checkpoint_epoch_*.pth命名,负责情感风格建模; - Prompt-TTS 主模型:包含
g_*.pth(生成器)和do_*.pth(判别器)等文件,承担最终语音合成任务。
创建标准目录结构
在项目根目录下创建对应的输出路径:
mkdir -p outputs/style_encoder/ckpt
mkdir -p outputs/prompt_tts_open_source_joint/ckpt
放置模型文件
按类型归类复制:
| 文件类型 | 目标路径 |
|---|---|
checkpoint_* 开头的文件 | outputs/style_encoder/ckpt/ |
g_*.pth, do_*.pth 等 | outputs/prompt_tts_open_source_joint/ckpt/ |
例如:
cp ~/Downloads/g_00140000.pth outputs/prompt_tts_open_source_joint/ckpt/
cp ~/Downloads/checkpoint_epoch_00000.pth outputs/style_encoder/ckpt/
✅ 强烈建议保留原始文件名,防止模型加载时因路径或命名不一致而出错。
输入格式详解:如何构造有效的合成指令
EmotiVoice 的推理脚本接受一种结构化文本输入,每行代表一条语音合成任务,格式如下:
<speaker_id>|<emotion_prompt>|<phoneme>|<text_content>
各字段说明:
| 字段 | 含义 |
|---|---|
speaker_id | 预设音色 ID,如 8051;支持超过 2000 种不同音色 |
emotion_prompt | 情感描述词,如“非常开心”、“低声细语”、“愤怒地喊” |
phoneme | 文本对应的音素序列,含起止标记 <sos/eos> |
text_content | 实际要朗读的中文句子 |
示例输入行:
8051|非常开心|<sos/eos> w o3 sp1 h ao4 sp0 k ai1 x in1 sp0 q ing2 <sos/eos>|我好开心啊
其中 sp0, sp1 表示不同程度的停顿(pause level),由前端工具自动生成,无需手动编写。
自动化生成音素序列
手动构造音素显然不现实。幸运的是,项目自带了一个前端处理脚本,可自动完成分词、拼音转换、音素生成等步骤。
假设你有一批待合成的纯文本句子,保存为 data/my_text.txt:
我来到北京清华大学。
这是一个激动人心的时刻!
你好,欢迎使用 EmotiVoice。
运行前端脚本进行预处理:
python frontend.py data/my_text.txt > data/my_text_for_tts.txt
输出文件 my_text_for_tts.txt 将包含完整四元组格式,可直接用于后续推理。
这一步看似简单,实则是保证语音自然度的关键环节。前端处理的质量直接影响重音、节奏和语调的表现力。
执行语音合成:命令行模式
对于批量生成场景,推荐使用命令行脚本进行高效处理。
先设置输入文件路径:
export TEXT=data/my_text_for_tts.txt
然后运行联合推理脚本:
python inference_am_vocoder_joint.py \
--logdir prompt_tts_open_source_joint \
--config_folder config/joint \
--checkpoint g_00140000 \
--test_file $TEXT
参数解释:
--logdir:指定模型日志目录名称,对应outputs/{logdir}下的路径;--config_folder:配置文件所在目录,定义了网络结构与超参数;--checkpoint:要加载的权重文件前缀(不含.pth);--test_file:输入文本路径。
✅ 成功运行后,合成音频将保存在:
outputs/prompt_tts_open_source_joint/test_audio/
每个句子生成一个 .wav 文件,命名为 test_000.wav, test_001.wav …,采样率为 44.1kHz,音质清晰,适合进一步编辑或发布。
你可以用任何音频播放器试听,感受不同情感提示带来的语气变化。
启动交互式 Web 界面
如果你更倾向于图形化操作,或者希望快速调试效果,EmotiVoice 还提供了一个基于 Streamlit 的可视化界面。
安装 Streamlit:
pip install streamlit
启动服务:
streamlit run demo_page.py
默认浏览器会打开页面:
界面功能一览:
- 文本输入框:输入你想合成的内容;
- 音色选择下拉菜单:从 2000+ 预设音色中挑选合适的声音;
- 情感标签输入框:自由填写“温柔地说”、“兴奋地喊道”等描述;
- 实时播放与下载按钮:即时试听并导出音频;
- 参考音频上传区:实现零样本声音克隆
💡 使用技巧:
- 上传一段 3~10 秒的目标人物语音(如你自己录音),系统会自动提取其音色特征;
- 在情感提示中加入“带着笑意”、“疲惫地说”等描述,即可让克隆声音带上相应情绪;
- 结合不同的 speaker_id 与 emotion_prompt,可以创造出极具个性化的角色语音,非常适合虚拟偶像、游戏配音等高级用途。
Web 界面虽然不如命令行高效,但在探索音色搭配、调试情感表达时极为直观,特别适合非技术用户或原型设计阶段。
实践建议与常见问题
关于音色选择
虽然系统支持上千种预设音色,但并非所有都稳定可用。建议先通过 Web 界面测试几个典型 ID(如 8051, 9000+),观察发音自然度和口音一致性。
也可以通过分析训练数据分布来判断哪些音色质量更高——通常高频出现的 speaker_id 数据更充分,合成效果更好。
如何优化情感控制?
情感提示词的质量直接影响输出效果。一些经验法则包括:
- 使用具体动作 + 情绪组合,如“颤抖着说”、“微笑着回答”;
- 避免过于抽象的词汇,如“普通地”、“正常地说”,这类描述缺乏引导性;
- 可尝试叠加多个关键词:“激动又紧张地说”,有时会产生有趣的复合情绪表现。
推理速度与资源消耗
尽管支持 GPU 加速,但 Prompt-TTS 模型参数量较大,单句合成仍需数秒时间(取决于长度)。若需高性能部署,可考虑:
- 使用 TensorRT 或 ONNX Runtime 对模型进行加速;
- 将推理封装为 REST API 服务,供外部程序异步调用;
- 利用批处理机制一次性合成多条语音,提高 GPU 利用率。
总结与展望
EmotiVoice 不只是一个开源 TTS 工具,它代表了一种新的语音交互可能性:有情感、有身份、可定制的声音体验。
通过本次部署,你已经掌握了从环境搭建、模型配置到命令行与 Web 双模式推理的全流程。无论你是开发者、创作者还是研究者,都可以基于这套系统构建出更具表现力的应用。
它的核心优势在于:
- ✅ 支持中英文混合合成
- ✅ 超过 2000 种预设音色可选
- ✅ 可精细控制情感表达(喜怒哀乐)
- ✅ 零样本声音克隆,仅需数秒参考音频
- ✅ 提供命令行 + Web 双操作模式
- ✅ 完全本地运行,保障数据隐私
未来,你可以进一步扩展其能力:
- 将其封装为 Flask/FastAPI 接口,接入聊天机器人或数字人系统;
- 结合大语言模型(LLM),实现“动态生成 + 情感朗读”的全自动对话流;
- 构建自动化有声书流水线,根据不同情节自动切换叙述者音色与情绪;
- 探索跨语言迁移,尝试用中文训练模型合成英文语音(或反之)。
现在,你的文字不仅可以被听见,还能被“感受”。
让每一句话,都有它的语气与灵魂。
1484

被折叠的 条评论
为什么被折叠?



