Update leaderboard: 2025-03-11T14:53:40.179Z
Browse files- .gitattributes +0 -35
- .gitignore +0 -54
- README.md +0 -10
- assets/index-C-TpxbMu.js +0 -0
- assets/index-sdSyjyYD.css +1 -0
- components/ASRBenchmarkTable.jsx +0 -151
- components/App.jsx +0 -196
- components/DatasetFilter.jsx +0 -20
- components/EmptyState.jsx +0 -23
- components/ErrorState.jsx +0 -14
- components/LoadingState.jsx +0 -11
- components/ThemeToggle.jsx +0 -19
- css/styles.css +0 -5
- css/tailwind.config.js +0 -14
- css/transitions.css +0 -8
- index.html +2 -36
- js/theme.js +0 -16
- js/utils/csvParser.js +0 -64
.gitattributes
DELETED
@@ -1,35 +0,0 @@
|
|
1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.gitignore
DELETED
@@ -1,54 +0,0 @@
|
|
1 |
-
# Logs
|
2 |
-
logs/
|
3 |
-
*.log
|
4 |
-
npm-debug.log*
|
5 |
-
yarn-debug.log*
|
6 |
-
yarn-error.log*
|
7 |
-
|
8 |
-
# Dependency directories
|
9 |
-
node_modules/
|
10 |
-
jspm_packages/
|
11 |
-
|
12 |
-
# Build output
|
13 |
-
dist/
|
14 |
-
.vite/
|
15 |
-
|
16 |
-
# Environment variables
|
17 |
-
.env
|
18 |
-
.env.local
|
19 |
-
.env.*.local
|
20 |
-
|
21 |
-
# TypeScript
|
22 |
-
*.tsbuildinfo
|
23 |
-
|
24 |
-
# Optional caches
|
25 |
-
.npm
|
26 |
-
.eslintcache
|
27 |
-
.stylelintcache
|
28 |
-
.rpt2_cache/
|
29 |
-
.rts2_cache_cjs/
|
30 |
-
.rts2_cache_es/
|
31 |
-
.rts2_cache_umd/
|
32 |
-
|
33 |
-
# REPL history
|
34 |
-
.node_repl_history
|
35 |
-
|
36 |
-
# Package files
|
37 |
-
*.tgz
|
38 |
-
.yarn-integrity
|
39 |
-
|
40 |
-
# IDE and editor directories and files
|
41 |
-
.vscode/
|
42 |
-
.idea/
|
43 |
-
*.suo
|
44 |
-
*.ntvs*
|
45 |
-
*.njsproj
|
46 |
-
*.sln
|
47 |
-
|
48 |
-
# Operating system files
|
49 |
-
.DS_Store
|
50 |
-
Thumbs.db
|
51 |
-
|
52 |
-
# Temporary files
|
53 |
-
tmp/
|
54 |
-
temp/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
DELETED
@@ -1,10 +0,0 @@
|
|
1 |
-
---
|
2 |
-
title: Turkish Asr Leaderboard
|
3 |
-
emoji: 🔥
|
4 |
-
colorFrom: pink
|
5 |
-
colorTo: blue
|
6 |
-
sdk: static
|
7 |
-
pinned: false
|
8 |
-
---
|
9 |
-
|
10 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/index-C-TpxbMu.js
ADDED
The diff for this file is too large to render.
See raw diff
|
|
assets/index-sdSyjyYD.css
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.static{position:static}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.h-12{height:3rem}.h-3{height:.75rem}.h-5{height:1.25rem}.h-screen{height:100vh}.max-h-20{max-height:5rem}.min-h-screen{min-height:100vh}.w-12{width:3rem}.w-3{width:.75rem}.w-5{width:1.25rem}.min-w-full{min-width:100%}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[120px\]{max-width:120px}.max-w-md{max-width:28rem}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-t-2{border-top-width:2px}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-wider{letter-spacing:.05em}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}body{transition:background-color .3s ease,color .3s ease}.theme-transition{transition:background-color .3s ease,color .3s ease,border-color .3s ease}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.dark\:divide-gray-700:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(55 65 81 / var(--tw-divide-opacity, 1))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\:bg-dark-100:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(26 26 26 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-200:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(18 18 18 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.dark\:text-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\:hover\:text-blue-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
|
components/ASRBenchmarkTable.jsx
DELETED
@@ -1,151 +0,0 @@
|
|
1 |
-
const ASRBenchmarkTable = ({ metrics, sortConfig, requestSort, formatNumber, selectedDataset, datasets, onDatasetChange, darkMode, toggleTheme, debugInfo }) => {
|
2 |
-
return (
|
3 |
-
<div className="max-w-7xl mx-auto p-4">
|
4 |
-
<div className="flex justify-between items-center mb-6">
|
5 |
-
<h1 className="text-xl font-bold dark:text-gray-100 text-gray-800">ASR Benchmark Comparison</h1>
|
6 |
-
<ThemeToggle darkMode={darkMode} toggleTheme={toggleTheme} />
|
7 |
-
</div>
|
8 |
-
|
9 |
-
<DatasetFilter
|
10 |
-
selectedDataset={selectedDataset}
|
11 |
-
datasets={datasets}
|
12 |
-
onChange={onDatasetChange}
|
13 |
-
/>
|
14 |
-
|
15 |
-
<div className="overflow-x-auto dark:bg-dark-100 bg-white rounded-lg shadow-md">
|
16 |
-
<table className="min-w-full divide-y dark:divide-gray-700 divide-gray-200">
|
17 |
-
<thead className="dark:bg-gray-800 bg-gray-50">
|
18 |
-
<tr>
|
19 |
-
<th className="py-2 px-3 text-left text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider">
|
20 |
-
Model
|
21 |
-
</th>
|
22 |
-
<th
|
23 |
-
className="py-2 px-3 text-center text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider cursor-pointer dark:hover:bg-gray-700 hover:bg-gray-100"
|
24 |
-
onClick={() => requestSort('wer')}
|
25 |
-
>
|
26 |
-
<div className="flex items-center justify-center">
|
27 |
-
WER ⬇️
|
28 |
-
{sortConfig.key === 'wer' && (
|
29 |
-
<span className="ml-1">{sortConfig.direction === 'asc' ? '▲' : '▼'}</span>
|
30 |
-
)}
|
31 |
-
</div>
|
32 |
-
</th>
|
33 |
-
<th
|
34 |
-
className="py-2 px-3 text-center text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider cursor-pointer dark:hover:bg-gray-700 hover:bg-gray-100"
|
35 |
-
onClick={() => requestSort('cer')}
|
36 |
-
>
|
37 |
-
<div className="flex items-center justify-center">
|
38 |
-
CER ⬇️
|
39 |
-
{sortConfig.key === 'cer' && (
|
40 |
-
<span className="ml-1">{sortConfig.direction === 'asc' ? '▲' : '▼'}</span>
|
41 |
-
)}
|
42 |
-
</div>
|
43 |
-
</th>
|
44 |
-
<th
|
45 |
-
className="py-2 px-3 text-center text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider cursor-pointer dark:hover:bg-gray-700 hover:bg-gray-100"
|
46 |
-
onClick={() => requestSort('cosine_similarity')}
|
47 |
-
>
|
48 |
-
<div className="flex items-center justify-center">
|
49 |
-
Similarity ⬆️
|
50 |
-
{sortConfig.key === 'cosine_similarity' && (
|
51 |
-
<span className="ml-1">{sortConfig.direction === 'asc' ? '▲' : '▼'}</span>
|
52 |
-
)}
|
53 |
-
</div>
|
54 |
-
</th>
|
55 |
-
<th
|
56 |
-
className="py-2 px-3 text-center text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider cursor-pointer dark:hover:bg-gray-700 hover:bg-gray-100"
|
57 |
-
onClick={() => requestSort('speed')}
|
58 |
-
>
|
59 |
-
<div className="flex items-center justify-center">
|
60 |
-
Speed ⬆️
|
61 |
-
{sortConfig.key === 'speed' && (
|
62 |
-
<span className="ml-1">{sortConfig.direction === 'asc' ? '▲' : '▼'}</span>
|
63 |
-
)}
|
64 |
-
</div>
|
65 |
-
</th>
|
66 |
-
<th className="py-2 px-3 text-center text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider">
|
67 |
-
Dataset
|
68 |
-
</th>
|
69 |
-
<th className="py-2 px-3 text-center text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider">
|
70 |
-
Backend
|
71 |
-
</th>
|
72 |
-
<th className="py-2 px-3 text-center text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider">
|
73 |
-
Device
|
74 |
-
</th>
|
75 |
-
<th className="py-2 px-3 text-center text-xs font-medium dark:text-gray-400 text-gray-500 uppercase tracking-wider">
|
76 |
-
Hardware
|
77 |
-
</th>
|
78 |
-
</tr>
|
79 |
-
</thead>
|
80 |
-
<tbody className="divide-y dark:divide-gray-700 divide-gray-200">
|
81 |
-
{metrics.map((item, index) => (
|
82 |
-
<tr
|
83 |
-
key={index}
|
84 |
-
className={index % 2 === 0 ? 'dark:bg-dark-100 bg-white' : 'dark:bg-gray-800 bg-gray-50'}
|
85 |
-
>
|
86 |
-
<td className="py-2 px-3 text-xs whitespace-nowrap">
|
87 |
-
<a
|
88 |
-
href={item.asr_model_url}
|
89 |
-
target="_blank"
|
90 |
-
rel="noopener noreferrer"
|
91 |
-
className="dark:text-blue-400 text-blue-600 dark:hover:text-blue-300 hover:text-blue-800 hover:underline"
|
92 |
-
>
|
93 |
-
{item.asr_model_name}
|
94 |
-
</a>
|
95 |
-
</td>
|
96 |
-
<td className="py-2 px-3 text-xs text-center whitespace-nowrap">
|
97 |
-
{formatNumber(item.wer)}%
|
98 |
-
</td>
|
99 |
-
<td className="py-2 px-3 text-xs text-center whitespace-nowrap">
|
100 |
-
{formatNumber(item.cer)}%
|
101 |
-
</td>
|
102 |
-
<td className="py-2 px-3 text-xs text-center whitespace-nowrap">
|
103 |
-
{formatNumber(item.cosine_similarity)}%
|
104 |
-
</td>
|
105 |
-
<td className="py-2 px-3 text-xs text-center whitespace-nowrap">
|
106 |
-
{formatNumber(item.speed)}×
|
107 |
-
</td>
|
108 |
-
<td className="py-2 px-3 text-xs text-center whitespace-nowrap">
|
109 |
-
<a
|
110 |
-
href={`https://huggingface.co/${item.dataset_hf_id}`}
|
111 |
-
target="_blank"
|
112 |
-
rel="noopener noreferrer"
|
113 |
-
className="dark:text-blue-400 text-blue-600 dark:hover:text-blue-300 hover:text-blue-800 hover:underline"
|
114 |
-
>
|
115 |
-
{item.dataset_name}
|
116 |
-
</a>
|
117 |
-
</td>
|
118 |
-
<td className="py-2 px-3 text-xs text-center whitespace-nowrap">
|
119 |
-
{item.backend || '-'}
|
120 |
-
</td>
|
121 |
-
<td className="py-2 px-3 text-xs text-center whitespace-nowrap">
|
122 |
-
{item.device || '-'}
|
123 |
-
</td>
|
124 |
-
<td className="py-2 px-3 text-xs text-center whitespace-nowrap">
|
125 |
-
{item.device_model || '-'}
|
126 |
-
</td>
|
127 |
-
</tr>
|
128 |
-
))}
|
129 |
-
</tbody>
|
130 |
-
</table>
|
131 |
-
</div>
|
132 |
-
|
133 |
-
<div className="mt-6 text-xs dark:text-gray-400 text-gray-600 dark:bg-dark-100 bg-white p-4 rounded-lg shadow-md">
|
134 |
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-2">
|
135 |
-
<div>
|
136 |
-
<p><span className="font-semibold">WER</span>: Word Error Rate (lower is better)</p>
|
137 |
-
<p><span className="font-semibold">CER</span>: Character Error Rate (lower is better)</p>
|
138 |
-
</div>
|
139 |
-
<div>
|
140 |
-
<p><span className="font-semibold">Similarity</span>: Cosine similarity between reference and prediction texts (higher is better)</p>
|
141 |
-
<p><span className="font-semibold">Speed</span>: Real-time factor (higher is better)</p>
|
142 |
-
</div>
|
143 |
-
</div>
|
144 |
-
<p className="mt-4 text-xs dark:text-gray-500 text-gray-500">
|
145 |
-
Last updated: {metrics[0]?.timestamp ? new Date(metrics[0].timestamp.substring(0,8).replace(/(\d{4})(\d{2})(\d{2})/, '$1-$2-$3')).toLocaleDateString() : 'Unknown'}
|
146 |
-
</p>
|
147 |
-
<p className="mt-1 text-xs dark:text-gray-600 text-gray-500">{debugInfo}</p>
|
148 |
-
</div>
|
149 |
-
</div>
|
150 |
-
);
|
151 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
components/App.jsx
DELETED
@@ -1,196 +0,0 @@
|
|
1 |
-
const App = () => {
|
2 |
-
const [metrics, setMetrics] = React.useState([]);
|
3 |
-
const [datasets, setDatasets] = React.useState([]);
|
4 |
-
const [loading, setLoading] = React.useState(true);
|
5 |
-
const [error, setError] = React.useState(null);
|
6 |
-
const [sortConfig, setSortConfig] = React.useState({ key: 'wer', direction: 'asc' });
|
7 |
-
const [debugInfo, setDebugInfo] = React.useState('');
|
8 |
-
const [selectedDataset, setSelectedDataset] = React.useState('all');
|
9 |
-
const [darkMode, setDarkMode] = React.useState(document.documentElement.classList.contains('dark'));
|
10 |
-
|
11 |
-
// Simplified theme handling - just initialize once
|
12 |
-
React.useEffect(() => {
|
13 |
-
// Set initial dark mode state based on document class
|
14 |
-
const isDark = document.documentElement.classList.contains('dark');
|
15 |
-
setDarkMode(isDark);
|
16 |
-
console.log("React component initialized with theme:", isDark ? "DARK" : "LIGHT");
|
17 |
-
}, []);
|
18 |
-
|
19 |
-
React.useEffect(() => {
|
20 |
-
const fetchData = async () => {
|
21 |
-
try {
|
22 |
-
const owner = 'ysdede';
|
23 |
-
const repo = 'asr_benchmark_store';
|
24 |
-
|
25 |
-
// Try alternate URL format for Hugging Face datasets
|
26 |
-
const apiUrl = `https://huggingface.co/datasets/${owner}/${repo}/resolve/main/metrics-00.csv`;
|
27 |
-
|
28 |
-
setDebugInfo(`Trying to fetch from: ${apiUrl}`);
|
29 |
-
|
30 |
-
const response = await fetch(apiUrl);
|
31 |
-
if (!response.ok) {
|
32 |
-
throw new Error(`Failed to fetch: ${response.status} ${response.statusText}`);
|
33 |
-
}
|
34 |
-
|
35 |
-
const csvText = await response.text();
|
36 |
-
setDebugInfo('Data fetched successfully, parsing CSV...');
|
37 |
-
|
38 |
-
const parsedData = CSVParser.parseCSV(csvText, setDebugInfo);
|
39 |
-
|
40 |
-
if (parsedData.length > 0) {
|
41 |
-
setMetrics(parsedData);
|
42 |
-
|
43 |
-
// Extract unique datasets
|
44 |
-
const uniqueDatasets = [...new Set(parsedData.map(item => item.dataset_name))];
|
45 |
-
setDatasets(uniqueDatasets);
|
46 |
-
|
47 |
-
setDebugInfo(`Parsed ${parsedData.length} records successfully`);
|
48 |
-
} else {
|
49 |
-
setDebugInfo('Parsed data is empty');
|
50 |
-
}
|
51 |
-
|
52 |
-
setLoading(false);
|
53 |
-
} catch (error) {
|
54 |
-
console.error('Error fetching metrics data:', error);
|
55 |
-
setError(error.message);
|
56 |
-
setDebugInfo(`Error: ${error.message}`);
|
57 |
-
setLoading(false);
|
58 |
-
|
59 |
-
// Fallback to static data for demo purposes
|
60 |
-
tryWithStaticData();
|
61 |
-
}
|
62 |
-
};
|
63 |
-
|
64 |
-
const tryWithStaticData = () => {
|
65 |
-
setDebugInfo('Falling back to static demo data...');
|
66 |
-
// Sample data from your CSV
|
67 |
-
const staticData = [
|
68 |
-
{
|
69 |
-
"asr_model_name": "openai/whisper-large-v3-turbo",
|
70 |
-
"wer": "10.4",
|
71 |
-
"cer": "5.4",
|
72 |
-
"cosine_similarity": "95.51",
|
73 |
-
"speed": "29",
|
74 |
-
"dataset_name": "turkishvoicedataset",
|
75 |
-
"dataset_hf_id": "erenfazlioglu/turkishvoicedataset",
|
76 |
-
"device_model": "Tesla T4",
|
77 |
-
"timestamp": "20250310164022",
|
78 |
-
"asr_model_url": "https://huggingface.co/openai/whisper-large-v3-turbo"
|
79 |
-
},
|
80 |
-
{
|
81 |
-
"asr_model_name": "openai/whisper-small",
|
82 |
-
"wer": "21.87",
|
83 |
-
"cer": "8.33",
|
84 |
-
"cosine_similarity": "91.23",
|
85 |
-
"speed": "68",
|
86 |
-
"dataset_name": "turkishvoicedataset",
|
87 |
-
"dataset_hf_id": "erenfazlioglu/turkishvoicedataset",
|
88 |
-
"device_model": "NVIDIA L4",
|
89 |
-
"timestamp": "20250310180124",
|
90 |
-
"asr_model_url": "https://huggingface.co/openai/whisper-small"
|
91 |
-
}
|
92 |
-
];
|
93 |
-
|
94 |
-
setMetrics(staticData);
|
95 |
-
setLoading(false);
|
96 |
-
};
|
97 |
-
|
98 |
-
fetchData();
|
99 |
-
}, []);
|
100 |
-
|
101 |
-
const requestSort = (key) => {
|
102 |
-
let direction = 'asc';
|
103 |
-
if (sortConfig.key === key && sortConfig.direction === 'asc') {
|
104 |
-
direction = 'desc';
|
105 |
-
}
|
106 |
-
setSortConfig({ key, direction });
|
107 |
-
};
|
108 |
-
|
109 |
-
const formatNumber = (value) => {
|
110 |
-
if (!value) return '-';
|
111 |
-
const num = parseFloat(value);
|
112 |
-
return isNaN(num) ? value : num.toFixed(2);
|
113 |
-
};
|
114 |
-
|
115 |
-
const getSortedMetrics = () => {
|
116 |
-
// First filter by selected dataset
|
117 |
-
const filteredItems = selectedDataset === 'all'
|
118 |
-
? [...metrics]
|
119 |
-
: metrics.filter(item => item.dataset_name === selectedDataset);
|
120 |
-
|
121 |
-
// Then sort the filtered items
|
122 |
-
if (sortConfig.key) {
|
123 |
-
filteredItems.sort((a, b) => {
|
124 |
-
const aValue = parseFloat(a[sortConfig.key]) || 0;
|
125 |
-
const bValue = parseFloat(b[sortConfig.key]) || 0;
|
126 |
-
|
127 |
-
if (aValue < bValue) {
|
128 |
-
return sortConfig.direction === 'asc' ? -1 : 1;
|
129 |
-
}
|
130 |
-
if (aValue > bValue) {
|
131 |
-
return sortConfig.direction === 'asc' ? 1 : -1;
|
132 |
-
}
|
133 |
-
return 0;
|
134 |
-
});
|
135 |
-
}
|
136 |
-
return filteredItems;
|
137 |
-
};
|
138 |
-
|
139 |
-
const toggleTheme = () => {
|
140 |
-
const newDarkMode = !darkMode;
|
141 |
-
setDarkMode(newDarkMode);
|
142 |
-
if (newDarkMode) {
|
143 |
-
document.documentElement.classList.add('dark');
|
144 |
-
} else {
|
145 |
-
document.documentElement.classList.remove('dark');
|
146 |
-
}
|
147 |
-
};
|
148 |
-
|
149 |
-
if (loading) {
|
150 |
-
return <LoadingState debugInfo={debugInfo} />;
|
151 |
-
}
|
152 |
-
|
153 |
-
if (error) {
|
154 |
-
return <ErrorState error={error} debugInfo={debugInfo} />;
|
155 |
-
}
|
156 |
-
|
157 |
-
if (metrics.length === 0) {
|
158 |
-
return (
|
159 |
-
<div className="flex items-center justify-center h-screen">
|
160 |
-
<div className="text-center p-4">
|
161 |
-
<p className="text-lg">No benchmark data available</p>
|
162 |
-
<span className="text-xs dark:text-gray-400 text-gray-500">{debugInfo}</span>
|
163 |
-
</div>
|
164 |
-
</div>
|
165 |
-
);
|
166 |
-
}
|
167 |
-
|
168 |
-
const sortedMetrics = getSortedMetrics();
|
169 |
-
|
170 |
-
if (sortedMetrics.length === 0) {
|
171 |
-
return (
|
172 |
-
<EmptyState
|
173 |
-
darkMode={darkMode}
|
174 |
-
toggleTheme={toggleTheme}
|
175 |
-
selectedDataset={selectedDataset}
|
176 |
-
datasets={datasets}
|
177 |
-
onDatasetChange={setSelectedDataset}
|
178 |
-
/>
|
179 |
-
);
|
180 |
-
}
|
181 |
-
|
182 |
-
return (
|
183 |
-
<ASRBenchmarkTable
|
184 |
-
metrics={sortedMetrics}
|
185 |
-
sortConfig={sortConfig}
|
186 |
-
requestSort={requestSort}
|
187 |
-
formatNumber={formatNumber}
|
188 |
-
selectedDataset={selectedDataset}
|
189 |
-
datasets={datasets}
|
190 |
-
onDatasetChange={setSelectedDataset}
|
191 |
-
darkMode={darkMode}
|
192 |
-
toggleTheme={toggleTheme}
|
193 |
-
debugInfo={debugInfo}
|
194 |
-
/>
|
195 |
-
);
|
196 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
components/DatasetFilter.jsx
DELETED
@@ -1,20 +0,0 @@
|
|
1 |
-
const DatasetFilter = ({ selectedDataset, datasets, onChange }) => {
|
2 |
-
return (
|
3 |
-
<div className="mb-4 dark:bg-dark-100 bg-white p-3 rounded-lg shadow-md">
|
4 |
-
<label htmlFor="dataset-filter" className="mr-2 text-sm font-medium dark:text-gray-300 text-gray-700">
|
5 |
-
Filter by Dataset:
|
6 |
-
</label>
|
7 |
-
<select
|
8 |
-
id="dataset-filter"
|
9 |
-
value={selectedDataset}
|
10 |
-
onChange={(e) => onChange(e.target.value)}
|
11 |
-
className="border rounded py-1 px-2 text-sm dark:bg-gray-700 bg-gray-50 dark:border-gray-600 border-gray-300 dark:text-gray-200 text-gray-700 focus:ring-blue-500 focus:border-blue-500"
|
12 |
-
>
|
13 |
-
<option value="all">All Datasets</option>
|
14 |
-
{datasets.map((dataset, index) => (
|
15 |
-
<option key={index} value={dataset}>{dataset}</option>
|
16 |
-
))}
|
17 |
-
</select>
|
18 |
-
</div>
|
19 |
-
);
|
20 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
components/EmptyState.jsx
DELETED
@@ -1,23 +0,0 @@
|
|
1 |
-
const EmptyState = ({ darkMode, toggleTheme, selectedDataset, datasets, onDatasetChange }) => {
|
2 |
-
return (
|
3 |
-
<div className="max-w-6xl mx-auto p-4">
|
4 |
-
<div className="flex justify-between items-center mb-6">
|
5 |
-
<h1 className="text-xl font-bold dark:text-gray-100 text-gray-800">ASR Benchmark Comparison</h1>
|
6 |
-
<ThemeToggle darkMode={darkMode} toggleTheme={toggleTheme} />
|
7 |
-
</div>
|
8 |
-
|
9 |
-
<DatasetFilter
|
10 |
-
selectedDataset={selectedDataset}
|
11 |
-
datasets={datasets}
|
12 |
-
onChange={onDatasetChange}
|
13 |
-
/>
|
14 |
-
|
15 |
-
<div className="dark:bg-dark-100 bg-white rounded-lg shadow-md p-8 text-center">
|
16 |
-
<svg xmlns="http://www.w3.org/2000/svg" className="h-12 w-12 mx-auto mb-4 dark:text-gray-400 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
17 |
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
18 |
-
</svg>
|
19 |
-
<p className="dark:text-gray-300 text-gray-600">No results found for the selected dataset</p>
|
20 |
-
</div>
|
21 |
-
</div>
|
22 |
-
);
|
23 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
components/ErrorState.jsx
DELETED
@@ -1,14 +0,0 @@
|
|
1 |
-
const ErrorState = ({ error, debugInfo }) => {
|
2 |
-
return (
|
3 |
-
<div className="flex items-center justify-center h-screen">
|
4 |
-
<div className="text-red-500 dark:text-red-400 p-4 max-w-md text-center">
|
5 |
-
<svg xmlns="http://www.w3.org/2000/svg" className="h-12 w-12 mx-auto mb-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
6 |
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
7 |
-
</svg>
|
8 |
-
<p className="text-lg font-semibold mb-2">Error</p>
|
9 |
-
<p>{error}</p>
|
10 |
-
<span className="text-xs dark:text-gray-400 text-gray-500 mt-4 block">{debugInfo}</span>
|
11 |
-
</div>
|
12 |
-
</div>
|
13 |
-
);
|
14 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
components/LoadingState.jsx
DELETED
@@ -1,11 +0,0 @@
|
|
1 |
-
const LoadingState = ({ debugInfo }) => {
|
2 |
-
return (
|
3 |
-
<div className="flex items-center justify-center h-screen">
|
4 |
-
<div className="text-center p-4">
|
5 |
-
<div className="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-blue-500 mx-auto mb-4"></div>
|
6 |
-
<p className="text-lg">Loading benchmark data...</p>
|
7 |
-
<span className="text-xs dark:text-gray-400 text-gray-500">{debugInfo}</span>
|
8 |
-
</div>
|
9 |
-
</div>
|
10 |
-
);
|
11 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
components/ThemeToggle.jsx
DELETED
@@ -1,19 +0,0 @@
|
|
1 |
-
const ThemeToggle = ({ darkMode, toggleTheme }) => {
|
2 |
-
return (
|
3 |
-
<button
|
4 |
-
onClick={toggleTheme}
|
5 |
-
className="p-2 rounded-full dark:bg-gray-700 bg-gray-200 dark:hover:bg-gray-600 hover:bg-gray-300 transition-colors"
|
6 |
-
title={darkMode ? "Switch to light mode" : "Switch to dark mode"}
|
7 |
-
>
|
8 |
-
{darkMode ? (
|
9 |
-
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
10 |
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" />
|
11 |
-
</svg>
|
12 |
-
) : (
|
13 |
-
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
14 |
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z" />
|
15 |
-
</svg>
|
16 |
-
)}
|
17 |
-
</button>
|
18 |
-
);
|
19 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
css/styles.css
DELETED
@@ -1,5 +0,0 @@
|
|
1 |
-
@media (prefers-color-scheme: dark) {
|
2 |
-
html:not(.light) {
|
3 |
-
color-scheme: dark;
|
4 |
-
}
|
5 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
css/tailwind.config.js
DELETED
@@ -1,14 +0,0 @@
|
|
1 |
-
tailwind.config = {
|
2 |
-
darkMode: 'class',
|
3 |
-
theme: {
|
4 |
-
extend: {
|
5 |
-
colors: {
|
6 |
-
dark: {
|
7 |
-
100: '#1E293B', // slate-800
|
8 |
-
200: '#0F172A', // slate-900
|
9 |
-
300: '#020617', // slate-950
|
10 |
-
}
|
11 |
-
}
|
12 |
-
}
|
13 |
-
}
|
14 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
css/transitions.css
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
/* Ensure smooth transitions between themes */
|
2 |
-
body {
|
3 |
-
transition: background-color 0.3s ease, color 0.3s ease;
|
4 |
-
}
|
5 |
-
|
6 |
-
table, th, td {
|
7 |
-
transition: background-color 0.3s ease, color 0.3s ease;
|
8 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
index.html
CHANGED
@@ -4,44 +4,10 @@
|
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
<title>ASR Benchmark Comparison</title>
|
7 |
-
|
8 |
-
|
9 |
-
<script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
|
10 |
-
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
|
11 |
-
|
12 |
-
<!-- Add Babel for JSX support -->
|
13 |
-
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
|
14 |
-
|
15 |
-
<!-- Add Tailwind CSS -->
|
16 |
-
<script src="https://cdn.tailwindcss.com"></script>
|
17 |
-
<script src="css/tailwind.config.js"></script>
|
18 |
-
|
19 |
-
<!-- Custom CSS -->
|
20 |
-
<link rel="stylesheet" href="css/styles.css">
|
21 |
-
<link rel="stylesheet" href="css/transitions.css">
|
22 |
-
|
23 |
-
<!-- Theme detection -->
|
24 |
-
<script src="js/theme.js"></script>
|
25 |
</head>
|
26 |
<body class="dark:bg-dark-200 dark:text-gray-200 bg-gray-50 text-gray-800 min-h-screen">
|
27 |
<div id="root"></div>
|
28 |
-
|
29 |
-
<!-- Utility scripts -->
|
30 |
-
<script type="text/babel" src="js/utils/csvParser.js"></script>
|
31 |
-
|
32 |
-
<!-- React Components -->
|
33 |
-
<script type="text/babel" src="components/ThemeToggle.jsx"></script>
|
34 |
-
<script type="text/babel" src="components/DatasetFilter.jsx"></script>
|
35 |
-
<script type="text/babel" src="components/LoadingState.jsx"></script>
|
36 |
-
<script type="text/babel" src="components/ErrorState.jsx"></script>
|
37 |
-
<script type="text/babel" src="components/EmptyState.jsx"></script>
|
38 |
-
<script type="text/babel" src="components/ASRBenchmarkTable.jsx"></script>
|
39 |
-
<script type="text/babel" src="components/App.jsx"></script>
|
40 |
-
|
41 |
-
<!-- Main script to render the app -->
|
42 |
-
<script type="text/babel">
|
43 |
-
const root = ReactDOM.createRoot(document.getElementById('root'));
|
44 |
-
root.render(<App />);
|
45 |
-
</script>
|
46 |
</body>
|
47 |
</html>
|
|
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
<title>ASR Benchmark Comparison</title>
|
7 |
+
<script type="module" crossorigin src="/assets/index-C-TpxbMu.js"></script>
|
8 |
+
<link rel="stylesheet" crossorigin href="/assets/index-sdSyjyYD.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
</head>
|
10 |
<body class="dark:bg-dark-200 dark:text-gray-200 bg-gray-50 text-gray-800 min-h-screen">
|
11 |
<div id="root"></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
</body>
|
13 |
</html>
|
js/theme.js
DELETED
@@ -1,16 +0,0 @@
|
|
1 |
-
// Theme detection and management
|
2 |
-
function detectTheme() {
|
3 |
-
// Check system preference
|
4 |
-
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
5 |
-
document.documentElement.classList.add('dark');
|
6 |
-
console.log("Theme detection: System preference - DARK theme applied");
|
7 |
-
return 'dark';
|
8 |
-
} else {
|
9 |
-
document.documentElement.classList.remove('dark');
|
10 |
-
console.log("Theme detection: System preference - LIGHT theme applied");
|
11 |
-
return 'light';
|
12 |
-
}
|
13 |
-
}
|
14 |
-
|
15 |
-
// Run on page load
|
16 |
-
const initialTheme = detectTheme();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/utils/csvParser.js
DELETED
@@ -1,64 +0,0 @@
|
|
1 |
-
// CSV parsing utilities
|
2 |
-
const CSVParser = {
|
3 |
-
parseCSV: function(csvText, setDebugInfo) {
|
4 |
-
// Parse CSV with quotes
|
5 |
-
const lines = csvText.split('\n');
|
6 |
-
if (lines.length < 2) return [];
|
7 |
-
|
8 |
-
const headers = this.parseCsvLine(lines[0]);
|
9 |
-
const result = [];
|
10 |
-
const uniqueEntries = new Set(); // Track unique model+dataset+wer combinations
|
11 |
-
let duplicatesRemoved = 0;
|
12 |
-
|
13 |
-
for (let i = 1; i < lines.length; i++) {
|
14 |
-
if (lines[i].trim() === '') continue;
|
15 |
-
|
16 |
-
const values = this.parseCsvLine(lines[i]);
|
17 |
-
if (values.length === headers.length) {
|
18 |
-
const row = {};
|
19 |
-
headers.forEach((header, index) => {
|
20 |
-
row[header] = values[index];
|
21 |
-
});
|
22 |
-
|
23 |
-
// Create a unique key based on model name, dataset name, and WER score
|
24 |
-
const uniqueKey = `${row.asr_model_name}|${row.dataset_name}|${row.wer}`;
|
25 |
-
|
26 |
-
// Skip if we've already seen this combination
|
27 |
-
if (uniqueEntries.has(uniqueKey)) {
|
28 |
-
duplicatesRemoved++;
|
29 |
-
continue;
|
30 |
-
}
|
31 |
-
|
32 |
-
uniqueEntries.add(uniqueKey);
|
33 |
-
result.push(row);
|
34 |
-
}
|
35 |
-
}
|
36 |
-
|
37 |
-
if (setDebugInfo) {
|
38 |
-
setDebugInfo(prev => `${prev}\nRemoved ${duplicatesRemoved} duplicate entries based on model, dataset, and WER.`);
|
39 |
-
}
|
40 |
-
return result;
|
41 |
-
},
|
42 |
-
|
43 |
-
parseCsvLine: function(line) {
|
44 |
-
const result = [];
|
45 |
-
let inQuotes = false;
|
46 |
-
let currentValue = '';
|
47 |
-
|
48 |
-
for (let i = 0; i < line.length; i++) {
|
49 |
-
const char = line[i];
|
50 |
-
|
51 |
-
if (char === '"') {
|
52 |
-
inQuotes = !inQuotes;
|
53 |
-
} else if (char === ',' && !inQuotes) {
|
54 |
-
result.push(currentValue);
|
55 |
-
currentValue = '';
|
56 |
-
} else {
|
57 |
-
currentValue += char;
|
58 |
-
}
|
59 |
-
}
|
60 |
-
|
61 |
-
result.push(currentValue);
|
62 |
-
return result;
|
63 |
-
}
|
64 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|