recycleactor commited on
Commit
18cc23b
·
verified ·
1 Parent(s): dd79a9b

Upload 2 files

Browse files
Files changed (2) hide show
  1. README.md +20 -7
  2. tts-space-app.py +84 -0
README.md CHANGED
@@ -1,13 +1,26 @@
1
  ---
2
- title: Tts
3
- emoji: 🦀
4
- colorFrom: blue
5
- colorTo: red
6
  sdk: gradio
7
- sdk_version: 6.25.0
8
- python_version: '3.12'
9
  app_file: app.py
10
  pinned: false
 
 
11
  ---
12
 
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: F5 TTS RU Bot Voice
3
+ emoji: 🗣
4
+ colorFrom: indigo
5
+ colorTo: purple
6
  sdk: gradio
7
+ sdk_version: 5.8.0
 
8
  app_file: app.py
9
  pinned: false
10
+ license: cc-by-nc-4.0
11
+ short_description: Озвучка ответов Telegram-бота через F5-TTS_RUSSIAN
12
  ---
13
 
14
+ Внутренний Space для озвучки ответов бота — обёртка над
15
+ [Misha24-10/F5-TTS_RUSSIAN](https://huggingface.co/Misha24-10/F5-TTS_RUSSIAN).
16
+ Публичный интерфейс не нужен, дёргается ботом через `@gradio/client` по
17
+ эндпоинту `/tts` (см. app.py).
18
+
19
+ Файлы рядом с этим README:
20
+ - `app.py` — сама модель и Gradio-интерфейс
21
+ - `requirements.txt` — `f5-tts`, `gradio`, `soundfile`, `spaces`
22
+ - `ref_voice.wav` — референсный голос для клонирования (5-15 сек чистой
23
+ речи, без музыки/шума)
24
+
25
+ license — `cc-by-nc-4.0`, т.к. веса Misha24-10/F5-TTS_RUSSIAN идут под
26
+ этой же лицензией (некоммерческое использование).
tts-space-app.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ==== F5-TTS_RUSSIAN — свой минимальный Gradio Space, по образу GigaAM ====
2
+ #
3
+ # Деплой (как GigaAM):
4
+ # 1. huggingface.co -> New Space -> SDK: Gradio -> Hardware: ZeroGPU
5
+ # (бесплатно, но с очередью и лимитом времени на вызов — для одной
6
+ # реплики этого достаточно; если не подойдёт, платный T4 small).
7
+ # 2. Положить рядом с этим файлом:
8
+ # - requirements.txt (см. ниже)
9
+ # - ref_voice.wav — 5-15 секунд ЧИСТОЙ речи голосом, которым должен
10
+ # говорить бот (без музыки/шума на фоне, лучше строгая, ровная
11
+ # дикция — F5-TTS клонирует именно тембр и манеру произношения)
12
+ # - переписать REF_TEXT ниже на ТОЧНУЮ дословную расшифровку того, что
13
+ # реально сказано на ref_voice.wav (лишний/неточный текст — главная
14
+ # причина кривых результатов у F5-TTS)
15
+ # 3. Закоммитить (через веб-интерфейс Space или git push) — Space сам
16
+ # соберётся и на первый вызов подтянет веса модели с HF (holodный
17
+ # старт может занять пару минут — это нормально).
18
+ # 4. В переменных окружения бота на Render задать:
19
+ # TTS_SPACE=твой-юзернейм/имя-space
20
+ #
21
+ # requirements.txt:
22
+ # f5-tts
23
+ # gradio
24
+ # soundfile
25
+ # spaces
26
+
27
+ import os
28
+ import tempfile
29
+
30
+ import gradio as gr
31
+ import soundfile as sf
32
+ import spaces
33
+ from f5_tts.api import F5TTS
34
+
35
+ # ---- Модель ----
36
+ # F5TTS_v1_Base_v2 — самый свежий из выложенных чекпоинтов Misha24-10 на
37
+ # момент написания; если на HF появится более новый (проверить
38
+ # huggingface.co/Misha24-10/F5-TTS_RUSSIAN) — можно смело поменять здесь.
39
+ REPO = "Misha24-10/F5-TTS_RUSSIAN"
40
+ CKPT_SUBPATH = "F5TTS_v1_Base_v2/model_last_inference.safetensors"
41
+ VOCAB_SUBPATH = "F5TTS_v1_Base_v2/vocab.txt"
42
+
43
+ from huggingface_hub import hf_hub_download
44
+
45
+ ckpt_path = hf_hub_download(REPO, CKPT_SUBPATH)
46
+ vocab_path = hf_hub_download(REPO, VOCAB_SUBPATH)
47
+
48
+ tts = F5TTS(
49
+ model="F5TTS_v1_Base",
50
+ ckpt_file=ckpt_path,
51
+ vocab_file=vocab_path,
52
+ )
53
+
54
+ # ---- Референсный голос ----
55
+ REF_AUDIO = os.path.join(os.path.dirname(__file__), "ref_voice.wav")
56
+ # !!! ОБЯЗАТЕЛЬНО заменить на точный текст, реально сказанный в ref_voice.wav
57
+ REF_TEXT = "текст, который дословно произносится на референсном аудио"
58
+
59
+
60
+ @spaces.GPU(duration=60)
61
+ def tts_infer(text: str) -> str:
62
+ if not text or not text.strip():
63
+ raise gr.Error("пустой текст")
64
+
65
+ wav, sr, _ = tts.infer(
66
+ ref_file=REF_AUDIO,
67
+ ref_text=REF_TEXT,
68
+ gen_text=text.strip(),
69
+ )
70
+
71
+ out_path = tempfile.mktemp(suffix=".wav")
72
+ sf.write(out_path, wav, sr)
73
+ return out_path
74
+
75
+
76
+ demo = gr.Interface(
77
+ fn=tts_infer,
78
+ inputs=gr.Textbox(label="Текст"),
79
+ outputs=gr.Audio(type="filepath", label="Озвучка"),
80
+ api_name="tts", # именно этот путь бот дёргает как "/tts" через @gradio/client
81
+ title="F5-TTS_RUSSIAN — озвучка для бота",
82
+ )
83
+
84
+ demo.queue().launch()