Files
ai-agent-book/chapter8/sesame/README.md
T
liqiang b119135836
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
2026-08-20 13:12:50 +00:00

329 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sesame CSM (1B) TTS - Text-to-Speech Fine-tuning
## English
This directory contains scripts for fine-tuning and running inference with the Sesame CSM text-to-speech model using Unsloth.
## Files
- `sesame_csm_sft_unsloth.py` - Training script for fine-tuning the model with LoRA
- `inference.py` - Single inference script for generating speech from text
- `batch_inference.py` - Batch inference script for processing multiple texts
- `example_inputs.json` - Example input file for batch inference
- `requirements.txt` - Python dependencies
## Installation
```bash
# Use a separate project-local environment for Sesame.
# This project pins transformers==4.52.3, while the root ch7 extra uses
# transformers>=4.55 for MultilingualReasoning, so no single environment
# can satisfy both contracts safely.
# From the repository root:
cd chapter8/sesame
python -m venv .venv-sesame
source .venv-sesame/bin/activate
# Windows PowerShell: .\.venv-sesame\Scripts\Activate.ps1
# Windows cmd: .venv-sesame\Scripts\activate.bat
python -m pip install -r requirements.txt
# For Conda users, install ffmpeg
conda install -c conda-forge "ffmpeg>=6.0" -y
conda install -c conda-forge libiconv -y
```
## Training
To train a model with your own dataset:
```bash
python sesame_csm_sft_unsloth.py
```
This will:
1. Load the base model `unsloth/csm-1b`
2. Add LoRA adapters
3. Fine-tune on your dataset
4. Save the LoRA adapters to `lora_model/`
## Inference
### Single Text Inference
Generate speech from a single text:
```bash
# Without context (simple generation)
python inference.py \
--lora-path lora_model \
--text "We just finished fine tuning a text to speech model... and it's pretty good!" \
--output example_without_context_1.wav
# With voice context (for voice consistency) using dataset index 3
python inference.py \
--lora-path lora_model \
--text "Sesame is a super cool TTS model which can be fine tuned with Unsloth." \
--dataset-context-idx 3 \
--output example_with_context_1.wav
# Using base model only (without LoRA)
python inference.py \
--text "Hello world, this is a test of the text to speech system."
# With custom speaker ID and longer generation
python inference.py \
--lora-path lora_model \
--text "This is a longer sentence that needs more tokens." \
--speaker-id 0 \
--max-tokens 250 \
--output long_speech.wav
# With 4-bit quantization (lower memory)
python inference.py \
--lora-path lora_model \
--text "Memory efficient inference." \
--load-in-4bit
```
### Batch Inference
Process multiple texts at once:
```bash
# From JSON file
python batch_inference.py \
--lora-path lora_model \
--input-file example_inputs.json \
--output-dir batch_outputs
# From plain text file (one text per line)
python batch_inference.py \
--lora-path lora_model \
--input-file texts.txt \
--output-dir batch_outputs
```
#### Input File Formats
**JSON format** (`example_inputs.json`):
Without context:
```json
[
{
"text": "We just finished fine tuning a text to speech model... and it's pretty good!",
"speaker_id": 0,
"output": "example_without_context_1.wav"
},
{
"text": "Sesame is a super cool TTS model which can be fine tuned with Unsloth.",
"speaker_id": 0,
"output": "example_without_context_2.wav"
}
]
```
With context (for voice consistency using dataset indices):
```json
[
{
"text": "Sesame is a super cool TTS model which can be fine tuned with Unsloth.",
"speaker_id": 0,
"dataset_context_idx": 3,
"output": "example_with_context_1.wav"
},
{
"text": "We just finished fine tuning a text to speech model... and it's pretty good!",
"speaker_id": 0,
"dataset_context_idx": 4,
"output": "example_with_context_2.wav"
}
]
```
**Note**: `dataset_context_idx` refers to the index in the training dataset. The original `MrDragonFox/Elise` repository is now disabled, so the runnable defaults use its public `maxbsoft/mrdragonfox-elise` mirror. Indices 3 and 4 are used in the training script examples.
**Plain text format** (one sentence per line, no context support):
```
Hello world, this is the first sentence.
This is the second sentence.
This is the third sentence.
```
## Parameters
### Common Parameters
- `--base-model`: Base model name or path (default: `unsloth/csm-1b`)
- `--lora-path`: Path to saved LoRA adapters (optional)
- `--load-in-4bit`: Load model in 4-bit quantization to reduce memory usage
### Inference Parameters
- `--text`: Text to convert to speech
- `--speaker-id`: Speaker ID for multi-speaker models (default: 0)
- `--output`: Output audio file path (default: `output.wav`)
- `--max-tokens`: Maximum tokens to generate (125 ≈ 10 seconds of audio)
- `--dataset-context-idx`: Dataset index to use for voice consistency (e.g., 3 or 4 from training examples)
- `--dataset-name`: Dataset name to load context from (default: `maxbsoft/mrdragonfox-elise`)
### Batch Inference Parameters
- `--input-file`: Input file (JSON or plain text)
- `--output-dir`: Output directory for audio files (default: `outputs`)
## Model Information
- **Base Model**: Sesame CSM (1B) - A compact text-to-speech model
- **Output Format**: 24kHz WAV audio
- **Token-to-Time Ratio**: Approximately 125 tokens = 10 seconds of audio
- **Multi-speaker**: Supports multiple speakers via speaker IDs
## Advanced Usage
### Voice Consistency with Context
For better voice consistency, you can provide audio context from the dataset (see `sesame_csm_sft_unsloth.py` lines 320-390 for examples):
```python
from inference import load_model, generate_speech
model, processor = load_model("unsloth/csm-1b", "lora_model")
# Use dataset index 3 for voice consistency (same as training script)
generate_speech(
model=model,
processor=processor,
text="Sesame is a super cool TTS model which can be fine tuned with Unsloth.",
dataset_context_idx=3,
dataset_name="maxbsoft/mrdragonfox-elise",
output_path="output_with_context.wav"
)
```
The inference scripts automatically load the audio and text from the specified dataset index, ensuring consistency with the training approach.
## Memory Requirements
- **Base model**: ~4-6GB VRAM
- **Base model + LoRA training**: ~8-12GB VRAM
- **With 4-bit quantization**: ~2-3GB VRAM
- **Inference only**: ~2-4GB VRAM
Use `--load-in-4bit` flag if you have limited GPU memory.
## Troubleshooting
### AssertionError during generation
If you encounter `AssertionError` during `model.generate()`, ensure you're passing tensors correctly:
```python
# ❌ Wrong
audio_values = model.generate(**inputs, max_new_tokens=125)
# ✅ Correct
audio_values = model.generate(
input_ids=inputs["input_ids"],
attention_mask=inputs.get("attention_mask"),
max_new_tokens=125,
output_audio=True
)
```
### Out of memory
- Use `--load-in-4bit` flag
- Reduce `max_new_tokens`
- Process texts one at a time instead of batching
- Use a smaller batch size during training
## Resources
- [Unsloth Documentation](https://docs.unsloth.ai/)
- [Unsloth TTS Guide](https://docs.unsloth.ai/basics/text-to-speech-tts-fine-tuning)
- [Unsloth Discord](https://discord.gg/unsloth)
- [Unsloth GitHub](https://github.com/unslothai/unsloth)
## License
This project uses the Unsloth library and Sesame CSM model. Please refer to their respective licenses.
---
## 中文
# Sesame CSM1BTTS:文本转语音微调
## 文件
项目包含训练脚本、单条推理脚本、批量推理脚本、依赖文件以及数据处理相关配置。
## 安装
```bash
# Sesame 请使用单独的项目本地环境。
# 本项目固定 transformers==4.52.3,而根目录 ch7 extra 为
# MultilingualReasoning 使用 transformers>=4.55;单一环境无法安全同时满足两者。
# 从仓库根目录开始:
cd chapter8/sesame
python -m venv .venv-sesame
source .venv-sesame/bin/activate
# Windows PowerShell.\.venv-sesame\Scripts\Activate.ps1
# Windows cmd.venv-sesame\Scripts\activate.bat
python -m pip install -r requirements.txt
# Conda 用户可安装 ffmpeg
conda install -c conda-forge ffmpeg
```
请根据本机 CUDA 版本安装匹配的 PyTorch,并确认 FFmpeg 可以正常处理音频。
## 训练
训练脚本加载 Sesame CSM 1B 基础模型和语音数据集,通过 LoRA 进行参数高效微调。运行前请检查模型名称、数据集、输出目录、批量大小和训练轮数。
## 推理
### 单条文本推理
推理脚本支持无上下文生成、使用数据集样本作为声音上下文、仅加载基础模型、自定义说话人 ID、更长生成长度以及 4-bit 量化。
### 批量推理
批量脚本可从 JSON 文件或逐行文本文件读取输入,并为每条文本生成独立音频。
## 参数
常用参数包括模型与适配器路径、输入文本、输出路径、说话人 ID、上下文样本索引、最大生成长度、温度和量化开关。批量模式还支持输入文件、输出目录和失败重试设置。
## 模型信息
CSM 是一类上下文语音模型,可利用文本、说话人标识和参考语音生成具有一致音色的语音。本实验围绕 1B 参数版本进行微调。
## 高级用法
### 使用上下文保持声音一致
可选择训练数据中的音频作为上下文。训练与推理应使用一致的上下文格式和说话人 ID;英文示例使用数据集索引 3。
## 显存需求
实际显存取决于序列长度、上下文音频、批量大小和精度。4-bit 量化可降低推理显存,训练时可使用梯度累积与梯度检查点。
## 故障排查
### 生成期间出现 AssertionError
确保说话人 ID、上下文列表和文本列表的长度及嵌套结构符合模型接口,不要把单个值误传为错误形状的批量输入。
### 显存不足
减小批量大小、上下文长度或最大生成长度,启用量化,并关闭其他占用 GPU 的进程。
## 资源与许可
模型和相关项目链接见英文部分。使用前请核对上游模型、数据集和代码许可。