vietnamese-phonetic-transcript 1.0.0

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/LICENSE.md ADDED
@@ -0,0 +1,33 @@
1
+ # Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License
2
+
3
+ By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
4
+
5
+ ## Section 1 – Definitions.
6
+
7
+ - **Licensed Material**: the artistic or literary work, database, or other material to which the Licensor applied this Public License.
8
+ - **Licensor**: the individual(s) or entity(ies) granting rights under this Public License.
9
+ - **You**: the individual or entity exercising the Licensed Rights under this Public License.
10
+ - **Share**: to provide material to the public by any means or process.
11
+ - **Adapted Material**: material derived from or modified based on the Licensed Material.
12
+ - **NonCommercial**: not primarily intended for or directed towards commercial advantage or monetary compensation.
13
+
14
+ ## Section 2 – Scope.
15
+
16
+ ### 2.1 License Grant
17
+
18
+ Subject to the terms of this Public License, the Licensor grants You a worldwide, royalty-free, non-exclusive, irrevocable license to:
19
+
20
+ - **Share**: copy and redistribute the Licensed Material in any medium or format.
21
+ - **Adapt**: remix, transform, and build upon the Licensed Material.
22
+
23
+ ### 2.2 Conditions
24
+
25
+ - **Attribution (BY)**: You must give appropriate credit, provide a link to the license, and indicate if changes were made.
26
+ - **NonCommercial (NC)**: You may **not** use the material for commercial purposes.
27
+ - **ShareAlike (SA)**: If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
28
+
29
+ ## Section 3 – Disclaimer.
30
+
31
+ The Licensed Material is provided "as-is" without any warranties or guarantees. The Licensor is not liable for any damages arising from its use.
32
+
33
+ **Full License Text:** [Creative Commons License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode)
package/README.md ADDED
@@ -0,0 +1,314 @@
1
+ <div align="center">
2
+
3
+ <h1>vietnamese-phonetic-transcript</h1>
4
+
5
+ <p>
6
+ Vietnamese Phonetic Transcript
7
+ </p>
8
+
9
+ <!-- Badges -->
10
+ <p>
11
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/graphs/contributors">
12
+ <img src="https://img.shields.io/github/contributors/DuckyMomo20012/vietnamese-phonetic-transcript" alt="contributors" />
13
+ </a>
14
+ <a href="">
15
+ <img src="https://img.shields.io/github/last-commit/DuckyMomo20012/vietnamese-phonetic-transcript" alt="last update" />
16
+ </a>
17
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/network/members">
18
+ <img src="https://img.shields.io/github/forks/DuckyMomo20012/vietnamese-phonetic-transcript" alt="forks" />
19
+ </a>
20
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/stargazers">
21
+ <img src="https://img.shields.io/github/stars/DuckyMomo20012/vietnamese-phonetic-transcript" alt="stars" />
22
+ </a>
23
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/issues/">
24
+ <img src="https://img.shields.io/github/issues/DuckyMomo20012/vietnamese-phonetic-transcript" alt="open issues" />
25
+ </a>
26
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/blob/main/LICENSE.md">
27
+ <img src="https://img.shields.io/github/license/DuckyMomo20012/vietnamese-phonetic-transcript.svg" alt="license" />
28
+ </a>
29
+ </p>
30
+
31
+ <h4>
32
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/">View Demo</a>
33
+ <span> · </span>
34
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript">Documentation</a>
35
+ <span> · </span>
36
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/issues/">Report Bug</a>
37
+ <span> · </span>
38
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/issues/">Request Feature</a>
39
+ </h4>
40
+ </div>
41
+
42
+ <br />
43
+
44
+ <!-- Table of Contents -->
45
+
46
+ # :notebook_with_decorative_cover: Table of Contents
47
+
48
+ - [Getting Started](#toolbox-getting-started)
49
+ - [Prerequisites](#bangbang-prerequisites)
50
+ - [Run Locally](#running-run-locally)
51
+ - [Usage](#eyes-usage)
52
+ - [Bảng phiên âm âm vị học Tiếng Việt](#bảng-phiên-âm-âm-vị-học-tiếng-việt)
53
+ - [Hệ thống âm đầu](#hệ-thống-âm-đầu)
54
+ - [Hệ thống âm đệm](#hệ-thống-âm-đệm)
55
+ - [Hệ thống âm chính](#hệ-thống-âm-chính)
56
+ - [Hệ thống âm cuối](#hệ-thống-âm-cuối)
57
+ - [Contributing](#wave-contributing)
58
+ - [Code of Conduct](#scroll-code-of-conduct)
59
+ - [License](#warning-license)
60
+ - [Contact](#handshake-contact)
61
+
62
+ <!-- Getting Started -->
63
+
64
+ ## :toolbox: Getting Started
65
+
66
+ <!-- Prerequisites -->
67
+
68
+ ### :bangbang: Prerequisites
69
+
70
+ - This project uses [pnpm](https://pnpm.io/) as package manager:
71
+
72
+ ```bash
73
+ npm install --global pnpm
74
+ ```
75
+
76
+ <!-- Run Locally -->
77
+
78
+ ### :running: Run Locally
79
+
80
+ Clone the project:
81
+
82
+ ```bash
83
+ git clone https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript.git
84
+ ```
85
+
86
+ Go to the project directory:
87
+
88
+ ```bash
89
+ cd vietnamese-phonetic-transcript
90
+ ```
91
+
92
+ Install dependencies:
93
+
94
+ ```bash
95
+ pnpm install
96
+ ```
97
+
98
+ <!-- Usage -->
99
+
100
+ ## :eyes: Usage
101
+
102
+ ### Bảng phiên âm âm vị học Tiếng Việt
103
+
104
+ #### Hệ thống âm đầu
105
+
106
+ Hệ thống âm đầu: 22 phụ âm
107
+
108
+ | STT | Âm vị | Chữ viết (+ bối cảnh sử dụng) | Ví dụ |
109
+ | --- | ---------------- | --------------------------------------------- | ------------------- |
110
+ | 1 | /b-/ | b | bè bạn |
111
+ | 2 | /m-/ | m | mệt mỏi |
112
+ | 3 | /f-/ | ph | phờ phạc |
113
+ | 4 | /v-/ | v | vờ vĩnh |
114
+ | 5 | /t-/ | t | tí tẹo |
115
+ | 6 | /tʼ-/ | th | tha thướt |
116
+ | 7 | /d-/ | đ | đủng đỉnh |
117
+ | 8 | /n-/ | n | no nê |
118
+ | 9 | /z-/ | d/gi | giầy da, bánh dầy |
119
+ | 10 | /ʐ-/ | r | rườm rà |
120
+ | 11 | /s-/ | x | xa xôi |
121
+ | 12 | /ʂ-/ | s | san sẻ |
122
+ | 13 | /c-/ | ch | chim chóc |
123
+ | 14 | /ʈ-/ | tr | trang trại |
124
+ | 15 | /ɲ-/ | nh | nhí nhảnh |
125
+ | 16 | /l-/ | l | lươn lẹo |
126
+ | 17 | /k-/ | k (+ âm chính: /-i-/, /-e-/, /-ɛ-/, /-ie-/) | kim, kê, kẻ, kiếm |
127
+ | 17 | /k-/ | q (+ âm đệm: /-u-/) | quả, quýt, quê |
128
+ | 17 | /k-/ | c (còn lại) | con, cà, cuống |
129
+ | 18 | /χ-/ | kh | khắt khe |
130
+ | 19 | /ŋ-/ | ngh (+ âm chính: /-i-/, /-e-/, /-ɛ-/, /-ie-/) | nghĩ, nghèo, nghiền |
131
+ | 19 | /ŋ-/ | ng (còn lại) | ngố, ngáo, ngõ |
132
+ | 20 | /ɣ-/ | gh (+ âm chính: /-i-/, /-e-/, /-ɛ-/, /-ie-/) | ghi, ghẻ, ghê |
133
+ | 20 | /ɣ-/ | g (còn lại) | gà, gỗ, gụ |
134
+ | 21 | /h-/ | h | hát hò |
135
+ | 22 | /ʔ-/ hoặc /zero/ | không thể hiện | ăn, uống, uể, oải |
136
+
137
+ #### Hệ thống âm đệm
138
+
139
+ Hệ thống âm đệm: 2 bán nguyên âm
140
+
141
+ | STT | Âm vị | Chữ viết (+ bối cảnh sử dụng) | Ví dụ |
142
+ | --- | ----------------- | --------------------------------------------------- | --------------------------------------- |
143
+ | 1 | /-w-/ hoặc /-u-/ | u (+ âm đầu: /k-/ (ghi bằng con chữ "q")) | quê, quả, quán, quyên, quăn, quận, quốc |
144
+ | 1 | /-w-/ hoặc /-u-/ | u (+ âm chính: /-i-/, /-e-/, /-ɤ-/, /-ɤ-/, /-ie-/) | huy, huế, huơ, huân, huyền |
145
+ | 1 | /-w-/ hoặc /-u-/ | o (các trường hợp còn lại) | hoa, hoe, hoác, họa hoằn |
146
+ | 2 | /zero/ | không thể hiện | hể hả, hiền, hương |
147
+
148
+ > [!NOTE]
149
+ > Toàn bộ tài liệu sẽ sử dụng /-u-/ để biểu diễn âm đệm này.
150
+
151
+ #### Hệ thống âm chính
152
+
153
+ Hệ thống âm chính: 13 nguyên âm đơn, 3 nguyên âm đôi
154
+
155
+ | STT | Âm vị | Chữ viết (+ bối cảnh sử dụng) | Ví dụ |
156
+ | --- | ------ | --------------------------------------------------------------- | ------------------------------------ |
157
+ | 1 | /-i-/ | y (+ âm đệm: /-u-/ hoặc âm đầu, âm đệm, âm cuối đều là /zero/) | huy, thúy, quýt, ý (kiến), thoát (y) |
158
+ | 1 | /-i-/ | i (còn lại) | im, đi, nhìn, mình |
159
+ | 2 | /-e-/ | ê | lên, bên, tênh |
160
+ | 3 | /-ɛ-/ | e | em, mẹ, kém |
161
+ | 4 | /-ɯ-/ | ư | từ, chữ, từng |
162
+ | 5 | /-ɤ-/ | ơ | trơn, mơ, lớp |
163
+ | 6 | /-a-/ | a | má, mái, qua, lại |
164
+ | 7 | /-u-/ | u | dù, súng |
165
+ | 8 | /-o-/ | ô | cổ, bốn, bông |
166
+ | 8 | /-o-/ | ôô (ít) | bôông |
167
+ | 9 | /-ɔ-/ | o | con, có, đói |
168
+ | 9 | /-ɔ-/ | oo (ít) | xoong |
169
+ | 10 | /-ɤ-/ | â | trần, sân, tầng |
170
+ | 11 | /-ɛ-/ | a | anh ách, nhanh nhách |
171
+ | 12 | /-ă-/ | a (+ âm cuối: /-w/, /-j/) | rau, tay, quay |
172
+ | 12 | /-ă-/ | ă (còn lại) | ăn năn, chăn, đắng |
173
+ | 13 | /-ɔ-/ | o (+ âm cuối: /-ŋ/, /-k/) | ong óc, mong, móc |
174
+ | 14 | /-ie-/ | iê (+ âm cuối khác /zero/, âm đệm /zero/) | biển, biếng |
175
+ | 14 | /-ie-/ | yê (+ âm cuối khác /zero/, âm đệm /-u-/ hoặc âm đầu /ʔ/) | khuyên, yếu, yểng, yểm |
176
+ | 14 | /-ie-/ | ia (+ âm cuối /zero/, âm đệm /zero/) | bia, mía, tía |
177
+ | 14 | /-ie-/ | ya (+ âm cuối /zero/, âm đệm /-u-/) | khuya, tuya |
178
+ | 15 | /-ɯɤ-/ | ươ (+ âm cuối khác /zero/) | ưỡn, lươn, bướng, hươu |
179
+ | 15 | /-ɯɤ-/ | ưa (+ âm cuối /zero/) | mưa, ưa, chừa |
180
+ | 16 | /-uo-/ | uô (+ âm cuối khác /zero/) | buồn, uống |
181
+ | 16 | /-uo-/ | ua (+ âm cuối /zero/) | ùa, chùa |
182
+
183
+ #### Hệ thống âm cuối
184
+
185
+ Hệ thống âm cuối: 6 phụ âm, 2 bán nguyên âm
186
+
187
+ | STT | Âm vị | Chữ viết (+ bối cảnh sử dụng) | Ví dụ |
188
+ | --- | ------ | --------------------------------------- | ----------------------------------- |
189
+ | 1 | /-m/ | m | ôm, nam, nem |
190
+ | 2 | /-n/ | n | ôn, nan, nến |
191
+ | 3 | /-p/ | p | ốp, hấp |
192
+ | 4 | /-t/ | t | tắt, hất |
193
+ | 5 | /-ŋ/ | nh (sau âm chính: /-i-/, /-e-/, /-ɛ-/) | inh, ênh, anh, xinh, mệnh, xanh |
194
+ | 5 | /-ŋ/ | ng (còn lại) | ong, ông, ung, ưng, kèng, kiểng |
195
+ | 6 | /-k/ | ch (sau âm chính: /-i-/, /-e-/, /-ɛ-/) | ich, ếch, ách, thích, chệch, bạch |
196
+ | 6 | /-k/ | c (còn lại) | óc, úc, ác, cóc, cúc, các, lắc, nấc |
197
+ | 7 | /-w/ | o (sau âm chính: /-a-/, /-ɛ-/) | áo, éo, báo, béo |
198
+ | 7 | /-w/ | u (còn lại) | au, eo, êu, iu, cháu, kêu, chịu |
199
+ | 8 | /-j/ | y (sau âm chính: /-ă-/, /-ɤ-/) | cáy, cấy |
200
+ | 8 | /-j/ | i (còn lại) | cái, ngoái, cưới, cuối |
201
+ | 9 | /zero/ | không thể hiện | bà, bố, mẹ |
202
+
203
+ ### Syllable Analysis
204
+
205
+ This project includes a script to analyze Vietnamese syllables from a text file
206
+ and validate them using phonetic transcription.
207
+
208
+ To run the analysis, use the following command:
209
+
210
+ ```bash
211
+ npx tsx src/syllable_analysis.ts
212
+ ```
213
+
214
+ Result:
215
+
216
+ - Dictionary (all lines): 8,010
217
+ - Valid syllables (transcribable): 7,413
218
+
219
+ - Theoretical combinations: 151,632
220
+ \[27 initials\] × \[3 glides\] × \[24 nuclei\] × \[13 codas\] × \[6 tones\]
221
+
222
+ - Comparisons:
223
+ - Valid vs Dictionary: 92.5%
224
+ - Valid vs Theoretical: 4.89%
225
+ - Dictionary vs Theoretical: 5.28%
226
+
227
+ - Differences:
228
+ - Non-transcribable entries: 597
229
+ - Missing from dictionary: 143,622
230
+
231
+ ---
232
+
233
+ Why Only 7413 Syllables of Dictionary Entries Are Transcribable?
234
+
235
+ 1. Foreign Words in the Dictionary
236
+
237
+ - Words like: accordeon, acid, albumin, alpha, ampere, antimon, aspirin, atlas.
238
+ These are borrowed/foreign words that don't follow Vietnamese phonological
239
+ rules.
240
+ - Your transcript system correctly rejects them as non-Vietnamese syllables.
241
+
242
+ 2. Technical/Scientific Terms
243
+
244
+ - Chemical compounds: aminoacid, ammoniac, amoniac.
245
+ - Technical terms: atlat, atmotphe, apatit.
246
+ - These often retain foreign pronunciation patterns.
247
+
248
+ 3. Abbreviations & Special Cases
249
+
250
+ - Shortened forms: al, ag, as.
251
+ - Currency codes: afghani, balboa, birr.
252
+ - Brand names and proper nouns.
253
+
254
+ Why Only 1.2% of Theoretical Combinations Exist?
255
+
256
+ 1. Phonological Constraints
257
+
258
+ - Not all consonant-vowel-tone combinations are pronounceable in Vietnamese.
259
+ - Vietnamese has strict rules about which sounds can combine.
260
+ - Example: Some initial consonants cannot precede certain vowels.
261
+
262
+ 2. Lexical Gaps
263
+
264
+ - Even if a combination is pronounceable, it might not form a meaningful word.
265
+ - Vietnamese vocabulary has evolved historically, leaving gaps in the sound
266
+ space.
267
+
268
+ 3. Tonal Restrictions
269
+
270
+ - Some vowel-consonant combinations are restricted to certain tones.
271
+ - Checked syllables (ending in -p, -t, -c, -ch) can only have tones 1 and 5.
272
+
273
+ 4. Historical Language Evolution
274
+
275
+ - Vietnamese has lost some syllables over time.
276
+ - Sound changes have eliminated certain combinations.
277
+ - Modern Vietnamese is more constrained than the theoretical maximum.
278
+
279
+ <!-- Contributing -->
280
+
281
+ ## :wave: Contributing
282
+
283
+ <a href="https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript/graphs/contributors">
284
+ <img src="https://contrib.rocks/image?repo=DuckyMomo20012/vietnamese-phonetic-transcript" />
285
+ </a>
286
+
287
+ Contributions are always welcome!
288
+
289
+ Please read the [contribution guidelines](./CONTRIBUTING.md).
290
+
291
+ <!-- Code of Conduct -->
292
+
293
+ ### :scroll: Code of Conduct
294
+
295
+ Please read the [Code of Conduct](./CODE_OF_CONDUCT.md).
296
+
297
+ <!-- License -->
298
+
299
+ ## :warning: License
300
+
301
+ This project is licensed under the **Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)** License.
302
+
303
+ [![License: CC BY-NC-SA 4.0](https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png)](https://creativecommons.org/licenses/by-nc-sa/4.0/).
304
+
305
+ See the **[LICENSE.md](./LICENSE.md)** file for full details.
306
+
307
+ <!-- Contact -->
308
+
309
+ ## :handshake: Contact
310
+
311
+ Duong Vinh - [@duckymomo20012](https://twitter.com/duckymomo20012) -
312
+ tienvinh.duong4@gmail.com
313
+
314
+ Project Link: [https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript](https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript).
package/dist/index.cjs ADDED
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // lib/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ phoneticTranscriptSentence: () => phoneticTranscriptSentence,
24
+ phoneticTranscriptWord: () => phoneticTranscriptWord
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+
28
+ // lib/phonetic_transcript/phonetic_transcript.ts
29
+ var initialList = [
30
+ { phoneme: "b-", character: "b" },
31
+ { phoneme: "m-", character: "m" },
32
+ { phoneme: "f-", character: "ph" },
33
+ { phoneme: "v-", character: "v" },
34
+ { phoneme: "t\u02BC-", character: "th" },
35
+ { phoneme: "\u0288-", character: "tr" },
36
+ { phoneme: "t-", character: "t" },
37
+ { phoneme: "d-", character: "\u0111" },
38
+ { phoneme: "\u0272-", character: "nh" },
39
+ { phoneme: "\u014B-", character: "ngh", main: ["-i-", "-e-", "-\u025B-", "-ie-"] },
40
+ { phoneme: "\u014B-", character: "ng" },
41
+ { phoneme: "n-", character: "n" },
42
+ { phoneme: "z-", character: "d" },
43
+ { phoneme: "z-", character: "gi" },
44
+ { phoneme: "\u0290-", character: "r" },
45
+ { phoneme: "s-", character: "x" },
46
+ { phoneme: "\u0282-", character: "s" },
47
+ { phoneme: "l-", character: "l" },
48
+ { phoneme: "\u03C7-", character: "kh" },
49
+ { phoneme: "c-", character: "ch" },
50
+ { phoneme: "k-", character: "k", main: ["-i-", "-e-", "-\u025B-", "-ie-"] },
51
+ { phoneme: "k-", character: "q", medial: ["-u\uE608-"] },
52
+ { phoneme: "k-", character: "c" },
53
+ { phoneme: "\u0263-", character: "gh", main: ["-i-", "-e-", "-\u025B-", "-ie-"] },
54
+ { phoneme: "\u0263-", character: "g" },
55
+ { phoneme: "h-", character: "h" }
56
+ ];
57
+ var medialList = [
58
+ {
59
+ phoneme: "-u\uE608-",
60
+ character: "u",
61
+ initial: ["k-"],
62
+ main: ["-i-", "-e-", "-\u0264-", "-\u0264\uE60C-", "-ie-"]
63
+ },
64
+ {
65
+ phoneme: "-u\uE608-",
66
+ character: "o"
67
+ }
68
+ ];
69
+ var mainList = [
70
+ {
71
+ phoneme: "-i-",
72
+ character: "y",
73
+ medial: ["-u\uE608-", "zero"],
74
+ initial: ["zero"],
75
+ final: ["zero"]
76
+ },
77
+ { phoneme: "-i-", character: "i" },
78
+ { phoneme: "-e-", character: "\xEA" },
79
+ { phoneme: "-\u025B-", character: "e" },
80
+ { phoneme: "-\u026F-", character: "\u01B0" },
81
+ { phoneme: "-\u0264-", character: "\u01A1" },
82
+ { phoneme: "-a-", character: "a" },
83
+ { phoneme: "-u-", character: "u" },
84
+ { phoneme: "-o-", character: "\xF4" },
85
+ { phoneme: "-o-", character: "\xF4\xF4" },
86
+ { phoneme: "-\u0254-", character: "o" },
87
+ { phoneme: "-\u0254-", character: "oo" },
88
+ { phoneme: "-\u0264\uE60C-", character: "\xE2" },
89
+ { phoneme: "-\u025B\uE60C-", character: "a" },
90
+ { phoneme: "-\u0103-", character: "a", final: ["-w", "-j"] },
91
+ { phoneme: "-\u0103-", character: "\u0103" },
92
+ { phoneme: "-\u0254\uE60C-", character: "o", final: ["-\u014B", "-k"] },
93
+ { phoneme: "-ie-", character: "i\xEA", notFinal: ["zero"], medial: ["zero"] },
94
+ {
95
+ phoneme: "-ie-",
96
+ character: "y\xEA",
97
+ notFinal: ["zero"],
98
+ medial: ["-u\uE608-"],
99
+ initial: ["zero"]
100
+ },
101
+ { phoneme: "-ie-", character: "ia", final: ["zero"], medial: ["zero"] },
102
+ { phoneme: "-ie-", character: "ya", final: ["zero"], medial: ["-u\uE608-"] },
103
+ { phoneme: "-\u026F\u0264-", character: "\u01B0\u01A1", notFinal: ["zero"] },
104
+ { phoneme: "-\u026F\u0264-", character: "\u01B0a", final: ["zero"] },
105
+ { phoneme: "-uo-", character: "u\xF4", notFinal: ["zero"] },
106
+ { phoneme: "-uo-", character: "ua", final: ["zero"] }
107
+ ];
108
+ var finalList = [
109
+ { phoneme: "-m", character: "m" },
110
+ { phoneme: "-n", character: "n" },
111
+ { phoneme: "-p", character: "p" },
112
+ { phoneme: "-t", character: "t" },
113
+ { phoneme: "-\u014B", character: "nh", main: ["-i-", "-e-", "-\u025B\uE60C-"] },
114
+ { phoneme: "-\u014B", character: "ng" },
115
+ { phoneme: "-k", character: "ch", main: ["-i-", "-e-", "-\u025B\uE60C-"] },
116
+ { phoneme: "-k", character: "c" },
117
+ { phoneme: "-w", character: "o", main: ["-a-", "-\u025B-"] },
118
+ { phoneme: "-w", character: "u" },
119
+ { phoneme: "-j", character: "y", main: ["-\u0103-", "-\u0264\uE60C-"] },
120
+ { phoneme: "-j", character: "i" }
121
+ ];
122
+ var toneMarkList = [
123
+ { character: "a", originalCharacter: "a", toneMark: 1 },
124
+ { character: "\xE0", originalCharacter: "a", toneMark: 2 },
125
+ { character: "\xE3", originalCharacter: "a", toneMark: 3 },
126
+ { character: "\u1EA3", originalCharacter: "a", toneMark: 4 },
127
+ { character: "\xE1", originalCharacter: "a", toneMark: 5 },
128
+ { character: "\u1EA1", originalCharacter: "a", toneMark: 6 },
129
+ { character: "\u0103", originalCharacter: "\u0103", toneMark: 1 },
130
+ { character: "\u1EB1", originalCharacter: "\u0103", toneMark: 2 },
131
+ { character: "\u1EB5", originalCharacter: "\u0103", toneMark: 3 },
132
+ { character: "\u1EB3", originalCharacter: "\u0103", toneMark: 4 },
133
+ { character: "\u1EAF", originalCharacter: "\u0103", toneMark: 5 },
134
+ { character: "\u1EB7", originalCharacter: "\u0103", toneMark: 6 },
135
+ { character: "\xE2", originalCharacter: "\xE2", toneMark: 1 },
136
+ { character: "\u1EA7", originalCharacter: "\xE2", toneMark: 2 },
137
+ { character: "\u1EAB", originalCharacter: "\xE2", toneMark: 3 },
138
+ { character: "\u1EA9", originalCharacter: "\xE2", toneMark: 4 },
139
+ { character: "\u1EA5", originalCharacter: "\xE2", toneMark: 5 },
140
+ { character: "\u1EAD", originalCharacter: "\xE2", toneMark: 6 },
141
+ { character: "e", originalCharacter: "e", toneMark: 1 },
142
+ { character: "\xE8", originalCharacter: "e", toneMark: 2 },
143
+ { character: "\u1EBD", originalCharacter: "e", toneMark: 3 },
144
+ { character: "\u1EBB", originalCharacter: "e", toneMark: 4 },
145
+ { character: "\xE9", originalCharacter: "e", toneMark: 5 },
146
+ { character: "\u1EB9", originalCharacter: "e", toneMark: 6 },
147
+ { character: "\xEA", originalCharacter: "\xEA", toneMark: 1 },
148
+ { character: "\u1EC1", originalCharacter: "\xEA", toneMark: 2 },
149
+ { character: "\u1EC5", originalCharacter: "\xEA", toneMark: 3 },
150
+ { character: "\u1EC3", originalCharacter: "\xEA", toneMark: 4 },
151
+ { character: "\u1EBF", originalCharacter: "\xEA", toneMark: 5 },
152
+ { character: "\u1EC7", originalCharacter: "\xEA", toneMark: 6 },
153
+ { character: "i", originalCharacter: "i", toneMark: 1 },
154
+ { character: "\xEC", originalCharacter: "i", toneMark: 2 },
155
+ { character: "\u0129", originalCharacter: "i", toneMark: 3 },
156
+ { character: "\u1EC9", originalCharacter: "i", toneMark: 4 },
157
+ { character: "\xED", originalCharacter: "i", toneMark: 5 },
158
+ { character: "\u1ECB", originalCharacter: "i", toneMark: 6 },
159
+ { character: "o", originalCharacter: "o", toneMark: 1 },
160
+ { character: "\xF2", originalCharacter: "o", toneMark: 2 },
161
+ { character: "\xF5", originalCharacter: "o", toneMark: 3 },
162
+ { character: "\u1ECF", originalCharacter: "o", toneMark: 4 },
163
+ { character: "\xF3", originalCharacter: "o", toneMark: 5 },
164
+ { character: "\u1ECD", originalCharacter: "o", toneMark: 6 },
165
+ { character: "\xF4", originalCharacter: "\xF4", toneMark: 1 },
166
+ { character: "\u1ED3", originalCharacter: "\xF4", toneMark: 2 },
167
+ { character: "\u1ED7", originalCharacter: "\xF4", toneMark: 3 },
168
+ { character: "\u1ED5", originalCharacter: "\xF4", toneMark: 4 },
169
+ { character: "\u1ED1", originalCharacter: "\xF4", toneMark: 5 },
170
+ { character: "\u1ED9", originalCharacter: "\xF4", toneMark: 6 },
171
+ { character: "\u01A1", originalCharacter: "\u01A1", toneMark: 1 },
172
+ { character: "\u1EDD", originalCharacter: "\u01A1", toneMark: 2 },
173
+ { character: "\u1EE1", originalCharacter: "\u01A1", toneMark: 3 },
174
+ { character: "\u1EDF", originalCharacter: "\u01A1", toneMark: 4 },
175
+ { character: "\u1EDB", originalCharacter: "\u01A1", toneMark: 5 },
176
+ { character: "\u1EE3", originalCharacter: "\u01A1", toneMark: 6 },
177
+ { character: "u", originalCharacter: "u", toneMark: 1 },
178
+ { character: "\xF9", originalCharacter: "u", toneMark: 2 },
179
+ { character: "\u0169", originalCharacter: "u", toneMark: 3 },
180
+ { character: "\u1EE7", originalCharacter: "u", toneMark: 4 },
181
+ { character: "\xFA", originalCharacter: "u", toneMark: 5 },
182
+ { character: "\u1EE5", originalCharacter: "u", toneMark: 6 },
183
+ { character: "\u01B0", originalCharacter: "\u01B0", toneMark: 1 },
184
+ { character: "\u1EEB", originalCharacter: "\u01B0", toneMark: 2 },
185
+ { character: "\u1EEF", originalCharacter: "\u01B0", toneMark: 3 },
186
+ { character: "\u1EED", originalCharacter: "\u01B0", toneMark: 4 },
187
+ { character: "\u1EE9", originalCharacter: "\u01B0", toneMark: 5 },
188
+ { character: "\u1EF1", originalCharacter: "\u01B0", toneMark: 6 },
189
+ { character: "y", originalCharacter: "y", toneMark: 1 },
190
+ { character: "\u1EF3", originalCharacter: "y", toneMark: 2 },
191
+ { character: "\u1EF9", originalCharacter: "y", toneMark: 3 },
192
+ { character: "\u1EF7", originalCharacter: "y", toneMark: 4 },
193
+ { character: "\xFD", originalCharacter: "y", toneMark: 5 },
194
+ { character: "\u1EF5", originalCharacter: "y", toneMark: 6 }
195
+ ];
196
+ var transcriptToString = (transcript) => {
197
+ if (!transcript.main || !transcript.toneMark) {
198
+ throw new Error("Invalid phonetic transcript");
199
+ }
200
+ return (transcript.initial?.replaceAll("-", "") || "") + (transcript?.medial?.replaceAll("-", "") || "") + transcript.main.replaceAll("-", "") + (transcript.final?.replaceAll("-", "") || "") + transcript.toneMark.toString();
201
+ };
202
+ var buildPhoneticTranscript = (word) => {
203
+ word = word.toLowerCase();
204
+ let transcript = {
205
+ toneMark: 1
206
+ };
207
+ toneMarkList.forEach((toneMark) => {
208
+ if (toneMark.toneMark !== 1 && word.includes(toneMark.character)) {
209
+ transcript.toneMark = toneMark.toneMark;
210
+ word = word.replace(toneMark.character, toneMark.originalCharacter);
211
+ }
212
+ });
213
+ initialList.forEach((initial) => {
214
+ if (word.startsWith(initial.character) && word.length - initial.character.length > 0) {
215
+ transcript.initial = initial.phoneme;
216
+ transcript.initialCharacter = initial.character;
217
+ word = word.slice(initial.character.length);
218
+ }
219
+ });
220
+ finalList.forEach((final) => {
221
+ if (word.endsWith(final.character) && word.length - final.character.length > 0) {
222
+ transcript.final = final.phoneme;
223
+ transcript.finalCharacter = final.character;
224
+ word = word.slice(0, word.length - final.character.length);
225
+ }
226
+ });
227
+ if (word.length > 1 && word !== "oo") {
228
+ if (word.startsWith("u") && (transcript.initialCharacter === "q" || ["y", "i", "\xEA", "\u01A1", "\xE2", "i\xEA", "y\xEA", "ia", "ya"].includes(
229
+ word.slice(1)
230
+ ))) {
231
+ transcript.medial = medialList[0].phoneme;
232
+ transcript.medialCharacter = medialList[0].character;
233
+ word = word.slice(1);
234
+ } else if (word.startsWith("o")) {
235
+ transcript.medial = medialList[1].phoneme;
236
+ transcript.medialCharacter = medialList[1].character;
237
+ word = word.slice(1);
238
+ }
239
+ }
240
+ if (word === "o" && transcript.finalCharacter && ["nh", "ng", "ch", "c"].includes(transcript.finalCharacter)) {
241
+ const main = mainList.filter((main2) => main2.phoneme === "-\u0254\uE60C-");
242
+ transcript.main = main[0].phoneme;
243
+ transcript.mainCharacter = main[0].character;
244
+ word = word.slice(1);
245
+ } else {
246
+ mainList.forEach((main) => {
247
+ if (word === main.character) {
248
+ transcript.main = main.phoneme;
249
+ transcript.mainCharacter = main.character;
250
+ word = word.slice(main.character.length);
251
+ }
252
+ });
253
+ }
254
+ return transcript;
255
+ };
256
+ var phoneticTranscriptWord = (word) => {
257
+ return word.replaceAll(/[^\P{L}]+/gmu, (word2) => {
258
+ try {
259
+ return transcriptToString(buildPhoneticTranscript(word2));
260
+ } catch (e) {
261
+ return word2;
262
+ }
263
+ });
264
+ };
265
+ var phoneticTranscriptSentence = (sentence) => {
266
+ return sentence.split(" ").map((word) => phoneticTranscriptWord(word)).join(" ");
267
+ };
268
+ // Annotate the CommonJS export names for ESM import in node:
269
+ 0 && (module.exports = {
270
+ phoneticTranscriptSentence,
271
+ phoneticTranscriptWord
272
+ });
273
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/index.ts","../lib/phonetic_transcript/phonetic_transcript.ts"],"sourcesContent":["export * from './phonetic_transcript/phonetic_transcript';\n","export type PhoneticTranscript = {\n main: string;\n mainCharacter: string;\n medial?: string;\n medialCharacter?: string;\n initial?: string;\n initialCharacter?: string;\n final?: string;\n finalCharacter?: string;\n toneMark: number;\n};\n\nexport type Constraint = {\n phoneme: string;\n character: string;\n initial?: Array<string>;\n notInitial?: Array<string>;\n medial?: Array<string>;\n notMedial?: Array<string>;\n main?: Array<string>;\n notMain?: Array<string>;\n final?: Array<string>;\n notFinal?: Array<string>;\n};\n\n// NOTE: Check the character orders, because \"t\" might be matched before \"th\"\nconst initialList = [\n { phoneme: 'b-', character: 'b' },\n { phoneme: 'm-', character: 'm' },\n { phoneme: 'f-', character: 'ph' },\n\n { phoneme: 'v-', character: 'v' },\n\n { phoneme: 'tʼ-', character: 'th' },\n\n { phoneme: 'ʈ-', character: 'tr' },\n\n { phoneme: 't-', character: 't' },\n\n { phoneme: 'd-', character: 'đ' },\n\n { phoneme: 'ɲ-', character: 'nh' },\n\n { phoneme: 'ŋ-', character: 'ngh', main: ['-i-', '-e-', '-ɛ-', '-ie-'] },\n { phoneme: 'ŋ-', character: 'ng' },\n\n { phoneme: 'n-', character: 'n' },\n\n { phoneme: 'z-', character: 'd' },\n { phoneme: 'z-', character: 'gi' },\n\n { phoneme: 'ʐ-', character: 'r' },\n\n { phoneme: 's-', character: 'x' },\n { phoneme: 'ʂ-', character: 's' },\n\n { phoneme: 'l-', character: 'l' },\n\n { phoneme: 'χ-', character: 'kh' },\n\n { phoneme: 'c-', character: 'ch' },\n\n { phoneme: 'k-', character: 'k', main: ['-i-', '-e-', '-ɛ-', '-ie-'] },\n { phoneme: 'k-', character: 'q', medial: ['-u-'] },\n { phoneme: 'k-', character: 'c' },\n\n { phoneme: 'ɣ-', character: 'gh', main: ['-i-', '-e-', '-ɛ-', '-ie-'] },\n { phoneme: 'ɣ-', character: 'g' },\n\n { phoneme: 'h-', character: 'h' },\n] satisfies Constraint[];\n\nconst medialList = [\n {\n phoneme: '-u-',\n character: 'u',\n initial: ['k-'],\n main: ['-i-', '-e-', '-ɤ-', '-ɤ-', '-ie-'],\n },\n {\n phoneme: '-u-',\n character: 'o',\n },\n] satisfies Constraint[];\n\nconst mainList = [\n {\n phoneme: '-i-',\n character: 'y',\n medial: ['-u-', 'zero'],\n initial: ['zero'],\n final: ['zero'],\n },\n { phoneme: '-i-', character: 'i' },\n\n { phoneme: '-e-', character: 'ê' },\n\n { phoneme: '-ɛ-', character: 'e' },\n\n { phoneme: '-ɯ-', character: 'ư' },\n\n { phoneme: '-ɤ-', character: 'ơ' },\n\n { phoneme: '-a-', character: 'a' },\n\n { phoneme: '-u-', character: 'u' },\n\n { phoneme: '-o-', character: 'ô' },\n { phoneme: '-o-', character: 'ôô' },\n\n { phoneme: '-ɔ-', character: 'o' },\n { phoneme: '-ɔ-', character: 'oo' },\n\n { phoneme: '-ɤ-', character: 'â' },\n\n { phoneme: '-ɛ-', character: 'a' },\n\n { phoneme: '-ă-', character: 'a', final: ['-w', '-j'] },\n { phoneme: '-ă-', character: 'ă' },\n\n { phoneme: '-ɔ-', character: 'o', final: ['-ŋ', '-k'] },\n\n { phoneme: '-ie-', character: 'iê', notFinal: ['zero'], medial: ['zero'] },\n {\n phoneme: '-ie-',\n character: 'yê',\n notFinal: ['zero'],\n medial: ['-u-'],\n initial: ['zero'],\n },\n { phoneme: '-ie-', character: 'ia', final: ['zero'], medial: ['zero'] },\n { phoneme: '-ie-', character: 'ya', final: ['zero'], medial: ['-u-'] },\n\n { phoneme: '-ɯɤ-', character: 'ươ', notFinal: ['zero'] },\n { phoneme: '-ɯɤ-', character: 'ưa', final: ['zero'] },\n\n { phoneme: '-uo-', character: 'uô', notFinal: ['zero'] },\n { phoneme: '-uo-', character: 'ua', final: ['zero'] },\n] satisfies Constraint[];\n\nconst finalList = [\n { phoneme: '-m', character: 'm' },\n\n { phoneme: '-n', character: 'n' },\n\n { phoneme: '-p', character: 'p' },\n\n { phoneme: '-t', character: 't' },\n\n { phoneme: '-ŋ', character: 'nh', main: ['-i-', '-e-', '-ɛ-'] },\n { phoneme: '-ŋ', character: 'ng' },\n\n { phoneme: '-k', character: 'ch', main: ['-i-', '-e-', '-ɛ-'] },\n { phoneme: '-k', character: 'c' },\n\n { phoneme: '-w', character: 'o', main: ['-a-', '-ɛ-'] },\n { phoneme: '-w', character: 'u' },\n\n { phoneme: '-j', character: 'y', main: ['-ă-', '-ɤ-'] },\n { phoneme: '-j', character: 'i' },\n] satisfies Constraint[];\n\nconst toneMarkList = [\n { character: 'a', originalCharacter: 'a', toneMark: 1 },\n { character: 'à', originalCharacter: 'a', toneMark: 2 },\n { character: 'ã', originalCharacter: 'a', toneMark: 3 },\n { character: 'ả', originalCharacter: 'a', toneMark: 4 },\n { character: 'á', originalCharacter: 'a', toneMark: 5 },\n { character: 'ạ', originalCharacter: 'a', toneMark: 6 },\n\n { character: 'ă', originalCharacter: 'ă', toneMark: 1 },\n { character: 'ằ', originalCharacter: 'ă', toneMark: 2 },\n { character: 'ẵ', originalCharacter: 'ă', toneMark: 3 },\n { character: 'ẳ', originalCharacter: 'ă', toneMark: 4 },\n { character: 'ắ', originalCharacter: 'ă', toneMark: 5 },\n { character: 'ặ', originalCharacter: 'ă', toneMark: 6 },\n\n { character: 'â', originalCharacter: 'â', toneMark: 1 },\n { character: 'ầ', originalCharacter: 'â', toneMark: 2 },\n { character: 'ẫ', originalCharacter: 'â', toneMark: 3 },\n { character: 'ẩ', originalCharacter: 'â', toneMark: 4 },\n { character: 'ấ', originalCharacter: 'â', toneMark: 5 },\n { character: 'ậ', originalCharacter: 'â', toneMark: 6 },\n\n { character: 'e', originalCharacter: 'e', toneMark: 1 },\n { character: 'è', originalCharacter: 'e', toneMark: 2 },\n { character: 'ẽ', originalCharacter: 'e', toneMark: 3 },\n { character: 'ẻ', originalCharacter: 'e', toneMark: 4 },\n { character: 'é', originalCharacter: 'e', toneMark: 5 },\n { character: 'ẹ', originalCharacter: 'e', toneMark: 6 },\n\n { character: 'ê', originalCharacter: 'ê', toneMark: 1 },\n { character: 'ề', originalCharacter: 'ê', toneMark: 2 },\n { character: 'ễ', originalCharacter: 'ê', toneMark: 3 },\n { character: 'ể', originalCharacter: 'ê', toneMark: 4 },\n { character: 'ế', originalCharacter: 'ê', toneMark: 5 },\n { character: 'ệ', originalCharacter: 'ê', toneMark: 6 },\n\n { character: 'i', originalCharacter: 'i', toneMark: 1 },\n { character: 'ì', originalCharacter: 'i', toneMark: 2 },\n { character: 'ĩ', originalCharacter: 'i', toneMark: 3 },\n { character: 'ỉ', originalCharacter: 'i', toneMark: 4 },\n { character: 'í', originalCharacter: 'i', toneMark: 5 },\n { character: 'ị', originalCharacter: 'i', toneMark: 6 },\n\n { character: 'o', originalCharacter: 'o', toneMark: 1 },\n { character: 'ò', originalCharacter: 'o', toneMark: 2 },\n { character: 'õ', originalCharacter: 'o', toneMark: 3 },\n { character: 'ỏ', originalCharacter: 'o', toneMark: 4 },\n { character: 'ó', originalCharacter: 'o', toneMark: 5 },\n { character: 'ọ', originalCharacter: 'o', toneMark: 6 },\n\n { character: 'ô', originalCharacter: 'ô', toneMark: 1 },\n { character: 'ồ', originalCharacter: 'ô', toneMark: 2 },\n { character: 'ỗ', originalCharacter: 'ô', toneMark: 3 },\n { character: 'ổ', originalCharacter: 'ô', toneMark: 4 },\n { character: 'ố', originalCharacter: 'ô', toneMark: 5 },\n { character: 'ộ', originalCharacter: 'ô', toneMark: 6 },\n\n { character: 'ơ', originalCharacter: 'ơ', toneMark: 1 },\n { character: 'ờ', originalCharacter: 'ơ', toneMark: 2 },\n { character: 'ỡ', originalCharacter: 'ơ', toneMark: 3 },\n { character: 'ở', originalCharacter: 'ơ', toneMark: 4 },\n { character: 'ớ', originalCharacter: 'ơ', toneMark: 5 },\n { character: 'ợ', originalCharacter: 'ơ', toneMark: 6 },\n\n { character: 'u', originalCharacter: 'u', toneMark: 1 },\n { character: 'ù', originalCharacter: 'u', toneMark: 2 },\n { character: 'ũ', originalCharacter: 'u', toneMark: 3 },\n { character: 'ủ', originalCharacter: 'u', toneMark: 4 },\n { character: 'ú', originalCharacter: 'u', toneMark: 5 },\n { character: 'ụ', originalCharacter: 'u', toneMark: 6 },\n\n { character: 'ư', originalCharacter: 'ư', toneMark: 1 },\n { character: 'ừ', originalCharacter: 'ư', toneMark: 2 },\n { character: 'ữ', originalCharacter: 'ư', toneMark: 3 },\n { character: 'ử', originalCharacter: 'ư', toneMark: 4 },\n { character: 'ứ', originalCharacter: 'ư', toneMark: 5 },\n { character: 'ự', originalCharacter: 'ư', toneMark: 6 },\n\n { character: 'y', originalCharacter: 'y', toneMark: 1 },\n { character: 'ỳ', originalCharacter: 'y', toneMark: 2 },\n { character: 'ỹ', originalCharacter: 'y', toneMark: 3 },\n { character: 'ỷ', originalCharacter: 'y', toneMark: 4 },\n { character: 'ý', originalCharacter: 'y', toneMark: 5 },\n { character: 'ỵ', originalCharacter: 'y', toneMark: 6 },\n];\n\nconst transcriptToString = (transcript: PhoneticTranscript): string => {\n if (!transcript.main || !transcript.toneMark) {\n throw new Error('Invalid phonetic transcript');\n }\n\n return (\n (transcript.initial?.replaceAll('-', '') || '') +\n (transcript?.medial?.replaceAll('-', '') || '') +\n transcript.main.replaceAll('-', '') +\n (transcript.final?.replaceAll('-', '') || '') +\n transcript.toneMark.toString()\n );\n};\n\nconst buildPhoneticTranscript = (word: string): PhoneticTranscript => {\n word = word.toLowerCase();\n\n let transcript = {\n toneMark: 1,\n } as PhoneticTranscript;\n\n // NOTE: Check tone mark\n toneMarkList.forEach((toneMark) => {\n if (toneMark.toneMark !== 1 && word.includes(toneMark.character)) {\n transcript.toneMark = toneMark.toneMark;\n\n word = word.replace(toneMark.character, toneMark.originalCharacter);\n }\n });\n\n // NOTE: Check initial\n initialList.forEach((initial) => {\n if (\n word.startsWith(initial.character) &&\n word.length - initial.character.length > 0\n ) {\n transcript.initial = initial.phoneme;\n transcript.initialCharacter = initial.character;\n\n word = word.slice(initial.character.length);\n }\n });\n\n // NOTE: Check final\n finalList.forEach((final) => {\n if (\n word.endsWith(final.character) &&\n word.length - final.character.length > 0\n ) {\n transcript.final = final.phoneme;\n transcript.finalCharacter = final.character;\n\n word = word.slice(0, word.length - final.character.length);\n }\n });\n\n // NOTE: Check medial\n if (word.length > 1 && word !== 'oo') {\n if (\n word.startsWith('u') &&\n (transcript.initialCharacter === 'q' ||\n ['y', 'i', 'ê', 'ơ', 'â', 'iê', 'yê', 'ia', 'ya'].includes(\n word.slice(1),\n ))\n ) {\n transcript.medial = medialList[0]!.phoneme;\n transcript.medialCharacter = medialList[0]!.character;\n\n word = word.slice(1);\n } else if (word.startsWith('o')) {\n transcript.medial = medialList[1]!.phoneme;\n transcript.medialCharacter = medialList[1]!.character;\n\n word = word.slice(1);\n }\n }\n\n if (\n word === 'o' &&\n transcript.finalCharacter &&\n ['nh', 'ng', 'ch', 'c'].includes(transcript.finalCharacter)\n ) {\n const main = mainList.filter((main) => main.phoneme === '-ɔ-');\n\n transcript.main = main[0]!.phoneme;\n transcript.mainCharacter = main[0]!.character;\n\n word = word.slice(1);\n } else {\n // NOTE: Check main\n mainList.forEach((main) => {\n if (word === main.character) {\n transcript.main = main.phoneme;\n transcript.mainCharacter = main.character;\n\n word = word.slice(main.character.length);\n }\n });\n }\n\n return transcript;\n};\n\nexport const phoneticTranscriptWord = (word: string) => {\n return word.replaceAll(/[^\\P{L}]+/gmu, (word) => {\n try {\n return transcriptToString(buildPhoneticTranscript(word));\n } catch (e) {\n return word;\n }\n });\n};\n\nexport const phoneticTranscriptSentence = (sentence: string): string => {\n return sentence\n .split(' ')\n .map((word) => phoneticTranscriptWord(word))\n .join(' ');\n};\n"],"mappings":"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","names":["main","word"]}
@@ -0,0 +1,27 @@
1
+ type PhoneticTranscript = {
2
+ main: string;
3
+ mainCharacter: string;
4
+ medial?: string;
5
+ medialCharacter?: string;
6
+ initial?: string;
7
+ initialCharacter?: string;
8
+ final?: string;
9
+ finalCharacter?: string;
10
+ toneMark: number;
11
+ };
12
+ type Constraint = {
13
+ phoneme: string;
14
+ character: string;
15
+ initial?: Array<string>;
16
+ notInitial?: Array<string>;
17
+ medial?: Array<string>;
18
+ notMedial?: Array<string>;
19
+ main?: Array<string>;
20
+ notMain?: Array<string>;
21
+ final?: Array<string>;
22
+ notFinal?: Array<string>;
23
+ };
24
+ declare const phoneticTranscriptWord: (word: string) => string;
25
+ declare const phoneticTranscriptSentence: (sentence: string) => string;
26
+
27
+ export { type Constraint, type PhoneticTranscript, phoneticTranscriptSentence, phoneticTranscriptWord };
@@ -0,0 +1,27 @@
1
+ type PhoneticTranscript = {
2
+ main: string;
3
+ mainCharacter: string;
4
+ medial?: string;
5
+ medialCharacter?: string;
6
+ initial?: string;
7
+ initialCharacter?: string;
8
+ final?: string;
9
+ finalCharacter?: string;
10
+ toneMark: number;
11
+ };
12
+ type Constraint = {
13
+ phoneme: string;
14
+ character: string;
15
+ initial?: Array<string>;
16
+ notInitial?: Array<string>;
17
+ medial?: Array<string>;
18
+ notMedial?: Array<string>;
19
+ main?: Array<string>;
20
+ notMain?: Array<string>;
21
+ final?: Array<string>;
22
+ notFinal?: Array<string>;
23
+ };
24
+ declare const phoneticTranscriptWord: (word: string) => string;
25
+ declare const phoneticTranscriptSentence: (sentence: string) => string;
26
+
27
+ export { type Constraint, type PhoneticTranscript, phoneticTranscriptSentence, phoneticTranscriptWord };
package/dist/index.js ADDED
@@ -0,0 +1,245 @@
1
+ // lib/phonetic_transcript/phonetic_transcript.ts
2
+ var initialList = [
3
+ { phoneme: "b-", character: "b" },
4
+ { phoneme: "m-", character: "m" },
5
+ { phoneme: "f-", character: "ph" },
6
+ { phoneme: "v-", character: "v" },
7
+ { phoneme: "t\u02BC-", character: "th" },
8
+ { phoneme: "\u0288-", character: "tr" },
9
+ { phoneme: "t-", character: "t" },
10
+ { phoneme: "d-", character: "\u0111" },
11
+ { phoneme: "\u0272-", character: "nh" },
12
+ { phoneme: "\u014B-", character: "ngh", main: ["-i-", "-e-", "-\u025B-", "-ie-"] },
13
+ { phoneme: "\u014B-", character: "ng" },
14
+ { phoneme: "n-", character: "n" },
15
+ { phoneme: "z-", character: "d" },
16
+ { phoneme: "z-", character: "gi" },
17
+ { phoneme: "\u0290-", character: "r" },
18
+ { phoneme: "s-", character: "x" },
19
+ { phoneme: "\u0282-", character: "s" },
20
+ { phoneme: "l-", character: "l" },
21
+ { phoneme: "\u03C7-", character: "kh" },
22
+ { phoneme: "c-", character: "ch" },
23
+ { phoneme: "k-", character: "k", main: ["-i-", "-e-", "-\u025B-", "-ie-"] },
24
+ { phoneme: "k-", character: "q", medial: ["-u\uE608-"] },
25
+ { phoneme: "k-", character: "c" },
26
+ { phoneme: "\u0263-", character: "gh", main: ["-i-", "-e-", "-\u025B-", "-ie-"] },
27
+ { phoneme: "\u0263-", character: "g" },
28
+ { phoneme: "h-", character: "h" }
29
+ ];
30
+ var medialList = [
31
+ {
32
+ phoneme: "-u\uE608-",
33
+ character: "u",
34
+ initial: ["k-"],
35
+ main: ["-i-", "-e-", "-\u0264-", "-\u0264\uE60C-", "-ie-"]
36
+ },
37
+ {
38
+ phoneme: "-u\uE608-",
39
+ character: "o"
40
+ }
41
+ ];
42
+ var mainList = [
43
+ {
44
+ phoneme: "-i-",
45
+ character: "y",
46
+ medial: ["-u\uE608-", "zero"],
47
+ initial: ["zero"],
48
+ final: ["zero"]
49
+ },
50
+ { phoneme: "-i-", character: "i" },
51
+ { phoneme: "-e-", character: "\xEA" },
52
+ { phoneme: "-\u025B-", character: "e" },
53
+ { phoneme: "-\u026F-", character: "\u01B0" },
54
+ { phoneme: "-\u0264-", character: "\u01A1" },
55
+ { phoneme: "-a-", character: "a" },
56
+ { phoneme: "-u-", character: "u" },
57
+ { phoneme: "-o-", character: "\xF4" },
58
+ { phoneme: "-o-", character: "\xF4\xF4" },
59
+ { phoneme: "-\u0254-", character: "o" },
60
+ { phoneme: "-\u0254-", character: "oo" },
61
+ { phoneme: "-\u0264\uE60C-", character: "\xE2" },
62
+ { phoneme: "-\u025B\uE60C-", character: "a" },
63
+ { phoneme: "-\u0103-", character: "a", final: ["-w", "-j"] },
64
+ { phoneme: "-\u0103-", character: "\u0103" },
65
+ { phoneme: "-\u0254\uE60C-", character: "o", final: ["-\u014B", "-k"] },
66
+ { phoneme: "-ie-", character: "i\xEA", notFinal: ["zero"], medial: ["zero"] },
67
+ {
68
+ phoneme: "-ie-",
69
+ character: "y\xEA",
70
+ notFinal: ["zero"],
71
+ medial: ["-u\uE608-"],
72
+ initial: ["zero"]
73
+ },
74
+ { phoneme: "-ie-", character: "ia", final: ["zero"], medial: ["zero"] },
75
+ { phoneme: "-ie-", character: "ya", final: ["zero"], medial: ["-u\uE608-"] },
76
+ { phoneme: "-\u026F\u0264-", character: "\u01B0\u01A1", notFinal: ["zero"] },
77
+ { phoneme: "-\u026F\u0264-", character: "\u01B0a", final: ["zero"] },
78
+ { phoneme: "-uo-", character: "u\xF4", notFinal: ["zero"] },
79
+ { phoneme: "-uo-", character: "ua", final: ["zero"] }
80
+ ];
81
+ var finalList = [
82
+ { phoneme: "-m", character: "m" },
83
+ { phoneme: "-n", character: "n" },
84
+ { phoneme: "-p", character: "p" },
85
+ { phoneme: "-t", character: "t" },
86
+ { phoneme: "-\u014B", character: "nh", main: ["-i-", "-e-", "-\u025B\uE60C-"] },
87
+ { phoneme: "-\u014B", character: "ng" },
88
+ { phoneme: "-k", character: "ch", main: ["-i-", "-e-", "-\u025B\uE60C-"] },
89
+ { phoneme: "-k", character: "c" },
90
+ { phoneme: "-w", character: "o", main: ["-a-", "-\u025B-"] },
91
+ { phoneme: "-w", character: "u" },
92
+ { phoneme: "-j", character: "y", main: ["-\u0103-", "-\u0264\uE60C-"] },
93
+ { phoneme: "-j", character: "i" }
94
+ ];
95
+ var toneMarkList = [
96
+ { character: "a", originalCharacter: "a", toneMark: 1 },
97
+ { character: "\xE0", originalCharacter: "a", toneMark: 2 },
98
+ { character: "\xE3", originalCharacter: "a", toneMark: 3 },
99
+ { character: "\u1EA3", originalCharacter: "a", toneMark: 4 },
100
+ { character: "\xE1", originalCharacter: "a", toneMark: 5 },
101
+ { character: "\u1EA1", originalCharacter: "a", toneMark: 6 },
102
+ { character: "\u0103", originalCharacter: "\u0103", toneMark: 1 },
103
+ { character: "\u1EB1", originalCharacter: "\u0103", toneMark: 2 },
104
+ { character: "\u1EB5", originalCharacter: "\u0103", toneMark: 3 },
105
+ { character: "\u1EB3", originalCharacter: "\u0103", toneMark: 4 },
106
+ { character: "\u1EAF", originalCharacter: "\u0103", toneMark: 5 },
107
+ { character: "\u1EB7", originalCharacter: "\u0103", toneMark: 6 },
108
+ { character: "\xE2", originalCharacter: "\xE2", toneMark: 1 },
109
+ { character: "\u1EA7", originalCharacter: "\xE2", toneMark: 2 },
110
+ { character: "\u1EAB", originalCharacter: "\xE2", toneMark: 3 },
111
+ { character: "\u1EA9", originalCharacter: "\xE2", toneMark: 4 },
112
+ { character: "\u1EA5", originalCharacter: "\xE2", toneMark: 5 },
113
+ { character: "\u1EAD", originalCharacter: "\xE2", toneMark: 6 },
114
+ { character: "e", originalCharacter: "e", toneMark: 1 },
115
+ { character: "\xE8", originalCharacter: "e", toneMark: 2 },
116
+ { character: "\u1EBD", originalCharacter: "e", toneMark: 3 },
117
+ { character: "\u1EBB", originalCharacter: "e", toneMark: 4 },
118
+ { character: "\xE9", originalCharacter: "e", toneMark: 5 },
119
+ { character: "\u1EB9", originalCharacter: "e", toneMark: 6 },
120
+ { character: "\xEA", originalCharacter: "\xEA", toneMark: 1 },
121
+ { character: "\u1EC1", originalCharacter: "\xEA", toneMark: 2 },
122
+ { character: "\u1EC5", originalCharacter: "\xEA", toneMark: 3 },
123
+ { character: "\u1EC3", originalCharacter: "\xEA", toneMark: 4 },
124
+ { character: "\u1EBF", originalCharacter: "\xEA", toneMark: 5 },
125
+ { character: "\u1EC7", originalCharacter: "\xEA", toneMark: 6 },
126
+ { character: "i", originalCharacter: "i", toneMark: 1 },
127
+ { character: "\xEC", originalCharacter: "i", toneMark: 2 },
128
+ { character: "\u0129", originalCharacter: "i", toneMark: 3 },
129
+ { character: "\u1EC9", originalCharacter: "i", toneMark: 4 },
130
+ { character: "\xED", originalCharacter: "i", toneMark: 5 },
131
+ { character: "\u1ECB", originalCharacter: "i", toneMark: 6 },
132
+ { character: "o", originalCharacter: "o", toneMark: 1 },
133
+ { character: "\xF2", originalCharacter: "o", toneMark: 2 },
134
+ { character: "\xF5", originalCharacter: "o", toneMark: 3 },
135
+ { character: "\u1ECF", originalCharacter: "o", toneMark: 4 },
136
+ { character: "\xF3", originalCharacter: "o", toneMark: 5 },
137
+ { character: "\u1ECD", originalCharacter: "o", toneMark: 6 },
138
+ { character: "\xF4", originalCharacter: "\xF4", toneMark: 1 },
139
+ { character: "\u1ED3", originalCharacter: "\xF4", toneMark: 2 },
140
+ { character: "\u1ED7", originalCharacter: "\xF4", toneMark: 3 },
141
+ { character: "\u1ED5", originalCharacter: "\xF4", toneMark: 4 },
142
+ { character: "\u1ED1", originalCharacter: "\xF4", toneMark: 5 },
143
+ { character: "\u1ED9", originalCharacter: "\xF4", toneMark: 6 },
144
+ { character: "\u01A1", originalCharacter: "\u01A1", toneMark: 1 },
145
+ { character: "\u1EDD", originalCharacter: "\u01A1", toneMark: 2 },
146
+ { character: "\u1EE1", originalCharacter: "\u01A1", toneMark: 3 },
147
+ { character: "\u1EDF", originalCharacter: "\u01A1", toneMark: 4 },
148
+ { character: "\u1EDB", originalCharacter: "\u01A1", toneMark: 5 },
149
+ { character: "\u1EE3", originalCharacter: "\u01A1", toneMark: 6 },
150
+ { character: "u", originalCharacter: "u", toneMark: 1 },
151
+ { character: "\xF9", originalCharacter: "u", toneMark: 2 },
152
+ { character: "\u0169", originalCharacter: "u", toneMark: 3 },
153
+ { character: "\u1EE7", originalCharacter: "u", toneMark: 4 },
154
+ { character: "\xFA", originalCharacter: "u", toneMark: 5 },
155
+ { character: "\u1EE5", originalCharacter: "u", toneMark: 6 },
156
+ { character: "\u01B0", originalCharacter: "\u01B0", toneMark: 1 },
157
+ { character: "\u1EEB", originalCharacter: "\u01B0", toneMark: 2 },
158
+ { character: "\u1EEF", originalCharacter: "\u01B0", toneMark: 3 },
159
+ { character: "\u1EED", originalCharacter: "\u01B0", toneMark: 4 },
160
+ { character: "\u1EE9", originalCharacter: "\u01B0", toneMark: 5 },
161
+ { character: "\u1EF1", originalCharacter: "\u01B0", toneMark: 6 },
162
+ { character: "y", originalCharacter: "y", toneMark: 1 },
163
+ { character: "\u1EF3", originalCharacter: "y", toneMark: 2 },
164
+ { character: "\u1EF9", originalCharacter: "y", toneMark: 3 },
165
+ { character: "\u1EF7", originalCharacter: "y", toneMark: 4 },
166
+ { character: "\xFD", originalCharacter: "y", toneMark: 5 },
167
+ { character: "\u1EF5", originalCharacter: "y", toneMark: 6 }
168
+ ];
169
+ var transcriptToString = (transcript) => {
170
+ if (!transcript.main || !transcript.toneMark) {
171
+ throw new Error("Invalid phonetic transcript");
172
+ }
173
+ return (transcript.initial?.replaceAll("-", "") || "") + (transcript?.medial?.replaceAll("-", "") || "") + transcript.main.replaceAll("-", "") + (transcript.final?.replaceAll("-", "") || "") + transcript.toneMark.toString();
174
+ };
175
+ var buildPhoneticTranscript = (word) => {
176
+ word = word.toLowerCase();
177
+ let transcript = {
178
+ toneMark: 1
179
+ };
180
+ toneMarkList.forEach((toneMark) => {
181
+ if (toneMark.toneMark !== 1 && word.includes(toneMark.character)) {
182
+ transcript.toneMark = toneMark.toneMark;
183
+ word = word.replace(toneMark.character, toneMark.originalCharacter);
184
+ }
185
+ });
186
+ initialList.forEach((initial) => {
187
+ if (word.startsWith(initial.character) && word.length - initial.character.length > 0) {
188
+ transcript.initial = initial.phoneme;
189
+ transcript.initialCharacter = initial.character;
190
+ word = word.slice(initial.character.length);
191
+ }
192
+ });
193
+ finalList.forEach((final) => {
194
+ if (word.endsWith(final.character) && word.length - final.character.length > 0) {
195
+ transcript.final = final.phoneme;
196
+ transcript.finalCharacter = final.character;
197
+ word = word.slice(0, word.length - final.character.length);
198
+ }
199
+ });
200
+ if (word.length > 1 && word !== "oo") {
201
+ if (word.startsWith("u") && (transcript.initialCharacter === "q" || ["y", "i", "\xEA", "\u01A1", "\xE2", "i\xEA", "y\xEA", "ia", "ya"].includes(
202
+ word.slice(1)
203
+ ))) {
204
+ transcript.medial = medialList[0].phoneme;
205
+ transcript.medialCharacter = medialList[0].character;
206
+ word = word.slice(1);
207
+ } else if (word.startsWith("o")) {
208
+ transcript.medial = medialList[1].phoneme;
209
+ transcript.medialCharacter = medialList[1].character;
210
+ word = word.slice(1);
211
+ }
212
+ }
213
+ if (word === "o" && transcript.finalCharacter && ["nh", "ng", "ch", "c"].includes(transcript.finalCharacter)) {
214
+ const main = mainList.filter((main2) => main2.phoneme === "-\u0254\uE60C-");
215
+ transcript.main = main[0].phoneme;
216
+ transcript.mainCharacter = main[0].character;
217
+ word = word.slice(1);
218
+ } else {
219
+ mainList.forEach((main) => {
220
+ if (word === main.character) {
221
+ transcript.main = main.phoneme;
222
+ transcript.mainCharacter = main.character;
223
+ word = word.slice(main.character.length);
224
+ }
225
+ });
226
+ }
227
+ return transcript;
228
+ };
229
+ var phoneticTranscriptWord = (word) => {
230
+ return word.replaceAll(/[^\P{L}]+/gmu, (word2) => {
231
+ try {
232
+ return transcriptToString(buildPhoneticTranscript(word2));
233
+ } catch (e) {
234
+ return word2;
235
+ }
236
+ });
237
+ };
238
+ var phoneticTranscriptSentence = (sentence) => {
239
+ return sentence.split(" ").map((word) => phoneticTranscriptWord(word)).join(" ");
240
+ };
241
+ export {
242
+ phoneticTranscriptSentence,
243
+ phoneticTranscriptWord
244
+ };
245
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/phonetic_transcript/phonetic_transcript.ts"],"sourcesContent":["export type PhoneticTranscript = {\n main: string;\n mainCharacter: string;\n medial?: string;\n medialCharacter?: string;\n initial?: string;\n initialCharacter?: string;\n final?: string;\n finalCharacter?: string;\n toneMark: number;\n};\n\nexport type Constraint = {\n phoneme: string;\n character: string;\n initial?: Array<string>;\n notInitial?: Array<string>;\n medial?: Array<string>;\n notMedial?: Array<string>;\n main?: Array<string>;\n notMain?: Array<string>;\n final?: Array<string>;\n notFinal?: Array<string>;\n};\n\n// NOTE: Check the character orders, because \"t\" might be matched before \"th\"\nconst initialList = [\n { phoneme: 'b-', character: 'b' },\n { phoneme: 'm-', character: 'm' },\n { phoneme: 'f-', character: 'ph' },\n\n { phoneme: 'v-', character: 'v' },\n\n { phoneme: 'tʼ-', character: 'th' },\n\n { phoneme: 'ʈ-', character: 'tr' },\n\n { phoneme: 't-', character: 't' },\n\n { phoneme: 'd-', character: 'đ' },\n\n { phoneme: 'ɲ-', character: 'nh' },\n\n { phoneme: 'ŋ-', character: 'ngh', main: ['-i-', '-e-', '-ɛ-', '-ie-'] },\n { phoneme: 'ŋ-', character: 'ng' },\n\n { phoneme: 'n-', character: 'n' },\n\n { phoneme: 'z-', character: 'd' },\n { phoneme: 'z-', character: 'gi' },\n\n { phoneme: 'ʐ-', character: 'r' },\n\n { phoneme: 's-', character: 'x' },\n { phoneme: 'ʂ-', character: 's' },\n\n { phoneme: 'l-', character: 'l' },\n\n { phoneme: 'χ-', character: 'kh' },\n\n { phoneme: 'c-', character: 'ch' },\n\n { phoneme: 'k-', character: 'k', main: ['-i-', '-e-', '-ɛ-', '-ie-'] },\n { phoneme: 'k-', character: 'q', medial: ['-u-'] },\n { phoneme: 'k-', character: 'c' },\n\n { phoneme: 'ɣ-', character: 'gh', main: ['-i-', '-e-', '-ɛ-', '-ie-'] },\n { phoneme: 'ɣ-', character: 'g' },\n\n { phoneme: 'h-', character: 'h' },\n] satisfies Constraint[];\n\nconst medialList = [\n {\n phoneme: '-u-',\n character: 'u',\n initial: ['k-'],\n main: ['-i-', '-e-', '-ɤ-', '-ɤ-', '-ie-'],\n },\n {\n phoneme: '-u-',\n character: 'o',\n },\n] satisfies Constraint[];\n\nconst mainList = [\n {\n phoneme: '-i-',\n character: 'y',\n medial: ['-u-', 'zero'],\n initial: ['zero'],\n final: ['zero'],\n },\n { phoneme: '-i-', character: 'i' },\n\n { phoneme: '-e-', character: 'ê' },\n\n { phoneme: '-ɛ-', character: 'e' },\n\n { phoneme: '-ɯ-', character: 'ư' },\n\n { phoneme: '-ɤ-', character: 'ơ' },\n\n { phoneme: '-a-', character: 'a' },\n\n { phoneme: '-u-', character: 'u' },\n\n { phoneme: '-o-', character: 'ô' },\n { phoneme: '-o-', character: 'ôô' },\n\n { phoneme: '-ɔ-', character: 'o' },\n { phoneme: '-ɔ-', character: 'oo' },\n\n { phoneme: '-ɤ-', character: 'â' },\n\n { phoneme: '-ɛ-', character: 'a' },\n\n { phoneme: '-ă-', character: 'a', final: ['-w', '-j'] },\n { phoneme: '-ă-', character: 'ă' },\n\n { phoneme: '-ɔ-', character: 'o', final: ['-ŋ', '-k'] },\n\n { phoneme: '-ie-', character: 'iê', notFinal: ['zero'], medial: ['zero'] },\n {\n phoneme: '-ie-',\n character: 'yê',\n notFinal: ['zero'],\n medial: ['-u-'],\n initial: ['zero'],\n },\n { phoneme: '-ie-', character: 'ia', final: ['zero'], medial: ['zero'] },\n { phoneme: '-ie-', character: 'ya', final: ['zero'], medial: ['-u-'] },\n\n { phoneme: '-ɯɤ-', character: 'ươ', notFinal: ['zero'] },\n { phoneme: '-ɯɤ-', character: 'ưa', final: ['zero'] },\n\n { phoneme: '-uo-', character: 'uô', notFinal: ['zero'] },\n { phoneme: '-uo-', character: 'ua', final: ['zero'] },\n] satisfies Constraint[];\n\nconst finalList = [\n { phoneme: '-m', character: 'm' },\n\n { phoneme: '-n', character: 'n' },\n\n { phoneme: '-p', character: 'p' },\n\n { phoneme: '-t', character: 't' },\n\n { phoneme: '-ŋ', character: 'nh', main: ['-i-', '-e-', '-ɛ-'] },\n { phoneme: '-ŋ', character: 'ng' },\n\n { phoneme: '-k', character: 'ch', main: ['-i-', '-e-', '-ɛ-'] },\n { phoneme: '-k', character: 'c' },\n\n { phoneme: '-w', character: 'o', main: ['-a-', '-ɛ-'] },\n { phoneme: '-w', character: 'u' },\n\n { phoneme: '-j', character: 'y', main: ['-ă-', '-ɤ-'] },\n { phoneme: '-j', character: 'i' },\n] satisfies Constraint[];\n\nconst toneMarkList = [\n { character: 'a', originalCharacter: 'a', toneMark: 1 },\n { character: 'à', originalCharacter: 'a', toneMark: 2 },\n { character: 'ã', originalCharacter: 'a', toneMark: 3 },\n { character: 'ả', originalCharacter: 'a', toneMark: 4 },\n { character: 'á', originalCharacter: 'a', toneMark: 5 },\n { character: 'ạ', originalCharacter: 'a', toneMark: 6 },\n\n { character: 'ă', originalCharacter: 'ă', toneMark: 1 },\n { character: 'ằ', originalCharacter: 'ă', toneMark: 2 },\n { character: 'ẵ', originalCharacter: 'ă', toneMark: 3 },\n { character: 'ẳ', originalCharacter: 'ă', toneMark: 4 },\n { character: 'ắ', originalCharacter: 'ă', toneMark: 5 },\n { character: 'ặ', originalCharacter: 'ă', toneMark: 6 },\n\n { character: 'â', originalCharacter: 'â', toneMark: 1 },\n { character: 'ầ', originalCharacter: 'â', toneMark: 2 },\n { character: 'ẫ', originalCharacter: 'â', toneMark: 3 },\n { character: 'ẩ', originalCharacter: 'â', toneMark: 4 },\n { character: 'ấ', originalCharacter: 'â', toneMark: 5 },\n { character: 'ậ', originalCharacter: 'â', toneMark: 6 },\n\n { character: 'e', originalCharacter: 'e', toneMark: 1 },\n { character: 'è', originalCharacter: 'e', toneMark: 2 },\n { character: 'ẽ', originalCharacter: 'e', toneMark: 3 },\n { character: 'ẻ', originalCharacter: 'e', toneMark: 4 },\n { character: 'é', originalCharacter: 'e', toneMark: 5 },\n { character: 'ẹ', originalCharacter: 'e', toneMark: 6 },\n\n { character: 'ê', originalCharacter: 'ê', toneMark: 1 },\n { character: 'ề', originalCharacter: 'ê', toneMark: 2 },\n { character: 'ễ', originalCharacter: 'ê', toneMark: 3 },\n { character: 'ể', originalCharacter: 'ê', toneMark: 4 },\n { character: 'ế', originalCharacter: 'ê', toneMark: 5 },\n { character: 'ệ', originalCharacter: 'ê', toneMark: 6 },\n\n { character: 'i', originalCharacter: 'i', toneMark: 1 },\n { character: 'ì', originalCharacter: 'i', toneMark: 2 },\n { character: 'ĩ', originalCharacter: 'i', toneMark: 3 },\n { character: 'ỉ', originalCharacter: 'i', toneMark: 4 },\n { character: 'í', originalCharacter: 'i', toneMark: 5 },\n { character: 'ị', originalCharacter: 'i', toneMark: 6 },\n\n { character: 'o', originalCharacter: 'o', toneMark: 1 },\n { character: 'ò', originalCharacter: 'o', toneMark: 2 },\n { character: 'õ', originalCharacter: 'o', toneMark: 3 },\n { character: 'ỏ', originalCharacter: 'o', toneMark: 4 },\n { character: 'ó', originalCharacter: 'o', toneMark: 5 },\n { character: 'ọ', originalCharacter: 'o', toneMark: 6 },\n\n { character: 'ô', originalCharacter: 'ô', toneMark: 1 },\n { character: 'ồ', originalCharacter: 'ô', toneMark: 2 },\n { character: 'ỗ', originalCharacter: 'ô', toneMark: 3 },\n { character: 'ổ', originalCharacter: 'ô', toneMark: 4 },\n { character: 'ố', originalCharacter: 'ô', toneMark: 5 },\n { character: 'ộ', originalCharacter: 'ô', toneMark: 6 },\n\n { character: 'ơ', originalCharacter: 'ơ', toneMark: 1 },\n { character: 'ờ', originalCharacter: 'ơ', toneMark: 2 },\n { character: 'ỡ', originalCharacter: 'ơ', toneMark: 3 },\n { character: 'ở', originalCharacter: 'ơ', toneMark: 4 },\n { character: 'ớ', originalCharacter: 'ơ', toneMark: 5 },\n { character: 'ợ', originalCharacter: 'ơ', toneMark: 6 },\n\n { character: 'u', originalCharacter: 'u', toneMark: 1 },\n { character: 'ù', originalCharacter: 'u', toneMark: 2 },\n { character: 'ũ', originalCharacter: 'u', toneMark: 3 },\n { character: 'ủ', originalCharacter: 'u', toneMark: 4 },\n { character: 'ú', originalCharacter: 'u', toneMark: 5 },\n { character: 'ụ', originalCharacter: 'u', toneMark: 6 },\n\n { character: 'ư', originalCharacter: 'ư', toneMark: 1 },\n { character: 'ừ', originalCharacter: 'ư', toneMark: 2 },\n { character: 'ữ', originalCharacter: 'ư', toneMark: 3 },\n { character: 'ử', originalCharacter: 'ư', toneMark: 4 },\n { character: 'ứ', originalCharacter: 'ư', toneMark: 5 },\n { character: 'ự', originalCharacter: 'ư', toneMark: 6 },\n\n { character: 'y', originalCharacter: 'y', toneMark: 1 },\n { character: 'ỳ', originalCharacter: 'y', toneMark: 2 },\n { character: 'ỹ', originalCharacter: 'y', toneMark: 3 },\n { character: 'ỷ', originalCharacter: 'y', toneMark: 4 },\n { character: 'ý', originalCharacter: 'y', toneMark: 5 },\n { character: 'ỵ', originalCharacter: 'y', toneMark: 6 },\n];\n\nconst transcriptToString = (transcript: PhoneticTranscript): string => {\n if (!transcript.main || !transcript.toneMark) {\n throw new Error('Invalid phonetic transcript');\n }\n\n return (\n (transcript.initial?.replaceAll('-', '') || '') +\n (transcript?.medial?.replaceAll('-', '') || '') +\n transcript.main.replaceAll('-', '') +\n (transcript.final?.replaceAll('-', '') || '') +\n transcript.toneMark.toString()\n );\n};\n\nconst buildPhoneticTranscript = (word: string): PhoneticTranscript => {\n word = word.toLowerCase();\n\n let transcript = {\n toneMark: 1,\n } as PhoneticTranscript;\n\n // NOTE: Check tone mark\n toneMarkList.forEach((toneMark) => {\n if (toneMark.toneMark !== 1 && word.includes(toneMark.character)) {\n transcript.toneMark = toneMark.toneMark;\n\n word = word.replace(toneMark.character, toneMark.originalCharacter);\n }\n });\n\n // NOTE: Check initial\n initialList.forEach((initial) => {\n if (\n word.startsWith(initial.character) &&\n word.length - initial.character.length > 0\n ) {\n transcript.initial = initial.phoneme;\n transcript.initialCharacter = initial.character;\n\n word = word.slice(initial.character.length);\n }\n });\n\n // NOTE: Check final\n finalList.forEach((final) => {\n if (\n word.endsWith(final.character) &&\n word.length - final.character.length > 0\n ) {\n transcript.final = final.phoneme;\n transcript.finalCharacter = final.character;\n\n word = word.slice(0, word.length - final.character.length);\n }\n });\n\n // NOTE: Check medial\n if (word.length > 1 && word !== 'oo') {\n if (\n word.startsWith('u') &&\n (transcript.initialCharacter === 'q' ||\n ['y', 'i', 'ê', 'ơ', 'â', 'iê', 'yê', 'ia', 'ya'].includes(\n word.slice(1),\n ))\n ) {\n transcript.medial = medialList[0]!.phoneme;\n transcript.medialCharacter = medialList[0]!.character;\n\n word = word.slice(1);\n } else if (word.startsWith('o')) {\n transcript.medial = medialList[1]!.phoneme;\n transcript.medialCharacter = medialList[1]!.character;\n\n word = word.slice(1);\n }\n }\n\n if (\n word === 'o' &&\n transcript.finalCharacter &&\n ['nh', 'ng', 'ch', 'c'].includes(transcript.finalCharacter)\n ) {\n const main = mainList.filter((main) => main.phoneme === '-ɔ-');\n\n transcript.main = main[0]!.phoneme;\n transcript.mainCharacter = main[0]!.character;\n\n word = word.slice(1);\n } else {\n // NOTE: Check main\n mainList.forEach((main) => {\n if (word === main.character) {\n transcript.main = main.phoneme;\n transcript.mainCharacter = main.character;\n\n word = word.slice(main.character.length);\n }\n });\n }\n\n return transcript;\n};\n\nexport const phoneticTranscriptWord = (word: string) => {\n return word.replaceAll(/[^\\P{L}]+/gmu, (word) => {\n try {\n return transcriptToString(buildPhoneticTranscript(word));\n } catch (e) {\n return word;\n }\n });\n};\n\nexport const phoneticTranscriptSentence = (sentence: string): string => {\n return sentence\n .split(' ')\n .map((word) => phoneticTranscriptWord(word))\n .join(' ');\n};\n"],"mappings":"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","names":["main","word"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "vietnamese-phonetic-transcript",
3
+ "version": "1.0.0",
4
+ "author": "DuckyMomo20012",
5
+ "description": "A library for converting Vietnamese text to its phonetic transcription.",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/DuckyMomo20012/vietnamese-phonetic-transcript.git"
9
+ },
10
+ "type": "module",
11
+ "main": "./dist/index.js",
12
+ "module": "./dist/index.mjs",
13
+ "types": "./dist/index.d.ts",
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "exports": {
18
+ "./package.json": "./package.json",
19
+ ".": {
20
+ "import": "./dist/index.js",
21
+ "default": "./dist/index.cjs"
22
+ }
23
+ },
24
+ "devDependencies": {
25
+ "@arethetypeswrong/cli": "0.18.2",
26
+ "@commitlint/cli": "19.8.1",
27
+ "@commitlint/config-conventional": "19.8.1",
28
+ "@types/node": "24.3.1",
29
+ "@typescript-eslint/eslint-plugin": "8.41.0",
30
+ "@typescript-eslint/parser": "8.41.0",
31
+ "eslint": "8.57.1",
32
+ "eslint-config-airbnb-base": "15.0.0",
33
+ "eslint-config-prettier": "9.1.2",
34
+ "eslint-import-resolver-typescript": "3.10.1",
35
+ "eslint-plugin-import": "2.32.0",
36
+ "eslint-plugin-jsx-a11y": "6.10.2",
37
+ "eslint-plugin-prettier": "5.5.4",
38
+ "eslint-plugin-react": "7.37.5",
39
+ "eslint-plugin-react-hooks": "5.2.0",
40
+ "husky": "9.1.7",
41
+ "lint-staged": "16.1.6",
42
+ "prettier": "3.6.2",
43
+ "tsup": "8.5.0",
44
+ "typescript": "5.9.2",
45
+ "vitest": "3.2.4"
46
+ },
47
+ "scripts": {
48
+ "lint": "tsc",
49
+ "build": "tsup",
50
+ "test": "vitest run",
51
+ "check-exports": "attw --pack . --ignore-rules=cjs-resolves-to-esm",
52
+ "prepublish": "pnpm run build && pnpm run check-exports && pnpm run lint"
53
+ }
54
+ }