Pythonでの多言語翻訳の探求

前回のエントリーでは音声ファイルからテキスト化を行いましたが、日本語音声から日本語テキストへの変換でした。実は英語の変換に関してはWhisperの解析時のオプション(task=”translate”)の追加を行うだけで行えるのですが、英語以外の言語に変換するにはどうすればと悩んでしましました。

英語だけでもいいじゃないかということもありますが、自分の住んでいる地域はブラジル(言語はポルトガル語)の方が結構いるので、そういう方々に向けて情報を出すのは比較的需要あるかな?ってことで調べてみました。

【参考】

外国人住民数を国籍別に見ると、ブラジルが60,397人で、全体の21.1%を占め、ベトナム49,719人(17.3%)、中国43,918人(15.3%)、フィリピン41,918人(14.6%)、韓国・朝鮮28,864人(10.1%)、ネパール12,844人(4.5%)と続いています。

https://www.pref.aichi.jp/soshiki/tabunka/gaikokuzinjuminsu-2022-12.html

Pythonのライブラリdeep-translator

Pythonで使用できる翻訳ライブラリを検索するとdeep-translatorというライブラリがありました。

【参考】

pypi.org

lokalise.com

このライブラリはネットにある翻訳サービスにアクセスして翻訳をすることができるというものです。メジャーどころではGoogle TranslatorAPIキー不要)、Microsoft TranslatorAPIキー必要)、YandexLibreなど複数の翻訳APIをサポートしています。こちらを使用して、ポルトガル語への変換を行います。

翻訳サービスの例

  • Google Translate
  • Microsoft Translator
  • Pons Translator
  • Linguee Translator
  • Mymemory Translator
  • Yandex Translator
  • QcriTranslator
  • DeeplTranslator
  • Papago Translator
  • Libre Translator
  • ChatGpt

ちなみにDeepLを普段から使用しているので検討していました。しかし、APIの登録時にDeepL Starter Proのライセンスとは別のメールアドレスで登録する必要がありますとのエラーが発生。そんなことあるんかよ〜

正規ルートで問い合わせをしたところ、メールアドレスは別以外は受け付けられないという残念な返答があったのでした。そのうち試すと思いますけど、今回はこちら使用します。

ライブラリのインストール

以下のようにpipコマンドでインストールを行います。

$ pip install deep-translator

あとは以下の様なサンプルコードで実験します。

deep_translator_sample.py

from deep_translator import GoogleTranslator

# 翻訳したいテキスト
source_text = "こんにちは、世界"

# 翻訳
translated = GoogleTranslator(source='ja', target='en').translate(source_text)

print(translated)  # Hello, World

実行例

$ python3 deep_translator_sample.py 
Hello World

Pythonでコーディングをしてみる

サンプルによるテストも終わったのでGooge Translatorを本格的に使用しようします。 今回も以下のようなファイルを使っていきます。

sample-jp.txt

[00:00.000 --> 00:04.000] 10月5日木曜日の全国の天気をお伝えします。
[00:04.000 --> 00:07.000] まずは天気図から見ていきましょう。
[00:07.000 --> 00:12.000] 定期圧や全線の通過に伴い、北日本や北陸では雨・風が強まります。
[00:12.000 --> 00:14.000] 荒れた天気に警戒が必要です。

コマンドラインで実行するために引数としてUTF-8のテキストファイル、入力言語、出力言語という指定で翻訳を行うようにします。出力ファイルはファイル名の最後に_言語コードという形式になるようにします。

例えば、sample-jp.txtというファイルを英語(en)に翻訳した場合には、出力ファイルはsample-jp_en.txtになります。

ポルトガル語文字コードptとなります。

【参考:ISO639

ISO 639-1コード一覧 - Wikipedia

ではコーディングを行っていきます。

deep_translator_google.py

import argparse
from deep_translator import GoogleTranslator

def translate_file(input_filename, source_language, target_language):
    # ファイルを読み込む
    with open(input_filename, 'r', encoding='utf-8') as file:
        content = file.read()

    # テキストを指定された言語に翻訳する
    translated_content = GoogleTranslator(source=source_language, target=target_language).translate(content)

    # 新しいファイル名を生成する
    new_filename = input_filename.replace('.txt', f'_{target_language}.txt')

    # 翻訳したテキストを新しいファイル名で保存する
    with open(new_filename, 'w', encoding='utf-8') as file:
        file.write(translated_content)

    print(f"Translated file saved as {new_filename}")

# コマンドライン引数の処理
parser = argparse.ArgumentParser(description='テキストファイルを指定された言語に翻訳します。')
parser.add_argument('input_filename', type=str, help='翻訳したいファイルの名前')
parser.add_argument('source_language', type=str, help='翻訳元の言語 (例: ja, en, fr, de, etc.)')
parser.add_argument('target_language', type=str, help='翻訳先の言語 (例: en, fr, de, etc.)')
args = parser.parse_args()

# 翻訳関数の実行
translate_file(args.input_filename, args.source_language, args.target_language)

これで実行を行ってみると・・・

実行方法(日本語からポルトガル語への変換)

$ python3 deep_translator_google.py sample-jp.txt ja pt

以下のファイルが出力されます。

sample-jp_pt.txt

[00:00.000 --> 00:04.000] Informaremos o tempo em todo o país na quinta-feira, 5 de outubro.
[00:04.000 --> 00:07.000] Vamos começar olhando o mapa meteorológico.
[00:07.000 --> 00:12.000] A chuva e o vento se intensificarão no norte do Japão e em Hokuriku devido à pressão periódica e à passagem de toda a linha.
[00:12.000 --> 00:14.000] Precisamos ser cautelosos com o mau tempo.

これでポルトガル語に変換することができました。Whisperの出力をそのまましているので翻訳の対応もかなりわかりやすくなるかなと思います。出力結果をDeepLに入力すると問題なく翻訳できているのがわかります。


他の翻訳エンジンを使用する場合

今回はGooge Translatorを使用していましたが、ライブラリではその他の翻訳エンジンを使用することができます。変更点はかなり少なくなっています。

変更点の抽出

import argparse
from deep_translator import MicrosoftTranslator # 変更点 翻訳エンジンの変更
中略
    # テキストを指定された言語に翻訳する 翻訳エンジンの呼び出しを変更
    translated_content = MicrosoftTranslator(source=source_language, target=target_language).translate(content)
中略

以下がソースコードの全体像になります。

deep_translator_microsoft.py

import argparse
from deep_translator import MicrosoftTranslator

def translate_file(input_filename, source_language, target_language):
    # ファイルを読み込む
    with open(input_filename, 'r', encoding='utf-8') as file:
        content = file.read()

    # テキストを指定された言語に翻訳する
    translated_content = MicrosoftTranslator(source=source_language, target=target_language).translate(content)

    # 新しいファイル名を生成する
    new_filename = input_filename.replace('.txt', f'({target_language}).txt')

    # 翻訳したテキストを新しいファイル名で保存する
    with open(new_filename, 'w', encoding='utf-8') as file:
        file.write(translated_content)

    print(f"Translated file saved as {new_filename}")

# コマンドライン引数の処理
parser = argparse.ArgumentParser(description='テキストファイルを指定された言語に翻訳します。')
parser.add_argument('input_filename', type=str, help='翻訳したいファイルの名前')
parser.add_argument('source_language', type=str, help='翻訳元の言語 (例: ja, en, fr, de, etc.)')
parser.add_argument('target_language', type=str, help='翻訳先の言語 (例: en, fr, de, etc.)')
args = parser.parse_args()

# 翻訳関数の実行
translate_file(args.input_filename, args.source_language, args.target_language)

実行方法(日本語からポルトガル語への変換)

(注意)MicrosoftトランスレーターではAPIキーが実行に必要になります。もし使用するのであれば環境変数APIキーをセットしてから実行してください。

$ export MICROSOFT_API_KEY="your_api_key"
$ python3 deep_translator_microsoft.py sample-jp.txt ja pt

APIキーが設定していない場合には以下のようなエラーが発生するので注意してください。

deep_translator.exceptions.ApiKeyException: None --> 
You have to pass your api_key!
You can do this by passing the key as a parameter/argument to the translator class
or by setting the environment variable MICROSOFT_API_KEY

Example: export MICROSOFT_API_KEY="your_api_key"

おわりに

YouTubeの字幕ネタで少し引っ張ってしまいましたが、これでかなりの言語への対応もできるのではないかと思います。行政では、外国人の方々への情報伝達がうまく行かないという苦しさがあると思うのですが、ChatGPTや翻訳サービスなどの組み合わせてうまく情報の伝達ができるといいですね。特に災害時にこういうことが活きてくると思うんですよ。

今回の一連の処理は無料でできます🤩

/* -----codeの行番号----- */