0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【翻訳モデル】簡単文言翻訳 LP2_1_2

Last updated at Posted at 2025-07-21
QQQ :bow_tone1:3Q!
📚 【翻訳モデル】200の言語を翻訳できるNLLBモデル体験 LM2_1 :arrow_heading_up:
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ぐらい

:flag_jp:言語一覧

    # 漢字系
    "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}")

📚 【翻訳モデル】200の言語を翻訳できるNLLBモデル体験 LM2_1 :arrow_heading_up:
QQQ :bow_tone1:3Q!
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?