elmadany commited on
Commit
4a7e467
·
verified ·
1 Parent(s): e31c354

Update public/index.html

Browse files
Files changed (1) hide show
  1. public/index.html +43 -16
public/index.html CHANGED
@@ -69,14 +69,31 @@
69
  .hero-actions { display: flex; gap: 15px; flex-wrap: wrap; justify-content: center; }
70
  .action-btn { display: flex; align-items: center; gap: 8px; padding: 12px 24px; border-radius: 30px; color: white; font-weight: 600; font-size: 15px; transition: transform 0.2s; }
71
  .action-btn:hover { transform: translateY(-3px); color: white; }
72
- .bg-red { background: var(--grad-red); } .bg-purple { background: var(--grad-purple); }
 
 
 
 
73
 
74
- /* Wave Background (Subtle Gradient only) */
75
  .wave-bg {
76
  position: absolute; top: -50px; left: -50%; width: 200%; height: 100%;
77
  background: radial-gradient(circle, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0) 70%);
78
  z-index: 0; pointer-events: none;
79
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
80
 
81
  /* --- WIDTH CONTROLLER --- */
82
  .content-container { width: 80%; max-width: 1600px; margin: 0 auto; }
@@ -93,6 +110,7 @@
93
 
94
  .controls { background: #f8fafc; padding: 20px; border-radius: 12px; display: flex; gap: 20px; align-items: center; margin-bottom: 20px; flex-wrap: wrap; }
95
  select { padding: 10px; border-radius: 8px; border: 1px solid #cbd5e1; font-size: 14px; min-width: 250px; cursor:pointer; }
 
96
  .rank-info { font-size: 13px; color: #64748b; margin-top: 5px; font-style: italic; }
97
  .score-desc { font-size: 14px; color: #475569; background: #fff7ed; border-left: 4px solid #f97316; padding: 10px 15px; margin-bottom: 20px; border-radius: 4px; }
98
 
@@ -119,6 +137,7 @@
119
 
120
  .arrow-down { color: #d97706; font-size: 10px; }
121
  .arrow-up { color: #16a34a; font-size: 10px; }
 
122
  </style>
123
  </head>
124
  <body>
@@ -129,7 +148,6 @@
129
  <div class="nav-text"><span>Voice of a</span> Continent</div>
130
  </a>
131
  <div class="nav-links">
132
- <a href="https://aclanthology.org/2025.emnlp-main.559" target="_blank" class="nav-link">Paper</a>
133
  <a href="https://africa.dlnlp.ai/simba/" target="_blank" class="btn-submit">Submit New Results</a>
134
  </div>
135
  </nav>
@@ -142,10 +160,23 @@
142
  <h2>Mapping Africa’s Speech Technology</h2>
143
  <p>SimbaBench bridges the digital divide with a unified suite for African AI: the largest open-source speech benchmark covering 61 languages.</p>
144
  <div class="hero-actions">
145
- <a href="https://aclanthology.org/2025.emnlp-main.559" target="_blank" class="action-btn bg-red"><i class="fa-regular fa-file-pdf"></i> Read Paper</a>
146
- <a href="https://africa.dlnlp.ai/simba" target="_blank" class="action-btn bg-purple"><i class="fa-solid fa-code-branch"></i> Official Website</a>
 
 
 
 
 
 
 
 
 
 
147
  </div>
148
  </div>
 
 
 
149
  </div>
150
 
151
  <div class="content-container layout-width">
@@ -267,6 +298,8 @@
267
  const allLangs = new Set();
268
  Object.values(DATA.asr.by_model).forEach(rows => rows.forEach(r => allLangs.add(r.Language)));
269
  Object.values(DATA.tts).forEach(rows => rows.forEach(r => allLangs.add(r.language)));
 
 
270
  populate('lang-select', Array.from(allLangs).sort());
271
 
272
  renderASR(); renderTTS(); renderSLID();
@@ -303,23 +336,19 @@
303
  if(n>0) modelStats.push({ name: modName, wer: sW/n, cer: sC/n });
304
  });
305
 
306
- modelStats.sort((a,b) => (a.wer - b.wer) || (a.cer - b.cer)); // Sorting by WER then CER
307
 
308
  html = `<table><thead><tr><th>Model</th><th>Simba ASR Score (WER/CER) <i class="fa-solid fa-arrow-down arrow-down"></i></th></tr></thead><tbody>`;
309
 
310
- // Tie-Aware Ranking Logic
311
  let currentRank = 1;
312
  modelStats.forEach((m, i) => {
313
  if (i > 0) {
314
  const prev = modelStats[i-1];
315
- if (Math.abs(m.wer - prev.wer) > 0.001) {
316
- currentRank = i + 1;
317
- }
318
  } else {
319
  currentRank = 1;
320
  }
321
  m.rank = currentRank;
322
-
323
  let icon = '';
324
  if(m.rank === 1) icon = '🥇 '; else if(m.rank === 2) icon = '🥈 '; else if(m.rank === 3) icon = '🥉 ';
325
 
@@ -335,7 +364,6 @@
335
 
336
  const d = DATA.asr.by_family[val];
337
  if(!d) return;
338
-
339
  d.data.sort((a,b) => a.Avg_WER - b.Avg_WER);
340
 
341
  html = `<table><thead><tr><th>Model</th><th>Simba ASR Family Score <i class="fa-solid fa-arrow-down arrow-down"></i></th>`;
@@ -351,7 +379,6 @@
351
  currentRank = 1;
352
  }
353
  r.rank = currentRank;
354
-
355
  let icon = '';
356
  if(r.rank === 1) icon = '🥇 '; else if(r.rank === 2) icon = '🥈 '; else if(r.rank === 3) icon = '🥉 ';
357
 
@@ -433,7 +460,7 @@
433
  asrRows.sort((a,b) => (a.wer - b.wer) || (a.cer - b.cer));
434
 
435
  let h1 = `<table><thead><tr><th>Model</th><th>WER <i class="fa-solid fa-arrow-down arrow-down"></i></th><th>CER <i class="fa-solid fa-arrow-down arrow-down"></i></th></tr></thead><tbody>`;
436
- if(asrRows.length === 0) h1 += `<tr><td colspan="3">No ASR data for this language.</td></tr>`;
437
  else {
438
  let currentRank = 1;
439
  asrRows.forEach((r, i) => {
@@ -473,7 +500,7 @@
473
  </tr>`;
474
  }
475
  });
476
- if(!ttsFound) h2 += `<tr><td colspan="9">No TTS data.</td></tr>`;
477
  h2 += `</tbody></table>`;
478
  document.getElementById('lang-tts-table').innerHTML = h2;
479
 
@@ -503,7 +530,7 @@
503
  h3 += `<tr><td style="font-weight:600;">${icon}${sc.n}</td><td>${fmt(sc.v)}</td></tr>`;
504
  });
505
  } else {
506
- h3 += `<tr><td colspan="2">No SLID data.</td></tr>`;
507
  }
508
  h3 += `</tbody></table>`;
509
  document.getElementById('lang-slid-table').innerHTML = h3;
 
69
  .hero-actions { display: flex; gap: 15px; flex-wrap: wrap; justify-content: center; }
70
  .action-btn { display: flex; align-items: center; gap: 8px; padding: 12px 24px; border-radius: 30px; color: white; font-weight: 600; font-size: 15px; transition: transform 0.2s; }
71
  .action-btn:hover { transform: translateY(-3px); color: white; }
72
+ .bg-red { background: var(--grad-red); }
73
+ .bg-purple { background: var(--grad-purple); }
74
+ .bg-orange { background: var(--grad-orange); }
75
+ .bg-blue { background: var(--grad-blue); }
76
+ .bg-green { background: var(--grad-green); }
77
 
78
+ /* Wave Animation */
79
  .wave-bg {
80
  position: absolute; top: -50px; left: -50%; width: 200%; height: 100%;
81
  background: radial-gradient(circle, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0) 70%);
82
  z-index: 0; pointer-events: none;
83
  }
84
+
85
+ .audio-wave {
86
+ height: 150px;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ gap: 6px;
91
+ margin-top: 60px; /* Space above wave */
92
+ mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);
93
+ }
94
+ .bar { width: 6px; background: #ffffff; border-radius: 99px; animation: bounce 1.2s ease-in-out infinite; }
95
+ .bar:nth-child(odd) { animation-duration: 1.5s; } .bar:nth-child(2n) { animation-duration: 1.1s; }
96
+ @keyframes bounce { 0%, 100% { height: 20px; } 50% { height: 120px; } }
97
 
98
  /* --- WIDTH CONTROLLER --- */
99
  .content-container { width: 80%; max-width: 1600px; margin: 0 auto; }
 
110
 
111
  .controls { background: #f8fafc; padding: 20px; border-radius: 12px; display: flex; gap: 20px; align-items: center; margin-bottom: 20px; flex-wrap: wrap; }
112
  select { padding: 10px; border-radius: 8px; border: 1px solid #cbd5e1; font-size: 14px; min-width: 250px; cursor:pointer; }
113
+
114
  .rank-info { font-size: 13px; color: #64748b; margin-top: 5px; font-style: italic; }
115
  .score-desc { font-size: 14px; color: #475569; background: #fff7ed; border-left: 4px solid #f97316; padding: 10px 15px; margin-bottom: 20px; border-radius: 4px; }
116
 
 
137
 
138
  .arrow-down { color: #d97706; font-size: 10px; }
139
  .arrow-up { color: #16a34a; font-size: 10px; }
140
+ .empty-msg { color: #64748b; font-style: italic; padding: 20px; text-align: center; }
141
  </style>
142
  </head>
143
  <body>
 
148
  <div class="nav-text"><span>Voice of a</span> Continent</div>
149
  </a>
150
  <div class="nav-links">
 
151
  <a href="https://africa.dlnlp.ai/simba/" target="_blank" class="btn-submit">Submit New Results</a>
152
  </div>
153
  </nav>
 
160
  <h2>Mapping Africa’s Speech Technology</h2>
161
  <p>SimbaBench bridges the digital divide with a unified suite for African AI: the largest open-source speech benchmark covering 61 languages.</p>
162
  <div class="hero-actions">
163
+ <a href="https://aclanthology.org/2025.emnlp-main.559" target="_blank" class="action-btn bg-red">
164
+ <i class="fa-regular fa-file-pdf"></i> Read Paper
165
+ </a>
166
+ <a href="https://github.com/UBC-NLP/simba" target="_blank" class="action-btn bg-purple">
167
+ <i class="fa-solid fa-code-branch"></i> Pipeline
168
+ </a>
169
+ <a href="https://huggingface.co/datasets/UBC-NLP/simba" target="_blank" class="action-btn bg-orange">
170
+ <i class="fa-solid fa-database"></i> Dataset
171
+ </a>
172
+ <a href="https://africa.dlnlp.ai/simba/#models" target="_blank" class="action-btn bg-blue">
173
+ <i class="fa-solid fa-bolt"></i> Models
174
+ </a>
175
  </div>
176
  </div>
177
+ <div class="audio-wave">
178
+ <div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div>
179
+ </div>
180
  </div>
181
 
182
  <div class="content-container layout-width">
 
298
  const allLangs = new Set();
299
  Object.values(DATA.asr.by_model).forEach(rows => rows.forEach(r => allLangs.add(r.Language)));
300
  Object.values(DATA.tts).forEach(rows => rows.forEach(r => allLangs.add(r.language)));
301
+ if(DATA.slid) DATA.slid.forEach(r => allLangs.add(r.Language));
302
+
303
  populate('lang-select', Array.from(allLangs).sort());
304
 
305
  renderASR(); renderTTS(); renderSLID();
 
336
  if(n>0) modelStats.push({ name: modName, wer: sW/n, cer: sC/n });
337
  });
338
 
339
+ modelStats.sort((a,b) => (a.wer - b.wer) || (a.cer - b.cer));
340
 
341
  html = `<table><thead><tr><th>Model</th><th>Simba ASR Score (WER/CER) <i class="fa-solid fa-arrow-down arrow-down"></i></th></tr></thead><tbody>`;
342
 
 
343
  let currentRank = 1;
344
  modelStats.forEach((m, i) => {
345
  if (i > 0) {
346
  const prev = modelStats[i-1];
347
+ if (Math.abs(m.wer - prev.wer) > 0.001) currentRank = i + 1;
 
 
348
  } else {
349
  currentRank = 1;
350
  }
351
  m.rank = currentRank;
 
352
  let icon = '';
353
  if(m.rank === 1) icon = '🥇 '; else if(m.rank === 2) icon = '🥈 '; else if(m.rank === 3) icon = '🥉 ';
354
 
 
364
 
365
  const d = DATA.asr.by_family[val];
366
  if(!d) return;
 
367
  d.data.sort((a,b) => a.Avg_WER - b.Avg_WER);
368
 
369
  html = `<table><thead><tr><th>Model</th><th>Simba ASR Family Score <i class="fa-solid fa-arrow-down arrow-down"></i></th>`;
 
379
  currentRank = 1;
380
  }
381
  r.rank = currentRank;
 
382
  let icon = '';
383
  if(r.rank === 1) icon = '🥇 '; else if(r.rank === 2) icon = '🥈 '; else if(r.rank === 3) icon = '🥉 ';
384
 
 
460
  asrRows.sort((a,b) => (a.wer - b.wer) || (a.cer - b.cer));
461
 
462
  let h1 = `<table><thead><tr><th>Model</th><th>WER <i class="fa-solid fa-arrow-down arrow-down"></i></th><th>CER <i class="fa-solid fa-arrow-down arrow-down"></i></th></tr></thead><tbody>`;
463
+ if(asrRows.length === 0) h1 += `<tr><td colspan="3" class="empty-msg">No ASR results available for ${lang}.</td></tr>`;
464
  else {
465
  let currentRank = 1;
466
  asrRows.forEach((r, i) => {
 
500
  </tr>`;
501
  }
502
  });
503
+ if(!ttsFound) h2 += `<tr><td colspan="9" class="empty-msg">No TTS results available for ${lang}.</td></tr>`;
504
  h2 += `</tbody></table>`;
505
  document.getElementById('lang-tts-table').innerHTML = h2;
506
 
 
530
  h3 += `<tr><td style="font-weight:600;">${icon}${sc.n}</td><td>${fmt(sc.v)}</td></tr>`;
531
  });
532
  } else {
533
+ h3 += `<tr><td colspan="2" class="empty-msg">No SLID results available for ${lang}.</td></tr>`;
534
  }
535
  h3 += `</tbody></table>`;
536
  document.getElementById('lang-slid-table').innerHTML = h3;