vietnamese-phonetic-transcript 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,768 @@
1
+ //#region src/phonetic_transcript/phonetic_transcript.ts
2
+ const initialList = [
3
+ {
4
+ phoneme: "b-",
5
+ character: "b"
6
+ },
7
+ {
8
+ phoneme: "m-",
9
+ character: "m"
10
+ },
11
+ {
12
+ phoneme: "f-",
13
+ character: "ph"
14
+ },
15
+ {
16
+ phoneme: "v-",
17
+ character: "v"
18
+ },
19
+ {
20
+ phoneme: "tʼ-",
21
+ character: "th"
22
+ },
23
+ {
24
+ phoneme: "ʈ-",
25
+ character: "tr"
26
+ },
27
+ {
28
+ phoneme: "t-",
29
+ character: "t"
30
+ },
31
+ {
32
+ phoneme: "d-",
33
+ character: "đ"
34
+ },
35
+ {
36
+ phoneme: "ɲ-",
37
+ character: "nh"
38
+ },
39
+ {
40
+ phoneme: "ŋ-",
41
+ character: "ngh",
42
+ main: [
43
+ "-i-",
44
+ "-e-",
45
+ "-ɛ-",
46
+ "-ie-"
47
+ ]
48
+ },
49
+ {
50
+ phoneme: "ŋ-",
51
+ character: "ng"
52
+ },
53
+ {
54
+ phoneme: "n-",
55
+ character: "n"
56
+ },
57
+ {
58
+ phoneme: "z-",
59
+ character: "d"
60
+ },
61
+ {
62
+ phoneme: "z-",
63
+ character: "gi"
64
+ },
65
+ {
66
+ phoneme: "ʐ-",
67
+ character: "r"
68
+ },
69
+ {
70
+ phoneme: "s-",
71
+ character: "x"
72
+ },
73
+ {
74
+ phoneme: "ʂ-",
75
+ character: "s"
76
+ },
77
+ {
78
+ phoneme: "l-",
79
+ character: "l"
80
+ },
81
+ {
82
+ phoneme: "χ-",
83
+ character: "kh"
84
+ },
85
+ {
86
+ phoneme: "c-",
87
+ character: "ch"
88
+ },
89
+ {
90
+ phoneme: "k-",
91
+ character: "k",
92
+ main: [
93
+ "-i-",
94
+ "-e-",
95
+ "-ɛ-",
96
+ "-ie-"
97
+ ]
98
+ },
99
+ {
100
+ phoneme: "k-",
101
+ character: "q",
102
+ medial: ["-u-"]
103
+ },
104
+ {
105
+ phoneme: "k-",
106
+ character: "c"
107
+ },
108
+ {
109
+ phoneme: "ɣ-",
110
+ character: "gh",
111
+ main: [
112
+ "-i-",
113
+ "-e-",
114
+ "-ɛ-",
115
+ "-ie-"
116
+ ]
117
+ },
118
+ {
119
+ phoneme: "ɣ-",
120
+ character: "g"
121
+ },
122
+ {
123
+ phoneme: "h-",
124
+ character: "h"
125
+ }
126
+ ];
127
+ const medialList = [{
128
+ phoneme: "-u-",
129
+ character: "u",
130
+ initial: ["k-"],
131
+ main: [
132
+ "-i-",
133
+ "-e-",
134
+ "-ɤ-",
135
+ "-ɤ-",
136
+ "-ie-"
137
+ ]
138
+ }, {
139
+ phoneme: "-u-",
140
+ character: "o"
141
+ }];
142
+ const mainList = [
143
+ {
144
+ phoneme: "-i-",
145
+ character: "y",
146
+ medial: ["-u-", "zero"],
147
+ initial: ["zero"],
148
+ final: ["zero"]
149
+ },
150
+ {
151
+ phoneme: "-i-",
152
+ character: "i"
153
+ },
154
+ {
155
+ phoneme: "-e-",
156
+ character: "ê"
157
+ },
158
+ {
159
+ phoneme: "-ɛ-",
160
+ character: "e"
161
+ },
162
+ {
163
+ phoneme: "-ɯ-",
164
+ character: "ư"
165
+ },
166
+ {
167
+ phoneme: "-ɤ-",
168
+ character: "ơ"
169
+ },
170
+ {
171
+ phoneme: "-a-",
172
+ character: "a"
173
+ },
174
+ {
175
+ phoneme: "-u-",
176
+ character: "u"
177
+ },
178
+ {
179
+ phoneme: "-o-",
180
+ character: "ô"
181
+ },
182
+ {
183
+ phoneme: "-o-",
184
+ character: "ôô"
185
+ },
186
+ {
187
+ phoneme: "-ɔ-",
188
+ character: "o"
189
+ },
190
+ {
191
+ phoneme: "-ɔ-",
192
+ character: "oo"
193
+ },
194
+ {
195
+ phoneme: "-ɤ-",
196
+ character: "â"
197
+ },
198
+ {
199
+ phoneme: "-ɛ-",
200
+ character: "a"
201
+ },
202
+ {
203
+ phoneme: "-ă-",
204
+ character: "a",
205
+ final: ["-w", "-j"]
206
+ },
207
+ {
208
+ phoneme: "-ă-",
209
+ character: "ă"
210
+ },
211
+ {
212
+ phoneme: "-ɔ-",
213
+ character: "o",
214
+ final: ["-ŋ", "-k"]
215
+ },
216
+ {
217
+ phoneme: "-ie-",
218
+ character: "iê",
219
+ notFinal: ["zero"],
220
+ medial: ["zero"]
221
+ },
222
+ {
223
+ phoneme: "-ie-",
224
+ character: "yê",
225
+ notFinal: ["zero"],
226
+ medial: ["-u-"],
227
+ initial: ["zero"]
228
+ },
229
+ {
230
+ phoneme: "-ie-",
231
+ character: "ia",
232
+ final: ["zero"],
233
+ medial: ["zero"]
234
+ },
235
+ {
236
+ phoneme: "-ie-",
237
+ character: "ya",
238
+ final: ["zero"],
239
+ medial: ["-u-"]
240
+ },
241
+ {
242
+ phoneme: "-ɯɤ-",
243
+ character: "ươ",
244
+ notFinal: ["zero"]
245
+ },
246
+ {
247
+ phoneme: "-ɯɤ-",
248
+ character: "ưa",
249
+ final: ["zero"]
250
+ },
251
+ {
252
+ phoneme: "-uo-",
253
+ character: "uô",
254
+ notFinal: ["zero"]
255
+ },
256
+ {
257
+ phoneme: "-uo-",
258
+ character: "ua",
259
+ final: ["zero"]
260
+ }
261
+ ];
262
+ const finalList = [
263
+ {
264
+ phoneme: "-m",
265
+ character: "m"
266
+ },
267
+ {
268
+ phoneme: "-n",
269
+ character: "n"
270
+ },
271
+ {
272
+ phoneme: "-p",
273
+ character: "p"
274
+ },
275
+ {
276
+ phoneme: "-t",
277
+ character: "t"
278
+ },
279
+ {
280
+ phoneme: "-ŋ",
281
+ character: "nh",
282
+ main: [
283
+ "-i-",
284
+ "-e-",
285
+ "-ɛ-"
286
+ ]
287
+ },
288
+ {
289
+ phoneme: "-ŋ",
290
+ character: "ng"
291
+ },
292
+ {
293
+ phoneme: "-k",
294
+ character: "ch",
295
+ main: [
296
+ "-i-",
297
+ "-e-",
298
+ "-ɛ-"
299
+ ]
300
+ },
301
+ {
302
+ phoneme: "-k",
303
+ character: "c"
304
+ },
305
+ {
306
+ phoneme: "-w",
307
+ character: "o",
308
+ main: ["-a-", "-ɛ-"]
309
+ },
310
+ {
311
+ phoneme: "-w",
312
+ character: "u"
313
+ },
314
+ {
315
+ phoneme: "-j",
316
+ character: "y",
317
+ main: ["-ă-", "-ɤ-"]
318
+ },
319
+ {
320
+ phoneme: "-j",
321
+ character: "i"
322
+ }
323
+ ];
324
+ const toneMarkList = [
325
+ {
326
+ character: "a",
327
+ originalCharacter: "a",
328
+ toneMark: 1
329
+ },
330
+ {
331
+ character: "à",
332
+ originalCharacter: "a",
333
+ toneMark: 2
334
+ },
335
+ {
336
+ character: "ã",
337
+ originalCharacter: "a",
338
+ toneMark: 3
339
+ },
340
+ {
341
+ character: "ả",
342
+ originalCharacter: "a",
343
+ toneMark: 4
344
+ },
345
+ {
346
+ character: "á",
347
+ originalCharacter: "a",
348
+ toneMark: 5
349
+ },
350
+ {
351
+ character: "ạ",
352
+ originalCharacter: "a",
353
+ toneMark: 6
354
+ },
355
+ {
356
+ character: "ă",
357
+ originalCharacter: "ă",
358
+ toneMark: 1
359
+ },
360
+ {
361
+ character: "ằ",
362
+ originalCharacter: "ă",
363
+ toneMark: 2
364
+ },
365
+ {
366
+ character: "ẵ",
367
+ originalCharacter: "ă",
368
+ toneMark: 3
369
+ },
370
+ {
371
+ character: "ẳ",
372
+ originalCharacter: "ă",
373
+ toneMark: 4
374
+ },
375
+ {
376
+ character: "ắ",
377
+ originalCharacter: "ă",
378
+ toneMark: 5
379
+ },
380
+ {
381
+ character: "ặ",
382
+ originalCharacter: "ă",
383
+ toneMark: 6
384
+ },
385
+ {
386
+ character: "â",
387
+ originalCharacter: "â",
388
+ toneMark: 1
389
+ },
390
+ {
391
+ character: "ầ",
392
+ originalCharacter: "â",
393
+ toneMark: 2
394
+ },
395
+ {
396
+ character: "ẫ",
397
+ originalCharacter: "â",
398
+ toneMark: 3
399
+ },
400
+ {
401
+ character: "ẩ",
402
+ originalCharacter: "â",
403
+ toneMark: 4
404
+ },
405
+ {
406
+ character: "ấ",
407
+ originalCharacter: "â",
408
+ toneMark: 5
409
+ },
410
+ {
411
+ character: "ậ",
412
+ originalCharacter: "â",
413
+ toneMark: 6
414
+ },
415
+ {
416
+ character: "e",
417
+ originalCharacter: "e",
418
+ toneMark: 1
419
+ },
420
+ {
421
+ character: "è",
422
+ originalCharacter: "e",
423
+ toneMark: 2
424
+ },
425
+ {
426
+ character: "ẽ",
427
+ originalCharacter: "e",
428
+ toneMark: 3
429
+ },
430
+ {
431
+ character: "ẻ",
432
+ originalCharacter: "e",
433
+ toneMark: 4
434
+ },
435
+ {
436
+ character: "é",
437
+ originalCharacter: "e",
438
+ toneMark: 5
439
+ },
440
+ {
441
+ character: "ẹ",
442
+ originalCharacter: "e",
443
+ toneMark: 6
444
+ },
445
+ {
446
+ character: "ê",
447
+ originalCharacter: "ê",
448
+ toneMark: 1
449
+ },
450
+ {
451
+ character: "ề",
452
+ originalCharacter: "ê",
453
+ toneMark: 2
454
+ },
455
+ {
456
+ character: "ễ",
457
+ originalCharacter: "ê",
458
+ toneMark: 3
459
+ },
460
+ {
461
+ character: "ể",
462
+ originalCharacter: "ê",
463
+ toneMark: 4
464
+ },
465
+ {
466
+ character: "ế",
467
+ originalCharacter: "ê",
468
+ toneMark: 5
469
+ },
470
+ {
471
+ character: "ệ",
472
+ originalCharacter: "ê",
473
+ toneMark: 6
474
+ },
475
+ {
476
+ character: "i",
477
+ originalCharacter: "i",
478
+ toneMark: 1
479
+ },
480
+ {
481
+ character: "ì",
482
+ originalCharacter: "i",
483
+ toneMark: 2
484
+ },
485
+ {
486
+ character: "ĩ",
487
+ originalCharacter: "i",
488
+ toneMark: 3
489
+ },
490
+ {
491
+ character: "ỉ",
492
+ originalCharacter: "i",
493
+ toneMark: 4
494
+ },
495
+ {
496
+ character: "í",
497
+ originalCharacter: "i",
498
+ toneMark: 5
499
+ },
500
+ {
501
+ character: "ị",
502
+ originalCharacter: "i",
503
+ toneMark: 6
504
+ },
505
+ {
506
+ character: "o",
507
+ originalCharacter: "o",
508
+ toneMark: 1
509
+ },
510
+ {
511
+ character: "ò",
512
+ originalCharacter: "o",
513
+ toneMark: 2
514
+ },
515
+ {
516
+ character: "õ",
517
+ originalCharacter: "o",
518
+ toneMark: 3
519
+ },
520
+ {
521
+ character: "ỏ",
522
+ originalCharacter: "o",
523
+ toneMark: 4
524
+ },
525
+ {
526
+ character: "ó",
527
+ originalCharacter: "o",
528
+ toneMark: 5
529
+ },
530
+ {
531
+ character: "ọ",
532
+ originalCharacter: "o",
533
+ toneMark: 6
534
+ },
535
+ {
536
+ character: "ô",
537
+ originalCharacter: "ô",
538
+ toneMark: 1
539
+ },
540
+ {
541
+ character: "ồ",
542
+ originalCharacter: "ô",
543
+ toneMark: 2
544
+ },
545
+ {
546
+ character: "ỗ",
547
+ originalCharacter: "ô",
548
+ toneMark: 3
549
+ },
550
+ {
551
+ character: "ổ",
552
+ originalCharacter: "ô",
553
+ toneMark: 4
554
+ },
555
+ {
556
+ character: "ố",
557
+ originalCharacter: "ô",
558
+ toneMark: 5
559
+ },
560
+ {
561
+ character: "ộ",
562
+ originalCharacter: "ô",
563
+ toneMark: 6
564
+ },
565
+ {
566
+ character: "ơ",
567
+ originalCharacter: "ơ",
568
+ toneMark: 1
569
+ },
570
+ {
571
+ character: "ờ",
572
+ originalCharacter: "ơ",
573
+ toneMark: 2
574
+ },
575
+ {
576
+ character: "ỡ",
577
+ originalCharacter: "ơ",
578
+ toneMark: 3
579
+ },
580
+ {
581
+ character: "ở",
582
+ originalCharacter: "ơ",
583
+ toneMark: 4
584
+ },
585
+ {
586
+ character: "ớ",
587
+ originalCharacter: "ơ",
588
+ toneMark: 5
589
+ },
590
+ {
591
+ character: "ợ",
592
+ originalCharacter: "ơ",
593
+ toneMark: 6
594
+ },
595
+ {
596
+ character: "u",
597
+ originalCharacter: "u",
598
+ toneMark: 1
599
+ },
600
+ {
601
+ character: "ù",
602
+ originalCharacter: "u",
603
+ toneMark: 2
604
+ },
605
+ {
606
+ character: "ũ",
607
+ originalCharacter: "u",
608
+ toneMark: 3
609
+ },
610
+ {
611
+ character: "ủ",
612
+ originalCharacter: "u",
613
+ toneMark: 4
614
+ },
615
+ {
616
+ character: "ú",
617
+ originalCharacter: "u",
618
+ toneMark: 5
619
+ },
620
+ {
621
+ character: "ụ",
622
+ originalCharacter: "u",
623
+ toneMark: 6
624
+ },
625
+ {
626
+ character: "ư",
627
+ originalCharacter: "ư",
628
+ toneMark: 1
629
+ },
630
+ {
631
+ character: "ừ",
632
+ originalCharacter: "ư",
633
+ toneMark: 2
634
+ },
635
+ {
636
+ character: "ữ",
637
+ originalCharacter: "ư",
638
+ toneMark: 3
639
+ },
640
+ {
641
+ character: "ử",
642
+ originalCharacter: "ư",
643
+ toneMark: 4
644
+ },
645
+ {
646
+ character: "ứ",
647
+ originalCharacter: "ư",
648
+ toneMark: 5
649
+ },
650
+ {
651
+ character: "ự",
652
+ originalCharacter: "ư",
653
+ toneMark: 6
654
+ },
655
+ {
656
+ character: "y",
657
+ originalCharacter: "y",
658
+ toneMark: 1
659
+ },
660
+ {
661
+ character: "ỳ",
662
+ originalCharacter: "y",
663
+ toneMark: 2
664
+ },
665
+ {
666
+ character: "ỹ",
667
+ originalCharacter: "y",
668
+ toneMark: 3
669
+ },
670
+ {
671
+ character: "ỷ",
672
+ originalCharacter: "y",
673
+ toneMark: 4
674
+ },
675
+ {
676
+ character: "ý",
677
+ originalCharacter: "y",
678
+ toneMark: 5
679
+ },
680
+ {
681
+ character: "ỵ",
682
+ originalCharacter: "y",
683
+ toneMark: 6
684
+ }
685
+ ];
686
+ function transcriptToString(transcript) {
687
+ if (!transcript.main || !transcript.toneMark) throw new Error("Invalid phonetic transcript");
688
+ return ((transcript.initial?.replaceAll("-", "") ?? "") || "") + ((transcript?.medial?.replaceAll("-", "") ?? "") || "") + transcript.main.replaceAll("-", "") + ((transcript.final?.replaceAll("-", "") ?? "") || "") + transcript.toneMark.toString();
689
+ }
690
+ function buildPhoneticTranscript(word) {
691
+ word = word.toLowerCase();
692
+ const transcript = { toneMark: 1 };
693
+ toneMarkList.forEach((toneMark) => {
694
+ if (toneMark.toneMark !== 1 && word.includes(toneMark.character)) {
695
+ transcript.toneMark = toneMark.toneMark;
696
+ word = word.replace(toneMark.character, toneMark.originalCharacter);
697
+ }
698
+ });
699
+ initialList.forEach((initial) => {
700
+ if (word.startsWith(initial.character) && word.length - initial.character.length > 0) {
701
+ transcript.initial = initial.phoneme;
702
+ transcript.initialCharacter = initial.character;
703
+ word = word.slice(initial.character.length);
704
+ }
705
+ });
706
+ finalList.forEach((final) => {
707
+ if (word.endsWith(final.character) && word.length - final.character.length > 0) {
708
+ transcript.final = final.phoneme;
709
+ transcript.finalCharacter = final.character;
710
+ word = word.slice(0, word.length - final.character.length);
711
+ }
712
+ });
713
+ if (word.length > 1 && word !== "oo") {
714
+ if (word.startsWith("u") && (transcript.initialCharacter === "q" || [
715
+ "y",
716
+ "i",
717
+ "ê",
718
+ "ơ",
719
+ "â",
720
+ "iê",
721
+ "yê",
722
+ "ia",
723
+ "ya"
724
+ ].includes(word.slice(1)))) {
725
+ transcript.medial = medialList[0].phoneme;
726
+ transcript.medialCharacter = medialList[0].character;
727
+ word = word.slice(1);
728
+ } else if (word.startsWith("o")) {
729
+ transcript.medial = medialList[1].phoneme;
730
+ transcript.medialCharacter = medialList[1].character;
731
+ word = word.slice(1);
732
+ }
733
+ }
734
+ if (word === "o" && transcript.finalCharacter !== void 0 && [
735
+ "nh",
736
+ "ng",
737
+ "ch",
738
+ "c"
739
+ ].includes(transcript.finalCharacter)) {
740
+ const main = mainList.filter((main) => main.phoneme === "-ɔ-");
741
+ transcript.main = main[0].phoneme;
742
+ transcript.mainCharacter = main[0].character;
743
+ word = word.slice(1);
744
+ } else mainList.forEach((main) => {
745
+ if (word === main.character) {
746
+ transcript.main = main.phoneme;
747
+ transcript.mainCharacter = main.character;
748
+ word = word.slice(main.character.length);
749
+ }
750
+ });
751
+ return transcript;
752
+ }
753
+ function phoneticTranscriptWord(word) {
754
+ return word.replaceAll(/\p{L}+/gu, (word) => {
755
+ try {
756
+ return transcriptToString(buildPhoneticTranscript(word));
757
+ } catch {
758
+ return word;
759
+ }
760
+ });
761
+ }
762
+ function phoneticTranscriptSentence(sentence) {
763
+ return sentence.split(" ").map((word) => phoneticTranscriptWord(word)).join(" ");
764
+ }
765
+ //#endregion
766
+ export { phoneticTranscriptSentence, phoneticTranscriptWord };
767
+
768
+ //# sourceMappingURL=index.mjs.map