ysdede commited on
Commit
070c829
·
1 Parent(s): 43256f7

Update leaderboard: 2025-03-11T14:53:40.179Z

Browse files
.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
- <!-- Add React and ReactDOM -->
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
- };