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 CHANGED
@@ -1,14 +1,17 @@
1
  {
2
- "totalProcessed": 24,
3
- "averageConfidence": 33,
 
 
 
4
  "distribution": {
5
  "red": {
6
  "count": 23,
7
- "percentage": 96
8
  },
9
  "orange": {
10
- "count": 1,
11
- "percentage": 4
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 beaucoup d'autres qui ne pensent pas comme ça. C'est ce que j'ai essayé d'expliquer dans cette vidéo.",
51
- "normalizedText": "Il y a des gens qui pensent que c'est vrai, mais il y a beaucoup d'autres qui ne pensent pas comme ça. C'est ce que j'ai essayé d'expliquer dans cette vidéo.",
52
- "confidenceScore": 43,
 
 
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": "D'autres proches, une notion au nom d'une partie de ces industries c'est, les Thangais, qui ont quand même créé ces ouves pratiques. Glenn), le Produit de la Prachinath anschiné, Un collage géologique USGS et l'Astrologie du Corail à l'Université d'Arizona, Flashtaff, Arizona",
69
- "normalizedText": "D'autres proches, une notion au nom d'une partie de ces industries c'est, les Thangais, qui ont quand même créé ces ouves pratiques. Glenn), le Produit de la Prachinath anschiné, Un collage géologique USGS et l'Astrologie du Corail à l'Université d'Arizona, Flashtaff, Arizona",
70
- "confidenceScore": 7,
 
 
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": "Pour le monde, la politique est majeure, mais l'accent sur son finans à la politique s'est fait avec le coronavirus et les grosses entreprises qui nous ont poussé au spectacle est difficile.",
78
- "normalizedText": "Pour le monde, la politique est majeure, mais l'accent sur son finans à la politique s'est fait avec le coronavirus et les grosses entreprises qui nous ont poussé au spectacle est difficile.",
79
- "confidenceScore": 6,
 
 
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": "rencies milieux sont États-Unis, Mexico, Syrie, Hamoum, Burma, Algérie, Tata guide des batailles d'ondes. Qu'est-ce qu'ils ont fait ?",
87
- "normalizedText": "Rencies milieux sont États-Unis, Mexico, Syrie, Hamoum, Burma, Algérie, Tata guide des batailles d'ondes. Qu'est-ce qu'ils ont fait ?",
88
- "confidenceScore": 5,
 
 
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": "J'ai des images allant de l'espace tel qu'on en a temporairement sur les images là-bas.",
96
- "normalizedText": "J'ai des images allant de l'espace tel qu'on en a temporairement sur les images là-bas.",
97
- "confidenceScore": 5,
98
- "status": "RED"
 
 
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 tu veux voir une autre vidéo, abonne-toi à ma chaîne et n'oublies pas de t'abonner à ma chaîne pour ne manquer aucune de mes nouvelles vidéos.",
114
- "normalizedText": "Ci tu veux voir une autre vidéo, abonne-toi à ma chaîne et n'oublies pas de t'abonner à ma chaîne pour ne manquer aucune de mes nouvelles vidéos.",
115
- "confidenceScore": 42,
 
 
 
 
 
 
 
 
 
 
 
 
 
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": "maintenant nous allons voir la soleil c'est le deuxième jour il y a plein de soleil dans cette montagne fette. De plus il ne GOIT pas",
132
- "normalizedText": "Maintenant nous allons voir la soleil c'est le deuxième jour il y a plein de soleil dans cette montagne fette. De plus il ne GOIT pas",
133
- "confidenceScore": 6,
 
 
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 Behn a calculé que tout ce qui n'existe pas dans le monde ou vivant d'hier n'est qu'une queue sur terre dans l'univers. Sauf le ciel et le chemin.",
141
- "normalizedText": "Aristote Behn a calculé que tout ce qui n'existe pas dans le monde ou vivant d'hier n'est qu'une queue sur terre dans l'univers. Sauf le ciel et le chemin.",
142
- "confidenceScore": 10,
 
 
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": "N'est pas parcours national de l'Afrique du Sud, il y a des choses que je voudrais divulguer et dóler ces raisons-là.",
159
- "normalizedText": "N'est pas parcours national de l'Afrique du Sud, il y a des choses que je voudrais divulguer et dóler ces raisons-là.",
160
- "confidenceScore": 15,
 
 
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 Giotou, Chandra Shekta Solanky, a dit qu'elle n'est pas sûre de son arrivée au tribunal et qu'elle ne veut pas qu'on l'appelle.",
168
- "normalizedText": "La police de Giotou, Chandra Shekta Solanky, a dit qu'elle n'est pas sûre de son arrivée au tribunal et qu'elle ne veut pas qu'on l'appelle.",
169
- "confidenceScore": 43,
 
 
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 Bach-Gadnard, allez voir Sanky-Thier-Bou-Mac dans Notre-Dame-de-Fatima. Sanky-Thier-Barabou-Kemane-Bou-Maria-Mafégne, nous le connaissons tous.",
177
- "normalizedText": "Bataille de Bach-Gadnard, allez voir Sanky-Thier-Bou-Mac dans Notre-Dame-de-Fatima. Sanky-Thier-Barabou-Kemane-Bou-Maria-Mafégne, nous le connaissons tous.",
178
- "confidenceScore": 47,
 
 
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, à l'endroit où il se trouvait. 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 ont donné 2 millions d'euros à Michael Mujégidem Delussi.",
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, à l'endroit où il se trouvait. 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 ont donné 2 millions d'euros à Michael Mujégidem Delussi.",
187
- "confidenceScore": 43,
 
 
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": "Si on entre en objectif, il est impossible de ne pas s'occupier de l'argent et la métier de voyageur à la destination.",
222
- "normalizedText": "Ci on entre en objectif, il est impossible de ne pas s'occupier de l'argent et la métier de voyageur à la destination.",
223
- "confidenceScore": 5,
 
 
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:05:05.141Z"
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: