# IndexTTS2 CLI v2 使用文档 本文档面向用户级 `indextts2` 命令行入口。CLI v2 是 IndexTTS2-first 的专用入口, 可安装到用户环境后从任意目录运行, 不依赖仓库根目录作为当前工作目录。它不会替换已有 `indextts` 命令。`indextts` 仍保留现有 IndexTTS1 行为。 ## 功能范围 当前 CLI v2 提供以下子命令: - `indextts2 init`: 创建持久化配置和默认模型资源目录, 不下载模型资源。 - `indextts2 config`: 查看或修改持久化配置。 - `indextts2 download`: 显式下载 IndexTTS2 模型资源。 - `indextts2 check`: 检查本地模型资源, Python 包和设备可用性。 - `indextts2 synth`: 使用 IndexTTS2 合成单条文本音频。 - `indextts2 batch`: 读取 JSON Lines 批量清单, 串行合成多条独立音频, 或合成后拼接为一个 WAV 文件。 - `indextts2 concat`: 读取 JSON Lines 拼接清单, 将已有 WAV 片段拼接为一个 WAV 文件。 以后可能会提供,但暂不包括: - WebUI 子命令, WebUI 仍使用 `uv run webui.py`。 - `batch` 的 `--continue-on-error`。 - `batch` 的并发执行。 - GPT 采样细节参数, 例如 `top_p`, `top_k`, `temperature` 等。 - IndexTTS1/IndexTTS2 引擎选择器。 ## 安装与入口 项目在 `pyproject.toml` 中注册了两个命令: ```toml indextts = "indextts.cli:main" indextts2 = "indextts.cli_v2:main" ``` 普通用户推荐使用用户级安装方式注册 CLI。当前仓库包如果尚未发布到 PyPI 或默认包 registry, 需要在仓库根目录从本地源码安装: ```bash uv tool install --python 3.10 . ``` 也可以使用 `pipx` 从本地源码安装: ```bash pipx install . ``` 在仓库开发和调试时, 可使用 editable 安装方式注册 CLI: ```bash uv tool install --python 3.10 -e . ``` 安装后可查看帮助: ```bash indextts2 --help indextts2 init --help indextts2 config --help indextts2 download --help indextts2 check --help indextts2 synth --help indextts2 batch --help indextts2 concat --help ``` 未安装入口时, 也可以在仓库根目录用 Python 模块方式调用。该入口保留给开发和调试使用, 不作为普通用户主路径: ```bash python -m indextts.cli_v2 --help ``` ## 首次初始化 `indextts2 init` 会创建平台标准配置目录, `config.toml` 和默认模型资源目录。它只准备本地状态, 不会自动联网下载模型资源。 ```bash indextts2 init ``` 指定模型资源目录并写入持久化配置(请将 `D:/models/IndexTTS-2` 替换为你的目标模型目录): ```bash indextts2 init --model-dir D:/models/IndexTTS-2 ``` `check`, `synth` 和 `batch` 在运行前也会执行首次初始化, 因此首次运行这些命令会创建配置文件和默认模型资源目录, 但仍不会自动下载模型资源。`concat` 不需要模型资源, 不执行模型资源检查。 ## 模型资源目录 CLI v2 使用“模型资源目录”保存 IndexTTS2 的模型文件和配套资源。 平台默认模型资源目录: | 平台 | 默认模型资源目录 | | --- | --- | | Windows | `%LOCALAPPDATA%\IndexTTS\models\IndexTTS-2` | | macOS | `~/Library/Application Support/IndexTTS/models/IndexTTS-2` | | Linux | `${XDG_DATA_HOME:-~/.local/share}/indextts/models/IndexTTS-2` | 持久化配置位置: | 平台 | 持久化配置 | | --- | --- | | Windows | `%APPDATA%\IndexTTS\config.toml` | | macOS | `~/Library/Application Support/IndexTTS/config.toml` | | Linux | `${XDG_CONFIG_HOME:-~/.config}/indextts/config.toml` | 模型资源目录解析优先级: 1. 命令行参数 `--model-dir PATH`。 2. 环境变量 `INDEXTTS2_MODEL_DIR`。 3. 持久化配置 `model_dir`。 4. 平台默认模型资源目录。 CLI 内部固定使用: ```text {model-resource-directory}/config.yaml ``` 模型资源目录必须包含以下关键资源: ```text config.yaml bpe.model gpt.pth s2mel.pth wav2vec2bert_stats.pt feat1.pt feat2.pt qwen0.6bemo4-merge hf_cache/w2v-bert-2.0 hf_cache/semantic_codec_model.safetensors hf_cache/campplus_cn_common.bin hf_cache/bigvgan/config.json hf_cache/bigvgan/bigvgan_generator.pt ``` ## 配置管理 查看持久化配置文件位置: ```bash indextts2 config path ``` 查看当前持久化配置: ```bash indextts2 config get ``` 写入模型资源目录: ```bash indextts2 config set model_dir D:/models/IndexTTS-2 ``` 可配置键: | 键 | 用途 | | --- | --- | | `model_dir` | 持久化模型资源目录。 | | `default_device` | 持久化默认运行设备, 例如 `cpu`, `cuda`, `cuda:0`, `mps`, `xpu`。 | | `use_fp16` | 持久化是否启用 FP16, 值为 `true` 或 `false`。 | | `use_deepspeed` | 持久化是否启用 DeepSpeed, 值为 `true` 或 `false`。 | | `use_cuda_kernel` | 持久化是否启用 CUDA kernel, 值为 `true` 或 `false`。 | 普通 `check`, `synth` 和 `batch` 参数只覆盖本次运行, 不会写回持久化配置。配置写入只通过 `indextts2 init --model-dir PATH`, `indextts2 config set KEY VALUE`, 以及成功的 `indextts2 download --model-dir PATH` 完成。`download --no-save` 不写回。 ## 模型下载 推荐通过 CLI 显式下载模型资源: ```bash indextts2 download ``` 默认下载源是 HuggingFace。选择下载源: ```bash indextts2 download --source huggingface indextts2 download --source modelscope ``` 指定下载目标目录: ```bash indextts2 download --source huggingface --model-dir D:/models/IndexTTS-2 ``` `download --model-dir PATH` 下载成功并通过资源检查后, 默认会把 `PATH` 写入持久化配置的 `model_dir`, 后续 `check`, `synth` 和 `batch` 会默认使用该目录。临时下载或预热其他目录时使用 `--no-save`: ```bash indextts2 download --source modelscope --model-dir D:/tmp/IndexTTS-2 --no-save ``` 下载命令通过 Python API 下载资源, 不依赖外部 `hf` 或 `modelscope` 可执行文件在 `PATH` 中。目标目录已有文件时, CLI 不会清空目录, 下载器可以增量补齐。下载完成后, CLI 会复用模型资源检查判断目录是否可用。 ## 环境检查 运行: ```bash indextts2 check ``` 指定设备检查: ```bash indextts2 check --device cuda:0 ``` `check` 会检查: - 解析后的模型资源目录是否存在。 - 必需模型资源是否存在。 - Python 包是否可导入: `torch`, `torchaudio`, `indextts`。 - 设备可用性: `cuda`, `xpu`, `mps`, `cpu`。 - 当传入 `--device` 时, 该设备是否可用。 示例成功输出: ```text Checking model directory: OK: model directory OK: required model files OK: python packages cuda: available xpu: unavailable mps: unavailable cpu: available ``` ## 单条文本合成 最小命令: ```bash indextts2 synth --text "你好, IndexTTS2。" --voice examples/voice_01.wav --output outputs/hello.wav ``` 从 UTF-8 文本文件读取: ```bash indextts2 synth --text-file input.txt --voice examples/voice_01.wav --output outputs/hello.wav ``` 从标准输入读取: ```bash echo "从标准输入读取文本。" | indextts2 synth --stdin --voice examples/voice_01.wav --output outputs/stdin.wav ``` 文本来源必须三选一: - `--text TEXT` - `--text-file PATH` - `--stdin` CLI 会去除文本首尾空白, 去除后不能为空。`--text-file` 按 UTF-8 读取。 ## 输出文件 `--output` 必填。默认不覆盖已有文件: ```bash indextts2 synth --text "测试覆盖。" --voice examples/voice_01.wav --output outputs/hello.wav ``` 如需覆盖已有输出, 使用 `--force`: ```bash indextts2 synth --text "测试覆盖。" --voice examples/voice_01.wav --output outputs/hello.wav --force ``` 输出路径的父目录会自动创建。合成成功时, 标准输出会打印: ```text Generated: outputs/hello.wav ``` ## 音色与情感控制 `--voice` 必填, 指向音色参考音频: ```bash indextts2 synth --text "保持音色。" --voice examples/voice_01.wav --output outputs/voice.wav ``` 使用情感参考音频: ```bash indextts2 synth --text "使用情感参考音频。" --voice examples/voice_01.wav --emotion-audio examples/emo_sad.wav --emotion-weight 0.75 --output outputs/emotion_audio.wav ``` 使用情感描述文本: ```bash indextts2 synth --text "使用情感描述文本。" --voice examples/voice_01.wav --emotion-text "warm and calm" --emotion-weight 0.6 --output outputs/emotion_text.wav ``` 使用 8 维情感向量: ```bash indextts2 synth --text "使用情感向量。" --voice examples/voice_01.wav --emotion-vector 0,0,0.8,0,0,0,0,0 --emotion-weight 1.0 --output outputs/emotion_vector.wav ``` 8 维情感向量的顺序固定为: 高兴, 愤怒, 悲伤, 害怕, 厌恶, 忧郁, 惊讶, 平静。 `--emotion-vector` 接受两种格式: - 逗号分隔格式: `0,0,0.8,0,0,0,0,0` - 带方括号的列表格式: `[0, 0, 0.8, 0, 0, 0, 0, 0]` 规则: - `--emotion-vector`, `--emotion-audio` 和 `--emotion-text` 三者互斥, 每次只能选择一种情感来源。 - `--emotion-text` 不能为空字符串。 - `--emotion-vector` 必须正好包含 8 个数字。 - `--emotion-vector` 每个值必须在 `0.0..1.0` 范围内。 - `--emotion-vector` 的总和必须小于等于 `0.8`。 - CLI 不会自动归一化, 裁剪, 重平衡或改写情感向量。 - `--emotion-weight` 必须是浮点数, 默认值为 `1.0`。 - `--emotion-weight` 会传给 IndexTTS2 的 `emo_alpha`。用于 `--emotion-vector` 时, 它会整体缩放 8 维情感向量的强度。 ## 批量合成 `indextts2 batch` 是当前 CLI v2 的批量合成子命令。它读取一份 JSON Lines 批量清单, 先预检整份清单, 再只初始化一次模型。默认模式按清单顺序串行生成多份独立音频文件。传入 `--concat` 时, CLI 会先为每条任务生成临时 WAV 片段, 再按清单顺序拼接成一个最终 WAV 文件。 `batch` 是新增子命令, 不会改变 `indextts2 synth` 的单条合成契约。 ### 基本命令 只校验批量清单和模型资源, 不加载模型, 不生成音频: ```bash indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav --dry-run ``` `--dry-run` 成功时输出: ```text Batch file OK: 4 tasks ``` 真实批量合成: ```bash indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav --device cuda:0 --fp16 ``` 合成成功时会逐条输出生成路径, 最后输出汇总: ```text Generated: examples/batch/out/001.wav Generated: examples/batch/out/002.wav Generated: examples/batch/out/003.wav Generated: examples/batch/out/004.wav Batch complete: 4 tasks generated ``` ### 输出模式 `batch` 支持三种输出模式。 逐行输出是默认模式。清单中每行必须提供 `output`: ```bash indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav ``` 自动命名输出使用 `--output-dir`, 清单中不能提供 `output`。输出文件按任务顺序命名为 `0001.wav`, `0002.wav`: ```bash indextts2 batch --batch-file examples/batch/auto-output.jsonl --voice examples/voice_01.wav --output-dir examples/batch/out/auto --dry-run ``` 如需文件名前缀, 加 `--output-prefix`。前缀不能包含路径分隔符或文件扩展名: ```bash indextts2 batch --batch-file examples/batch/auto-output.jsonl --voice examples/voice_01.wav --output-dir examples/batch/out/auto --output-prefix chapter --dry-run ``` 上例真实执行时会生成: ```text examples/batch/out/auto/chapter-0001.wav examples/batch/out/auto/chapter-0002.wav examples/batch/out/auto/chapter-0003.wav ``` 拼接输出使用 `--concat --output `, 清单中不能提供逐行 `output`: ```bash indextts2 batch --batch-file examples/batch/batch-concat.jsonl --voice examples/voice_01.wav --concat --output examples/batch/out/story.wav --dry-run ``` `--dry-run` 成功时输出: ```text Batch concat OK: 3 tasks ``` 真实执行时, CLI 会创建内部临时目录, 逐条合成 WAV 片段, 拼接为 `--output` 指定的最终 WAV, 然后默认删除临时目录: ```bash indextts2 batch --batch-file examples/batch/batch-concat.jsonl --voice examples/voice_01.wav --concat --output examples/batch/out/story.wav ``` 成功时输出: ```text Generated: ``` 如需保留内部临时 WAV 片段用于排查问题, 加 `--keep-temp`: ```bash indextts2 batch --batch-file examples/batch/batch-concat.jsonl --voice examples/voice_01.wav --concat --output examples/batch/out/story.wav --keep-temp ``` 成功时会额外输出临时目录: ```text Generated: Temp dir: ``` ### JSON Lines 批量清单 批量清单每个非空行是一条 JSON object。空行会被忽略, 不计入任务数。当前不支持注释行或行内注释。 示例 `examples/batch/demo.jsonl`: ```jsonl {"text": "第一句直接写在批量清单里。", "output": "out/001.wav"} {"text_file": "texts/second.txt", "emotion_audio": "../emo_sad.wav", "emotion_weight": 0.75, "output": "out/002.wav"} {"text": "第三句使用 JSON array 格式的情感向量。", "emotion_vector": [0, 0, 0.6, 0, 0, 0, 0, 0], "output": "out/003.wav"} {"text": "第四句使用 CLI 字符串格式的情感向量。", "emotion_vector": "0,0,0,0,0,0,0,0.5", "emotion_weight": "0.4", "output": "out/004.wav"} ``` 每行支持的字段: | 字段 | 必填 | 说明 | | --- | --- | --- | | `text` | 与 `text_file` 二选一 | 直接传入待合成文本, 去除首尾空白后不能为空。 | | `text_file` | 与 `text` 二选一 | 从 UTF-8 文本文件读取待合成文本, 整个文件作为一条任务文本。 | | `voice` | 有命令级 `--voice` 时可省略 | 音色参考音频路径。 | | `output` | 默认逐行输出模式必填 | 输出音频路径。使用 `--output-dir` 或 `--concat` 时不能提供。 | | `emotion_audio` | 否 | 情感参考音频路径。 | | `emotion_text` | 否 | 情感描述文本。 | | `emotion_vector` | 否 | 8 维情感向量, 支持 JSON array 或 CLI 风格字符串。 | | `emotion_weight` | 否 | 情感权重, 必须可解析为浮点数。 | | `silence_after_ms` | 否 | 拼接模式下, 在当前片段后追加的静音毫秒数。只能与 `--concat` 一起使用。 | 规则: - 未知字段会报错, 避免字段拼写错误被静默忽略。 - `text` 和 `text_file` 必须二选一, 不能同时提供, 也不能都不提供。 - 批量清单不支持逐行 `stdin`。 - `voice` 可逐行提供, 也可用命令级 `--voice` 作为默认值。 - 默认逐行输出模式下, `output` 必须解析为每条任务的唯一输出路径。 - 使用 `--output-dir` 时, `output` 由 CLI 自动生成, 清单中不能出现 `output`。 - 使用 `--concat` 时, 最终输出来自命令级 `--output`, 清单中不能出现逐行 `output`。 - `silence_after_ms` 必须是非负整数, 默认值为 `0`。 ### 路径解析 批量清单中的相对路径按批量清单文件所在目录解析, 包括 `text_file`, `voice`, 默认逐行输出模式下的 `output` 和 `emotion_audio`。 命令行参数路径仍按当前工作目录解析, 包括 `--batch-file`, 显式传入的 `--model-dir`, 命令级 `--voice`, 命令级 `--emotion-audio`, `--output-dir` 和拼接模式的 `--output`。 例如从仓库根目录运行: ```bash indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav --dry-run ``` 如果 `examples/batch/demo.jsonl` 某行写入 `"output": "out/001.wav"`, 实际输出路径会解析为 `examples/batch/out/001.wav`。 如果使用: ```bash indextts2 batch --batch-file examples/batch/auto-output.jsonl --voice examples/voice_01.wav --output-dir examples/batch/out/auto --dry-run ``` 自动输出目录 `examples/batch/out/auto` 会按当前工作目录解析, 不会按 `auto-output.jsonl` 所在目录再次拼接。 ### 覆盖, 失败和输出 默认不覆盖已有输出文件。如果任一任务的输出文件已存在, 且没有传 `--force`, 命令会在模型初始化前失败: ```bash indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav --force ``` 覆盖规则: - `--force` 只允许覆盖批量运行开始前已经存在的外部输出文件。 - 同一批量清单内部的重复 `output` 始终是输入错误, 即使传入 `--force` 也会失败。 - 使用 `--output-dir` 时, 自动生成的输出文件如果已存在, 仍需传入 `--force` 才能覆盖。 - 使用 `--concat` 时, 最终 `--output` 如果已存在, 仍需传入 `--force` 才能覆盖。 - 使用 `--output-dir` 或 `--concat` 时, CLI 会拒绝把生成输出写到批量清单, `text_file`, `voice` 或 `emotion_audio` 等受保护输入路径上。 - 批量合成当前采用失败即停止。没有 `--continue-on-error`。 - 如果某条任务在推理阶段失败, 已经生成的前序输出文件不会回滚删除。 - 批量拼接模式下, 推理失败或拼接失败会默认清理内部临时目录。传入 `--keep-temp` 时会保留临时目录并把路径写入输出。 - 成功任务会逐条打印 `Generated: `。 - 全部任务成功后打印 `Batch complete: tasks generated`。 - 批量拼接成功后只打印最终文件 `Generated: `, 不逐条打印临时片段。 - 与具体行相关的错误会包含批量清单中的 1-based 行号。 ### 批量情感字段 命令行可以提供公共默认值: ```bash indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav --emotion-text "warm and calm" --emotion-weight 0.6 ``` 批量清单每行可以用同名 snake_case 字段覆盖命令级默认值: - 命令级 `--voice` 对应逐行 `voice`。 - 命令级 `--emotion-audio` 对应逐行 `emotion_audio`。 - 命令级 `--emotion-text` 对应逐行 `emotion_text`。 - 命令级 `--emotion-vector` 对应逐行 `emotion_vector`。 - 命令级 `--emotion-weight` 对应逐行 `emotion_weight`。 情感规则: - `emotion_audio`, `emotion_text` 和 `emotion_vector` 是互斥的情感来源, 每行最多提供一种。 - 如果一行没有情感来源字段, 会继承命令级情感来源。 - 如果一行提供了情感来源字段, 该行会覆盖命令级情感来源。 - 如果一行没有 `emotion_weight`, 会继承命令级 `--emotion-weight`, 默认是 `1.0`。 - 如果一行只提供 `emotion_weight`, 它会继承命令级情感来源并只覆盖强度。 - 如果没有命令级情感来源, 单独提供逐行 `emotion_weight` 是输入错误。 - 如果没有任何情感来源, 当前行为与 `synth` 一致, 情感跟随 `voice` 参考音频。 批量清单中的 `emotion_vector` 接受两种格式: ```jsonl {"text": "JSON array 格式。", "voice": "../voice_01.wav", "emotion_vector": [0, 0, 0.8, 0, 0, 0, 0, 0], "output": "out/vector-array.wav"} {"text": "CLI 字符串格式。", "voice": "../voice_01.wav", "emotion_vector": "0,0,0.8,0,0,0,0,0", "output": "out/vector-string.wav"} ``` `emotion_vector` 的顺序和校验规则与 `synth --emotion-vector` 相同: 必须正好 8 个数字, 每个值在 `0.0..1.0` 范围内, 总和必须小于等于 `0.8`。 ## 已有 WAV 拼接 `indextts2 concat` 用于拼接已经存在的 WAV 文件。它不会加载模型, 也不会执行 TTS 推理。它只读取拼接清单, 校验每个 WAV 片段, 再按清单顺序写出一个新的 WAV 文件。 ### 基本命令 只校验拼接清单, 不创建输出文件: ```bash indextts2 concat --concat-file examples/batch/concat-audio.jsonl --output examples/batch/out/emotion_joined.wav --dry-run ``` `--dry-run` 成功时输出: ```text Concat file OK: 2 segments ``` 真实拼接: ```bash indextts2 concat --concat-file examples/batch/concat-audio.jsonl --output examples/batch/out/emotion_joined.wav ``` 成功时输出: ```text Generated: ``` 默认不覆盖已有输出。如需覆盖, 加 `--force`: ```bash indextts2 concat --concat-file examples/batch/concat-audio.jsonl --output examples/batch/out/emotion_joined.wav --force ``` ### JSON Lines 拼接清单 拼接清单每个非空行是一条 JSON object。空行会被忽略, 不计入片段数。当前不支持注释行或行内注释。 示例 `examples/batch/concat-audio.jsonl`: ```jsonl {"audio": "../emo_hate.wav", "silence_after_ms": 300} {"audio": "../emo_sad.wav", "silence_after_ms": 500} ``` 每行支持的字段: | 字段 | 必填 | 说明 | | --- | --- | --- | | `audio` | 是 | 待拼接 WAV 文件路径。 | | `silence_after_ms` | 否 | 当前片段后追加的静音毫秒数, 必须是非负整数, 默认 `0`。 | 规则: - 未知字段会报错。 - `audio` 必须是非空字符串, 并且扩展名必须是 `.wav`, 大小写不敏感。 - `audio` 相对路径按拼接清单文件所在目录解析。 - `--concat-file` 和 `--output` 相对路径按当前工作目录解析。 - `--output` 必须是 `.wav` 文件, 不能与 `--concat-file` 相同, 也不能与任何 `audio` 输入相同。 - 清单必须至少包含一个片段。 - 每个输入 WAV 必须存在, 可读取, 且至少包含一个音频帧。 - 所有输入 WAV 的采样率, 声道数和采样宽度必须一致。 - 拼接时会保留清单顺序, 并在每个片段后追加 `silence_after_ms` 指定的静音。 ## 运行参数 单条合成示例: ```bash indextts2 synth --text "运行参数示例。" --voice examples/voice_01.wav --output outputs/runtime.wav --device cuda:0 --fp16 --deepspeed --cuda-kernel --verbose ``` 批量合成示例: ```bash indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav --device cuda:0 --fp16 --deepspeed --cuda-kernel --verbose ``` 批量合成后拼接示例: ```bash indextts2 batch --batch-file examples/batch/batch-concat.jsonl --voice examples/voice_01.wav --concat --output examples/batch/out/story.wav --device cuda:0 --fp16 ``` 参数说明: | 参数 | 说明 | | --- | --- | | `--model-dir PATH` | 本次运行使用的模型资源目录, 覆盖 `INDEXTTS2_MODEL_DIR`, 持久化配置和平台默认值。 | | `--device DEVICE` | 本次运行设备, 例如 `cpu`, `cuda`, `cuda:0`, `mps`, `xpu`; 未传时可使用持久化配置 `default_device`。 | | `--fp16` / `--no-fp16` | 本次运行是否启用 FP16 半精度推理; 未传时可使用持久化配置 `use_fp16`。 | | `--deepspeed` / `--no-deepspeed` | 本次运行是否启用 DeepSpeed; 未传时可使用持久化配置 `use_deepspeed`。 | | `--cuda-kernel` / `--no-cuda-kernel` | 本次运行是否启用 CUDA kernel 路径; 未传时可使用持久化配置 `use_cuda_kernel`。 | | `--verbose` | 显示模型运行输出, 并向 `IndexTTS2.infer` 传入 `verbose=True`。 | 默认情况下, CLI 会隐藏模型初始化和推理过程中的普通标准输出。`synth` 成功后打印 `Generated: `; `batch` 每条成功任务打印 `Generated: `, 全部成功后再打印 `Batch complete: tasks generated`。需要调试时使用 `--verbose`。 `concat` 不加载模型, 因此不支持 `--model-dir`, `--device`, `--fp16`, `--deepspeed`, `--cuda-kernel` 或 `--verbose`。 ## 参数速查 ### `indextts2 init` | 参数 | 必填 | 默认值 | 说明 | | --- | --- | --- | --- | | `--model-dir PATH` | 否 | 平台默认模型资源目录 | 创建本地状态并把模型资源目录写入持久化配置。 | ### `indextts2 config` | 命令 | 说明 | | --- | --- | | `indextts2 config path` | 输出持久化配置文件位置。 | | `indextts2 config get` | 输出当前持久化配置。 | | `indextts2 config set KEY VALUE` | 写入一个配置值。`KEY` 可为 `model_dir`, `default_device`, `use_fp16`, `use_deepspeed`, `use_cuda_kernel`。 | ### `indextts2 download` | 参数 | 必填 | 默认值 | 说明 | | --- | --- | --- | --- | | `--source huggingface|modelscope` | 否 | `huggingface` | 模型下载源。 | | `--model-dir PATH` | 否 | 解析后的模型资源目录 | 下载目标目录。成功后默认写入持久化配置。 | | `--no-save` | 否 | `False` | 与 `--model-dir` 一起使用时, 禁止下载成功后写回 `model_dir`。 | ### `indextts2 check` | 参数 | 必填 | 默认值 | 说明 | | --- | --- | --- | --- | | `--model-dir PATH` | 否 | 解析后的模型资源目录 | 本次检查使用的 IndexTTS2 模型资源目录。 | | `--device DEVICE` | 否 | 无 | 要求可用的运行设备, 例如 `cuda:0`。 | ### `indextts2 synth` | 参数 | 必填 | 默认值 | 说明 | | --- | --- | --- | --- | | `--text TEXT` | 三选一 | 无 | 直接传入待合成文本。 | | `--text-file PATH` | 三选一 | 无 | 从 UTF-8 文本文件读取待合成文本。 | | `--stdin` | 三选一 | `False` | 从标准输入读取待合成文本。 | | `--voice PATH` | 是 | 无 | 音色参考音频路径。 | | `--emotion-audio PATH` | 否 | 无 | 情感参考音频路径, 与 `--emotion-vector` 和 `--emotion-text` 互斥。 | | `--emotion-text TEXT` | 否 | 无 | 情感描述文本, 与 `--emotion-vector` 和 `--emotion-audio` 互斥。 | | `--emotion-vector VECTOR` | 否 | 无 | 8 维情感向量, 支持逗号分隔或带方括号的列表格式, 与其他情感来源互斥。 | | `--emotion-weight FLOAT` | 否 | `1.0` | 情感权重, 映射到 `emo_alpha`, 可缩放情感向量强度。 | | `--output PATH` | 是 | 无 | 输出音频路径。 | | `--force` | 否 | `False` | 允许覆盖已有输出文件。 | | `--model-dir PATH` | 否 | 解析后的模型资源目录 | 本次合成使用的 IndexTTS2 模型资源目录。 | | `--device DEVICE` | 否 | 持久化配置或无 | 运行设备。 | | `--fp16` / `--no-fp16` | 否 | 持久化配置或 `False` | 启用或禁用 FP16 推理。 | | `--deepspeed` / `--no-deepspeed` | 否 | 持久化配置或 `False` | 启用或禁用 DeepSpeed。 | | `--cuda-kernel` / `--no-cuda-kernel` | 否 | 持久化配置或 `False` | 启用或禁用 CUDA kernel。 | | `--verbose` | 否 | `False` | 显示详细运行输出。 | ### `indextts2 batch` | 参数 | 必填 | 默认值 | 说明 | | --- | --- | --- | --- | | `--batch-file PATH` | 是 | 无 | JSON Lines 批量清单路径。 | | `--dry-run` | 否 | `False` | 只校验批量清单和模型资源, 不加载模型, 不生成音频。 | | `--output-dir PATH` | 否 | 无 | 自动命名输出目录。传入后清单中不能提供逐行 `output`。 | | `--output-prefix TEXT` | 否 | 无 | 自动命名输出文件前缀, 需与 `--output-dir` 一起使用。 | | `--concat` | 否 | `False` | 合成后拼接为一个最终 WAV 文件。 | | `--output PATH` | `--concat` 模式必填 | 无 | 拼接模式的最终 WAV 输出路径。只可与 `--concat` 一起使用。 | | `--keep-temp` | 否 | `False` | 拼接模式下保留内部临时 WAV 片段目录。 | | `--voice PATH` | 否 | 无 | 每条任务的默认音色参考音频, 可被逐行 `voice` 覆盖。 | | `--emotion-audio PATH` | 否 | 无 | 默认情感参考音频, 与 `--emotion-vector` 和 `--emotion-text` 互斥。 | | `--emotion-text TEXT` | 否 | 无 | 默认情感描述文本, 与 `--emotion-vector` 和 `--emotion-audio` 互斥。 | | `--emotion-vector VECTOR` | 否 | 无 | 默认 8 维情感向量, 支持逗号分隔或带方括号的列表格式, 与其他情感来源互斥。 | | `--emotion-weight FLOAT` | 否 | `1.0` | 默认情感权重, 可被逐行 `emotion_weight` 覆盖。 | | `--force` | 否 | `False` | 允许覆盖批量运行开始前已经存在的输出文件。 | | `--model-dir PATH` | 否 | 解析后的模型资源目录 | 本次批量合成使用的 IndexTTS2 模型资源目录。 | | `--device DEVICE` | 否 | 持久化配置或无 | 运行设备。 | | `--fp16` / `--no-fp16` | 否 | 持久化配置或 `False` | 启用或禁用 FP16 推理。 | | `--deepspeed` / `--no-deepspeed` | 否 | 持久化配置或 `False` | 启用或禁用 DeepSpeed。 | | `--cuda-kernel` / `--no-cuda-kernel` | 否 | 持久化配置或 `False` | 启用或禁用 CUDA kernel。 | | `--verbose` | 否 | `False` | 显示详细运行输出。 | ### `indextts2 concat` | 参数 | 必填 | 默认值 | 说明 | | --- | --- | --- | --- | | `--concat-file PATH` | 是 | 无 | JSON Lines 拼接清单路径。 | | `--output PATH` | 是 | 无 | 拼接后的 WAV 输出路径。 | | `--force` | 否 | `False` | 允许覆盖已有输出文件。 | | `--dry-run` | 否 | `False` | 只校验拼接清单和输入 WAV, 不生成输出音频。 | ## 返回码 | 返回码 | 含义 | 常见场景 | | --- | --- | --- | | `0` | 成功 | 初始化完成, 配置更新, 下载检查通过, 环境检查通过或合成成功。 | | `1` | 输入错误 | 文本来源不唯一, 文本为空, 缺少 `--output`, 输出已存在但未传 `--force`, 情感参数冲突, 批量清单字段错误, 拼接清单字段错误, WAV 格式不匹配。 | | `2` | 本地资源缺失 | 模型资源目录不存在, 必需模型资源缺失, 文本文件不存在, 音色参考音频不存在, 情感参考音频不存在, 批量清单不存在, 拼接清单不存在, 拼接音频不存在。 | | `3` | 运行环境不可用 | 必需 Python 包缺失, 下载源 Python 包缺失, 指定设备不可用, IndexTTS2 runtime 导入失败。 | | `4` | 推理或拼接失败 | 模型初始化, `infer` 执行或 WAV 写入替换过程中抛出异常。批量合成会停在第一条失败任务。 | 错误信息写入 `stderr`, 成功信息写入 `stdout`。 ## 常见错误 文本来源冲突: ```text ERROR: provide exactly one text source: --text, --text-file or --stdin ``` 处理方式: 只保留 `--text`, `--text-file`, `--stdin` 中的一个。 模型资源目录不存在: ```text ERROR: model directory does not exist: Model directory: Missing resources: model directory does not exist Download with HuggingFace: huggingface-cli download IndexTeam/IndexTTS-2 --local-dir "" Download with ModelScope: modelscope download --model IndexTeam/IndexTTS-2 --local_dir "" Persist a different model resource directory: indextts2 config set model_dir Hint: rerun indextts2 download or choose a different model resource directory. ``` 处理方式: 按输出中的目标目录下载模型资源。推荐先使用 CLI 下载: ```bash indextts2 download --model-dir ``` 如果模型资源已经在其他目录, 写入持久化配置: ```bash indextts2 config set model_dir ``` 模型资源缺失: ```text ERROR: missing required model files: bpe.model, gpt.pth Model directory: Missing resources: bpe.model, gpt.pth Download with HuggingFace: huggingface-cli download IndexTeam/IndexTTS-2 --local-dir "" Download with ModelScope: modelscope download --model IndexTeam/IndexTTS-2 --local_dir "" Persist a different model resource directory: indextts2 config set model_dir Hint: rerun indextts2 download or choose a different model resource directory. ``` 处理方式: 重新运行 `indextts2 download --model-dir ` 补齐资源, 或使用 `indextts2 config set model_dir ` 指向已有完整模型资源目录, 然后重新运行 `indextts2 check`。 输出文件已存在: ```text ERROR: output file already exists: outputs/hello.wav ``` 处理方式: 更换 `--output` 路径, 或确认可覆盖后加 `--force`。 情感向量数量错误: ```text ERROR: --emotion-vector must contain exactly 8 values; got 7 ``` 处理方式: 按高兴, 愤怒, 悲伤, 害怕, 厌恶, 忧郁, 惊讶, 平静的顺序传入 8 个数字。 批量清单字段错误: ```text ERROR: batch file line 2 has unknown fields: prompt_audio ``` 处理方式: 使用 `voice`, `emotion_audio`, `emotion_text`, `emotion_vector` 等 CLI v2 字段名, 不要使用底层 API 或旧样例字段名。 批量输出重复: ```text ERROR: batch file line 3 has duplicate output path: examples/batch/out/001.wav ``` 处理方式: 为同一批量清单中的每条任务设置不同的 `output`。`--force` 不允许批次内部互相覆盖。 批量拼接清单包含逐行输出: ```text ERROR: batch file line 1 field 'output' is not allowed with --concat ``` 处理方式: 使用 `--concat --output final.wav` 指定最终输出, 并从批量清单中删除逐行 `output`。 未开启批量拼接却提供静音字段: ```text ERROR: batch file line 1 field 'silence_after_ms' is only valid with --concat ``` 处理方式: 删除 `silence_after_ms`, 或在命令中加入 `--concat --output final.wav`。 拼接清单中的 WAV 格式不一致: ```text ERROR: concat file line 2 WAV format does not match baseline line 1 ``` 处理方式: 确认所有输入 WAV 的采样率, 声道数和采样宽度一致后再拼接。 拼接输出已存在: ```text ERROR: output file already exists: examples/batch/out/emotion_joined.wav ``` 处理方式: 更换 `--output` 路径, 或确认可覆盖后加 `--force`。 设备不可用: ```text ERROR: requested device is not available: cuda:0 ``` 处理方式: 使用 `indextts2 check` 查看当前设备可用性, 或改用 `--device cpu`。如果希望长期使用某个设备, 可写入持久化配置: ```bash indextts2 config set default_device cuda:0 ``` 下载源 Python 包缺失: ```text ERROR: runtime unavailable for huggingface download source: No module named 'huggingface_hub' Install download support with: pip install huggingface_hub ``` 处理方式: 为当前环境安装提示中的 Python 包, 或改用另一个下载源: ```bash indextts2 download --source modelscope ``` ## 推荐工作流 普通用户首次运行: ```bash indextts2 init indextts2 download indextts2 check indextts2 synth --text "你好, IndexTTS2。" --voice examples/voice_01.wav --output outputs/hello.wav ``` 使用已有模型资源目录: ```bash indextts2 config set model_dir D:/models/IndexTTS-2 indextts2 check ``` GPU 环境: ```bash indextts2 config set default_device cuda:0 indextts2 config set use_fp16 true indextts2 check indextts2 synth --text "GPU 推理测试。" --voice examples/voice_01.wav --output outputs/gpu.wav ``` 一次性覆盖模型资源目录或运行参数: ```bash indextts2 check --model-dir D:/models/IndexTTS-2 --device cuda:0 indextts2 synth --text "GPU 推理测试。" --voice examples/voice_01.wav --output outputs/gpu.wav --device cuda:0 --fp16 ``` 调试模型输出: ```bash indextts2 synth --text "调试输出。" --voice examples/voice_01.wav --output outputs/debug.wav --verbose ``` 批量合成: ```bash indextts2 check indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav --dry-run indextts2 batch --batch-file examples/batch/demo.jsonl --voice examples/voice_01.wav ``` 自动命名批量输出: ```bash indextts2 batch --batch-file examples/batch/auto-output.jsonl --voice examples/voice_01.wav --output-dir examples/batch/out/auto --dry-run indextts2 batch --batch-file examples/batch/auto-output.jsonl --voice examples/voice_01.wav --output-dir examples/batch/out/auto --output-prefix chapter ``` 批量合成后拼接: ```bash indextts2 batch --batch-file examples/batch/batch-concat.jsonl --voice examples/voice_01.wav --concat --output examples/batch/out/story.wav --dry-run indextts2 batch --batch-file examples/batch/batch-concat.jsonl --voice examples/voice_01.wav --concat --output examples/batch/out/story.wav ``` 拼接已有 WAV: ```bash indextts2 concat --concat-file examples/batch/concat-audio.jsonl --output examples/batch/out/emotion_joined.wav --dry-run indextts2 concat --concat-file examples/batch/concat-audio.jsonl --output examples/batch/out/emotion_joined.wav ``` 开发和调试 CLI v2: ```bash python -m indextts.cli_v2 --help python -m indextts.cli_v2 check ```