Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching

В данный форк добавлены исправления для работы с ударениями в русском языке. Любые конструктивные предложения также по доработкам для русского языка приветствуются.

[![python](https://img.shields.io/badge/Python-3.10-brightgreen)](https://github.com/SWivid/F5-TTS)
[![arXiv](https://img.shields.io/badge/arXiv-2410.06885-b31b1b.svg?logo=arXiv)](https://arxiv.org/abs/2410.06885)
[![demo](https://img.shields.io/badge/GitHub-Demo-orange.svg)](https://swivid.github.io/F5-TTS/)
Expand All @@ -24,6 +26,60 @@

## Installation

## Запуск в Google Colab

> ⚠️ **Важно**: Для работы приложения требуется **GPU**.
> После запуска ноутбука в Colab:
> 1. Перейдите в `Runtime` → `Change runtime type`
> 2. Выберите `Hardware accelerator: GPU` (например, `T4` или выше)

### 🔊 Вариант 1: Использование `ruaccent` для ударений

Разработка блокнота временно заморожена.

[![Open In Colab F5-TTS (ruaccent)](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mikhail2013ru/ESPEECH_TTS_INFER/blob/main/notebooks/ESPEECH_TTS_INFER_2.2_ruaccent.ipynb)

👉 Этот ноутбук использует библиотеку `ruaccent` для расстановки ударений.
Модель загружается **один раз**, затем можно генерировать несколько аудио.

### 🔊 Вариант 2: Использование `silero-stress` для ударений

Поддерживается в актуальном состоянии.

[![Open In Colab F5-TTS (silero-stress)](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mikhail2013ru/ESPEECH_TTS_INFER/blob/main/notebooks/ESPEECH_TTS_INFER_2.2_Silero-stress.ipynb)

👉 Этот ноутбук использует библиотеку `silero-stress` для расстановки ударений.
Она **быстрее и точнее** `ruaccent`, но также требует загрузки модели.

---

## 🧰 Что внутри?

- **F5-TTS** — современная модель синтеза речи
- **Gradio** — веб-интерфейс
- **runorm** — нормализация текста
- **ruaccent / silero-stress** — расстановка ударений
- **Whisper** — распознавание референсного аудио (опционально)

---

## 🚀 Как использовать?

1. Нажми на **кнопку "Open in Colab"**.
2. Установи **GPU** в настройках времени выполнения.
3. Запусти ячейки по очереди (`Ctrl+F9` или `Cmd+Enter`).
4. Дождись gradio ссылки (это может занять 2-5 минут).
5. Используй Gradio-интерфейс для синтеза речи.

---

## ⚠️ Ограничения

- Требуется **GPU** (CUDA).
- Модели **занимают много VRAM** (~3-6 ГБ).
- Длительность генерации напрямую зависит от количества знаков в тексте **На colab не рекомендуется озвучивать за раз более 10 тыс. знаков**.


### Create a separate environment if needed

```bash
Expand Down
17 changes: 16 additions & 1 deletion src/f5_tts/model/backbones/dit.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,21 @@ def forward(
if drop_audio_cond: # cfg for cond audio
cond = torch.zeros_like(cond)

# --- FIX START ---
# Force text_embed to match x length (duration) via nearest interpolation.
# This handles cases where text has extra tokens (like '+') that shouldn't affect duration.
if text_embed.shape[1] != x.shape[1]:
text_embed = text_embed.permute(0, 2, 1)
text_embed = F.interpolate(text_embed, size=x.shape[1], mode='nearest')
text_embed = text_embed.permute(0, 2, 1)

# Ensure cond matches x length as well (safety net)
if cond.shape[1] != x.shape[1]:
cond = cond.permute(0, 2, 1)
cond = F.interpolate(cond, size=x.shape[1], mode='nearest')
cond = cond.permute(0, 2, 1)
# --- FIX END ---

x = self.proj(torch.cat((x, cond, text_embed), dim=-1))
x = self.conv_pos_embed(x, mask=audio_mask) + x
return x
Expand Down Expand Up @@ -326,4 +341,4 @@ def forward(
x = self.norm_out(x, t)
output = self.proj_out(x)

return output
return output
19 changes: 15 additions & 4 deletions src/f5_tts/model/cfm.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,20 @@ def sample(
if isinstance(duration, int):
duration = torch.full((batch,), duration, device=device, dtype=torch.long)

duration = torch.maximum(
torch.maximum((text != -1).sum(dim=-1), lens) + 1, duration
) # duration at least text/audio prompt length plus one token, so something is generated
# --- FIX START ---
# Disable automatic forcing of duration based on text length.
# This was causing issues where text with extra symbols ('+') forced audio to be too long.
# We respect the passed 'duration' calculation.

# Original code (commented out):
# duration = torch.maximum(
# torch.maximum((text != -1).sum(dim=-1), lens) + 1, duration
# )

# New code: ensure duration is at least 1 (safety) and clamp max
duration = torch.maximum(duration, torch.ones_like(duration))
# --- FIX END ---

duration = duration.clamp(max=max_duration)
max_duration = duration.amax()

Expand Down Expand Up @@ -299,4 +310,4 @@ def forward(
loss = F.mse_loss(pred, flow, reduction="none")
loss = loss[rand_span_mask]

return loss.mean(), cond, pred
return loss.mean(), cond, pred