QQQ
3Q!
📚 【翻訳モデル】200の言語を翻訳できるNLLBモデル体験 LM2_1
CPUの場合
用時:
1分23秒(46:14 ~ 47:37)
負荷:
CPU80スレッドほぼ100%
GPU(CUDA)の場合
CPU負荷をせず、1/3程度短縮しました。83秒→27秒
用時:
27秒(27:06 ~ 27:33)
負荷:
CPU ほぼ変わらない 6%ぐらい GPU 65% GPU RAM 3GBぐらい
言語一覧
# 漢字系
"zh": "zho_Hans", # 中国語(簡体字)
"zh_TW": "zho_Hant", # 中国語(繁体字)
"ja": "jpn_Jpan", # 日本語
"ko": "kor_Hang", # 韓国語
"th": "tha_Thai", # タイ語
# ラテン系言語
"en": "eng_Latn", # 英語
"fr": "fra_Latn", # フランス語
"de": "deu_Latn", # ドイツ語
"vi": "vie_Latn", # ベトナム語
"tl": "tgl_Latn", # フィリピン語
"ms": "ind_Latn", # インドネシア語(マレー語と約80%共通)
"ru": "rus_Latn", # ロシア語
"es": "spa_Latn", # スペイン語
"it": "ita_Latn", # イタリア語
"pt": "por_Latn", # ポルトガル語
"tr": "tur_Latn", # トルコ語
"nl": "nld_Latn", # オランダ語
"sv": "swe_Latn", # スウェーデン語
"no": "nno_Latn", # ノルウェー語
"da": "dan_Latn", # デンマーク語
"is": "isl_Latn", # アイスランド語
# アラビア語系
"fa": "fas_Arab", # ペルシャ語
"ar": "ara_Arab", # アラビア語
# ヒンディー語系
"hi": "hin_Deva", # ヒンディー語
# ベンガル語系
"bn": "ben_Beng", # ベンガル語
翻訳結果
中国語翻訳文の「大家一起开心地共同进步吧!」後半部分が抜けてしまいました。
少し調査してみます。 ※ 文書翻訳も問題同件
原文(中文): 欢迎来到QQQ技术论坛,大家一起开心地共同进步吧!
翻訳結果:
jpn_Jpan: QQQ技術フォーラムへようこそ! 楽しく一緒に進んでください!
eng_Latn: Welcome to the QQQ Technology Forum, let's all be happy together and make progress together!
kor_Hang: QQQ 기술 포럼에 오신 것을 환영합니다.
vie_Latn: Chào mừng bạn đến với QQQ Technology Forum và vui vẻ cùng nhau tiến bộ!
fra_Latn: Bienvenue au Forum technologique QQQ, nous sommes heureux de progresser ensemble !
tgl_Latn: Maligayang pagdating sa QQQ Technology Forum, mag-iisa kayo sa pag-unlad!
ind_Latn: Selamat datang di QQQ Technology Forum, semoga kita bisa bersama-sama sukses!
deu_Latn: Willkommen zum QQQ Technologieforum und freuen Sie sich, gemeinsam voranzukommen!
spa_Latn: ¡Bienvenidos al Foro Tecnológico QQQ! ¡Vamos a hacer un buen progreso juntos!
ita_Latn: Benvenuti al Forum Tecnologico QQQ, siamo felici di andare avanti insieme!
============================================================
原文(日文): QQQ技術フォーラムへようこそ。みんなで楽しく一緒に進歩しましょう!
翻訳結果:
zho_Hans: 欢迎来到QQQ技术论坛.
eng_Latn: Welcome to the QQQ Technology Forum. Let's all have fun and move forward together!
kor_Hang: QQQ 기술 포럼에 오신 것을 환영합니다.
vie_Latn: Chào mừng bạn đến QQQ Technology Forum.
fra_Latn: Bienvenue au forum technique QQQ.
tgl_Latn: Maligayang pagdating sa QQQ Technology Forum.
ind_Latn: Selamat datang di forum teknologi QQQ.
deu_Latn: Willkommen auf dem QQQ-Technologieforum.
spa_Latn: ¡Bienvenidos al foro tecnológico QQQ! ¡Vamos a divertirnos y avanzar juntos!
ita_Latn: Benvenuti al Forum Tecnologico QQQ.
============================================================
原文(英文): Welcome to the QQQ Technology Forum. Let's have fun and make progress together!
翻訳結果:
jpn_Jpan: QQQ技術フォーラムへようこそ 一緒に楽しんで前進しよう!
zho_Hans: 欢迎来到QQQ技术论坛.
kor_Hang: QQQ 기술 포럼에 오신 것을 환영합니다. 함께 즐겁고 발전해 봅시다!
vie_Latn: Chào mừng đến với QQQ Technology Forum.
fra_Latn: Bienvenue au Forum de la technologie QQQ, amusons-nous et faisons des progrès ensemble !
tgl_Latn: Maligayang pagdating sa QQQ Technology Forum.
ind_Latn: Selamat datang di Forum Teknologi QQQ. Mari bersenang-senang dan membuat kemajuan bersama!
deu_Latn: Willkommen im QQQ-Technologieforum, lasst uns Spaß haben und gemeinsam Fortschritte machen!
spa_Latn: Bienvenidos al Foro Tecnológico QQQ. ¡Vamos a divertirnos y progresar juntos!
ita_Latn: Benvenuti al Forum Tecnologico QQQ, divertiamoci e facciamo progressi insieme!
============================================================
原文(韓国語): QQQ 기술 포럼에 오신 것을 환영합니다. 모두 함께 즐겁게 발전합시다!
翻訳結果:
jpn_Jpan: QQQ技術フォーラムへようこそ みんなで楽しく成長しよう!
zho_Hans: 欢迎来到QQQ技术论坛.
eng_Latn: Welcome to the QQQ Technology Forum. Let's all have fun and grow together!
vie_Latn: Chào mừng bạn đến QQQ Technology Forum. Hãy cùng nhau phát triển một cách vui vẻ!
fra_Latn: Bienvenue au forum technique QQQ.
tgl_Latn: Maligayang pagdating sa QQQ Technology Forum.
ind_Latn: Selamat datang di forum teknologi QQQ. Mari kita bersama-sama berkembang dengan menyenangkan!
deu_Latn: Willkommen auf dem QQQ-Technologieforum.
spa_Latn: Bienvenidos al foro tecnológico QQQ. ¡Vamos a desarrollarnos juntos!
ita_Latn: Benvenuti al Forum Tecnologico QQQ.
============================================================
============================================================
すべての言語テスト完了!
合計 25 言語をサポート
サポートされている言語リスト:
zh -> zho_Hans
zh_TW -> zho_Hant
ja -> jpn_Jpan
ko -> kor_Hang
th -> tha_Thai
en -> eng_Latn
fr -> fra_Latn
de -> deu_Latn
vi -> vie_Latn
tl -> tgl_Latn
ms -> ind_Latn
ru -> rus_Latn
es -> spa_Latn
it -> ita_Latn
pt -> por_Latn
tr -> tur_Latn
nl -> nld_Latn
sv -> swe_Latn
no -> nno_Latn
da -> dan_Latn
is -> isl_Latn
fa -> fas_Arab
ar -> ara_Arab
hi -> hin_Deva
bn -> ben_Beng
📁フォルダー構成
I:.
├─input_docs
├─logs
├─models
│ └─nllb-ct2
├─output_docs
└─scripts
ソース
language_map.py
# NLLB言語コードマッピング(完全な ISO639-3 準拠)
# これらのコードは、NLLB-200モデルで使用される標準的な言語コード形式です:
# 言語コード_文字体系(例:zho_Hans = 中国語簡体字)
NLLB_LANG_CODES = {
# 漢字系
"zh": "zho_Hans", # 中国語(簡体字)
"zh_TW": "zho_Hant", # 中国語(繁体字)
"ja": "jpn_Jpan", # 日本語
"ko": "kor_Hang", # 韓国語
"th": "tha_Thai", # タイ語
# ラテン系言語
"en": "eng_Latn", # 英語
"fr": "fra_Latn", # フランス語
"de": "deu_Latn", # ドイツ語
"vi": "vie_Latn", # ベトナム語
"tl": "tgl_Latn", # フィリピン語
"ms": "ind_Latn", # インドネシア語(マレー語と約80%共通)
"ru": "rus_Latn", # ロシア語
"es": "spa_Latn", # スペイン語
"it": "ita_Latn", # イタリア語
"pt": "por_Latn", # ポルトガル語
"tr": "tur_Latn", # トルコ語
"nl": "nld_Latn", # オランダ語
"sv": "swe_Latn", # スウェーデン語
"no": "nno_Latn", # ノルウェー語
"da": "dan_Latn", # デンマーク語
"is": "isl_Latn", # アイスランド語
# アラビア語系
"fa": "fas_Arab", # ペルシャ語
"ar": "ara_Arab", # アラビア語
# ヒンディー語系
"hi": "hin_Deva", # ヒンディー語
# ベンガル語系
"bn": "ben_Beng", # ベンガル語
}
test.py
import ctranslate2 # 変換されたモデルをロードして実行します(元の変換ツールよりも高速です)
from transformers import AutoTokenizer # テキストのセグメンテーションとエンコードのためにNLLBのトークナイザーをロードします
from language_map import NLLB_LANG_CODES
import sys
import os
# コンソールのエンコーディングをUTF-8に設定します
if sys.platform.startswith('win'):
os.system('chcp 65001 > nul')
sys.stdout.reconfigure(encoding='utf-8')
# モデルのロード(グローバル)
model_path = "../models/nllb-ct2"
translator = ctranslate2.Translator(model_path, device="cuda") # または "cpu" "cuda"
tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-600M")
# バッチ翻訳
# 引数:
# text: 翻訳するテキスト
# src_lang: ソース言語コード
# tgt_lang_list: ターゲット言語コードのリスト
# 戻り値:
# 辞書。キーは言語コード、値は翻訳後のテキスト
def batch_translate(text, src_lang="jpn_Jpan", tgt_lang_list=None):
if tgt_lang_list is None:
# デフォルトは主要言語に翻訳
tgt_lang_list = [
"zho_Hans", "eng_Latn", "jpn_Jpan", "kor_Hang", "vie_Latn",
"fra_Latn", "tgl_Latn", "ind_Latn", "deu_Latn"
]
# トークン化+ソース言語タグと終端記号を追加
tokens = tokenizer.convert_ids_to_tokens(
tokenizer.encode(text, add_special_tokens=False)
)
inputs = [f"{src_lang}"] + tokens + ["</s>"]
results = {}
for tgt_lang in tgt_lang_list:
# ターゲット言語のプレフィックスは2次元リスト(バッチ内各サンプルごとにリスト)
translated = translator.translate_batch(
[inputs], target_prefix=[[f"{tgt_lang}"]], beam_size=4
)
hypo_tokens = translated[0].hypotheses[0]
# デコード時は特殊トークンをスキップしない(手動で除去)
output = tokenizer.decode(
tokenizer.convert_tokens_to_ids(hypo_tokens), skip_special_tokens=False
)
# 言語タグと特殊トークンを除去
output = output.replace(f"{tgt_lang}", "").replace("</s>", "").strip()
results[tgt_lang] = output
return results
if __name__ == "__main__":
# 日本語から他言語へのテスト
tgt_lang_list = [
"zho_Hans", "eng_Latn", "kor_Hang", "vie_Latn", "fra_Latn",
"tgl_Latn", "ind_Latn", "deu_Latn", "spa_Latn", "ita_Latn"
]
text = "QQQ技術フォーラムへようこそ。みんなで楽しく一緒に進歩しましょう!"
print(f"原文(日文): {text}")
print("翻訳結果:")
translations = batch_translate(text, "jpn_Jpan", tgt_lang_list)
for lang_code, translated_text in translations.items():
try:
print(f"{lang_code}: {translated_text}")
except UnicodeEncodeError:
print(f"{lang_code}: [エンコードエラー、表示不可]")
print("\n" + "=" * 60)
# 中国語から他言語へのテスト
tgt_lang_list = [
"jpn_Jpan", "eng_Latn", "kor_Hang", "vie_Latn", "fra_Latn",
"tgl_Latn", "ind_Latn", "deu_Latn", "spa_Latn", "ita_Latn"
]
text = "欢迎来到QQQ技术论坛,大家一起开心地共同进步吧!"
print(f"原文(中文): {text}")
print("翻訳結果:")
translations = batch_translate(text, "zho_Hans", tgt_lang_list)
for lang_code, translated_text in translations.items():
try:
print(f"{lang_code}: {translated_text}")
except UnicodeEncodeError:
print(f"{lang_code}: [エンコードエラー、表示不可]")
print("\n" + "=" * 60)
# 英語から他言語へのテスト
tgt_lang_list = [
"jpn_Jpan", "zho_Hans", "kor_Hang", "vie_Latn", "fra_Latn",
"tgl_Latn", "ind_Latn", "deu_Latn", "spa_Latn", "ita_Latn"
]
text = "Welcome to the QQQ Technology Forum. Let's have fun and make progress together!"
print(f"原文(英文): {text}")
print("翻訳結果:")
translations = batch_translate(text, "eng_Latn", tgt_lang_list)
for lang_code, translated_text in translations.items():
try:
print(f"{lang_code}: {translated_text}")
except UnicodeEncodeError:
print(f"{lang_code}: [エンコードエラー、表示不可]")
print("\n" + "=" * 60)
# 韓国語から他言語へのテスト
tgt_lang_list = [
"jpn_Jpan", "zho_Hans", "eng_Latn", "vie_Latn", "fra_Latn",
"tgl_Latn", "ind_Latn", "deu_Latn", "spa_Latn", "ita_Latn"
]
text = "QQQ 기술 포럼에 오신 것을 환영합니다. 모두 함께 즐겁게 발전합시다!"
print(f"原文(韓国語): {text}")
print("翻訳結果:")
translations = batch_translate(text, "kor_Hang", tgt_lang_list)
for lang_code, translated_text in translations.items():
try:
print(f"{lang_code}: {translated_text}")
except UnicodeEncodeError:
print(f"{lang_code}: [エンコードエラー、表示不可]")
print("\n" + "=" * 60)
# フォロワーのテストコードをここに追加
print("\n" + "=" * 60)
print("すべての言語テスト完了!")
print(f"合計 {len(NLLB_LANG_CODES)} 言語をサポート")
print("サポートされている言語リスト:")
for short_code, full_code in NLLB_LANG_CODES.items():
print(f" {short_code} -> {full_code}")