Den4ikAI commited on
Commit
2f84a1a
·
verified ·
1 Parent(s): 9c2fc1d

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +168 -0
  2. data.json +467 -0
app.py ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ import json
4
+
5
+ # --- 1. Загрузка и подготовка данных ---
6
+
7
+ def load_data(json_path='data.json'):
8
+ """Загружает данные из JSON и преобразует их в pandas DataFrame."""
9
+ with open(json_path, 'r', encoding='utf-8') as f:
10
+ data = json.load(f)
11
+
12
+ df = pd.DataFrame(data)
13
+
14
+ # --- ИСПРАВЛЕНИЕ: Преобразуем колонку с датой в формат datetime ---
15
+ # dayfirst=True указывает pandas, что в формате ДД/ММ/ГГГГ день идет первым.
16
+ df['test_date'] = pd.to_datetime(df['test_date'], dayfirst=True)
17
+
18
+ return df
19
+
20
+ # --- 2. Логика фильтрации и обновления таблицы ---
21
+
22
+ def update_leaderboard(data_df, filter_type, search_query, show_outdated):
23
+ """Фильтрует DataFrame на основе выбранного типа, поискового запроса и флага устаревших данных."""
24
+
25
+ # Шаг 1: Фильтрация по устаревшим данным
26
+ if not show_outdated:
27
+ # Скрываем модели с пометкой об устаревших данных
28
+ filtered_df = data_df[~data_df['notes'].str.contains('устаревших данных', na=False, case=False)].copy()
29
+ else:
30
+ filtered_df = data_df.copy()
31
+
32
+ # Шаг 2: Фильтрация по типу
33
+ if filter_type == "Только войсклонинг":
34
+ filtered_df = filtered_df[filtered_df['type'] == 'voice_cloning'].copy()
35
+ elif filter_type == "Без войсклонинга":
36
+ filtered_df = filtered_df[filtered_df['type'] == 'single_speaker'].copy()
37
+ # else: "Все модели" - оставляем как есть
38
+
39
+ # Шаг 3: Фильтрация по поисковому запросу
40
+ if search_query:
41
+ query = search_query.lower()
42
+ filtered_df = filtered_df[
43
+ filtered_df['engine'].str.lower().str.contains(query) |
44
+ filtered_df['voice'].str.lower().str.contains(query)
45
+ ]
46
+
47
+ # Шаг 4: Подготовка DataFrame для отображения
48
+
49
+ # --- ИСПРАВЛЕНИЕ: Форматируем дату в 'ГГГГ-ММ-ДД' для корректной сортировки в UI ---
50
+ # Создаем копию, чтобы не изменять оригинальный DataFrame в gr.State
51
+ display_df = filtered_df.copy()
52
+ display_df['test_date'] = display_df['test_date'].dt.strftime('%Y-%m-%d')
53
+
54
+ column_mapping = {
55
+ "engine": "Движок", "voice": "Голос", "test_date": "Дата",
56
+ "hardware": "Железо", "utmos": "UTMOS (↑)", "cer": "CER (↓)",
57
+ "encodec_fad": "FAD (↓)", "similarity_avg": "Похожесть Avg (↑)",
58
+ "xrt_gpu": "xRT GPU (↓)", "xrt_cpu": "xRT CPU (↓)", "notes": "Примечания"
59
+ }
60
+
61
+ display_df = display_df[column_mapping.keys()].rename(columns=column_mapping)
62
+
63
+ return display_df
64
+
65
+
66
+ # --- 3. Создание интерфейса Gradio ---
67
+
68
+ # Загружаем данные один раз при старте приложения
69
+ original_df = load_data()
70
+
71
+ # Сортируем по-умолчанию по дате (самые новые вверху), скрывая устаревшие
72
+ initial_display_df = update_leaderboard(original_df, "Все модели", "", show_outdated=False)
73
+ initial_display_df = initial_display_df.sort_values(by="Дата", ascending=False)
74
+
75
+
76
+ with gr.Blocks(theme=gr.themes.Soft(), css="footer {visibility: hidden}") as demo:
77
+ gr.Markdown("# 🏆 Лидерборд TTS моделей для русского языка")
78
+ gr.Markdown(
79
+ """
80
+ Этот лидерборд предназначен для сравнения различных Text-to-Speech моделей.
81
+
82
+ ### Описание метрик:
83
+ - **UTMOS (↑)**: Оценка качества речи, основанная на мнении слушателей (Mean Opinion Score). **Больше — лучше.**
84
+ - **CER (↓)**: Character Error Rate (коэффициент ошибок по символам). Показывает, насколько часто синтез делает ошибки в произношении. **Меньше — лучше.**
85
+ - **FAD (↓)**: Fréchet Audio Distance. Объективная метрика, измеряющая расстояние между распределениями реального и синтезированного аудио. **Меньше — лучше.**
86
+ - **Похожесть Avg (↑)**: Средняя оценка схожести голоса с оригиналом при клонировании. **Больше — лучше.**
87
+ - **xRT GPU/CPU (↓)**: Real-Time Factor. Во сколько раз синтез быстрее (если < 1) или медленнее (если > 1) реального времени на GPU/CPU. **Меньше — лучше.**
88
+ - **Железо**: Тип оборудования, на котором производился тест (Cloud - облачный сервис, Local GPU/CPU - локальное железо, RTX 4090 - конкретная видеокарта).
89
+
90
+ *Кликните на заголовок колонки для сортировки. По умолчанию отсортировано по дате (сначала новые).*
91
+ """
92
+ )
93
+ gr.Markdown("✉️ Чтобы добавить свою модель, а также вопросы и предложения пишите в Telegram [@bceloss](https://t.me/bceloss)")
94
+ gr.Markdown('✉️ Добавляйтесь в чат "Распознавание и синтез речи" [@speech_recognition_ru](https://t.me/speech_recognition_ru)')
95
+ gr.Markdown('👥 Авторы: Nikolay Shmyrev [@nshmyrev]((https://t.me/nshmyrev)), Denis Petrov [@bceloss](https://t.me/bceloss)')
96
+
97
+
98
+
99
+ with gr.Row():
100
+ with gr.Column(scale=3):
101
+ filter_radio = gr.Radio(
102
+ ["Все модели", "Только войсклонинг", "Без войсклонинга"],
103
+ label="Тип модели",
104
+ value="Все модели"
105
+ )
106
+ with gr.Column(scale=3):
107
+ search_box = gr.Textbox(
108
+ label="Поиск по названию движка или голоса",
109
+ placeholder="Например, Silero, Vosk, Multi..."
110
+ )
111
+ with gr.Column(scale=2):
112
+ show_outdated_checkbox = gr.Checkbox(
113
+ label="Показать модели с устаревшими данными",
114
+ value=False,
115
+ info="⚠️ Данные этих моделей могут быть неточными"
116
+ )
117
+
118
+ # Информационное сообщение о скрытых моделях
119
+ outdated_info = gr.Markdown(visible=False)
120
+
121
+ leaderboard_df = gr.DataFrame(
122
+ value=initial_display_df,
123
+ interactive=True,
124
+ height=700
125
+ )
126
+
127
+ # Используем gr.State для передачи полного DataFrame с правильными типами данных
128
+ df_state = gr.State(original_df)
129
+
130
+ def on_change(filter_type, search_query, show_outdated, data_df):
131
+ """Обновляет таблицу и показывает информацию о скрытых моделях."""
132
+ updated_df = update_leaderboard(data_df, filter_type, search_query, show_outdated)
133
+
134
+ # Подсчитываем количество скрытых моделей с устаревшими данными
135
+ if not show_outdated:
136
+ outdated_count = data_df[data_df['notes'].str.contains('устаревших данных', na=False, case=False)].shape[0]
137
+ if outdated_count > 0:
138
+ info_text = f"ℹ️ **Скрыто моделей с устаревшими данными: {outdated_count}**. Включите опцию выше, чтобы показать их."
139
+ return updated_df, gr.update(value=info_text, visible=True)
140
+
141
+ return updated_df, gr.update(visible=False)
142
+
143
+ # Связываем все элементы управления с функцией обновления
144
+ filter_radio.change(
145
+ fn=on_change,
146
+ inputs=[filter_radio, search_box, show_outdated_checkbox, df_state],
147
+ outputs=[leaderboard_df, outdated_info]
148
+ )
149
+ search_box.change(
150
+ fn=on_change,
151
+ inputs=[filter_radio, search_box, show_outdated_checkbox, df_state],
152
+ outputs=[leaderboard_df, outdated_info]
153
+ )
154
+ show_outdated_checkbox.change(
155
+ fn=on_change,
156
+ inputs=[filter_radio, search_box, show_outdated_checkbox, df_state],
157
+ outputs=[leaderboard_df, outdated_info]
158
+ )
159
+
160
+ # Показываем информацию о скрытых моделях при загрузке
161
+ demo.load(
162
+ fn=lambda: f"ℹ️ **Скрыто моделей с устаревшими данными: {original_df[original_df['notes'].str.contains('устаревших данных', na=False, case=False)].shape[0]}**. Включите опцию выше, чтобы показать их.",
163
+ outputs=outdated_info
164
+ )
165
+
166
+ # --- 4. Запуск приложения ---
167
+ if __name__ == "__main__":
168
+ demo.launch()
data.json ADDED
@@ -0,0 +1,467 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "engine": "Silero v3_1",
4
+ "voice": "Aidar",
5
+ "test_date": "21/06/2024",
6
+ "type": "single_speaker",
7
+ "cer": 0.7,
8
+ "xrt_gpu": 0.0177,
9
+ "xrt_cpu": 0.1256,
10
+ "utmos": 2.544,
11
+ "similarity_avg": null,
12
+ "similarity_min": null,
13
+ "encodec_fad": 97.36,
14
+ "hardware": "Local GPU",
15
+ "notes": ""
16
+ },
17
+ {
18
+ "engine": "Silero v3_1",
19
+ "voice": "Baya",
20
+ "test_date": "21/06/2024",
21
+ "type": "single_speaker",
22
+ "cer": 0.7,
23
+ "xrt_gpu": 0.0177,
24
+ "xrt_cpu": 0.1256,
25
+ "utmos": 2.978,
26
+ "similarity_avg": null,
27
+ "similarity_min": null,
28
+ "encodec_fad": 170.53,
29
+ "hardware": "Local GPU",
30
+ "notes": ""
31
+ },
32
+ {
33
+ "engine": "Silero 4",
34
+ "voice": "Aidar",
35
+ "test_date": "21/06/2024",
36
+ "type": "single_speaker",
37
+ "cer": 1.0,
38
+ "xrt_gpu": 0.0149,
39
+ "xrt_cpu": 0.0544,
40
+ "utmos": 1.755,
41
+ "similarity_avg": null,
42
+ "similarity_min": null,
43
+ "encodec_fad": 79.33,
44
+ "hardware": "Local GPU",
45
+ "notes": ""
46
+ },
47
+ {
48
+ "engine": "Silero 4",
49
+ "voice": "Baya",
50
+ "test_date": "21/06/2024",
51
+ "type": "single_speaker",
52
+ "cer": 0.9,
53
+ "xrt_gpu": 0.0149,
54
+ "xrt_cpu": 0.0544,
55
+ "utmos": 2.144,
56
+ "similarity_avg": null,
57
+ "similarity_min": null,
58
+ "encodec_fad": 118.63,
59
+ "hardware": "Local GPU",
60
+ "notes": ""
61
+ },
62
+ {
63
+ "engine": "Vosk-TTS 0.9",
64
+ "voice": "Multi",
65
+ "test_date": "12/06/2025",
66
+ "type": "multi_speaker",
67
+ "cer": 0.6,
68
+ "xrt_gpu": 0.07,
69
+ "xrt_cpu": 0.3,
70
+ "utmos": 3.29,
71
+ "similarity_avg": 0.875,
72
+ "similarity_min": 0.600,
73
+ "encodec_fad": 0.81,
74
+ "hardware": "Local GPU",
75
+ "notes": ""
76
+ },
77
+ {
78
+ "engine": "TeraTTS",
79
+ "voice": "Natasha",
80
+ "test_date": "21/06/2024",
81
+ "type": "single_speaker",
82
+ "cer": 1.6,
83
+ "xrt_gpu": null,
84
+ "xrt_cpu": 0.1945,
85
+ "utmos": 3.281,
86
+ "similarity_avg": null,
87
+ "similarity_min": null,
88
+ "encodec_fad": 70.10,
89
+ "hardware": "Local CPU",
90
+ "notes": ""
91
+ },
92
+ {
93
+ "engine": "UtrobinTTS",
94
+ "voice": "Male",
95
+ "test_date": "21/06/2024",
96
+ "type": "single_speaker",
97
+ "cer": 2.1,
98
+ "xrt_gpu": 0.0265,
99
+ "xrt_cpu": 0.1323,
100
+ "utmos": 3.186,
101
+ "similarity_avg": null,
102
+ "similarity_min": null,
103
+ "encodec_fad": 46.14,
104
+ "hardware": "Local GPU",
105
+ "notes": ""
106
+ },
107
+ {
108
+ "engine": "XTTS2",
109
+ "voice": "Multi",
110
+ "test_date": "21/06/2024",
111
+ "type": "voice_cloning",
112
+ "cer": 2.7,
113
+ "xrt_gpu": 0.3458,
114
+ "xrt_cpu": null,
115
+ "utmos": 3.035,
116
+ "similarity_avg": 0.762,
117
+ "similarity_min": 0.468,
118
+ "encodec_fad": 5.42,
119
+ "hardware": "Local GPU",
120
+ "notes": "Сравнение проводилось на устаревших данных. Данные не верны!"
121
+ },
122
+ {
123
+ "engine": "Vosk-TTS GPT",
124
+ "voice": "Multi",
125
+ "test_date": "21/06/2024",
126
+ "type": "voice_cloning",
127
+ "cer": 2.1,
128
+ "xrt_gpu": 0.2690,
129
+ "xrt_cpu": null,
130
+ "utmos": 3.381,
131
+ "similarity_avg": 0.814,
132
+ "similarity_min": 0.544,
133
+ "encodec_fad": 5.89,
134
+ "hardware": "Local GPU",
135
+ "notes": "Сравнение проводилось на устаревших данных. Данные не верны!"
136
+ },
137
+ {
138
+ "engine": "Piper",
139
+ "voice": "Irina",
140
+ "test_date": "21/06/2024",
141
+ "type": "single_speaker",
142
+ "cer": 1.4,
143
+ "xrt_gpu": null,
144
+ "xrt_cpu": 0.045,
145
+ "utmos": 3.672,
146
+ "similarity_avg": null,
147
+ "similarity_min": null,
148
+ "encodec_fad": 74.98,
149
+ "hardware": "Local CPU",
150
+ "notes": ""
151
+ },
152
+ {
153
+ "engine": "Piper",
154
+ "voice": "Ruslan",
155
+ "test_date": "21/06/2024",
156
+ "type": "single_speaker",
157
+ "cer": 3.0,
158
+ "xrt_gpu": null,
159
+ "xrt_cpu": 0.045,
160
+ "utmos": 2.975,
161
+ "similarity_avg": null,
162
+ "similarity_min": null,
163
+ "encodec_fad": 72.22,
164
+ "hardware": "Local CPU",
165
+ "notes": ""
166
+ },
167
+ {
168
+ "engine": "BeneGes",
169
+ "voice": "Ruslan",
170
+ "test_date": "21/06/2024",
171
+ "type": "single_speaker",
172
+ "cer": 2.4,
173
+ "xrt_gpu": null,
174
+ "xrt_cpu": 0.321,
175
+ "utmos": 2.537,
176
+ "similarity_avg": null,
177
+ "similarity_min": null,
178
+ "encodec_fad": 63.02,
179
+ "hardware": "Local CPU",
180
+ "notes": ""
181
+ },
182
+ {
183
+ "engine": "Tortoise Ruslan",
184
+ "voice": "Multi",
185
+ "test_date": "21/06/2024",
186
+ "type": "voice_cloning",
187
+ "cer": 6.2,
188
+ "xrt_gpu": 25.03,
189
+ "xrt_cpu": null,
190
+ "utmos": 2.893,
191
+ "similarity_avg": 0.660,
192
+ "similarity_min": 0.483,
193
+ "encodec_fad": 14.21,
194
+ "hardware": "Local GPU",
195
+ "notes": "Сравнение проводилось на устаревших данных. Данные не верны!"
196
+ },
197
+ {
198
+ "engine": "Bark Small",
199
+ "voice": "Ru_4",
200
+ "test_date": "21/06/2024",
201
+ "type": "single_speaker",
202
+ "cer": 10.3,
203
+ "xrt_gpu": 1.201,
204
+ "xrt_cpu": null,
205
+ "utmos": 2.554,
206
+ "similarity_avg": null,
207
+ "similarity_min": null,
208
+ "encodec_fad": 61.71,
209
+ "hardware": "Local GPU",
210
+ "notes": ""
211
+ },
212
+ {
213
+ "engine": "EdgeTTS",
214
+ "voice": "Dmitry",
215
+ "test_date": "21/06/2024",
216
+ "type": "single_speaker",
217
+ "cer": 0.7,
218
+ "xrt_gpu": null,
219
+ "xrt_cpu": 0.076,
220
+ "utmos": 3.565,
221
+ "similarity_avg": null,
222
+ "similarity_min": null,
223
+ "encodec_fad": 32.69,
224
+ "hardware": "Cloud",
225
+ "notes": "cloud"
226
+ },
227
+ {
228
+ "engine": "EdgeTTS",
229
+ "voice": "Svetlana",
230
+ "test_date": "21/06/2024",
231
+ "type": "single_speaker",
232
+ "cer": 0.7,
233
+ "xrt_gpu": null,
234
+ "xrt_cpu": 0.076,
235
+ "utmos": 3.513,
236
+ "similarity_avg": null,
237
+ "similarity_min": null,
238
+ "encodec_fad": 30.60,
239
+ "hardware": "Cloud",
240
+ "notes": "cloud"
241
+ },
242
+ {
243
+ "engine": "Yandex",
244
+ "voice": "Alexander",
245
+ "test_date": "21/06/2024",
246
+ "type": "single_speaker",
247
+ "cer": 0.6,
248
+ "xrt_gpu": null,
249
+ "xrt_cpu": 0.028,
250
+ "utmos": 3.413,
251
+ "similarity_avg": null,
252
+ "similarity_min": null,
253
+ "encodec_fad": 54.10,
254
+ "hardware": "Cloud",
255
+ "notes": "cloud"
256
+ },
257
+ {
258
+ "engine": "Yandex",
259
+ "voice": "Marina",
260
+ "test_date": "21/06/2024",
261
+ "type": "single_speaker",
262
+ "cer": 0.6,
263
+ "xrt_gpu": null,
264
+ "xrt_cpu": 0.028,
265
+ "utmos": 3.482,
266
+ "similarity_avg": null,
267
+ "similarity_min": null,
268
+ "encodec_fad": 26.23,
269
+ "hardware": "Cloud",
270
+ "notes": "cloud"
271
+ },
272
+ {
273
+ "engine": "Sber",
274
+ "voice": "Boris 24",
275
+ "test_date": "03/11/2024",
276
+ "type": "single_speaker",
277
+ "cer": 0.7,
278
+ "xrt_gpu": null,
279
+ "xrt_cpu": 0.31,
280
+ "utmos": 3.747,
281
+ "similarity_avg": null,
282
+ "similarity_min": null,
283
+ "encodec_fad": 26.21,
284
+ "hardware": "Cloud",
285
+ "notes": "cloud"
286
+ },
287
+ {
288
+ "engine": "Sber",
289
+ "voice": "Alexandra 24",
290
+ "test_date": "03/11/2024",
291
+ "type": "single_speaker",
292
+ "cer": 0.8,
293
+ "xrt_gpu": null,
294
+ "xrt_cpu": 0.30,
295
+ "utmos": 3.196,
296
+ "similarity_avg": null,
297
+ "similarity_min": null,
298
+ "encodec_fad": 32.04,
299
+ "hardware": "Cloud",
300
+ "notes": "cloud"
301
+ },
302
+ {
303
+ "engine": "FishSpeech 1.5",
304
+ "voice": "Multi",
305
+ "test_date": "07/08/2025",
306
+ "type": "voice_cloning",
307
+ "cer": 1.5,
308
+ "xrt_gpu": 1.7,
309
+ "xrt_cpu": null,
310
+ "utmos": 3.183,
311
+ "similarity_avg": 0.757,
312
+ "similarity_min": 0.535,
313
+ "encodec_fad": 2.37,
314
+ "hardware": "Local GPU",
315
+ "notes": ""
316
+ },
317
+ {
318
+ "engine": "Tinkoff",
319
+ "voice": "Alyona",
320
+ "test_date": "14/12/2024",
321
+ "type": "single_speaker",
322
+ "cer": 0.7,
323
+ "xrt_gpu": null,
324
+ "xrt_cpu": 0.16,
325
+ "utmos": 3.634,
326
+ "similarity_avg": null,
327
+ "similarity_min": null,
328
+ "encodec_fad": 172.9,
329
+ "hardware": "Cloud",
330
+ "notes": "cloud"
331
+ },
332
+ {
333
+ "engine": "Tinkoff",
334
+ "voice": "Dima",
335
+ "test_date": "20/03/2025",
336
+ "type": "single_speaker",
337
+ "cer": 0.8,
338
+ "xrt_gpu": null,
339
+ "xrt_cpu": 0.16,
340
+ "utmos": 3.568,
341
+ "similarity_avg": null,
342
+ "similarity_min": null,
343
+ "encodec_fad": 129.2,
344
+ "hardware": "Cloud",
345
+ "notes": "cloud"
346
+ },
347
+ {
348
+ "engine": "Tinkoff",
349
+ "voice": "Anna",
350
+ "test_date": "20/03/2025",
351
+ "type": "single_speaker",
352
+ "cer": 0.8,
353
+ "xrt_gpu": null,
354
+ "xrt_cpu": 0.16,
355
+ "utmos": 2.919,
356
+ "similarity_avg": null,
357
+ "similarity_min": null,
358
+ "encodec_fad": 120.5,
359
+ "hardware": "Cloud",
360
+ "notes": "cloud"
361
+ },
362
+ {
363
+ "engine": "F5-TTS Misha V2",
364
+ "voice": "Multi",
365
+ "test_date": "07/08/2025",
366
+ "type": "voice_cloning",
367
+ "cer": 2.4,
368
+ "xrt_gpu": 1.37,
369
+ "xrt_cpu": null,
370
+ "utmos": 3.157,
371
+ "similarity_avg": 0.821,
372
+ "similarity_min": null,
373
+ "encodec_fad": 1.9,
374
+ "hardware": "Local GPU",
375
+ "notes": ""
376
+ },
377
+ {
378
+ "engine": "ESpeech-TTS-1 [RL] V2",
379
+ "voice": "Multi",
380
+ "test_date": "17/08/2025",
381
+ "type": "voice_cloning",
382
+ "cer": 2.3,
383
+ "xrt_gpu": 0.19,
384
+ "xrt_cpu": null,
385
+ "utmos": 3.289,
386
+ "similarity_avg": 0.826,
387
+ "similarity_min": null,
388
+ "encodec_fad": 2.89,
389
+ "hardware": "RTX 4090",
390
+ "notes": ""
391
+ },
392
+ {
393
+ "engine": "ESpeech-TTS-1 [SFT] 265K",
394
+ "voice": "Multi",
395
+ "test_date": "17/08/2025",
396
+ "type": "voice_cloning",
397
+ "cer": 2.9,
398
+ "xrt_gpu": 0.19,
399
+ "xrt_cpu": null,
400
+ "utmos": 3.136,
401
+ "similarity_avg": 0.827,
402
+ "similarity_min": null,
403
+ "encodec_fad": 2.66,
404
+ "hardware": "RTX 4090",
405
+ "notes": ""
406
+ },
407
+ {
408
+ "engine": "ESpeech-TTS-1 [RL] V1",
409
+ "voice": "Multi",
410
+ "test_date": "17/08/2025",
411
+ "type": "voice_cloning",
412
+ "cer": 2.3,
413
+ "xrt_gpu": 0.19,
414
+ "xrt_cpu": null,
415
+ "utmos": 3.239,
416
+ "similarity_avg": 0.828,
417
+ "similarity_min": null,
418
+ "encodec_fad": 2.54,
419
+ "hardware": "RTX 4090",
420
+ "notes": ""
421
+ },
422
+ {
423
+ "engine": "ESpeech-TTS-1 [SFT] 95K",
424
+ "voice": "Multi",
425
+ "test_date": "17/08/2025",
426
+ "type": "voice_cloning",
427
+ "cer": 1.6,
428
+ "xrt_gpu": 0.19,
429
+ "xrt_cpu": null,
430
+ "utmos": 3.198,
431
+ "similarity_avg": 0.830,
432
+ "similarity_min": null,
433
+ "encodec_fad": 3.06,
434
+ "hardware": "RTX 4090",
435
+ "notes": ""
436
+ },
437
+ {
438
+ "engine": "ESpeech-TTS-1 PODCASTER [SFT]",
439
+ "voice": "Multi",
440
+ "test_date": "18/08/2025",
441
+ "type": "voice_cloning",
442
+ "cer": 1.3,
443
+ "xrt_gpu": 0.19,
444
+ "xrt_cpu": null,
445
+ "utmos": 3.203,
446
+ "similarity_avg": 0.833,
447
+ "similarity_min": null,
448
+ "encodec_fad": 3.06,
449
+ "hardware": "RTX 4090",
450
+ "notes": "Trained ONLY Podcasts"
451
+ },
452
+ {
453
+ "engine": "ElevenLabs Multilingual V2",
454
+ "voice": "Multi",
455
+ "test_date": "17/08/2025",
456
+ "type": "voice_cloning",
457
+ "cer": 1.2,
458
+ "xrt_gpu": null,
459
+ "xrt_cpu": null,
460
+ "utmos": 3.309,
461
+ "similarity_avg": 0.780,
462
+ "similarity_min": null,
463
+ "encodec_fad": 3.05,
464
+ "hardware": "Cloud",
465
+ "notes": "cloud"
466
+ }
467
+ ]