HachimiMT-60-QT / README_vi.md
ngocdang83's picture
README: English default + README_vi.md (match family structure)
843aab0 verified
|
Raw
History Blame Contribute Delete
7.35 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.

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? Tại sao ngươi 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 đề gì…
我来给你介绍介绍这里的福利吧 Để 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.

Đ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 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...

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 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ụ tên linh thú 【异瞳金丝猴】 (chuẩn: Dị Đồng Kim Ty Hầu): bản thường ra "Kim Ti Hầu", bản QT ra "Kim Hầu" (dịch nghĩa chữ 丝). Đọ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 là 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.