Qwen3-TTS 与 IndexTTS 2.5 单目录部署
TTS(Text-to-Speech,文本转语音)可以把解说稿直接生成音频。在 Windows 11 和 RTX 3060 12GB 上,Qwen3-TTS 1.7B 与 IndexTTS 2.5 都已完成中文短句生成验证。日常使用可以从三个启动文件进入网页,生成的音频自动保存到固定目录。
这套部署把源码、Python、模型、缓存、参考录音和输出统一放在 D:\AI\TTS,同时为两套应用保留独立的 Python 依赖环境。本文记录 2026 年 10 月 20 日的实际配置、关键命令和测试结果,并提供运行管理脚本。
模型选择与实测环境
本次安装包含三个用途不同的模型:
| 模型 | 本次用途 | 本地模型目录 |
|---|---|---|
| Qwen3-TTS-12Hz-1.7B-CustomVoice | 选择预设音色,配合文字指令控制表达 | models\qwen-customvoice |
| Qwen3-TTS-12Hz-1.7B-Base | 根据参考录音克隆声音 | models\qwen-base |
| IndexTTS 2.5 | 根据参考录音配音,并使用情绪控制功能 | models\indextts-2.5 |
Qwen 的 CustomVoice 和 Base 对应不同任务,需要分别下载权重;本次没有安装 VoiceDesign。模型用途可对照 Qwen3-TTS 官方说明和 IndexTTS 2.5 模型说明。
| 项目 | 实测配置 |
|---|---|
| 系统 | Windows 11 Pro |
| 显卡 | NVIDIA GeForce RTX 3060,12GB 显存 |
| CPU / 内存 | Intel Core i9-12900K / 64GB |
| 显卡驱动 | 610.88 |
| Qwen Python | 3.12.15 |
| IndexTTS Python | 3.11.13 |
| PyTorch / torchaudio | 2.8.0,CUDA 12.8 构建,即 cu128 |
| Transformers | Qwen 4.57.3;IndexTTS 4.52.1 |
| Gradio | 两套环境均为 5.45.0 |
这里的 Python 独立环境,是指每个应用都有自己的 .venv 文件夹,单独保存所需的软件包。两个项目使用的 Transformers 版本不同,分别管理可以避免安装一方依赖时影响另一方。
本次使用 BF16 半精度运行,即用较少的位数保存计算中的数值,以降低显存占用。没有安装 FlashAttention、DeepSpeed,也没有启用自定义 CUDA 内核编译。
统一目录结构
1 | D:\AI\TTS\ |
统一管理需要同时控制安装目录和缓存目录。只把源码放在 D 盘,Python 下载工具和网页组件仍可能使用用户目录或系统临时目录。
启动脚本为当前进程设置环境变量,不修改系统 PATH。NVIDIA 驱动仍由 Windows 管理;浏览器自行下载的文件仍服从浏览器下载设置。这里统一的是 TTS 应用及其依赖、缓存和输出,并不包含 Windows 与浏览器本身。
运行管理脚本
下载 Windows 运行管理脚本,2026-10-20 版,ZIP,5,112 字节。
附件包含本次部署使用的三个 .cmd 启动文件,以及 env.ps1、start.ps1、run-model.py、layout.ps1。解压后将启动文件放在 D:\AI\TTS 根目录,四个脚本放在其 scripts 子目录。
附件负责环境变量、模型启动、输出保存和目录关联,不包含 Python、第三方工具、模型权重或依赖安装包。下方命令按已部署结构整理;未在第二台空白电脑上完整重装验证。
环境配置的主要内容
env.ps1 从脚本所在位置计算安装根目录,并设置以下路径:
| 环境变量 | 作用与保存位置 |
|---|---|
UV_PYTHON_INSTALL_DIR |
uv 管理的 Python,放在 python |
UV_CACHE_DIR |
uv 下载与安装缓存,放在 cache\uv |
HF_HOME、HF_HUB_CACHE、HF_XET_CACHE |
Hugging Face 缓存,放在 cache\huggingface 下 |
MODELSCOPE_CACHE |
ModelScope 缓存,放在 cache\modelscope |
TORCH_HOME、TORCH_EXTENSIONS_DIR |
PyTorch 缓存,放在 cache 下 |
GRADIO_TEMP_DIR |
网页临时音频,放在 temp\gradio |
TEMP、TMP |
当前进程临时目录,放在 temp |
CUDA_CACHE_PATH |
CUDA 计算缓存,放在 cache\cuda |
此外,脚本配置了 pip、Numba、Matplotlib 等组件的缓存目录,并通过 PYTHONNOUSERSITE=1 避免加载用户级 Python 软件包。uv 的 Python 注册和全局路径修改也已关闭。uv 相关变量可查阅其环境变量文档。
安装工具与独立环境
以下命令在 PowerShell 中执行。首次打开终端后先加载 env.ps1;重新打开终端时需要再次加载。各安装命令成功后再继续下一步。
准备便携工具
从官方发布入口下载 Windows 版本,解压成以下结构:
| 工具 | 本次版本 | 需要存在的文件 |
|---|---|---|
| uv | 0.13.1 | tools\uv\uv.exe |
| MinGit | 2.56.0.2 | tools\git\cmd\git.exe |
| FFmpeg Windows 构建 | 9.0.2 | tools\ffmpeg\bin\ffmpeg.exe |
| SoX | 14.4.2 | tools\sox\sox.exe |
解压时保留工具附带的 DLL 和其他文件;检查压缩包是否多套了一层目录。工具准备好后加载环境,安装 Python:
1 | . 'D:\AI\TTS\scripts\env.ps1' |
如果 Windows 阻止运行下载的 PowerShell 脚本,可在核对附件内容后,以当前进程执行策略打开一个新终端:
1 | powershell.exe -NoProfile -ExecutionPolicy Bypass |
再在新窗口加载 env.ps1。三个日常启动文件已经带有当前进程的执行策略参数,无需修改系统执行策略。
获取源码并记录版本
1 | git clone https://github.com/QwenLM/Qwen3-TTS.git D:\AI\TTS\apps\qwen3-tts |
这两个提交对应本次实测源码。重新部署时固定源码版本,可以减少上游更新导致参数或依赖变化的影响。软件包下载仍受包源可用性影响。
安装 Qwen 环境
1 | Set-Location D:\AI\TTS\apps\qwen3-tts |
安装 IndexTTS 环境
1 | Set-Location D:\AI\TTS\apps\index-tts |
IndexTTS 按对应源码中的锁文件安装依赖,只启用网页需要的 webui 依赖组。没有使用 --all-extras,也没有为了启动网页安装本次未使用的加速组件。
分别在两个应用目录执行以下命令,检查 PyTorch 是否识别显卡:
1 | .\.venv\Scripts\python.exe -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0)); print(torch.cuda.is_bf16_supported())" |
本次两套环境均识别到 RTX 3060,CUDA 和 BF16 检查均返回 True。
下载模型与辅助文件
三个主模型分别来自以下官方仓库:
| 仓库 | 保存位置 |
|---|---|
Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice |
D:\AI\TTS\models\qwen-customvoice |
Qwen/Qwen3-TTS-12Hz-1.7B-Base |
D:\AI\TTS\models\qwen-base |
IndexTeam/IndexTTS-2.5 |
D:\AI\TTS\models\indextts-2.5 |
需要下载整个模型仓库对应的配置、分词器和权重文件,不能只拿一个最大的权重文件。Qwen 模型目录中的 speech_tokenizer 子目录也要保留。
例如,将下面内容保存为 D:\AI\TTS\scripts\download-main-models.py,使用 Qwen 环境中的 Hugging Face 下载组件获取本次对应版本:
1 | from pathlib import Path |
运行前加载统一环境:
1 | . 'D:\AI\TTS\scripts\env.ps1' |
这段代码是按模型版本记录整理的下载方式。本次实际下载中,CustomVoice 使用 ModelScope,Base、IndexTTS 和辅助模型通过 Hugging Face 下载后转入 Windows;最终在 Windows 端完成了 15 项主要权重及相关大文件的 SHA256 校验。
IndexTTS 还有辅助模型
IndexTTS 首次启动还会检查辅助模型。本次最终目录包含:
1 | models\indextts-2.5\hf_cache\ |
对应来源为 facebook/w2v-bert-2.0、nvidia/bigvgan_v2_22khz_80band_256x 和 funasr/campplus。这些文件在本次部署中提前准备;缺失时,官方程序会尝试下载。主模型目录中的 qwen0.6bemo4-merge 也已保留,用于文本情绪分析。
网页示例音频同样可能触发下载。本次把官方示例音频补齐到了 apps\index-tts\examples。因此,“主权重已经下载”并不等于所有首次运行所需文件已经准备完毕。完整断网启动未单独测试。
把输出和缓存固定下来
完成源码、依赖和模型准备后,执行一次目录配置:
1 | & 'D:\AI\TTS\scripts\layout.ps1' |
该脚本建立 IndexTTS 的两个 Windows 目录链接:
| 应用中的目录 | 实际保存目录 |
|---|---|
apps\index-tts\outputs |
outputs\index |
apps\index-tts\prompts |
voices\index |
目录链接让官方程序继续使用原有相对路径,文件实际写入统一的数据目录。备份时以根目录下的 outputs 和 voices 为准,避免重复复制。
脚本适用于首次配置。如果应用中已经存在普通的 outputs 或 prompts 目录,它会停止并报错;应先备份、整理已有数据,再建立链接。
修正 IndexTTS 覆盖缓存路径的问题
本次源码的 indextts/infer_v2_5.py 中存在如下设置:
1 | os.environ['HF_HUB_CACHE'] = './checkpoints/hf_cache' |
它会覆盖启动前配置好的环境变量。layout.ps1 将这一行改为:
1 | os.environ.setdefault('HF_HUB_CACHE', './checkpoints/hf_cache') |
这样,外部已经指定缓存路径时会保留外部配置;没有指定时才使用源码默认值。辅助模型仍按官方程序的约定放在所选模型目录下的 hf_cache 中。
保存 Qwen 音频与音色文件
run-model.py 在调用 Qwen 官方网页前,为生成函数增加自动保存:预设配音写入 outputs\qwen-customvoice,克隆配音写入 outputs\qwen-base。文件名包含时间和随机标识,减少重名覆盖。
网页保存的 Qwen 音色文件放在 voices,而不是长期依赖临时目录。它们是后续克隆时加载的 .pt 文件,不是可直接播放的音频。
测试中还遇到过 Gradio 的 InvalidPathError:文件已经写入统一目录,但网页不能返回该路径中的文件。启动脚本通过 allowed_paths 明确允许访问 voices 和 outputs 后,音色保存、重新加载和生成流程验证通过。
日常启动与使用
| 启动文件 | 用途 | 网页地址 |
|---|---|---|
启动Qwen配音.cmd |
预设音色配音 | http://127.0.0.1:7861 |
启动Qwen声音克隆.cmd |
根据参考录音克隆声音 | http://127.0.0.1:7861 |
启动IndexTTS.cmd |
IndexTTS 配音与情绪控制 | http://127.0.0.1:7862 |
双击后保留命令行窗口,服务就绪后脚本会尝试打开浏览器,也可手动访问表中地址。监听地址限定为本机 127.0.0.1。
一次运行一个模型。脚本使用文件锁阻止从这三个入口同时加载多个模型;切换前在原窗口按 Ctrl+C,等待服务退出。关闭网页不会停止模型服务。
Qwen 预设配音
语言选择 Chinese,选择 Serena、Vivian 等预设音色,输入正文。控制指令可以填写:
用自然清晰的普通话讲解,语速适中。
该启动方式使用本地 CustomVoice 权重,设备为 cuda:0,数值类型为 bfloat16,关闭 FlashAttention,并将并发数限制为 1。
Qwen 声音克隆
上传参考录音,填写录音中实际说出的文本,再输入要生成的内容。需要反复使用同一音色时,通过网页保存音色文件,后续从 voices 选择并加载。
本次功能测试使用 Qwen 生成的示例声音作为参考,验证了保存和重新加载流程;真人声音相似度未测。
IndexTTS 配音
上传参考录音,语言选择 ZH(中文),输入文本,先使用默认情绪和生成参数。需要调整表达时,再逐项尝试情感参考音频或情感向量。
也可以在终端执行以下完整命令,通过运行管理脚本启动 IndexTTS:
1 | powershell.exe -NoProfile -ExecutionPolicy Bypass -File "D:\AI\TTS\scripts\start.ps1" -Model index |
运行管理脚本向官方网页程序传入的主要参数如下:
| 参数 | 值 |
|---|---|
--version |
2.5 |
--model_dir |
D:\AI\TTS\models\indextts-2.5 |
--fp16 |
启用 |
--host |
127.0.0.1 |
--port |
7862 |
--gui_seg_tokens |
80 |
这个版本的网页保留了 --fp16 参数名,但在 2.5 分支中,会在设备支持时选择 BF16。本次 RTX 3060 实际运行的是 BF16。参数行为以本次使用的官方网页源码为准。
RTX 3060 12GB 实测结果
三套模型逐个加载,使用同一段中文文本测试:
这段配音在本地电脑生成。每个步骤都可以单独调整,音频与字幕保持一致。
| 模型 | 模型加载 | 生成耗时 | 音频长度 | PyTorch 峰值已分配显存 |
|---|---|---|---|---|
| Qwen CustomVoice 1.7B | 8.9 秒 | 48.0 秒 | 7.36 秒 | 4.11 GiB |
| Qwen Base 1.7B | 12.5 秒 | 41.9 秒 | 7.28 秒 | 4.37 GiB |
| IndexTTS 2.5 | 40.6 秒 | 30.1 秒 | 7.02 秒 | 6.54 GiB |
生成耗时不含模型加载时间。显存数据由 PyTorch 统计,不包含桌面和其他应用,也不等同于 nvidia-smi 显示的整张显卡占用。本次 IndexTTS 测试加载了 QwenEmotion。
这是一组单段测试,没有重复测量取平均值,也没有测试长文章连续生成。三种方式在这组配置下生成整段音频所花时间都长于音频自身时长,适合提前制作配音;这些结果不能用于推断流式首包延迟。
另外通过网页接口完成了以下验证:
- Qwen 预设配音生成,并自动保存到统一输出目录。
- Qwen 音色保存到
voices,重新加载后继续生成。 - IndexTTS 上传参考音频、生成并保存到
outputs\index。 - 第二个模型通过启动脚本启动时,被运行锁拦截。
生成文件已检查可解码、非空、数值有效。未执行人工试听、逐字听写评估或桌面浏览器点击测试,不能把文件生成成功等同于读音和音质已经逐项验收。
使用与维护
长讲稿按句子或分镜分段生成,单独检查多音字、数字、英文缩写和停顿。先生成短句确认音色与表达,再扩大文本长度,更便于发现问题和重新生成。
日常重点保留 voices、outputs、模型和运行配置。临时压缩包可在安装完成后清理,依赖下载缓存可保留以便修复环境。发生报错时,先查看 logs 中最近的模型日志;显存不足时可通过 nvidia-smi 检查当前占用。
备份整个目录便于保存模型与数据,但移动目录或换电脑后,Python 虚拟环境和 Windows 目录链接需要重新建立。源码升级前也应记录现有提交与软件包版本,并重新检查缓存路径修改、网页参数和输出保存行为。