CognxSafeTrack commited on
Commit ·
b6de1ea
1
Parent(s): 181ff6e
chore(api): add fast-levenshtein for Whisper WER calibration benchmark
Browse files- apps/api/data/calibration_stats.json +108 -46
- apps/api/package.json +2 -0
- apps/api/src/scripts/calibrate-whisper.ts +53 -0
- pnpm-lock.yaml +24 -0
apps/api/data/calibration_stats.json
CHANGED
|
@@ -1,14 +1,17 @@
|
|
| 1 |
{
|
| 2 |
-
"totalProcessed":
|
| 3 |
-
"averageConfidence":
|
|
|
|
|
|
|
|
|
|
| 4 |
"distribution": {
|
| 5 |
"red": {
|
| 6 |
"count": 23,
|
| 7 |
-
"percentage":
|
| 8 |
},
|
| 9 |
"orange": {
|
| 10 |
-
"count":
|
| 11 |
-
"percentage":
|
| 12 |
},
|
| 13 |
"green": {
|
| 14 |
"count": 0,
|
|
@@ -23,6 +26,8 @@
|
|
| 23 |
"transcribedText": "Groyeslande, Bariwul, Woon, Wai, Dek, Sitarikh, Skandinav, Nyongi, Wahni, Erik, Lerouj, Danjukur, Tokholsi, Island, Ngir, Fat, Bakan, Bimuytuki, Ziswau, Silegis, Groyelande, Daldikotude, Groyelande.",
|
| 24 |
"normalizedText": "Groyeslande, Bariwul, Woon, Wai, Dek, Sitarikh, Skandinav, Nyongi, Wahni, Erik, Lerouj, Danjukur, Tokholsi, Island, Ngir, Fat, Bakan, Bimuytuki, Ziswau, Silegis, Groyelande, Daldikotude, Groyelande.",
|
| 25 |
"confidenceScore": 48,
|
|
|
|
|
|
|
| 26 |
"status": "RED"
|
| 27 |
},
|
| 28 |
{
|
|
@@ -32,6 +37,8 @@
|
|
| 32 |
"transcribedText": "Si vous avez des questions sur ce bâtiment, vous pouvez m'envoyer un message en disant que je suis là pour vous aider pour qu'on puisse en savoir plus sur ce bâtiment.",
|
| 33 |
"normalizedText": "Ci vous avez des questions sur ce bâtiment, vous pouvez m'envoyer un message en disant que je suis là pour vous aider pour qu'on puisse en savoir plus sur ce bâtiment.",
|
| 34 |
"confidenceScore": 42,
|
|
|
|
|
|
|
| 35 |
"status": "RED"
|
| 36 |
},
|
| 37 |
{
|
|
@@ -41,15 +48,19 @@
|
|
| 41 |
"transcribedText": "Sous-titres réalisés para la communauté d'Amara.org",
|
| 42 |
"normalizedText": "Sous-titres réalisés para la communauté d'Amara.org",
|
| 43 |
"confidenceScore": 72,
|
|
|
|
|
|
|
| 44 |
"status": "ORANGE"
|
| 45 |
},
|
| 46 |
{
|
| 47 |
"source": "FLEURS",
|
| 48 |
"index": 3,
|
| 49 |
"hfOriginalText": "am na nit ñu yaakaar ne waxoon na dëgg wante nit ñu bare yaakaaru ñu loolu; muy jànt bi dafay wë suuf ci; boole ci jant bi ak yeneen bideew yi",
|
| 50 |
-
"transcribedText": "Il y a des gens qui pensent que c'est vrai, mais il y a
|
| 51 |
-
"normalizedText": "Il y a des gens qui pensent que c'est vrai, mais il y a
|
| 52 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 53 |
"status": "RED"
|
| 54 |
},
|
| 55 |
{
|
|
@@ -59,43 +70,53 @@
|
|
| 59 |
"transcribedText": "Si bien qu'il n'y a pas de spectre, nous devons l'éliminer pour qu'une personne puisse nous dire qu'elle doit l'éliminer pour que l'équipe puisse s'en sortir.",
|
| 60 |
"normalizedText": "Ci bien qu'il n'y a pas de spectre, nous devons l'éliminer pour qu'une personne puisse nous dire qu'elle doit l'éliminer pour que l'équipe puisse s'en sortir.",
|
| 61 |
"confidenceScore": 43,
|
|
|
|
|
|
|
| 62 |
"status": "RED"
|
| 63 |
},
|
| 64 |
{
|
| 65 |
"source": "FLEURS",
|
| 66 |
"index": 5,
|
| 67 |
"hfOriginalText": "séni doxalin nirowul ak binék ci suuf biy yamalé tangay bi waye amna doolé ak kamb yu xoot yi ci suuf si glen cushing bu united states geological survey usgs kurelu astrogeology ak northern arizona university nékoon ci flagstaff arizona mooko wax",
|
| 68 |
-
"transcribedText": "
|
| 69 |
-
"normalizedText": "
|
| 70 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 71 |
"status": "RED"
|
| 72 |
},
|
| 73 |
{
|
| 74 |
"source": "FLEURS",
|
| 75 |
"index": 6,
|
| 76 |
"hfOriginalText": "polotiku fomb bi dafay wuute waaye bi weeru màrs di waaja jeex polotiku fomb ndax coronavirus weesuwul suwe 2020 biñu jappee beneen dat ngir olympik yi",
|
| 77 |
-
"transcribedText": "
|
| 78 |
-
"normalizedText": "
|
| 79 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 80 |
"status": "RED"
|
| 81 |
},
|
| 82 |
{
|
| 83 |
"source": "FLEURS",
|
| 84 |
"index": 7,
|
| 85 |
"hfOriginalText": "ci atum 1990 yokkoon nañu limu barab yu woorandi yi addina bi am ndax daŋkaafu suufu dezeer bi",
|
| 86 |
-
"transcribedText": "
|
| 87 |
-
"normalizedText": "
|
| 88 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 89 |
"status": "RED"
|
| 90 |
},
|
| 91 |
{
|
| 92 |
"source": "FLEURS",
|
| 93 |
"index": 8,
|
| 94 |
"hfOriginalText": "ñim dem tukki ci dëkk yu bari payum taks mën nañu fa sakkanalee xaalis ci beneen anam ndax sàngara si ak sigaret si fala gëna yombee",
|
| 95 |
-
"transcribedText": "
|
| 96 |
-
"normalizedText": "
|
| 97 |
-
"confidenceScore":
|
| 98 |
-
"
|
|
|
|
|
|
|
| 99 |
},
|
| 100 |
{
|
| 101 |
"source": "FLEURS",
|
|
@@ -104,15 +125,30 @@
|
|
| 104 |
"transcribedText": "A Pia, la capitale de Samoa, il y a des réunions à l'occasion de l'anniversaire de l'anniversaire de Paul.",
|
| 105 |
"normalizedText": "A Pia, la capitale de Samoa, il y a des réunions à l'occasion de l'anniversaire de l'anniversaire de Paul.",
|
| 106 |
"confidenceScore": 37,
|
|
|
|
|
|
|
| 107 |
"status": "RED"
|
| 108 |
},
|
| 109 |
{
|
| 110 |
"source": "FLEURS",
|
| 111 |
"index": 10,
|
| 112 |
"hfOriginalText": "ci mbenuum weer beneen fafalnaaw genn na yoonam ca mashhad te mëkk benn miir rey fukki nit ak juróom ñaar",
|
| 113 |
-
"transcribedText": "Si
|
| 114 |
-
"normalizedText": "Ci
|
| 115 |
-
"confidenceScore":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 116 |
"status": "RED"
|
| 117 |
},
|
| 118 |
{
|
|
@@ -122,24 +158,30 @@
|
|
| 122 |
"transcribedText": "S'il n'y a pas de graffitis, il n'a pas d'intérêt.",
|
| 123 |
"normalizedText": "S'il n'y a pas de graffitis, il n'a pas d'intérêt.",
|
| 124 |
"confidenceScore": 39,
|
|
|
|
|
|
|
| 125 |
"status": "RED"
|
| 126 |
},
|
| 127 |
{
|
| 128 |
"source": "FLEURS",
|
| 129 |
"index": 13,
|
| 130 |
"hfOriginalText": "gox bi moo nekkoon itam fiñu daan sukkandiku ngir yeek ci wolkan bu nyiragongo ak yenn ci montaañi gorilla yu gëna yomb yuñuy topp afrik",
|
| 131 |
-
"transcribedText": "
|
| 132 |
-
"normalizedText": "
|
| 133 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 134 |
"status": "RED"
|
| 135 |
},
|
| 136 |
{
|
| 137 |
"source": "FLEURS",
|
| 138 |
"index": 14,
|
| 139 |
"hfOriginalText": "aristotle bénn xalaat kat nééna lép lo giss amna bénn wala lu epp gnenti yééf yugnuko défaré suuf l ndox ak safara",
|
| 140 |
-
"transcribedText": "Aristote
|
| 141 |
-
"normalizedText": "Aristote
|
| 142 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 143 |
"status": "RED"
|
| 144 |
},
|
| 145 |
{
|
|
@@ -149,42 +191,52 @@
|
|
| 149 |
"transcribedText": "Gymnastique de l'Amérique et de l'Ouest, c'est ce que nous faisons. Nous faisons de la gymnastique et d'autres activités pour que les jeunes et les adultes puissent s'entraîner bien et bien.",
|
| 150 |
"normalizedText": "Gymnastique de l'Amérique et de l'Ouest, c'est ce que nous faisons. Nous faisons de la gymnastique et d'autres activités pour que les jeunes et les adultes puissent s'entraîner bien et bien.",
|
| 151 |
"confidenceScore": 40,
|
|
|
|
|
|
|
| 152 |
"status": "RED"
|
| 153 |
},
|
| 154 |
{
|
| 155 |
"source": "FLEURS",
|
| 156 |
"index": 16,
|
| 157 |
"hfOriginalText": "ndéem ak parku nasiyonal yu afrig du sud yepp am na ay waxtaan bés bu né ak fay ngir dug ci bërëb bi",
|
| 158 |
-
"transcribedText": "
|
| 159 |
-
"normalizedText": "
|
| 160 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 161 |
"status": "RED"
|
| 162 |
},
|
| 163 |
{
|
| 164 |
"source": "FLEURS",
|
| 165 |
"index": 17,
|
| 166 |
"hfOriginalText": "njiitu poliis bi chandra shekhar solanki wax na ni kiñu tuumal dafa ñëw ci tirbinaal bi ak kanam guñu nëbb",
|
| 167 |
-
"transcribedText": "La police de
|
| 168 |
-
"normalizedText": "La police de
|
| 169 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 170 |
"status": "RED"
|
| 171 |
},
|
| 172 |
{
|
| 173 |
"source": "FLEURS",
|
| 174 |
"index": 18,
|
| 175 |
"hfOriginalText": "ba tey ci bëj-gannar dem leen xooli sanktiyeer bu mag bi ci notre-dame de fatima sanktiyeer barab bu bu keemane bu mariyaama feeñ te ñu xam ko ci addina bi yépp",
|
| 176 |
-
"transcribedText": "Bataille de
|
| 177 |
-
"normalizedText": "Bataille de
|
| 178 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 179 |
"status": "RED"
|
| 180 |
},
|
| 181 |
{
|
| 182 |
"source": "FLEURS",
|
| 183 |
"index": 19,
|
| 184 |
"hfOriginalText": "situ xibaar ak begal xol bu tmz bu waxna ni photographe bi moo taxawal otoom ci beneen wetu yoon wu mag wii di sepulveda ba noppi bëggoon koo foto ci barab bi polisié yi di taxaw laata muy jeggi tali bi ba noppi dem yoonam loolu moo waral polisié bu californie bi taxawal auto yi ñaari yoon ngir may ko mu jeggi dem dellusi",
|
| 185 |
-
"transcribedText": "C'est ce que j'ai appris à l'université de Témzé, c'est qu'il y avait une photo d'un homme en voiture, dans un autre endroit,
|
| 186 |
-
"normalizedText": "C'est ce que j'ai appris à l'université de Témzé, c'est qu'il y avait une photo d'un homme en voiture, dans un autre endroit,
|
| 187 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 188 |
"status": "RED"
|
| 189 |
},
|
| 190 |
{
|
|
@@ -194,6 +246,8 @@
|
|
| 194 |
"transcribedText": "Comme nous l'avons dit il y a quelques années, dans le domaine de la science-fiction, il y a eu beaucoup d'événements informatiques qui ont fait que les gens ont commencé à s'intégrer et à s'adapter à la science-fiction.",
|
| 195 |
"normalizedText": "Comme nous l'avons dit il y a quelques années, dans le domaine de la science-fiction, il y a eu beaucoup d'événements informatiques qui ont fait que les gens ont commencé à s'intégrer et à s'adapter à la science-fiction.",
|
| 196 |
"confidenceScore": 41,
|
|
|
|
|
|
|
| 197 |
"status": "RED"
|
| 198 |
},
|
| 199 |
{
|
|
@@ -203,6 +257,8 @@
|
|
| 203 |
"transcribedText": "Ce qui s'est passé à l'intérieur de l'Amérique, c'est ce que Donald Trump a dit à la secrétaire de l'Assemblée des Nations Unies. Il a dit qu'il allait sortir de l'Amérique et qu'il allait sortir de Syrie.",
|
| 204 |
"normalizedText": "Ce qui s'est passé à l'intérieur de l'Amérique, c'est ce que Donald Trump a dit à la secrétaire de l'Assemblée des Nations Unies. Il a dit qu'il allait sortir de l'Amérique et qu'il allait sortir de Syrie.",
|
| 205 |
"confidenceScore": 48,
|
|
|
|
|
|
|
| 206 |
"status": "RED"
|
| 207 |
},
|
| 208 |
{
|
|
@@ -212,15 +268,19 @@
|
|
| 212 |
"transcribedText": "Il y a des atomes qui savent qu'il n'y a pas d'échec dans l'atmosphère. S'il y a de l'eau dans l'atmosphère, ou si il n'y a pas d'eau dans l'atmosphère, il n'y a pas d'échec.",
|
| 213 |
"normalizedText": "Il y a des atomes qui savent qu'il n'y a pas d'échec dans l'atmosphère. S'il y a de l'eau dans l'atmosphère, ou ci il n'y a pas d'eau dans l'atmosphère, il n'y a pas d'échec.",
|
| 214 |
"confidenceScore": 47,
|
|
|
|
|
|
|
| 215 |
"status": "RED"
|
| 216 |
},
|
| 217 |
{
|
| 218 |
"source": "FLEURS",
|
| 219 |
"index": 23,
|
| 220 |
"hfOriginalText": "kaaraange bu andak yaar xarañ ci baal ak mboolo bu mën liggéey taxna ñu genn ak te leerna modoonon mboolo buñu wara daan",
|
| 221 |
-
"transcribedText": "
|
| 222 |
-
"normalizedText": "
|
| 223 |
-
"confidenceScore":
|
|
|
|
|
|
|
| 224 |
"status": "RED"
|
| 225 |
},
|
| 226 |
{
|
|
@@ -230,8 +290,10 @@
|
|
| 230 |
"transcribedText": "J'espère que vous avez apprécié cette vidéo, si c'est le cas n'hésitez pas à vous abonner à ma chaine pour d'autres vidéos.",
|
| 231 |
"normalizedText": "J'espère que vous avez apprécié cette vidéo, ci c'est le cas n'hésitez pas à vous abonner à ma chaine pour d'autres vidéos.",
|
| 232 |
"confidenceScore": 47,
|
|
|
|
|
|
|
| 233 |
"status": "RED"
|
| 234 |
}
|
| 235 |
],
|
| 236 |
-
"updatedAt": "2026-03-07T01:
|
| 237 |
}
|
|
|
|
| 1 |
{
|
| 2 |
+
"totalProcessed": 25,
|
| 3 |
+
"averageConfidence": 39,
|
| 4 |
+
"averageRawWER": 1.0500360995315416,
|
| 5 |
+
"averageNormalizedWER": 1.0483959196214965,
|
| 6 |
+
"dictionaryEfficiency": 0.1562022401684011,
|
| 7 |
"distribution": {
|
| 8 |
"red": {
|
| 9 |
"count": 23,
|
| 10 |
+
"percentage": 92
|
| 11 |
},
|
| 12 |
"orange": {
|
| 13 |
+
"count": 2,
|
| 14 |
+
"percentage": 8
|
| 15 |
},
|
| 16 |
"green": {
|
| 17 |
"count": 0,
|
|
|
|
| 26 |
"transcribedText": "Groyeslande, Bariwul, Woon, Wai, Dek, Sitarikh, Skandinav, Nyongi, Wahni, Erik, Lerouj, Danjukur, Tokholsi, Island, Ngir, Fat, Bakan, Bimuytuki, Ziswau, Silegis, Groyelande, Daldikotude, Groyelande.",
|
| 27 |
"normalizedText": "Groyeslande, Bariwul, Woon, Wai, Dek, Sitarikh, Skandinav, Nyongi, Wahni, Erik, Lerouj, Danjukur, Tokholsi, Island, Ngir, Fat, Bakan, Bimuytuki, Ziswau, Silegis, Groyelande, Daldikotude, Groyelande.",
|
| 28 |
"confidenceScore": 48,
|
| 29 |
+
"rawWER": 0.90625,
|
| 30 |
+
"normalizedWER": 0.90625,
|
| 31 |
"status": "RED"
|
| 32 |
},
|
| 33 |
{
|
|
|
|
| 37 |
"transcribedText": "Si vous avez des questions sur ce bâtiment, vous pouvez m'envoyer un message en disant que je suis là pour vous aider pour qu'on puisse en savoir plus sur ce bâtiment.",
|
| 38 |
"normalizedText": "Ci vous avez des questions sur ce bâtiment, vous pouvez m'envoyer un message en disant que je suis là pour vous aider pour qu'on puisse en savoir plus sur ce bâtiment.",
|
| 39 |
"confidenceScore": 42,
|
| 40 |
+
"rawWER": 1.1923076923076923,
|
| 41 |
+
"normalizedWER": 1.1923076923076923,
|
| 42 |
"status": "RED"
|
| 43 |
},
|
| 44 |
{
|
|
|
|
| 48 |
"transcribedText": "Sous-titres réalisés para la communauté d'Amara.org",
|
| 49 |
"normalizedText": "Sous-titres réalisés para la communauté d'Amara.org",
|
| 50 |
"confidenceScore": 72,
|
| 51 |
+
"rawWER": 1,
|
| 52 |
+
"normalizedWER": 1,
|
| 53 |
"status": "ORANGE"
|
| 54 |
},
|
| 55 |
{
|
| 56 |
"source": "FLEURS",
|
| 57 |
"index": 3,
|
| 58 |
"hfOriginalText": "am na nit ñu yaakaar ne waxoon na dëgg wante nit ñu bare yaakaaru ñu loolu; muy jànt bi dafay wë suuf ci; boole ci jant bi ak yeneen bideew yi",
|
| 59 |
+
"transcribedText": "Il y a des gens qui pensent que c'est vrai, mais il y en a d'autres qui ne pensent pas comme ça. C'est ce que je veux vous montrer dans cette vidéo.",
|
| 60 |
+
"normalizedText": "Il y a des gens qui pensent que c'est vrai, mais il y en a d'autres qui ne pensent pas comme ça. C'est ce que je veux vous montrer dans cette vidéo.",
|
| 61 |
+
"confidenceScore": 42,
|
| 62 |
+
"rawWER": 1.032258064516129,
|
| 63 |
+
"normalizedWER": 1.032258064516129,
|
| 64 |
"status": "RED"
|
| 65 |
},
|
| 66 |
{
|
|
|
|
| 70 |
"transcribedText": "Si bien qu'il n'y a pas de spectre, nous devons l'éliminer pour qu'une personne puisse nous dire qu'elle doit l'éliminer pour que l'équipe puisse s'en sortir.",
|
| 71 |
"normalizedText": "Ci bien qu'il n'y a pas de spectre, nous devons l'éliminer pour qu'une personne puisse nous dire qu'elle doit l'éliminer pour que l'équipe puisse s'en sortir.",
|
| 72 |
"confidenceScore": 43,
|
| 73 |
+
"rawWER": 1,
|
| 74 |
+
"normalizedWER": 0.9655172413793104,
|
| 75 |
"status": "RED"
|
| 76 |
},
|
| 77 |
{
|
| 78 |
"source": "FLEURS",
|
| 79 |
"index": 5,
|
| 80 |
"hfOriginalText": "séni doxalin nirowul ak binék ci suuf biy yamalé tangay bi waye amna doolé ak kamb yu xoot yi ci suuf si glen cushing bu united states geological survey usgs kurelu astrogeology ak northern arizona university nékoon ci flagstaff arizona mooko wax",
|
| 81 |
+
"transcribedText": "Dans cette première page, notamment à l'arrivée d'un extraordinaire tremblement sec, le temps n'irait pas ce seul et nous annonçons les premières informations. Geological Survey, ESGS, Courriel Astrology at Northern Arizona University, Néconci Flash Staff, Arizona, Montcoir.",
|
| 82 |
+
"normalizedText": "Dans cette première page, notamment à l'arrivée d'un extraordinaire tremblement sec, le temps n'irait pas ce seul et nous annonçons les premières informations. Geological Survey, ESGS, Courriel Astrology at Northern Arizona University, Néconci Flash Staff, Arizona, Montcoir.",
|
| 83 |
+
"confidenceScore": 17,
|
| 84 |
+
"rawWER": 0.8571428571428571,
|
| 85 |
+
"normalizedWER": 0.8571428571428571,
|
| 86 |
"status": "RED"
|
| 87 |
},
|
| 88 |
{
|
| 89 |
"source": "FLEURS",
|
| 90 |
"index": 6,
|
| 91 |
"hfOriginalText": "polotiku fomb bi dafay wuute waaye bi weeru màrs di waaja jeex polotiku fomb ndax coronavirus weesuwul suwe 2020 biñu jappee beneen dat ngir olympik yi",
|
| 92 |
+
"transcribedText": "Le public pour le fait de ce cas espérons qu'il regarde profondément ensemble à la société politique.",
|
| 93 |
+
"normalizedText": "Le public pour le fait de ce cas espérons qu'il regarde profondément ensemble à la société politique.",
|
| 94 |
+
"confidenceScore": 7,
|
| 95 |
+
"rawWER": 1,
|
| 96 |
+
"normalizedWER": 1,
|
| 97 |
"status": "RED"
|
| 98 |
},
|
| 99 |
{
|
| 100 |
"source": "FLEURS",
|
| 101 |
"index": 7,
|
| 102 |
"hfOriginalText": "ci atum 1990 yokkoon nañu limu barab yu woorandi yi addina bi am ndax daŋkaafu suufu dezeer bi",
|
| 103 |
+
"transcribedText": "C'est à tout 1.190.000, ce qu'on a fait pour nous, ce qu'on a fait pour nous, pour nous, pour nous, parce qu'on a fait de la paix, de la paix, de la liberté.",
|
| 104 |
+
"normalizedText": "C'est à tout 1.190.000, ce qu'on a fait pour nous, ce qu'on a fait pour nous, pour nous, pour nous, parce qu'on a fait de la paix, de la paix, de la liberté.",
|
| 105 |
+
"confidenceScore": 37,
|
| 106 |
+
"rawWER": 1.8333333333333333,
|
| 107 |
+
"normalizedWER": 1.8333333333333333,
|
| 108 |
"status": "RED"
|
| 109 |
},
|
| 110 |
{
|
| 111 |
"source": "FLEURS",
|
| 112 |
"index": 8,
|
| 113 |
"hfOriginalText": "ñim dem tukki ci dëkk yu bari payum taks mën nañu fa sakkanalee xaalis ci beneen anam ndax sàngara si ak sigaret si fala gëna yombee",
|
| 114 |
+
"transcribedText": "Sous-titres réalisés para la communauté d'Amara.org",
|
| 115 |
+
"normalizedText": "Sous-titres réalisés para la communauté d'Amara.org",
|
| 116 |
+
"confidenceScore": 68,
|
| 117 |
+
"rawWER": 1,
|
| 118 |
+
"normalizedWER": 1,
|
| 119 |
+
"status": "ORANGE"
|
| 120 |
},
|
| 121 |
{
|
| 122 |
"source": "FLEURS",
|
|
|
|
| 125 |
"transcribedText": "A Pia, la capitale de Samoa, il y a des réunions à l'occasion de l'anniversaire de l'anniversaire de Paul.",
|
| 126 |
"normalizedText": "A Pia, la capitale de Samoa, il y a des réunions à l'occasion de l'anniversaire de l'anniversaire de Paul.",
|
| 127 |
"confidenceScore": 37,
|
| 128 |
+
"rawWER": 1,
|
| 129 |
+
"normalizedWER": 1,
|
| 130 |
"status": "RED"
|
| 131 |
},
|
| 132 |
{
|
| 133 |
"source": "FLEURS",
|
| 134 |
"index": 10,
|
| 135 |
"hfOriginalText": "ci mbenuum weer beneen fafalnaaw genn na yoonam ca mashhad te mëkk benn miir rey fukki nit ak juróom ñaar",
|
| 136 |
+
"transcribedText": "Si vous voulez voir d'autres vidéos, n'hésitez pas à vous abonner à ma chaîne.",
|
| 137 |
+
"normalizedText": "Ci vous voulez voir d'autres vidéos, n'hésitez pas à vous abonner à ma chaîne.",
|
| 138 |
+
"confidenceScore": 38,
|
| 139 |
+
"rawWER": 1,
|
| 140 |
+
"normalizedWER": 0.95,
|
| 141 |
+
"status": "RED"
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"source": "FLEURS",
|
| 145 |
+
"index": 11,
|
| 146 |
+
"hfOriginalText": "jarul wax so mënee ab làkkbu waa rom dina gëna yomb ci yaw ngir jàng làkku purtugées",
|
| 147 |
+
"transcribedText": "J'ai l'impression qu'il n'y a pas beaucoup de gens qui parlent portugais.",
|
| 148 |
+
"normalizedText": "J'ai l'impression qu'il n'y a pas beaucoup de gens qui parlent portugais.",
|
| 149 |
+
"confidenceScore": 43,
|
| 150 |
+
"rawWER": 1,
|
| 151 |
+
"normalizedWER": 1,
|
| 152 |
"status": "RED"
|
| 153 |
},
|
| 154 |
{
|
|
|
|
| 158 |
"transcribedText": "S'il n'y a pas de graffitis, il n'a pas d'intérêt.",
|
| 159 |
"normalizedText": "S'il n'y a pas de graffitis, il n'a pas d'intérêt.",
|
| 160 |
"confidenceScore": 39,
|
| 161 |
+
"rawWER": 0.9375,
|
| 162 |
+
"normalizedWER": 0.9375,
|
| 163 |
"status": "RED"
|
| 164 |
},
|
| 165 |
{
|
| 166 |
"source": "FLEURS",
|
| 167 |
"index": 13,
|
| 168 |
"hfOriginalText": "gox bi moo nekkoon itam fiñu daan sukkandiku ngir yeek ci wolkan bu nyiragongo ak yenn ci montaañi gorilla yu gëna yomb yuñuy topp afrik",
|
| 169 |
+
"transcribedText": "Les meunes de wellbeing sont travelers en France, en Great-Britannique, en Jumanie, en Espagne et en Afrique Opticienne",
|
| 170 |
+
"normalizedText": "Les meunes de wellbeing sont travelers en France, en Great-Britannique, en Jumanie, en Espagne et en Afrique Opticienne",
|
| 171 |
+
"confidenceScore": 5,
|
| 172 |
+
"rawWER": 1,
|
| 173 |
+
"normalizedWER": 1,
|
| 174 |
"status": "RED"
|
| 175 |
},
|
| 176 |
{
|
| 177 |
"source": "FLEURS",
|
| 178 |
"index": 14,
|
| 179 |
"hfOriginalText": "aristotle bénn xalaat kat nééna lép lo giss amna bénn wala lu epp gnenti yééf yugnuko défaré suuf l ndox ak safara",
|
| 180 |
+
"transcribedText": "Aristote bena Khalat katnena lep lo gis amna bena wala lo epu nyeti yef yu nyuko defare souf ndokh ak safara",
|
| 181 |
+
"normalizedText": "Aristote bena Khalat katnena lep lo gis amna bena wala lo epu nyeti yef yu nyuko defare souf ndokh ak safara",
|
| 182 |
+
"confidenceScore": 42,
|
| 183 |
+
"rawWER": 0.7727272727272727,
|
| 184 |
+
"normalizedWER": 0.7727272727272727,
|
| 185 |
"status": "RED"
|
| 186 |
},
|
| 187 |
{
|
|
|
|
| 191 |
"transcribedText": "Gymnastique de l'Amérique et de l'Ouest, c'est ce que nous faisons. Nous faisons de la gymnastique et d'autres activités pour que les jeunes et les adultes puissent s'entraîner bien et bien.",
|
| 192 |
"normalizedText": "Gymnastique de l'Amérique et de l'Ouest, c'est ce que nous faisons. Nous faisons de la gymnastique et d'autres activités pour que les jeunes et les adultes puissent s'entraîner bien et bien.",
|
| 193 |
"confidenceScore": 40,
|
| 194 |
+
"rawWER": 1.0333333333333334,
|
| 195 |
+
"normalizedWER": 1.0333333333333334,
|
| 196 |
"status": "RED"
|
| 197 |
},
|
| 198 |
{
|
| 199 |
"source": "FLEURS",
|
| 200 |
"index": 16,
|
| 201 |
"hfOriginalText": "ndéem ak parku nasiyonal yu afrig du sud yepp am na ay waxtaan bés bu né ak fay ngir dug ci bërëb bi",
|
| 202 |
+
"transcribedText": "Ndeem ac parkou, nasional you afric du sud yep, amna ay wakhtan bes boune ak fay ngir lugusi berebi.",
|
| 203 |
+
"normalizedText": "Ndeem ac parkou, nasional you afric du sud yep, amna ay wakhtan bes boune ak fey ngir lugusi berebi.",
|
| 204 |
+
"confidenceScore": 37,
|
| 205 |
+
"rawWER": 0.7391304347826086,
|
| 206 |
+
"normalizedWER": 0.782608695652174,
|
| 207 |
"status": "RED"
|
| 208 |
},
|
| 209 |
{
|
| 210 |
"source": "FLEURS",
|
| 211 |
"index": 17,
|
| 212 |
"hfOriginalText": "njiitu poliis bi chandra shekhar solanki wax na ni kiñu tuumal dafa ñëw ci tirbinaal bi ak kanam guñu nëbb",
|
| 213 |
+
"transcribedText": "La police de Guéthoube, Chandra Chekta Solanky, a dit qu'elle n'est pas sûre de son arrivée au tribunal et qu'elle n'a pas d'information.",
|
| 214 |
+
"normalizedText": "La police de Guéthoube, Chandra Chekta Solanky, a dit qu'elle n'est pas sûre de son arrivée au tribunal et qu'elle n'a pas d'information.",
|
| 215 |
+
"confidenceScore": 44,
|
| 216 |
+
"rawWER": 1.1,
|
| 217 |
+
"normalizedWER": 1.1,
|
| 218 |
"status": "RED"
|
| 219 |
},
|
| 220 |
{
|
| 221 |
"source": "FLEURS",
|
| 222 |
"index": 18,
|
| 223 |
"hfOriginalText": "ba tey ci bëj-gannar dem leen xooli sanktiyeer bu mag bi ci notre-dame de fatima sanktiyeer barab bu bu keemane bu mariyaama feeñ te ñu xam ko ci addina bi yépp",
|
| 224 |
+
"transcribedText": "Bataille de Bette Garnard, allez voir Sankitierre Bumac, la ville de Notre-Dame de Fatima. Sankitierre, c'est là qu'est Maria Maffeigne et nous le connaissons tous.",
|
| 225 |
+
"normalizedText": "Bataille de Bette Garnard, allez voir Sankitierre Bumac, la ville de Notre-Dame de Fatima. Sankitierre, c'est là qu'est Maria Maffeigne et nous le connaissons tous.",
|
| 226 |
+
"confidenceScore": 43,
|
| 227 |
+
"rawWER": 0.9032258064516129,
|
| 228 |
+
"normalizedWER": 0.9032258064516129,
|
| 229 |
"status": "RED"
|
| 230 |
},
|
| 231 |
{
|
| 232 |
"source": "FLEURS",
|
| 233 |
"index": 19,
|
| 234 |
"hfOriginalText": "situ xibaar ak begal xol bu tmz bu waxna ni photographe bi moo taxawal otoom ci beneen wetu yoon wu mag wii di sepulveda ba noppi bëggoon koo foto ci barab bi polisié yi di taxaw laata muy jeggi tali bi ba noppi dem yoonam loolu moo waral polisié bu californie bi taxawal auto yi ñaari yoon ngir may ko mu jeggi dem dellusi",
|
| 235 |
+
"transcribedText": "C'est ce que j'ai appris à l'université de Témzé, c'est qu'il y avait une photo d'un homme en voiture, dans un autre endroit, et qu'il se trouvait là-bas. Ils voulaient qu'il y ait une photo avec les policiers pour qu'ils puissent voir l'homme et qu'ils puissent y aller. C'est ce que j'ai appris. Les policiers de Californie se sont retrouvés là-bas, avec deux hommes, dans un autre endroit. C'est ce que j'ai appris à l'université de Témzé.",
|
| 236 |
+
"normalizedText": "C'est ce que j'ai appris à l'université de Témzé, c'est qu'il y avait une photo d'un homme en voiture, dans un autre endroit, et qu'il se trouvait là-bas. Ils voulaient qu'il y ait une photo avec les policiers pour qu'ils puissent voir l'homme et qu'ils puissent y aller. C'est ce que j'ai appris. Les policiers de Californie se sont retrouvés là-bas, avec deux hommes, dans un autre endroit. C'est ce que j'ai appris à l'université de Témzé.",
|
| 237 |
+
"confidenceScore": 46,
|
| 238 |
+
"rawWER": 1.1875,
|
| 239 |
+
"normalizedWER": 1.1875,
|
| 240 |
"status": "RED"
|
| 241 |
},
|
| 242 |
{
|
|
|
|
| 246 |
"transcribedText": "Comme nous l'avons dit il y a quelques années, dans le domaine de la science-fiction, il y a eu beaucoup d'événements informatiques qui ont fait que les gens ont commencé à s'intégrer et à s'adapter à la science-fiction.",
|
| 247 |
"normalizedText": "Comme nous l'avons dit il y a quelques années, dans le domaine de la science-fiction, il y a eu beaucoup d'événements informatiques qui ont fait que les gens ont commencé à s'intégrer et à s'adapter à la science-fiction.",
|
| 248 |
"confidenceScore": 41,
|
| 249 |
+
"rawWER": 1.027027027027027,
|
| 250 |
+
"normalizedWER": 1.027027027027027,
|
| 251 |
"status": "RED"
|
| 252 |
},
|
| 253 |
{
|
|
|
|
| 257 |
"transcribedText": "Ce qui s'est passé à l'intérieur de l'Amérique, c'est ce que Donald Trump a dit à la secrétaire de l'Assemblée des Nations Unies. Il a dit qu'il allait sortir de l'Amérique et qu'il allait sortir de Syrie.",
|
| 258 |
"normalizedText": "Ce qui s'est passé à l'intérieur de l'Amérique, c'est ce que Donald Trump a dit à la secrétaire de l'Assemblée des Nations Unies. Il a dit qu'il allait sortir de l'Amérique et qu'il allait sortir de Syrie.",
|
| 259 |
"confidenceScore": 48,
|
| 260 |
+
"rawWER": 1.0625,
|
| 261 |
+
"normalizedWER": 1.0625,
|
| 262 |
"status": "RED"
|
| 263 |
},
|
| 264 |
{
|
|
|
|
| 268 |
"transcribedText": "Il y a des atomes qui savent qu'il n'y a pas d'échec dans l'atmosphère. S'il y a de l'eau dans l'atmosphère, ou si il n'y a pas d'eau dans l'atmosphère, il n'y a pas d'échec.",
|
| 269 |
"normalizedText": "Il y a des atomes qui savent qu'il n'y a pas d'échec dans l'atmosphère. S'il y a de l'eau dans l'atmosphère, ou ci il n'y a pas d'eau dans l'atmosphère, il n'y a pas d'échec.",
|
| 270 |
"confidenceScore": 47,
|
| 271 |
+
"rawWER": 1.6666666666666667,
|
| 272 |
+
"normalizedWER": 1.6666666666666667,
|
| 273 |
"status": "RED"
|
| 274 |
},
|
| 275 |
{
|
| 276 |
"source": "FLEURS",
|
| 277 |
"index": 23,
|
| 278 |
"hfOriginalText": "kaaraange bu andak yaar xarañ ci baal ak mboolo bu mën liggéey taxna ñu genn ak te leerna modoonon mboolo buñu wara daan",
|
| 279 |
+
"transcribedText": "Qu'ils prennent c'est encourager et la conduire located à la véritable onde de cette zone.",
|
| 280 |
+
"normalizedText": "Qu'ils prennent c'est encourager et la conduire located à la véritable onde de cette zone.",
|
| 281 |
+
"confidenceScore": 4,
|
| 282 |
+
"rawWER": 1,
|
| 283 |
+
"normalizedWER": 1,
|
| 284 |
"status": "RED"
|
| 285 |
},
|
| 286 |
{
|
|
|
|
| 290 |
"transcribedText": "J'espère que vous avez apprécié cette vidéo, si c'est le cas n'hésitez pas à vous abonner à ma chaine pour d'autres vidéos.",
|
| 291 |
"normalizedText": "J'espère que vous avez apprécié cette vidéo, ci c'est le cas n'hésitez pas à vous abonner à ma chaine pour d'autres vidéos.",
|
| 292 |
"confidenceScore": 47,
|
| 293 |
+
"rawWER": 1,
|
| 294 |
+
"normalizedWER": 1,
|
| 295 |
"status": "RED"
|
| 296 |
}
|
| 297 |
],
|
| 298 |
+
"updatedAt": "2026-03-07T01:14:15.768Z"
|
| 299 |
}
|
apps/api/package.json
CHANGED
|
@@ -17,6 +17,7 @@
|
|
| 17 |
"axios": "^1.13.5",
|
| 18 |
"bullmq": "^5.1.0",
|
| 19 |
"dotenv": "^16.4.7",
|
|
|
|
| 20 |
"fastify": "^4.0.0",
|
| 21 |
"fastify-plugin": "^4.5.1",
|
| 22 |
"ioredis": "^5.9.3",
|
|
@@ -29,6 +30,7 @@
|
|
| 29 |
"devDependencies": {
|
| 30 |
"@repo/tsconfig": "workspace:*",
|
| 31 |
"@types/dotenv": "^8.2.3",
|
|
|
|
| 32 |
"@types/node": "^20.0.0",
|
| 33 |
"tsx": "^3.0.0",
|
| 34 |
"typescript": "^5.0.0"
|
|
|
|
| 17 |
"axios": "^1.13.5",
|
| 18 |
"bullmq": "^5.1.0",
|
| 19 |
"dotenv": "^16.4.7",
|
| 20 |
+
"fast-levenshtein": "^3.0.0",
|
| 21 |
"fastify": "^4.0.0",
|
| 22 |
"fastify-plugin": "^4.5.1",
|
| 23 |
"ioredis": "^5.9.3",
|
|
|
|
| 30 |
"devDependencies": {
|
| 31 |
"@repo/tsconfig": "workspace:*",
|
| 32 |
"@types/dotenv": "^8.2.3",
|
| 33 |
+
"@types/fast-levenshtein": "^0.0.4",
|
| 34 |
"@types/node": "^20.0.0",
|
| 35 |
"tsx": "^3.0.0",
|
| 36 |
"typescript": "^5.0.0"
|
apps/api/src/scripts/calibrate-whisper.ts
CHANGED
|
@@ -2,6 +2,7 @@ import 'dotenv/config';
|
|
| 2 |
import fs from 'fs';
|
| 3 |
import path from 'path';
|
| 4 |
import { execSync } from 'child_process';
|
|
|
|
| 5 |
import { aiService } from '../services/ai';
|
| 6 |
import { normalizeWolof } from './normalizeWolof';
|
| 7 |
|
|
@@ -10,6 +11,34 @@ const STATS_PATH = path.join(DATA_DIR, 'calibration_stats.json');
|
|
| 10 |
const HF_SAMPLES_PATH = path.join(DATA_DIR, 'hf_samples.json');
|
| 11 |
const PY_SCRIPT = path.join(__dirname, 'fetch_hf_audio.py');
|
| 12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
export async function runCalibration() {
|
| 14 |
console.log("🚀 Starting Whisper Confidence Calibration Stress-Test...");
|
| 15 |
|
|
@@ -43,6 +72,8 @@ export async function runCalibration() {
|
|
| 43 |
let orangeCount = 0;
|
| 44 |
let greenCount = 0;
|
| 45 |
let totalConfidence = 0;
|
|
|
|
|
|
|
| 46 |
|
| 47 |
let totalProcessed = 0;
|
| 48 |
|
|
@@ -58,7 +89,13 @@ export async function runCalibration() {
|
|
| 58 |
// Normalize
|
| 59 |
const normResult = normalizeWolof(text);
|
| 60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
totalConfidence += confidence;
|
|
|
|
|
|
|
| 62 |
totalProcessed++;
|
| 63 |
|
| 64 |
if (confidence <= 50) redCount++;
|
|
@@ -72,6 +109,8 @@ export async function runCalibration() {
|
|
| 72 |
transcribedText: text,
|
| 73 |
normalizedText: normResult.normalizedText,
|
| 74 |
confidenceScore: confidence,
|
|
|
|
|
|
|
| 75 |
status: confidence <= 50 ? 'RED' : confidence <= 80 ? 'ORANGE' : 'GREEN'
|
| 76 |
});
|
| 77 |
|
|
@@ -81,10 +120,22 @@ export async function runCalibration() {
|
|
| 81 |
}
|
| 82 |
|
| 83 |
const averageConfidence = totalProcessed > 0 ? Math.round(totalConfidence / totalProcessed) : 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
|
| 85 |
const stats = {
|
| 86 |
totalProcessed,
|
| 87 |
averageConfidence,
|
|
|
|
|
|
|
|
|
|
| 88 |
distribution: {
|
| 89 |
red: { count: redCount, percentage: totalProcessed ? Math.round((redCount / totalProcessed) * 100) : 0 },
|
| 90 |
orange: { count: orangeCount, percentage: totalProcessed ? Math.round((orangeCount / totalProcessed) * 100) : 0 },
|
|
@@ -97,6 +148,8 @@ export async function runCalibration() {
|
|
| 97 |
fs.writeFileSync(STATS_PATH, JSON.stringify(stats, null, 2));
|
| 98 |
console.log(`\n✅ Calibration finished! Stats saved to ${STATS_PATH}`);
|
| 99 |
console.log(`Average Confidence: ${averageConfidence}%`);
|
|
|
|
|
|
|
| 100 |
console.log(`Red (<=50%): ${redCount} | Orange (51-80%): ${orangeCount} | Green (>80%): ${greenCount}`);
|
| 101 |
}
|
| 102 |
|
|
|
|
| 2 |
import fs from 'fs';
|
| 3 |
import path from 'path';
|
| 4 |
import { execSync } from 'child_process';
|
| 5 |
+
import levenshtein from 'fast-levenshtein';
|
| 6 |
import { aiService } from '../services/ai';
|
| 7 |
import { normalizeWolof } from './normalizeWolof';
|
| 8 |
|
|
|
|
| 11 |
const HF_SAMPLES_PATH = path.join(DATA_DIR, 'hf_samples.json');
|
| 12 |
const PY_SCRIPT = path.join(__dirname, 'fetch_hf_audio.py');
|
| 13 |
|
| 14 |
+
/**
|
| 15 |
+
* Computes Word Error Rate (WER) using Levenshtein distance on words.
|
| 16 |
+
* WER = (Substitutions + Deletions + Insertions) / Total Reference Words
|
| 17 |
+
*/
|
| 18 |
+
function calculateWER(reference: string, hypothesis: string): number {
|
| 19 |
+
const refWords = reference.toLowerCase().replace(/[.,/#!$%^&*;:{}=\-_`~()]/g, "").split(/\s+/).filter(w => w);
|
| 20 |
+
const hypWords = hypothesis.toLowerCase().replace(/[.,/#!$%^&*;:{}=\-_`~()]/g, "").split(/\s+/).filter(w => w);
|
| 21 |
+
|
| 22 |
+
if (refWords.length === 0) return 0;
|
| 23 |
+
|
| 24 |
+
// Map words to unique characters to use fast-levenshtein (which expects strings)
|
| 25 |
+
const wordMap = new Map<string, string>();
|
| 26 |
+
let charCode = 0xE000; // Use Private Use Area characters
|
| 27 |
+
|
| 28 |
+
const getChar = (word: string) => {
|
| 29 |
+
if (!wordMap.has(word)) {
|
| 30 |
+
wordMap.set(word, String.fromCharCode(charCode++));
|
| 31 |
+
}
|
| 32 |
+
return wordMap.get(word)!;
|
| 33 |
+
};
|
| 34 |
+
|
| 35 |
+
const refChars = refWords.map(getChar).join('');
|
| 36 |
+
const hypChars = hypWords.map(getChar).join('');
|
| 37 |
+
|
| 38 |
+
const distance = levenshtein.get(refChars, hypChars);
|
| 39 |
+
return distance / refWords.length;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
export async function runCalibration() {
|
| 43 |
console.log("🚀 Starting Whisper Confidence Calibration Stress-Test...");
|
| 44 |
|
|
|
|
| 72 |
let orangeCount = 0;
|
| 73 |
let greenCount = 0;
|
| 74 |
let totalConfidence = 0;
|
| 75 |
+
let totalRawWER = 0;
|
| 76 |
+
let totalNormWER = 0;
|
| 77 |
|
| 78 |
let totalProcessed = 0;
|
| 79 |
|
|
|
|
| 89 |
// Normalize
|
| 90 |
const normResult = normalizeWolof(text);
|
| 91 |
|
| 92 |
+
// Compute WER
|
| 93 |
+
const rawWER = calculateWER(sample.original_text, text);
|
| 94 |
+
const normWER = calculateWER(sample.original_text, normResult.normalizedText);
|
| 95 |
+
|
| 96 |
totalConfidence += confidence;
|
| 97 |
+
totalRawWER += rawWER;
|
| 98 |
+
totalNormWER += normWER;
|
| 99 |
totalProcessed++;
|
| 100 |
|
| 101 |
if (confidence <= 50) redCount++;
|
|
|
|
| 109 |
transcribedText: text,
|
| 110 |
normalizedText: normResult.normalizedText,
|
| 111 |
confidenceScore: confidence,
|
| 112 |
+
rawWER,
|
| 113 |
+
normalizedWER: normWER,
|
| 114 |
status: confidence <= 50 ? 'RED' : confidence <= 80 ? 'ORANGE' : 'GREEN'
|
| 115 |
});
|
| 116 |
|
|
|
|
| 120 |
}
|
| 121 |
|
| 122 |
const averageConfidence = totalProcessed > 0 ? Math.round(totalConfidence / totalProcessed) : 0;
|
| 123 |
+
const averageRawWER = totalProcessed > 0 ? totalRawWER / totalProcessed : 0;
|
| 124 |
+
const averageNormalizedWER = totalProcessed > 0 ? totalNormWER / totalProcessed : 0;
|
| 125 |
+
|
| 126 |
+
// Calculate Dictionary Efficiency (Improvement in WER relative to Raw WER)
|
| 127 |
+
let dictionaryEfficiency = 0;
|
| 128 |
+
if (averageRawWER > 0) {
|
| 129 |
+
// If WER goes down, efficiency is positive.
|
| 130 |
+
dictionaryEfficiency = ((averageRawWER - averageNormalizedWER) / averageRawWER) * 100;
|
| 131 |
+
}
|
| 132 |
|
| 133 |
const stats = {
|
| 134 |
totalProcessed,
|
| 135 |
averageConfidence,
|
| 136 |
+
averageRawWER,
|
| 137 |
+
averageNormalizedWER,
|
| 138 |
+
dictionaryEfficiency,
|
| 139 |
distribution: {
|
| 140 |
red: { count: redCount, percentage: totalProcessed ? Math.round((redCount / totalProcessed) * 100) : 0 },
|
| 141 |
orange: { count: orangeCount, percentage: totalProcessed ? Math.round((orangeCount / totalProcessed) * 100) : 0 },
|
|
|
|
| 148 |
fs.writeFileSync(STATS_PATH, JSON.stringify(stats, null, 2));
|
| 149 |
console.log(`\n✅ Calibration finished! Stats saved to ${STATS_PATH}`);
|
| 150 |
console.log(`Average Confidence: ${averageConfidence}%`);
|
| 151 |
+
console.log(`Raw WER: ${(averageRawWER * 100).toFixed(2)}% | Normalized WER: ${(averageNormalizedWER * 100).toFixed(2)}%`);
|
| 152 |
+
console.log(`Dictionary Efficiency Gain: ${dictionaryEfficiency.toFixed(2)}%`);
|
| 153 |
console.log(`Red (<=50%): ${redCount} | Orange (51-80%): ${orangeCount} | Green (>80%): ${greenCount}`);
|
| 154 |
}
|
| 155 |
|
pnpm-lock.yaml
CHANGED
|
@@ -93,6 +93,9 @@ importers:
|
|
| 93 |
dotenv:
|
| 94 |
specifier: ^16.4.7
|
| 95 |
version: 16.6.1
|
|
|
|
|
|
|
|
|
|
| 96 |
fastify:
|
| 97 |
specifier: ^4.0.0
|
| 98 |
version: 4.29.1
|
|
@@ -124,6 +127,9 @@ importers:
|
|
| 124 |
'@types/dotenv':
|
| 125 |
specifier: ^8.2.3
|
| 126 |
version: 8.2.3
|
|
|
|
|
|
|
|
|
|
| 127 |
'@types/node':
|
| 128 |
specifier: ^20.0.0
|
| 129 |
version: 20.19.33
|
|
@@ -1405,6 +1411,9 @@ packages:
|
|
| 1405 |
'@types/estree@1.0.8':
|
| 1406 |
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
|
| 1407 |
|
|
|
|
|
|
|
|
|
|
| 1408 |
'@types/node-cron@3.0.11':
|
| 1409 |
resolution: {integrity: sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==}
|
| 1410 |
|
|
@@ -1833,6 +1842,9 @@ packages:
|
|
| 1833 |
fast-json-stringify@5.16.1:
|
| 1834 |
resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==}
|
| 1835 |
|
|
|
|
|
|
|
|
|
|
| 1836 |
fast-querystring@1.1.2:
|
| 1837 |
resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
|
| 1838 |
|
|
@@ -1846,6 +1858,10 @@ packages:
|
|
| 1846 |
resolution: {integrity: sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==}
|
| 1847 |
hasBin: true
|
| 1848 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1849 |
fastify-plugin@4.5.1:
|
| 1850 |
resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==}
|
| 1851 |
|
|
@@ -4214,6 +4230,8 @@ snapshots:
|
|
| 4214 |
|
| 4215 |
'@types/estree@1.0.8': {}
|
| 4216 |
|
|
|
|
|
|
|
| 4217 |
'@types/node-cron@3.0.11': {}
|
| 4218 |
|
| 4219 |
'@types/node-fetch@2.6.13':
|
|
@@ -4684,6 +4702,10 @@ snapshots:
|
|
| 4684 |
json-schema-ref-resolver: 1.0.1
|
| 4685 |
rfdc: 1.4.1
|
| 4686 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4687 |
fast-querystring@1.1.2:
|
| 4688 |
dependencies:
|
| 4689 |
fast-decode-uri-component: 1.0.1
|
|
@@ -4696,6 +4718,8 @@ snapshots:
|
|
| 4696 |
dependencies:
|
| 4697 |
strnum: 2.1.2
|
| 4698 |
|
|
|
|
|
|
|
| 4699 |
fastify-plugin@4.5.1: {}
|
| 4700 |
|
| 4701 |
fastify@4.29.1:
|
|
|
|
| 93 |
dotenv:
|
| 94 |
specifier: ^16.4.7
|
| 95 |
version: 16.6.1
|
| 96 |
+
fast-levenshtein:
|
| 97 |
+
specifier: ^3.0.0
|
| 98 |
+
version: 3.0.0
|
| 99 |
fastify:
|
| 100 |
specifier: ^4.0.0
|
| 101 |
version: 4.29.1
|
|
|
|
| 127 |
'@types/dotenv':
|
| 128 |
specifier: ^8.2.3
|
| 129 |
version: 8.2.3
|
| 130 |
+
'@types/fast-levenshtein':
|
| 131 |
+
specifier: ^0.0.4
|
| 132 |
+
version: 0.0.4
|
| 133 |
'@types/node':
|
| 134 |
specifier: ^20.0.0
|
| 135 |
version: 20.19.33
|
|
|
|
| 1411 |
'@types/estree@1.0.8':
|
| 1412 |
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
|
| 1413 |
|
| 1414 |
+
'@types/fast-levenshtein@0.0.4':
|
| 1415 |
+
resolution: {integrity: sha512-tkDveuitddQCxut1Db8eEFfMahTjOumTJGPHmT9E7KUH+DkVq9WTpVvlfenf3S+uCBeu8j5FP2xik/KfxOEjeA==}
|
| 1416 |
+
|
| 1417 |
'@types/node-cron@3.0.11':
|
| 1418 |
resolution: {integrity: sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==}
|
| 1419 |
|
|
|
|
| 1842 |
fast-json-stringify@5.16.1:
|
| 1843 |
resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==}
|
| 1844 |
|
| 1845 |
+
fast-levenshtein@3.0.0:
|
| 1846 |
+
resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==}
|
| 1847 |
+
|
| 1848 |
fast-querystring@1.1.2:
|
| 1849 |
resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
|
| 1850 |
|
|
|
|
| 1858 |
resolution: {integrity: sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==}
|
| 1859 |
hasBin: true
|
| 1860 |
|
| 1861 |
+
fastest-levenshtein@1.0.16:
|
| 1862 |
+
resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
|
| 1863 |
+
engines: {node: '>= 4.9.1'}
|
| 1864 |
+
|
| 1865 |
fastify-plugin@4.5.1:
|
| 1866 |
resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==}
|
| 1867 |
|
|
|
|
| 4230 |
|
| 4231 |
'@types/estree@1.0.8': {}
|
| 4232 |
|
| 4233 |
+
'@types/fast-levenshtein@0.0.4': {}
|
| 4234 |
+
|
| 4235 |
'@types/node-cron@3.0.11': {}
|
| 4236 |
|
| 4237 |
'@types/node-fetch@2.6.13':
|
|
|
|
| 4702 |
json-schema-ref-resolver: 1.0.1
|
| 4703 |
rfdc: 1.4.1
|
| 4704 |
|
| 4705 |
+
fast-levenshtein@3.0.0:
|
| 4706 |
+
dependencies:
|
| 4707 |
+
fastest-levenshtein: 1.0.16
|
| 4708 |
+
|
| 4709 |
fast-querystring@1.1.2:
|
| 4710 |
dependencies:
|
| 4711 |
fast-decode-uri-component: 1.0.1
|
|
|
|
| 4718 |
dependencies:
|
| 4719 |
strnum: 2.1.2
|
| 4720 |
|
| 4721 |
+
fastest-levenshtein@1.0.16: {}
|
| 4722 |
+
|
| 4723 |
fastify-plugin@4.5.1: {}
|
| 4724 |
|
| 4725 |
fastify@4.29.1:
|