# MOSS-TTSD **Repository Path**: ruby11dog/MOSS-TTSD ## Basic Information - **Project Name**: MOSS-TTSD - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-30 - **Last Updated**: 2025-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
# MOSS-TTSD 🪐 [English](README.md) | [简体中文](README_zh.md) ## 概述 MOSS-TTSD(text to spoken dialogue)是一个开源的中英双语口语对话合成模型,可以将包含两位说话人的对话脚本转换为自然、富有表现力的对话语音。MOSS-TTSD支持双说话人零样本音色克隆与长时间单段语音生成,非常适合播客,访谈,聊天等对话场景。 详细模型介绍与演示请见我们的[中文博客](https://www.open-moss.com/cn/moss-ttsd/)和[Blog-en](https://www.open-moss.com/en/moss-ttsd/)。模型权重在 [Hugging Face](https://huggingface.co/fnlp/MOSS-TTSD-v0.5) 提供,并可在 [Spaces 演示](https://huggingface.co/spaces/fnlp/MOSS-TTSD) 在线体验。 ## 亮点 - **高表现力对话语音**:基于统一语义-声学神经音频Codec、预训练大语言模型、百万小时TTS数据与对话语音数据,MOSS-TTSD能够生成高表现力,高自然度,具有自然对话韵律的拟人对话语音。 - **双说话人零样本声音克隆**:MOSS-TTSD支持零样本双说话人克隆,按脚本精确进行角色/声线切换。只需要提供10到20秒的参考音频片段。 - **中英双语**:MOSS-TTSD支持中英两种语言的高表现力语音生成。 - **长音频生成**:得益于低码率Codec与训练框架优化,MOSS-TTSD在长音频生成场景进行了大量训练(训练最大长度达到1700s),能够单次生成超长音频。 - **开源可商用**:当前与后续版本将保持开源,支持免费商用。 ## 最新动态 🚀 - **[2025-11-01]** 我们发布了 MOSS-TTSD v0.7:显著提升了音质、声音克隆能力与稳定性,支持32khz高音质输出,并大幅拓展了单次生成长度(960s->1700s),更够比较稳定地根据说话人标签生成语音事件。 - **[2025-09-09]** 我们支持了 SGLang 推理引擎加速模型推理,最高可加速**16倍**。 - **[2025-08-25]** 我们发布了 32khz XY-Tokenizer。 - **[2025-08-12]** 我们支持了 MOSS-TTSD v0.5 的流式推理。 - **[2025-07-29]** 我们提供了 MOSS-TTSD v0.5 的硅基流动API调用接口和调用示例。 - **[2025-07-16]** 我们开源了 MOSS-TTSD v0.5 的微调代码,支持全量微调,LoRA微调和多机训练。 - **[2025-07-04]** 我们发布了 MOSS-TTSD v0.5:显著提升了音色切换准确率、声音克隆能力与稳定性。 - **[2025-06-20]** 我们发布了 MOSS-TTSD v0。此外,我们还提供了播客生成流水线 Podever,可以便捷地将 PDF、URL 或长文本等内容自动转换为高质量播客。 ## 安装 运行 MOSS-TTSD 需要安装依赖,可以使用 pip 和 conda 创建环境。 ### 使用 conda ```bash conda create -n moss_ttsd python=3.10 -y && conda activate moss_ttsd pip install -r requirements.txt pip install flash-attn ``` ### 下载 XY-Tokenizer 权重 首先需要下载 XY-Tokenizer 的Codec模型权重,见 [XY_Tokenizer仓库](https://huggingface.co/fnlp/XY_Tokenizer_TTSD_V0_32k)。 ```bash mkdir -p XY_Tokenizer/weights huggingface-cli download fnlp/MOSS_TTSD_tokenizer MOSS_TTSD_tokenizer --local-dir ./XY_Tokenizer/weights/ ``` ## 使用方法 ### 本地推理 我们提供了模型推理脚本用于模型的本地推理。使用前请确保已下载好模型权重及对应的配置文件。 ```bash python inference.py --jsonl examples/examples.jsonl --output_dir outputs --seed 42 --use_normalize --silence_duration 0 ``` 参数说明: - `--jsonl`:输入 JSONL 文件路径,包含对话脚本与参考音频 - `--output_dir`:生成音频文件的保存目录 - `--seed`:随机种子 - `--use_normalize`:是否启用文本归一化(建议开启) - `--dtype`:模型精度(默认 `bf16`) - `--attn_implementation`:注意力实现(默认 `flash_attention_2`,也支持 `sdpa`、`eager`) - `--silence_duration`:参考音频与生成音频之间的静默时长(默认 0 秒),当生成音频开头出现杂音时(通常因为生成音频续写了prompt的尾音),请尝试将该参数设置为0.1。 **Windows用户需要将attn_implementation参数设置为sdpa或者eager** #### JSONL 输入格式 MOSS-TTSD 支持两种输入格式: **格式1:分别提供两位说话人的参考音频** ```json { "base_path": "/path/to/audio/files", "text": "[S1]说话人1的内容[S2]说话人2的内容[S1]...", "prompt_audio_speaker1": "path/to/speaker1_audio.wav", "prompt_text_speaker1": "说话人1参考音频的对应文本", "prompt_audio_speaker2": "path/to/speaker2_audio.wav", "prompt_text_speaker2": "说话人2参考音频的对应文本" } ``` **格式2:共享参考音频(一个参考音频包含两个说话人的内容)** ```json { "base_path": "/path/to/audio/files", "text": "[S1]说话人1的内容[S2]说话人2的内容[S1]...", "prompt_audio": "path/to/shared_reference_audio.wav", "prompt_text": "[S1]用于说话人1的参考文本[S2]用于说话人2的参考文本" } ``` #### 字段说明 **通用字段:** - `text`:带 `[S1]`、`[S2]` 说话人标签的对话脚本(必填) - `base_path`:相对路径的基准目录(可选) **用于声音克隆(格式1):** - `prompt_audio_speaker1/2`:两位说话人的参考音频(可相对 `base_path`) - `prompt_text_speaker1/2`:对应参考音频的文本,有助于更好匹配音色 **用于共享参考(格式2):** - `prompt_audio`:包含两位说话人的共享参考音频(可相对 `base_path`) - `prompt_text`:对应的参考文本,亦使用 `[S1]`、`[S2]` 区分 #### 说话人标签 - `[S1]`:表示说话人1开始说话 - `[S2]`:表示说话人2开始说话 示例: ``` [S1]你好,今天感觉如何?[S2]挺好的,谢谢关心![S1]那太好了。 ``` **GPU 显存需求** MOSS-TTSD非常高效,显存需求很低。例如默认 `bf16` 精度生成 600 秒音频时,模型需要的显存低于 7GB。这使得MOSS-TTSD可以运行在大多数消费级GPU上。 我们提供了一个显存估算公式来估计实际的显存开销 $$ y = 0.00172x + 5.8832 $$ 其中 $x$ 为生成音频时长(秒),$y$ 为显存占用(GB)。 > 请注意,如果您的prompt(例如 `prompt_audio_speaker1`)比我们的默认示例更长,显存开销会更高。 | 生成时长(秒) | 显存占用(GB) | | -------------- | -------------- | | 120 | 6.08 | | 300 | 6.39 | | 360 | 6.5 | | 600 | 6.91 | ### Web UI 使用 你还可以使用以下的命令启动Gradio界面,通过Web UI来使用MOSS-TTSD。 ```bash python gradio_demo.py ``` ### 流式推理 我们支持了音频输出的流式推理,`streamer.py` 提供了一个流式音频生成的参考实现。与一次性生成完整音频序列的批量推理不同,这种流式方法会在生成语音 token 的同时,逐步处理并输出音频片段,从而显著缩短首段音频的生成时间。`AudioIteratorStreamer` 类展示了如何实现语音 token 的分片解码,每个片段大约对应 20 秒的音频。 ```bash python streamer.py \ --jsonl examples/examples.jsonl \ --output_dir outputs/streamer \ --dtype bf16 \ --attn_implementation flash_attention_2 \ --use_tqdm ``` **Windows用户需要将attn_implementation参数设置为sdpa或者eager** 参数说明: - `--jsonl`:输入 JSONL 文件路径,包含对话脚本与参考音频(默认 `examples/examples.jsonl`) - `--seed`:随机种子(可选) - `--output_dir`:用于保存流式片段和最终音频的目录(默认 `outputs/streamer`) - `--use_normalize`:是否进行文本归一化(默认 `True`) - `--dtype`:`bf16`(默认)、`fp16`、`fp32` - `--attn_implementation`:`flash_attention_2`(默认)、`sdpa`、`eager` - `--use_tqdm`:显示 token 级进度条 输出说明: - 流式片段音频:`chunk_0.flac`、`chunk_1.flac` ... 保存在 `--output_dir` - 拼接后的全量音频:`full_audio.flac` 保存在 `--output_dir` 注意: - 当前流式仅支持 batch size = 1 ### API 使用 #### 批处理工具 我们提供了基于 SiliconFlow API 的Batch处理工具 `use_api.py`,用于并发处理多条对话生成任务。 ##### 环境变量 在使用API工具之前,你需要设置用于 API 身份验证的环境变量: ```bash export SILICONFLOW_API_KEY="your_siliconflow_api_key" export SILICONFLOW_API_BASE="https://api.siliconflow.cn/v1" ``` ##### 运行方式 ```bash python use_api.py --jsonl_file your_data.jsonl --output_dir your_output --max_workers 8 ``` ##### 参数说明 - `--jsonl_file`:输入 JSONL 文件(默认 `examples/examples.jsonl`) - `--output_dir`:生成音频输出目录(默认 `api_outputs`) - `--max_workers`:并发工作器数(默认 8) ##### 输入格式 API调用与本地推理相同,支持以下 JSONL 格式: **格式1:分别提供两位说话人的参考音频** ```json { "base_path": "/path/to/audio/files", "text": "[S1]你好![S2]嗨,你最近怎么样?[S1]我感觉很棒!", "prompt_audio_speaker1": "speaker1_reference.wav", "prompt_text_speaker1": "说话人1的参考文本", "prompt_audio_speaker2": "speaker2_reference.wav", "prompt_text_speaker2": "说话人2的参考文本" } ``` **格式2:共享参考音频** ```json { "base_path": "/path/to/audio/files", "text": "[S1]你好![S2]嗨,你最近怎么样?[S1]我感觉很棒!", "prompt_audio": "shared_reference.wav", "prompt_text": "[S1]说话人1参考[S2]说话人2参考" } ``` ##### 输出 API调用会产生: 1. 多个 `output_XXXX.wav` 音频文件 2. `output_results.jsonl` 处理结果索引(含各文件路径) ## 播客生成 我们提供了一个自动化的播客生成工具,可直接分析 URL 或用户上传的 PDF/文本文件,提取内容并生成高质量语音博客。 使用前请确保 `OPENAI_API_KEY` 与 `OPENAI_API_BASE` 环境变量设置正确。我们推荐使用 Gemini API 生成播客脚本,因此 API key 应为 Gemini key,API base 设为 `https://generativelanguage.googleapis.com/v1beta/openai/`。 此外,也可以使用其他模型来生成博客脚本。 ```bash export OPENAI_API_KEY="your_openai_api_key" export OPENAI_API_BASE="your_openai_api_base" # 处理网页 python podcast_generate.py "https://www.open-moss.com/cn/moss-ttsd/" # 处理 PDF 文件 python podcast_generate.py "examples/Attention Is All You Need.pdf" # 处理文本文件 python podcast_generate.py "examples/example.txt" # 自定义输出目录 python podcast_generate.py "your_input" -o "your_output" # 生成英文播客 python podcast_generate.py "your_input" -l en ``` 脚本支持中文(`zh`)与英文(`en`)两种语言,默认中文,可通过 `--language`/`-l` 指定。 ## 微调(Fine-Tuning) 我们在 `finetune` 目录内提供了模型微调脚本与数据预处理工具。模型微调可以让模型在固定说话人的数据集上进行训练,提升模型对于特定说话人的音色克隆能力。 ### 文件结构 ``` MOSS-TTSD/ └── finetune/ ├── requirements_finetune.txt # 微调依赖 ├── finetune_workflow.py # 一键式微调工作流脚本 ├── data_preprocess.py # 数据预处理脚本 ├── finetune.py # 训练脚本 ├── training_config.yaml # 训练超参 └── finetune_config.yaml # 工作流配置模板 ``` ### 环境准备 #### 使用 conda ```bash conda create -n moss_ttsd_finetune python=3.10 -y && conda activate moss_ttsd_finetune pip install -r finetune/requirements_finetune.txt pip install flash-attn ``` #### 使用 venv ```bash python -m venv moss_ttsd_finetune source moss_ttsd_finetune/bin/activate pip install -r finetune/requirements_finetune.txt pip install flash-attn --no-build-isolation ``` ### 数据准备 按照前文【使用方法/本地推理/JSONL 输入格式】组织 JSONL 文件,可包含多条符合格式的样例。可参考 `examples/examples.jsonl` 与 `examples/examples_single_reference.jsonl`。 准备好 JSONL 后,可用 `data_preprocess.py` 手动预处理: ```bash python finetune/data_preprocess.py --jsonl