前回のエントリーでは音声ファイルからテキスト化を行いましたが、日本語音声から日本語テキストへの変換でした。実は英語の変換に関しては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
というライブラリがありました。
【参考】
このライブラリはネットにある翻訳サービスにアクセスして翻訳をすることができるというものです。メジャーどころではGoogle Translator
(APIキー不要)、Microsoft Translator
(APIキー必要)、Yandex
、Libre
など複数の翻訳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
になります。
【参考:ISO639
】
ではコーディングを行っていきます。
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
や翻訳サービスなどの組み合わせてうまく情報の伝達ができるといいですね。特に災害時にこういうことが活きてくると思うんですよ。
今回の一連の処理は無料でできます🤩