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 LoRAinference.py- Single inference script for generating speech from textbatch_inference.py- Batch inference script for processing multiple textsexample_inputs.json- Example input file for batch inferencerequirements.txt- Python dependencies
Installation¶
# 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 chapter7/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:
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:
# 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:
# 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:
[
{
"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):
[
{
"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 (e.g., MrDragonFox/Elise). Indices 3 and 4 are used in the training script examples.
Plain text format (one sentence per line, no context support):
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: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):
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="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:
# ❌ 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-4bitflag - Reduce
max_new_tokens - Process texts one at a time instead of batching
- Use a smaller batch size during training
Resources¶
License¶
This project uses the Unsloth library and Sesame CSM model. Please refer to their respective licenses.
中文¶
Sesame CSM(1B)TTS:文本转语音微调¶
文件¶
项目包含训练脚本、单条推理脚本、批量推理脚本、依赖文件以及数据处理相关配置。
安装¶
# Sesame 请使用单独的项目本地环境。
# 本项目固定 transformers==4.52.3,而根目录 ch7 extra 为
# MultilingualReasoning 使用 transformers>=4.55;单一环境无法安全同时满足两者。
# 从仓库根目录开始:
cd chapter7/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 的进程。
资源与许可¶
模型和相关项目链接见英文部分。使用前请核对上游模型、数据集和代码许可。