ngocdang83 commited on
Commit
843aab0
·
verified ·
1 Parent(s): aa5a8c0

README: English default + README_vi.md (match family structure)

Browse files
Files changed (2) hide show
  1. README.md +64 -53
  2. README_vi.md +127 -0
README.md CHANGED
@@ -19,71 +19,82 @@ datasets:
19
  - chi-vi/hirashiba-mt-zh2vi-b-filtered
20
  ---
21
 
22
- # HachimiMT-60-QT: dịch truyện Trung→Việt, văn phong convert thuần nhất
23
 
24
- Bản "giọng cổ trang" của [HachimiMT-60](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi):
25
- dịch tiếng Trung sang tiếng Việt theo **văn phong truyện convert** — *ta, ngươi, hắn,
26
- nàng, tỷ tỷ, ca ca…* — và **giữ đúng một giọng từ đầu đến cuối chương**.
27
 
28
- ## Khác bản thường?
 
 
 
 
 
29
 
30
- Model dịch máy bình thường (kể cả bản HachimiMT-60 gốc) có một tật khó chịu với
31
- người đọc truyện: **đang dịch thì đổi cách xưng hô giữa chừng** — cùng một nhân vật,
32
- câu trước gọi "ngươi", câu sau thành "cậu"; đoạn trước xưng "ta", đoạn sau thành "tôi".
33
 
34
- Bản QT được huấn luyện trên dữ liệu đã chuẩn hóa toàn bộ hệ xưng hô, nên **không còn
35
- đổi giọng nữa**. dụ thật, cùng một chương truyện, cùng một cuộc phỏng vấn
36
- (HachimiMT-60 thường vs bản QT này):
 
 
37
 
38
- | Nguyên văn | Bản thường | **Bản QT** |
 
 
 
 
39
  |---|---|---|
40
  | 你为什么要报考我们的学校? | Tại sao **ngươi** lại muốn thi vào trường của chúng ta? | Tại sao **ngươi** phải thi vào trường của chúng ta? |
41
- | 你成绩没有问题…… (câu ngay sau) | Thành tích của **cậu** không thành vấn đề… ← *đổi giọng!* | Thành tích của **ngươi** không có vấn đề gì… |
42
- | 我来给你介绍介绍这里的福利吧 | Để **tôi** giới thiệu phúc lợi ở đây cho **cậu** nhé, **chúng tôi**… | Để **ta** giới thiệu phúc lợi ở đây cho **ngươi** nhé, **chúng ta**… |
43
- | 张羽……他感觉…… (lời kể) | Trương Vũ… **cậu** cảm thấy… ← *"cậu" cho lời kể* | Trương Vũ… **hắn** cảm thấy… |
44
 
45
- Đo trên 7 chương thuộc 7 thể loại khác nhau (538 câu): lớp xưng "ngươi/cậu",
46
- bản thường **đổi giọng ~24% chỗ chuyển câu**; bản QT: **0%**. Các lớp
47
- ta/tôi, chúng ta/chúng tôi, hắn/nàng cũng về 0 tương tự.
48
 
49
- ## Câu khó (stress test)
50
 
51
- **Một câu chứa 4 ngôi** — không lẫn ai với ai:
52
 
53
  > 他说你不懂她的心思,我们都别插手了。
54
  > → *Hắn nói ngươi không hiểu tâm tư của nàng, chúng ta đều đừng nhúng tay vào.*
 
55
 
56
- **Đoạn dài nhiều lượt xưng hô** — chỗ bản thường dễ "đổi giọng ngay giữa đoạn":
 
57
 
58
  > 张羽同学,我们了解到你的家庭情况恐怕不足以负担这边的学费。不过我们为贫困生提供了优惠的贷款服务,只要你愿意抵押一些不重要的器官就行……
59
 
60
- | | Dịch |
61
  |---|---|
62
- | Bản thường | Bạn học Trương Vũ, **chúng tôi** hiểu được tình hình gia đình của **bạn**… Tuy nhiên, **chúng ta** đã cung cấp dịch vụ vay… chỉ cần **bạn**… ← *trộn 2 giọng trong 1 đoạn* |
63
- | **Bản QT** | Bạn học Trương Vũ, **chúng ta** biết được tình hình gia đình của **ngươi**… Nhưng **chúng ta** đã cung cấp dịch vụ vay vốn ưu đãi… chỉ cần **ngươi** chịu thế chấp một số nội tạng không quan trọng là được... |
64
 
65
- ## Giới hạn đã biết (ví dụ thật, không giấu)
66
 
67
- Tên riêng/thuật ngữ hiếm thỉnh thoảng lệch âm hoặc bị dịch nghĩa hạn chế chung của
68
- cả họ model cỡ nhỏ, không riêng bản QT. Ví dụ tên linh thú 【异瞳金丝猴】
69
- (chuẩn: *Dị Đồng Kim Ty Hầu*): bản thường ra "Kim **Ti** Hầu", bản QT ra
70
- "Kim **Tơ** Hầu" (dịch nghĩa chữ 丝). Đọc truyện nhiều tên riêng lạ thì nên
71
- soát lại các tên xuất hiện lần đầu.
 
72
 
73
- ## Dùng khi nào?
74
 
75
- - ✅ Đọc/convert truyện tiên hiệp, huyền huyễn, cổ trang, đam mỹ cổ phong — hoặc bất
76
- kỳ thể loại nào bạn muốn **giọng convert xuyên suốt**.
77
- - ⚠️ Truyện hiện đại cũng sẽ ra giọng convert ("Sao ngươi chưa nghỉ ngơi?") — đây là
78
- **chủ đích** của bản này. Muốn giọng tự nhiên theo ngữ cảnh, dùng
79
- [bản thường](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi).
80
 
81
- Vài điều đánh đổi (chủ đích, ghi rõ để khỏi bất ngờ):
82
 
83
- - 我们/咱们 đều thành **"chúng ta"** (không còn phân biệt "chúng tôi").
84
- - Xưng thân mật kiểu hiện đại (anh/em trong thoại yêu đương) phần lớn thành ta/ngươi.
 
 
 
 
85
 
86
- ## Dùng nhanh (Python)
87
 
88
  ```python
89
  from transformers import AutoTokenizer, MarianMTModel
@@ -102,14 +113,14 @@ print(tokenizer.decode(out[0], skip_special_tokens=True))
102
  # Tung Dương, chỉ dựa vào điểm thi trong trường là còn xa mới đủ."
103
  ```
104
 
105
- > 💡 **Mẹo decode**: đừng bật `no_repeat_ngram_size` với model này nó ép máy
106
- > "né chữ lặp" nên hay bóp méo tên riêng (Lý Giáng Thiên → Lý Giáng Dương).
107
- > Cứ để mặc định như dụ trên.
108
 
109
- ## Chạy nhanh trên CPU (CTranslate2)
110
 
111
- Repo kèm sẵn bản nén INT8 trong thư mục `ct2-int8_float32/` — dịch nhanh gấp nhiều
112
- lần trên máy không có GPU:
113
 
114
  ```python
115
  import ctranslate2
@@ -134,13 +145,13 @@ print(tokenizer.decode(tokenizer.convert_tokens_to_ids(res[0].hypotheses[0]),
134
  # "Ngươi yên tâm đi, người ta là công ty lớn, sẽ không lừa người đâu."
135
  ```
136
 
137
- ## Gia đình Hachimi
138
 
139
- | Model | Dùng khi |
140
  |---|---|
141
- | [HachimiMT-60-zh-vi](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi) | Giọng tự nhiên theo ngữ cảnh, đa thể loại |
142
- | **HachimiMT-60-QT** (bản này) | Giọng convert thuần nhất, không đổi xưng hô |
143
- | [Demo Space](https://huggingface.co/spaces/ngocdang83/HachimiMT-demo) | Dịch thử ngay trên trình duyệt |
144
 
145
- Chi tiết kỹ thuật (56.96M tham số, Marian encoder-decoder, chạy tốt cả CPU lẫn GPU)
146
- xem `config.json`. Giấy phép CC-BY-4.0 — dùng thoải mái, ghi nguồn là được.
 
19
  - chi-vi/hirashiba-mt-zh2vi-b-filtered
20
  ---
21
 
22
+ # HachimiMT-60-QT: Chinese→Vietnamese translation with a perfectly consistent "convert" voice
23
 
24
+ > 🇻🇳 [Đọc bản tiếng Việt](./README_vi.md)
 
 
25
 
26
+ The "classical register" edition of
27
+ [HachimiMT-60](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi): it translates
28
+ Chinese web novels into Vietnamese using the **truyện convert** pronoun register —
29
+ *ta, ngươi, hắn, nàng, tỷ tỷ, ca ca…* (the archaic Sino-Vietnamese address style
30
+ that Vietnamese web-novel readers know by heart) — and **keeps that voice perfectly
31
+ stable from the first line of a chapter to the last**.
32
 
33
+ ## What's different from the base model?
 
 
34
 
35
+ Ordinary MT models (including base HachimiMT-60) have a habit that drives novel
36
+ readers crazy: **they switch address style mid-chapter**. The same character is
37
+ "ngươi" (archaic *you*) in one line and suddenly "cậu" (modern *you*) in the next;
38
+ the narrator says "ta" (*I*, archaic) in one paragraph and "tôi" (*I*, modern) in
39
+ another.
40
 
41
+ This QT edition was trained on data whose entire pronoun system was normalized, so
42
+ **the voice never flips**. Real output, same chapter, same interview scene
43
+ (base HachimiMT-60 vs this model):
44
+
45
+ | Source | Base model | **QT model** |
46
  |---|---|---|
47
  | 你为什么要报考我们的学校? | Tại sao **ngươi** lại muốn thi vào trường của chúng ta? | Tại sao **ngươi** phải thi vào trường của chúng ta? |
48
+ | 你成绩没有问题…… (very next line) | Thành tích của **cậu** không thành vấn đề… ← *voice flips!* | Thành tích của **ngươi** không có vấn đề gì… |
49
+ | 我来给你介绍介绍这里的福利吧 | Để **tôi** giới thiệu cho **cậu** nhé, **chúng tôi**… | Để **ta** giới thiệu cho **ngươi** nhé, **chúng ta**… |
50
+ | 张羽……他感觉…… (narration) | Trương Vũ… **cậu** cảm thấy… ← *modern "cậu" in narration* | Trương Vũ… **hắn** cảm thấy… |
51
 
52
+ Measured on 7 chapters across 7 genres (538 lines): in the *you*-register class the
53
+ base model **flips voice at ~24% of line transitions**; this model: **0%**. The
54
+ *I*, *we* and third-person classes also drop to zero.
55
 
56
+ ## Stress tests
57
 
58
+ **Four pronouns in one sentence** — nothing gets mixed up:
59
 
60
  > 他说你不懂她的心思,我们都别插手了。
61
  > → *Hắn nói ngươi không hiểu tâm tư của nàng, chúng ta đều đừng nhúng tay vào.*
62
+ > (he→hắn, you→ngươi, she→nàng, we→chúng ta)
63
 
64
+ **A long multi-clause paragraph** — where the base model mixes two voices inside a
65
+ single paragraph:
66
 
67
  > 张羽同学,我们了解到你的家庭情况恐怕不足以负担这边的学费。不过我们为贫困生提供了优惠的贷款服务,只要你愿意抵押一些不重要的器官就行……
68
 
69
+ | | Translation |
70
  |---|---|
71
+ | Base | Bạn học Trương Vũ, **chúng tôi** hiểu được tình hình gia đình của **bạn**… Tuy nhiên, **chúng ta** đã cung cấp dịch vụ vay… chỉ cần **bạn**… ← *two registers in one paragraph* |
72
+ | **QT** | Bạn học Trương Vũ, **chúng ta** biết được tình hình gia đình của **ngươi**… Nhưng **chúng ta** đã cung cấp dịch vụ vay vốn ưu đãi… chỉ cần **ngươi** chịu thế chấp một số nội tạng không quan trọng là được... |
73
 
74
+ ## When to use it
75
 
76
+ - Xianxia, xuanhuan, historical, danmei or **any** genre where you want the
77
+ convert voice all the way through.
78
+ - ⚠️ Modern-setting stories also come out in the archaic voice ("Sao ngươi chưa
79
+ nghỉ ngơi?") that is **by design**. If you want context-appropriate natural
80
+ register instead, use the
81
+ [base model](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi).
82
 
83
+ Deliberate trade-offs (documented so nothing surprises you):
84
 
85
+ - 我们/咱们 both become **"chúng ta"** (the inclusive/exclusive *we* distinction is dropped).
86
+ - Modern intimate address (anh/em between lovers) mostly becomes ta/ngươi.
 
 
 
87
 
88
+ ## Known limitations (real example, not hidden)
89
 
90
+ Rare proper nouns and coined terms can come out with a shifted syllable or a
91
+ literal translation a limitation of every model in this size class, not specific
92
+ to the QT edition. Example, the spirit-beast name 【异瞳金丝猴】 (reference:
93
+ *Dị Đồng Kim Ty Hầu*): the base model outputs "Kim **Ti** Hầu", this model outputs
94
+ "Kim **Tơ** Hầu" (literal reading of 丝). If your novel is full of first-time rare
95
+ names, spot-check them.
96
 
97
+ ## Quick start (Python)
98
 
99
  ```python
100
  from transformers import AutoTokenizer, MarianMTModel
 
113
  # Tung Dương, chỉ dựa vào điểm thi trong trường là còn xa mới đủ."
114
  ```
115
 
116
+ > 💡 **Decoding tip**: do **not** set `no_repeat_ngram_size` with this model — it
117
+ > forces the decoder to avoid repeating n-grams and tends to mangle proper names
118
+ > (Lý Giáng Thiên Giáng Dương). The defaults above are what we ship with.
119
 
120
+ ## Fast CPU inference (CTranslate2)
121
 
122
+ The repo ships an INT8 export under `ct2-int8_float32/` — several times faster on
123
+ machines without a GPU:
124
 
125
  ```python
126
  import ctranslate2
 
145
  # "Ngươi yên tâm đi, người ta là công ty lớn, sẽ không lừa người đâu."
146
  ```
147
 
148
+ ## The Hachimi family
149
 
150
+ | Model | Use when |
151
  |---|---|
152
+ | [HachimiMT-60-zh-vi](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi) | Natural, context-dependent register |
153
+ | **HachimiMT-60-QT** (this) | One perfectly stable convert voice |
154
+ | [Demo Space](https://huggingface.co/spaces/ngocdang83/HachimiMT-demo) | Try it in the browser |
155
 
156
+ Technical details (56.96M params, Marian encoder-decoder, runs fine on CPU or GPU)
157
+ are in `config.json`. License CC-BY-4.0 — use freely with attribution.
README_vi.md ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ > 🇬🇧 [English version](./README.md)
2
+
3
+ # HachimiMT-60-QT: dịch truyện Trung→Việt, văn phong convert thuần nhất
4
+
5
+ Bản "giọng cổ trang" của [HachimiMT-60](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi):
6
+ dịch tiếng Trung sang tiếng Việt theo **văn phong truyện convert** — *ta, ngươi, hắn,
7
+ nàng, tỷ tỷ, ca ca…* — và **giữ đúng một giọng từ đầu đến cuối chương**.
8
+
9
+ ## Khác gì bản thường?
10
+
11
+ Model dịch máy bình thường (kể cả bản HachimiMT-60 gốc) có một tật khó chịu với
12
+ người đọc truyện: **đang dịch thì đổi cách xưng hô giữa chừng** — cùng một nhân vật,
13
+ câu trước gọi "ngươi", câu sau thành "cậu"; đoạn trước xưng "ta", đoạn sau thành "tôi".
14
+
15
+ Bản QT được huấn luyện trên dữ liệu đã chuẩn hóa toàn bộ hệ xưng hô, nên **không còn
16
+ đổi giọng nữa**. Ví dụ thật, cùng một chương truyện, cùng một cuộc phỏng vấn
17
+ (HachimiMT-60 thường vs bản QT này):
18
+
19
+ | Nguyên văn | Bản thường | **Bản QT** |
20
+ |---|---|---|
21
+ | 你为什么要报考我们的学校? | Tại sao **ngươi** lại muốn thi vào trường của chúng ta? | Tại sao **ngươi** phải thi vào trường của chúng ta? |
22
+ | 你成绩没有问题…… (câu ngay sau) | Thành tích của **cậu** không thành vấn đề… ← *đổi giọng!* | Thành tích của **ngươi** không có vấn đề gì… |
23
+ | 我来给你介绍介绍这里的福利吧 | Để **tôi** giới thiệu phúc lợi ở đây cho **cậu** nhé, **chúng tôi**… | Để **ta** giới thiệu phúc lợi ở đây cho **ngươi** nhé, **chúng ta**… |
24
+ | 张羽……他感觉…… (lời kể) | Trương Vũ… **cậu** cảm thấy… ← *"cậu" cho lời kể* | Trương Vũ… **hắn** cảm thấy… |
25
+
26
+ Đo trên 7 chương thuộc 7 thể loại khác nhau (538 câu): ở lớp xưng hô "ngươi/cậu",
27
+ bản thường **đổi giọng ở ~24% chỗ chuyển câu**; bản QT: **0%**. Các lớp
28
+ ta/tôi, chúng ta/chúng tôi, hắn/nàng cũng về 0 tương tự.
29
+
30
+ ## Câu khó (stress test)
31
+
32
+ **Một câu chứa 4 ngôi** — không lẫn ai với ai:
33
+
34
+ > 他说你不懂她的心思,我们都别插手了。
35
+ > → *Hắn nói ngươi không hiểu tâm tư của nàng, chúng ta đều đừng nhúng tay vào.*
36
+
37
+ **Đoạn dài nhiều lượt xưng hô** — chỗ bản thường dễ "đổi giọng ngay giữa đoạn":
38
+
39
+ > 张羽同学,我们了解到你的家庭情况恐怕不足以负担这边的学费。不过我们为贫困生提供了优惠的贷款服务,只要你愿意抵押一些不重要的器官就行……
40
+
41
+ | | Dịch |
42
+ |---|---|
43
+ | Bản thường | Bạn học Trương Vũ, **chúng tôi** hiểu được tình hình gia đình của **bạn**… Tuy nhiên, **chúng ta** đã cung cấp dịch vụ vay… chỉ cần **bạn**… ← *trộn 2 giọng trong 1 đoạn* |
44
+ | **Bản QT** | Bạn học Trương Vũ, **chúng ta** biết được tình hình gia đình của **ngươi**… Nhưng **chúng ta** đã cung cấp dịch vụ vay vốn ưu đãi… chỉ cần **ngươi** chịu thế chấp một số nội tạng không quan trọng là được... |
45
+
46
+ ## Giới hạn đã biết (ví dụ thật, không giấu)
47
+
48
+ Tên riêng/thuật ngữ hiếm thỉnh thoảng lệch âm hoặc bị dịch nghĩa — hạn chế chung của
49
+ cả họ model cỡ nhỏ, không riêng bản QT. Ví dụ tên linh thú 【异瞳金丝猴】
50
+ (chuẩn: *Dị Đồng Kim Ty Hầu*): bản thường ra "Kim **Ti** Hầu", bản QT ra
51
+ "Kim **Tơ** Hầu" (dịch nghĩa chữ 丝). Đọc truyện nhiều tên riêng lạ thì nên
52
+ soát lại các tên xuất hiện lần đầu.
53
+
54
+ ## Dùng khi nào?
55
+
56
+ - ✅ Đọc/convert truyện tiên hiệp, huyền huyễn, cổ trang, đam mỹ cổ phong — hoặc bất
57
+ kỳ thể loại nào bạn muốn **giọng convert xuyên suốt**.
58
+ - ⚠️ Truyện hiện đại cũng sẽ ra giọng convert ("Sao ngươi chưa nghỉ ngơi?") — đây là
59
+ **chủ đích** của bản này. Muốn giọng tự nhiên theo ngữ cảnh, dùng
60
+ [bản thường](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi).
61
+
62
+ Vài điều đánh đổi (chủ đích, ghi rõ để khỏi bất ngờ):
63
+
64
+ - 我们/咱们 đều thành **"chúng ta"** (không còn phân biệt "chúng tôi").
65
+ - Xưng hô thân mật kiểu hiện đại (anh/em trong thoại yêu đương) phần lớn thành ta/ngươi.
66
+
67
+ ## Dùng nhanh (Python)
68
+
69
+ ```python
70
+ from transformers import AutoTokenizer, MarianMTModel
71
+ import torch
72
+
73
+ repo = "ngocdang83/HachimiMT-60-QT"
74
+ tokenizer = AutoTokenizer.from_pretrained(repo)
75
+ model = MarianMTModel.from_pretrained(repo).eval()
76
+
77
+ src = "你成绩没有问题,但想要进嵩阳高中,光靠校内考试成绩是远远不够的。"
78
+ inp = tokenizer(src, return_tensors="pt", truncation=True, max_length=256)
79
+ with torch.inference_mode():
80
+ out = model.generate(**inp, max_new_tokens=300, num_beams=4, early_stopping=True)
81
+ print(tokenizer.decode(out[0], skip_special_tokens=True))
82
+ # "Thành tích của ngươi không có vấn đề gì, nhưng muốn vào trường trung học
83
+ # Tung Dương, chỉ dựa vào điểm thi trong trường là còn xa mới đủ."
84
+ ```
85
+
86
+ > 💡 **Mẹo decode**: đừng bật `no_repeat_ngram_size` với model này — nó ép máy
87
+ > "né chữ lặp" nên hay bóp méo tên riêng (Lý Giáng Thiên → Lý Giáng Dương).
88
+ > Cứ để mặc định như ví dụ trên.
89
+
90
+ ## Chạy nhanh trên CPU (CTranslate2)
91
+
92
+ Repo kèm sẵn bản nén INT8 trong thư mục `ct2-int8_float32/` — dịch nhanh gấp nhiều
93
+ lần trên máy không có GPU:
94
+
95
+ ```python
96
+ import ctranslate2
97
+ from pathlib import Path
98
+ from huggingface_hub import snapshot_download
99
+ from transformers import AutoTokenizer
100
+
101
+ repo = "ngocdang83/HachimiMT-60-QT"
102
+ path = Path(snapshot_download(repo, allow_patterns=[
103
+ "config.json", "source.spm", "target.spm", "vocab.json",
104
+ "tokenizer_config.json", "ct2-int8_float32/*",
105
+ ]))
106
+ tokenizer = AutoTokenizer.from_pretrained(path)
107
+ translator = ctranslate2.Translator(str(path / "ct2-int8_float32"),
108
+ device="cpu", compute_type="int8_float32")
109
+
110
+ src = "你放心吧,人家是大公司,不会骗人的。"
111
+ toks = tokenizer.convert_ids_to_tokens(tokenizer(src).input_ids)
112
+ res = translator.translate_batch([toks], beam_size=1, max_decoding_length=256)
113
+ print(tokenizer.decode(tokenizer.convert_tokens_to_ids(res[0].hypotheses[0]),
114
+ skip_special_tokens=True))
115
+ # "Ngươi yên tâm đi, người ta là công ty lớn, sẽ không lừa người đâu."
116
+ ```
117
+
118
+ ## Gia đình Hachimi
119
+
120
+ | Model | Dùng khi |
121
+ |---|---|
122
+ | [HachimiMT-60-zh-vi](https://huggingface.co/ngocdang83/HachimiMT-60-zh-vi) | Giọng tự nhiên theo ngữ cảnh, đa thể loại |
123
+ | **HachimiMT-60-QT** (bản này) | Giọng convert thuần nhất, không đổi xưng hô |
124
+ | [Demo Space](https://huggingface.co/spaces/ngocdang83/HachimiMT-demo) | Dịch thử ngay trên trình duyệt |
125
+
126
+ Chi tiết kỹ thuật (56.96M tham số, Marian encoder-decoder, chạy tốt cả CPU lẫn GPU)
127
+ xem `config.json`. Giấy phép CC-BY-4.0 — dùng thoải mái, ghi nguồn là được.