HachimiMT-60-QT / README_vi.md
ngocdang83's picture
v1.1: continue-train on 5,380 phenomenon-lane sentences (idioms, 宁缺毋滥, causative 教, 莫不, 讨X, 凛然 …) + 30k QT replay; register flip 0.000 unchanged; clean suite +1.05 BLEU; blind dual review 46 better / 14 worse vs v1.0
fca7a1e verified
|
Raw
History Blame Contribute Delete
10.9 kB

🇬🇧 English version

HachimiMT-60-QT: dịch truyện Trung→Việt, văn phong convert thuần nhất

Bản "giọng cổ trang" của HachimiMT-60: dịch tiếng Trung sang tiếng Việt theo văn phong truyện convertta, ngươi, hắn, nàng, tỷ tỷ, ca ca… — và giữ đúng một giọng từ đầu đến cuối chương.

Có gì mới ở v1.1 (12/09/2026)

Vẫn model đó, cùng tokenizer, cùng bộ file — thay thế trực tiếp. v1.1 được train tiếp 2.000 bước trên 5.380 câu thật đào từ kho truyện, nhắm đúng những cụm "đuôi hiếm" mà bản trước dịch sai: thành ngữ động từ–tân ngữ (背黑锅, 敲竹杠, 碰钉子, 钻牛角尖, 狮子大开口, 翻旧账 …), cụm bốn chữ 宁缺毋滥 (v1.0 phiên thành tên giả "Ninh Khuyết"), 教 nghĩa sai khiến trong văn chương ("khiến", không phải "dạy"), nhóm 莫不 / 讨X / 凛然 — mỗi nhóm kèm câu đối chứng để nghĩa thường (教 = dạy, tên riêng có chữ 莫/宁) không bị lệch — cộng 30k câu ôn lại từ dữ liệu gốc để phần còn lại không xê dịch.

Ví dụ thật, CTranslate2 INT8, beam 1 (đúng cấu hình bên dưới):

Nguyên văn v1.0 v1.1
宁缺毋滥,这才是王者的傲气。 Ninh Khuyết không có lạm dụng, đây mới là ngạo khí của bậc vương giả. Thà thiếu chứ không lấy bừa, đây mới là ngạo khí của bậc vương giả.
老黄满脸不忿地说道:“就不怕他们狮子大开口? Lão Hoàng mặt mũi tràn đầy bất mãn nói: “Không sợ bọn hắn mở miệng sư tử sao? Lão Hoàng mặt đầy không phục nói: "Không sợ bọn hắn hét giá trên trời sao?"
四名顶尖高手,心中凛然,如临大敌。 Bốn cao thủ đỉnh cao, trong lòng nghiêm nghị, như đối mặt với đại địch. Bốn cao thủ đỉnh cao, trong lòng rúng động, như lâm đại địch.
‘轻轻吻着你的脸,教我如何不想她’ 'Nhẹ nhàng hôn lên mặt ngươi, dạy ta làm sao không nhớ nàng' 'nhẹ nhàng hôn lên mặt ngươi, khiến ta làm sao không nghĩ nàng'
之前他有意收买沈薇,却碰了一鼻子灰,…… Trước đó hắn có ý mua chuộc Thẩm Vi, lại bị ăn một phát bụi, … Trước đây hắn cố ý mua chuộc Thẩm Vi, lại chuốc lấy thất vọng, …

Đo được, v1.0 → v1.1, cùng cấu hình decode:

  • Review mù bởi hai bên chấm độc lập, 192 câu mới dựng quanh các cụm này: mức lỗi trung bình 0,92 → 0,59; v1.1 tốt hơn ở 46 câu, kém hơn ở 14 câu. Trên bộ 175 câu của vòng đầu: 1,01 → 0,50 (53 tốt hơn / 10 kém hơn).
  • Độ nhất quán xưng hô (lý do tồn tại của bản này): vẫn 0 lần đổi giọng ở mọi lớp ngôi trên bộ 7 chương; độ phủ lớp "ngươi" 0,92 → 1,00.
  • Chất lượng chung, bộ 1.392 câu sạch: BLEU 51,4 → 52,4; tỷ lệ lặp 0,79 % không đổi; tốc độ không đổi. Bộ 49 câu khó tên riêng: BLEU 56,4 → 57,9, tỷ lệ giữ đúng tên không đổi. Gate hiệu chuẩn tên 223/230 không đổi.

Còn yếu, nói trước: 敲竹杠 ở vài ngữ cảnh vẫn dịch chữ ("gõ thanh tre"), 放鸽子 vẫn dịch chữ, 莫不 đứng ngay sau một chuỗi địa danh có thể thành tên ("Mạc Bất"), và tên riêng hiếm vẫn có thể lệch âm hoặc mất viết hoa ("Tô đạm Nguyệt").

Cần bản cũ? Ghim tag: revision="v1.0" (dùng được với from_pretrained lẫn snapshot_download).

Khác gì bản thường?

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 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, 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".

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 đổ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 (HachimiMT-60 thường vs bản QT này):

Nguyên văn Bản thường Bản QT
你为什么要报考我们的学校? Tại sao ngươi lại muốn thi vào trường của chúng ta? Ngươi vì sao phải thi vào trường của chúng ta?
你成绩没有问题…… (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 đề…
我来给你介绍介绍这里的福利吧 Để 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
张羽……他感觉…… (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…

Đ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", bản thường đổi giọng ở ~24% chỗ chuyển câu; bản QT: 0%. Các lớp ta/tôi, chúng ta/chúng tôi, hắn/nàng cũng về 0 tương tự.

Câu khó (stress test)

Một câu chứa 4 ngôi — không lẫn ai với ai:

他说你不懂她的心思,我们都别插手了。 → 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 nữa.

Đ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":

张羽同学,我们了解到你的家庭情况恐怕不足以负担这边的学费。不过我们为贫困生提供了优惠的贷款服务,只要你愿意抵押一些不重要的器官就行……

Dịch
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
Bản QT Trương Vũ đồng học, 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...

Giới hạn đã biết (ví dụ thật, không giấu)

Tên riêng/thuật ngữ hiếm thỉnh thoảng lệch âm, mất viết hoa một âm tiết hoặc bị dịch nghĩa — hạn chế chung của cả họ model cỡ nhỏ, không riêng bản QT. Ví dụ thật ở v1.1: tên linh thú 【异瞳金丝猴】 (chuẩn: Dị Đồng Kim Ty Hầu) ra "Kim Ti Hầu"; nhân vật 苏淡月 (Tô Đạm Nguyệt) có lần ra "Tô đạm Nguyệt"; tên Tây 泰尔齐奇 ra nửa phiên âm "Til Tề Kỳ". Đọc truyện nhiều tên riêng lạ thì nên soát lại các tên xuất hiện lần đầu.

Dùng khi nào?

  • ✅ Đọc/convert truyện tiên hiệp, huyền huyễn, cổ trang, đam mỹ cổ phong — hoặc bất kỳ thể loại nào bạn muốn giọng convert xuyên suốt.
  • ⚠️ Truyện hiện đại cũng sẽ ra giọng convert ("Sao ngươi chưa nghỉ ngơi?") — đây là chủ đích của bản này. Muốn giọng tự nhiên theo ngữ cảnh, dùng bản thường.

Vài điều đánh đổi (chủ đích, ghi rõ để khỏi bất ngờ):

  • 我们/咱们 đều thành "chúng ta" (không còn phân biệt "chúng tôi").
  • 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.

Dùng nhanh (Python)

from transformers import AutoTokenizer, MarianMTModel
import torch

repo = "ngocdang83/HachimiMT-60-QT"
tokenizer = AutoTokenizer.from_pretrained(repo)
model = MarianMTModel.from_pretrained(repo).eval()

src = "你成绩没有问题,但想要进嵩阳高中,光靠校内考试成绩是远远不够的。"
inp = tokenizer(src, return_tensors="pt", truncation=True, max_length=256)
with torch.inference_mode():
    out = model.generate(**inp, max_new_tokens=300, num_beams=4, early_stopping=True)
print(tokenizer.decode(out[0], skip_special_tokens=True))
# "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
#  Tung Dương, chỉ dựa vào điểm thi trong trường thì còn xa mới đủ."

💡 Mẹo decode: đừng bật no_repeat_ngram_size với model này — nó ép máy "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). Cứ để mặc định như ví dụ trên.

Chạy nhanh trên CPU (CTranslate2)

Repo kèm sẵn bản nén INT8 trong thư mục ct2-int8_float32/ — dịch nhanh gấp nhiều lần trên máy không có GPU:

import ctranslate2
from pathlib import Path
from huggingface_hub import snapshot_download
from transformers import AutoTokenizer

repo = "ngocdang83/HachimiMT-60-QT"
path = Path(snapshot_download(repo, allow_patterns=[
    "config.json", "source.spm", "target.spm", "vocab.json",
    "tokenizer_config.json", "ct2-int8_float32/*",
]))
tokenizer = AutoTokenizer.from_pretrained(path)
translator = ctranslate2.Translator(str(path / "ct2-int8_float32"),
                                    device="cpu", compute_type="int8_float32")

src = "你放心吧,人家是大公司,不会骗人的。"
toks = tokenizer.convert_ids_to_tokens(tokenizer(src).input_ids)
res = translator.translate_batch([toks], beam_size=1, max_decoding_length=256)
print(tokenizer.decode(tokenizer.convert_tokens_to_ids(res[0].hypotheses[0]),
                       skip_special_tokens=True))
# "Ngươi yên tâm đi, người ta là công ty lớn, sẽ không lừa người đâu."

Gia đình Hachimi

Model Dùng khi
HachimiMT-60-zh-vi Giọng tự nhiên theo ngữ cảnh, đa thể loại
HachimiMT-60-QT (bản này) Giọng convert thuần nhất, không đổi xưng hô
Demo Space Dịch thử ngay trên trình duyệt

Chi tiết kỹ thuật (56.96M tham số, Marian encoder-decoder, chạy tốt cả CPU lẫn GPU) xem config.json. Giấy phép CC-BY-4.0 — dùng thoải mái, ghi nguồn là được.