@ozgurguler/trnorm 0.1.0 → 0.1.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/README.md +77 -72
- package/package.json +50 -51
package/README.md
CHANGED
|
@@ -1,72 +1,77 @@
|
|
|
1
|
-
# trnorm
|
|
2
|
-
|
|
3
|
-
Yazılı Türkçeyi okunuş formuna çeviren [trnorm](
|
|
4
|
-
Python'la **aynı çıktıyı** verir. Sayı, tarih, saat, para, yüzde, birim, kısaltma, telefon, IBAN, plaka, URL; ekler
|
|
5
|
-
okunuşa uyar (`15.00'de` → "on beşte", `SGK'ye` → "se ge kaya").
|
|
6
|
-
|
|
7
|
-
```js
|
|
8
|
-
import { normalize, normalize_for_eval, inverse_normalize, number_to_words } from '@ozgurguler/trnorm';
|
|
9
|
-
|
|
10
|
-
normalize("Saat 09:30'da 3. kata gelin, ücret 1.250,50 TL.");
|
|
11
|
-
// "Saat dokuz otuzda üçüncü kata gelin, ücret bin iki yüz elli lira elli kuruş."
|
|
12
|
-
normalize_for_eval("ABD'de 5 TL mi?"); // "a be dede beş lira mı" (WER/CER için)
|
|
13
|
-
inverse_normalize('saat on dört otuzda yüzde on beşlik indirim'); // "saat 14.30'da %15'lik indirim"
|
|
14
|
-
number_to_words(1923); // "bin dokuz yüz yirmi üç"
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
```sh
|
|
18
|
-
npm install @ozgurguler/trnorm
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Kurallar ve örnekler Python sürümüyle ortaktır: [docs/TRNORM.md](
|
|
22
|
-
|
|
23
|
-
## API
|
|
24
|
-
|
|
25
|
-
| İşlev | Ne yapar |
|
|
26
|
-
|---|---|
|
|
27
|
-
| `normalize(text)` | Yazılı metin → okunuş (TTS girdisi). Büyük/küçük harf ve noktalama korunur. |
|
|
28
|
-
| `normalize_for_eval(text)` | Ölçüm için kanonik biçim: okunuş, Türkçe küçük harf, noktalamasız. Referansa ve çıktıya aynen uygulanır. |
|
|
29
|
-
| `inverse_normalize(text)` | Okunuş → rakamlı yazı (ASR çıktısı için). |
|
|
30
|
-
| `number_to_words(n)`, `ordinal_to_words(n)` | Sayının okunuşu: `4` → "dört", "dördüncü". `n`: bigint ya da tam sayı; başka bir sayı Python'daki float gibi okunur. |
|
|
31
|
-
| `tr_lower(text)`, `tr_upper(text)` | Türkçe büyük/küçük harf (I ↔ ı, İ ↔ i). |
|
|
32
|
-
|
|
33
|
-
Python bir hata verdiğinde bu sürüm de hata fırlatır (örneğin 4300 haneden uzun bir sayıda `ValueError`).
|
|
34
|
-
|
|
35
|
-
## Python'la aynı mı?
|
|
36
|
-
|
|
37
|
-
Evet; amaç birebir aynılık. Sürüm, Python'un `str`, `re` ve `int` davranışını taklit eder (`src/py.js`): karakter sayımı
|
|
38
|
-
kod noktasıyla, `\w`/`\d`/`\s`/`\b` Python'un Unicode tanımıyla, `$`'ın son satır sonundan önce de eşleşmesi, sınırsız
|
|
39
|
-
tam sayılar (BigInt), Unicode 15.0'ın büyük/küçük harf tabloları (`src/case_tables.js`), Python 3.12'nin tanımadığı
|
|
40
|
-
yeni karakterler (`src/unassigned.js`) ve tek başına kalmış vekil (surrogate) karakterler.
|
|
41
|
-
|
|
42
|
-
- `npm test`: `test/golden.json`'daki 7.566 metin ve 2.505 sayı. Bu dosyayı `tools/golden.py
|
|
43
|
-
trnorm'dan üretir
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
1
|
+
# trnorm-js
|
|
2
|
+
|
|
3
|
+
Yazılı Türkçeyi okunuş formuna çeviren [trnorm](https://github.com/ozguradmin/ahenk-turkish-tts/tree/main/src/trnorm)'un JavaScript sürümü: tarayıcıda ve Node'da, bağımlılıksız,
|
|
4
|
+
Python'la **aynı çıktıyı** verir. Sayı, tarih, saat, para, yüzde, birim, kısaltma, telefon, IBAN, plaka, URL; ekler
|
|
5
|
+
okunuşa uyar (`15.00'de` → "on beşte", `SGK'ye` → "se ge kaya").
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import { normalize, normalize_for_eval, inverse_normalize, number_to_words } from '@ozgurguler/trnorm';
|
|
9
|
+
|
|
10
|
+
normalize("Saat 09:30'da 3. kata gelin, ücret 1.250,50 TL.");
|
|
11
|
+
// "Saat dokuz otuzda üçüncü kata gelin, ücret bin iki yüz elli lira elli kuruş."
|
|
12
|
+
normalize_for_eval("ABD'de 5 TL mi?"); // "a be dede beş lira mı" (WER/CER için)
|
|
13
|
+
inverse_normalize('saat on dört otuzda yüzde on beşlik indirim'); // "saat 14.30'da %15'lik indirim"
|
|
14
|
+
number_to_words(1923); // "bin dokuz yüz yirmi üç"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm install @ozgurguler/trnorm
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Kurallar ve örnekler Python sürümüyle ortaktır: [docs/TRNORM.md](https://github.com/ozguradmin/ahenk-turkish-tts/blob/main/docs/TRNORM.md).
|
|
22
|
+
|
|
23
|
+
## API
|
|
24
|
+
|
|
25
|
+
| İşlev | Ne yapar |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `normalize(text)` | Yazılı metin → okunuş (TTS girdisi). Büyük/küçük harf ve noktalama korunur. |
|
|
28
|
+
| `normalize_for_eval(text)` | Ölçüm için kanonik biçim: okunuş, Türkçe küçük harf, noktalamasız. Referansa ve çıktıya aynen uygulanır. |
|
|
29
|
+
| `inverse_normalize(text)` | Okunuş → rakamlı yazı (ASR çıktısı için). |
|
|
30
|
+
| `number_to_words(n)`, `ordinal_to_words(n)` | Sayının okunuşu: `4` → "dört", "dördüncü". `n`: bigint ya da tam sayı; başka bir sayı Python'daki float gibi okunur. |
|
|
31
|
+
| `tr_lower(text)`, `tr_upper(text)` | Türkçe büyük/küçük harf (I ↔ ı, İ ↔ i). |
|
|
32
|
+
|
|
33
|
+
Python bir hata verdiğinde bu sürüm de hata fırlatır (örneğin 4300 haneden uzun bir sayıda `ValueError`).
|
|
34
|
+
|
|
35
|
+
## Python'la aynı mı?
|
|
36
|
+
|
|
37
|
+
Evet; amaç birebir aynılık. Sürüm, Python'un `str`, `re` ve `int` davranışını taklit eder (`src/py.js`): karakter sayımı
|
|
38
|
+
kod noktasıyla, `\w`/`\d`/`\s`/`\b` Python'un Unicode tanımıyla, `$`'ın son satır sonundan önce de eşleşmesi, sınırsız
|
|
39
|
+
tam sayılar (BigInt), Unicode 15.0'ın büyük/küçük harf tabloları (`src/case_tables.js`), Python 3.12'nin tanımadığı
|
|
40
|
+
yeni karakterler (`src/unassigned.js`) ve tek başına kalmış vekil (surrogate) karakterler.
|
|
41
|
+
|
|
42
|
+
- `npm test`: `test/golden.json`'daki 7.566 metin ve 2.505 sayı. Bu dosyayı `tools/golden.py`, [ahenk-turkish-tts](https://github.com/ozguradmin/ahenk-turkish-tts)
|
|
43
|
+
deposundaki Python trnorm'dan üretir; Python'daki bir değişiklikten sonra dosya yeniden üretilip test çalıştırılır:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
git clone --depth 1 https://github.com/ozguradmin/ahenk-turkish-tts ../ahenk-turkish-tts
|
|
47
|
+
npm run golden # Python 3.12 ile
|
|
48
|
+
npm test
|
|
49
|
+
```
|
|
50
|
+
- Daha geniş eşitlik testi [ahenk-cep-pdfreader](https://github.com/ozguradmin/ahenk-cep-pdfreader/tree/claude/tender-cori-4vvwp6/tools/parity)
|
|
51
|
+
deposunda (`tools/parity`): testler, belgeler ve rastgele üretilmiş zor girdiler (dev sayılar, görünmez
|
|
52
|
+
karakterler, birleşik işaretler, emoji, karışık alfabeler, tek başına vekil karakterler, Python'un tanımadığı yeni
|
|
53
|
+
Unicode karakterleri). Son çalıştırmada üç işlevin (ve okunuş biçimlerinin `inverse_normalize`'ı) 742.716 sonucu
|
|
54
|
+
Python 3.12'yle birebir aynı çıktı. `npm test` V8'de (Node) ve JavaScriptCore'da (Safari'nin motoru) geçiyor. Bu
|
|
55
|
+
sürüm, o sitenin (Ahenk Okur) tarayıcıdaki metin ön ucudur.
|
|
56
|
+
|
|
57
|
+
**Safari 26.0–26.5:** Bu sürümlerin RegExp motoru, U+F800–U+FBFF ya da vekil aralığındaki bir karakterle ardından gelen
|
|
58
|
+
U+FC00–U+FFFF aralığındaki bir karakteri (örneğin `fi5`) tek karakter sanıyor. Böyle bir çift içeren nadir bir metinde
|
|
59
|
+
işlevler yanlış sonuç vermek yerine `name === 'EngineError'` olan bir hata fırlatır; gerekirse metni sunucuya ya da
|
|
60
|
+
Python'a gönderin.
|
|
61
|
+
|
|
62
|
+
Gereken: ES2022 ve Unicode özellik kaçışları olan bir JavaScript motoru (Node 18+, güncel tarayıcılar, Safari 16.4+).
|
|
63
|
+
|
|
64
|
+
## English
|
|
65
|
+
|
|
66
|
+
A JavaScript port of the Python [trnorm](https://github.com/ozguradmin/ahenk-turkish-tts/tree/main/src/trnorm), with the same output for the same input: Turkish written →
|
|
67
|
+
spoken form for TTS (`normalize`), the canonical form for WER/CER scoring (`normalize_for_eval`), and spoken → digits
|
|
68
|
+
for ASR output (`inverse_normalize`), plus `number_to_words`, `ordinal_to_words`, `tr_lower`, `tr_upper`. No
|
|
69
|
+
dependencies; browsers and Node 18+. It keeps Python's `str`, `re` and `int` semantics (code-point indexing, Unicode
|
|
70
|
+
`\w \d \s \b`, Python's `$`, BigInt, Unicode 15.0 case tables, characters newer than Python 3.12's Unicode, lone
|
|
71
|
+
surrogates) and throws where Python raises. `npm test` compares it with the Python trnorm (ozguradmin/ahenk-turkish-tts) on 7,566 texts
|
|
72
|
+
and 2,505 numbers (`tools/golden.py` writes the file); the full parity harness lives in ahenk-cep-pdfreader, where the
|
|
73
|
+
last run gave the same result as Python 3.12 on all 742,716 results (corpus, fuzz and adversarial inputs). On
|
|
74
|
+
Safari 26.0–26.5, whose RegExp engine misreads certain character pairs, such rare inputs throw an `EngineError`
|
|
75
|
+
instead of giving a wrong answer.
|
|
76
|
+
|
|
77
|
+
Apache-2.0. The Python trnorm, its rules and the Ahenk speech models: https://github.com/ozguradmin/ahenk-turkish-tts.
|
package/package.json
CHANGED
|
@@ -1,51 +1,50 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@ozgurguler/trnorm",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Turkish text normalization for speech, in JavaScript: written -> spoken form for TTS, evaluation normalization for ASR (WER/CER), and spoken -> digits. The same output as the Python trnorm.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"exports": {
|
|
7
|
-
".": {
|
|
8
|
-
"types": "./index.d.ts",
|
|
9
|
-
"default": "./src/index.js"
|
|
10
|
-
}
|
|
11
|
-
},
|
|
12
|
-
"main": "./src/index.js",
|
|
13
|
-
"types": "./index.d.ts",
|
|
14
|
-
"files": [
|
|
15
|
-
"src/",
|
|
16
|
-
"index.d.ts",
|
|
17
|
-
"README.md",
|
|
18
|
-
"LICENSE"
|
|
19
|
-
],
|
|
20
|
-
"sideEffects": false,
|
|
21
|
-
"engines": {
|
|
22
|
-
"node": ">=18"
|
|
23
|
-
},
|
|
24
|
-
"scripts": {
|
|
25
|
-
"test": "node --test test/golden.test.mjs",
|
|
26
|
-
"golden": "python3.12 tools/golden.py"
|
|
27
|
-
},
|
|
28
|
-
"keywords": [
|
|
29
|
-
"turkish",
|
|
30
|
-
"türkçe",
|
|
31
|
-
"text-normalization",
|
|
32
|
-
"tts",
|
|
33
|
-
"asr",
|
|
34
|
-
"speech",
|
|
35
|
-
"number-to-words",
|
|
36
|
-
"sayı",
|
|
37
|
-
"okunuş"
|
|
38
|
-
],
|
|
39
|
-
"author": "Özgür Güler",
|
|
40
|
-
"license": "Apache-2.0",
|
|
41
|
-
"repository": {
|
|
42
|
-
"type": "git",
|
|
43
|
-
"url": "git+https://github.com/ozguradmin/
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@ozgurguler/trnorm",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Turkish text normalization for speech, in JavaScript: written -> spoken form for TTS, evaluation normalization for ASR (WER/CER), and spoken -> digits. The same output as the Python trnorm.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./index.d.ts",
|
|
9
|
+
"default": "./src/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"main": "./src/index.js",
|
|
13
|
+
"types": "./index.d.ts",
|
|
14
|
+
"files": [
|
|
15
|
+
"src/",
|
|
16
|
+
"index.d.ts",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"test": "node --test test/golden.test.mjs",
|
|
26
|
+
"golden": "python3.12 tools/golden.py"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"turkish",
|
|
30
|
+
"türkçe",
|
|
31
|
+
"text-normalization",
|
|
32
|
+
"tts",
|
|
33
|
+
"asr",
|
|
34
|
+
"speech",
|
|
35
|
+
"number-to-words",
|
|
36
|
+
"sayı",
|
|
37
|
+
"okunuş"
|
|
38
|
+
],
|
|
39
|
+
"author": "Özgür Güler",
|
|
40
|
+
"license": "Apache-2.0",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/ozguradmin/trnorm-js.git"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/ozguradmin/trnorm-js#readme",
|
|
46
|
+
"bugs": "https://github.com/ozguradmin/trnorm-js/issues",
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
}
|
|
50
|
+
}
|