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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
D:\AI\TTS\
├── 启动Qwen配音.cmd
├── 启动Qwen声音克隆.cmd
├── 启动IndexTTS.cmd
├── apps\
│ ├── qwen3-tts\.venv\
│ └── index-tts\.venv\
├── python\ Python 3.11、3.12
├── tools\ uv、Git、FFmpeg、SoX
├── models\
│ ├── qwen-customvoice\
│ ├── qwen-base\
│ └── indextts-2.5\
│ └── hf_cache\ IndexTTS 辅助模型
├── voices\ 参考录音、参考文本、Qwen 音色文件
│ └── index\
├── outputs\
│ ├── qwen-customvoice\
│ ├── qwen-base\
│ └── index\
├── cache\ 软件包和模型下载缓存、计算缓存
├── temp\ 临时文件、网页临时音频
├── logs\ 运行日志、版本和测试记录
└── scripts\ 环境配置、启动与目录管理脚本

统一管理需要同时控制安装目录和缓存目录。只把源码放在 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
2
3
4
5
6
. 'D:\AI\TTS\scripts\env.ps1'
uv --version
git --version
ffmpeg -version
sox --version
uv python install 3.12.15 3.11.13

如果 Windows 阻止运行下载的 PowerShell 脚本,可在核对附件内容后,以当前进程执行策略打开一个新终端:

1
powershell.exe -NoProfile -ExecutionPolicy Bypass

再在新窗口加载 env.ps1。三个日常启动文件已经带有当前进程的执行策略参数,无需修改系统执行策略。

获取源码并记录版本

1
2
3
4
5
git clone https://github.com/QwenLM/Qwen3-TTS.git D:\AI\TTS\apps\qwen3-tts
git clone https://github.com/index-tts/index-tts.git D:\AI\TTS\apps\index-tts

git -C D:\AI\TTS\apps\qwen3-tts checkout 022e286b98fbec7e1e916cb940cdf532cd9f488e
git -C D:\AI\TTS\apps\index-tts checkout d9e41aac89fd00b3d71497fddb287b7f24613712

这两个提交对应本次实测源码。重新部署时固定源码版本,可以减少上游更新导致参数或依赖变化的影响。软件包下载仍受包源可用性影响。

安装 Qwen 环境

1
2
3
4
Set-Location D:\AI\TTS\apps\qwen3-tts
uv venv --python 3.12.15 .venv
uv pip install --python .venv\Scripts\python.exe torch==2.8.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu128
uv pip install --python .venv\Scripts\python.exe -e . transformers==4.57.3 gradio==5.45.0 modelscope==1.40.2

安装 IndexTTS 环境

1
2
Set-Location D:\AI\TTS\apps\index-tts
uv sync --python 3.11.13 --extra webui

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from pathlib import Path
from huggingface_hub import snapshot_download

root = Path(__file__).resolve().parent.parent
models = [
(
"Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
"0c0e3051f131929182e2c023b9537f8b1c68adfe",
"qwen-customvoice",
),
(
"Qwen/Qwen3-TTS-12Hz-1.7B-Base",
"fd4b254389122332181a7c3db7f27e918eec64e3",
"qwen-base",
),
(
"IndexTeam/IndexTTS-2.5",
"c39ce5ba981572cb187443877ff559dfb246ce63",
"indextts-2.5",
),
]
for repo, revision, folder in models:
snapshot_download(
repo_id=repo,
revision=revision,
local_dir=str(root / "models" / folder),
max_workers=4,
)

运行前加载统一环境:

1
2
. 'D:\AI\TTS\scripts\env.ps1'
& 'D:\AI\TTS\apps\qwen3-tts\.venv\Scripts\python.exe' 'D:\AI\TTS\scripts\download-main-models.py'

这段代码是按模型版本记录整理的下载方式。本次实际下载中,CustomVoice 使用 ModelScope,Base、IndexTTS 和辅助模型通过 Hugging Face 下载后转入 Windows;最终在 Windows 端完成了 15 项主要权重及相关大文件的 SHA256 校验。

IndexTTS 还有辅助模型

IndexTTS 首次启动还会检查辅助模型。本次最终目录包含:

1
2
3
4
5
6
7
8
9
models\indextts-2.5\hf_cache\
├── w2v-bert-2.0\
│ ├── config.json
│ ├── preprocessor_config.json
│ └── model.safetensors
├── bigvgan\
│ ├── config.json
│ └── bigvgan_generator.pt
└── campplus_cn_common.bin

对应来源为 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 目录链接需要重新建立。源码升级前也应记录现有提交与软件包版本,并重新检查缓存路径修改、网页参数和输出保存行为。