- 背景・目的
- 全体ソースコード
- Google翻訳APIのインストール
- APIをインストールする際の注意点
- 必要なモジュールのインポート
- 文字化けするときの対処法
- 翻訳させたいフレーズの入力
- 翻訳処理
- 実行結果の例
- 次の取り組み
背景・目的
プログラミングもしながら語学も学ぶ方法はないかと考えた結果、最初に思いついたのは翻訳アプリを自作してみる事でした。といっても翻訳自体はGoogle翻訳のAPIを利用しているので結構簡単にできました。ただ、作る中でいくつかハマった事があったので、その辺の対処方法にも触れながら今回作った翻訳アプリを紹介しようと思います。
- 作者: 安藤進
- 出版社/メーカー: 丸善出版
- 発売日: 2018/06/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
全体ソースコード
アプリのソースコードは以下のGitHubリポジトリで公開しています。
コードの全体は以下のようになります。
# -*- coding: utf-8 -*- """ This is a translation script for Japanese, English, Chinese and Spanish. Usage: python translate_ja_en_zh_es.py 'phrase' The phrase should be enclosed in single or double quotations Output: translated phrase and pronouncitation """ import io, sys from py_translator import Translator # set encoding utf-8 to prevent text garbling in Japanese or Chinese sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') def to_japanese(translator_obj, input_phrase): translated_phrase = translator_obj.translate(input_phrase, dest='ja') print('In Japanese: %s' % translated_phrase.text) def to_english(translator_obj, input_phrase): translated_phrase = translator_obj.translate(input_phrase, dest='en') print('In English: %s' % translated_phrase.text) def to_chinese_simplified(translator_obj, input_phrase): translated_phrase = translator_obj.translate(input_phrase, dest='zh-CN') if translated_phrase.src == 'zh-CN': print('Pronounciation: %s' % translated_phrase.pronunciation) else: print('In Simplified Chinese: %s Pronounciation: %s' % (translated_phrase.text, translated_phrase.pronunciation)) def to_spanish(translator_obj, input_phrase): translated_phrase = translator_obj.translate(input_phrase, dest='es') print('In Spanish: %s' % translated_phrase.text) def translate(input_phrase): translator = Translator() # detect language type of input phrase detect_result = translator.detect(input_phrase) language_type = detect_result.lang print('Language type: %s' % language_type) # switch translation process depend on language type if 'ja' in language_type: # Japanese print('Input phrase is Japanese') to_english(translator, input_phrase) to_chinese_simplified(translator, input_phrase) to_spanish(translator, input_phrase) elif 'zh-CN' in language_type: # Chinese(Simplified) print('Input phrase is Simplified Chinese') to_chinese_simplified(translator, input_phrase) to_japanese(translator, input_phrase) to_english(translator, input_phrase) to_spanish(translator, input_phrase) elif 'en' in language_type: # English print('Input phrase is English') to_japanese(translator, input_phrase) to_chinese_simplified(translator, input_phrase) to_spanish(translator, input_phrase) elif 'es' in language_type: # Spanish print('Input phrase is Spanish') to_japanese(translator, input_phrase) to_chinese_simplified(translator, input_phrase) to_english(translator, input_phrase) else: print('Input phrase should be Japanese, English, Chinese or Spanish') if __name__ == '__main__': # get command line input argv = sys.argv argv_len = len(argv) # check there is an input phrase if argv_len == 2: input_phrase = argv[1] else: print("please input phrase you want to translate.") print("Usage: python translate_ja_en_zh_es.py 'phrase'") print("The phrase should be enclosed in single or double quotations") input_phrase = '' # translation if input_phrase: translate(input_phrase)
Google翻訳APIのインストール
まずはGoogle翻訳のAPIとして以下のものをインストールします。
pipコマンドで簡単にインストールできます。
pip install py-translator
APIをインストールする際の注意点
Google翻訳のAPIで検索すると、おそらく真っ先に見つかるのは以下のAPIだと思います。
Googletrans: Free and Unlimited Google translate API for Python — Googletrans 2.3.0 documentation
しかしながら、これには実はバグがあり、日本語や中国語などを入れるとエラーが出てまともに動きませんでした。
そしてこのバグを修正してリリースされたのが上記のpy-translatorという訳です。
間違えて後者の方をインストールしないように気を付けてください。
必要なモジュールのインポート
以下のようにインポートしておきます。
import io, sys from py_translator import Translator
文字化けするときの対処法
翻訳結果として日本語や中国語などを出力させると文字化けして表示されてしまいます。
それを防ぐために以下のコードを最初に記述しておきましょう。
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
翻訳させたいフレーズの入力
翻訳させるフレーズの入力部分のコードは以下のようになっています。
if __name__ == '__main__': # get command line input argv = sys.argv argv_len = len(argv) # check there is an input phrase if argv_len == 2: input_phrase = argv[1] else: print("please input phrase you want to translate.") print("Usage: python translate_ja_en_zh_es.py 'phrase'") print("The phrase should be enclosed in single or double quotations") input_phrase = '' # translation if input_phrase: translate(input_phrase)
こうすることで、以下のコマンドで実行できるようになります。この時、入力するフレーズはシングル or ダブルクオテーションで囲うようにしてください。
python translate_ja_en_zh_es.py 'phrase'
そして、入力フレーズがあれば翻訳処理を実行し、入力フレーズがなければ使い方を説明する文言を表示させて終了します。
翻訳処理
以下のコードで翻訳処理を実行します。
def translate(input_phrase): translator = Translator() # detect language type of input phrase detect_result = translator.detect(input_phrase) language_type = detect_result.lang print('Language type: %s' % language_type) # switch translation process depend on language type if 'ja' in language_type: # Japanese print('Input phrase is Japanese') to_english(translator, input_phrase) to_chinese_simplified(translator, input_phrase) to_spanish(translator, input_phrase) elif 'zh-CN' in language_type: # Chinese(Simplified) print('Input phrase is Simplified Chinese') to_chinese_simplified(translator, input_phrase) to_japanese(translator, input_phrase) to_english(translator, input_phrase) to_spanish(translator, input_phrase) elif 'en' in language_type: # English print('Input phrase is English') to_japanese(translator, input_phrase) to_chinese_simplified(translator, input_phrase) to_spanish(translator, input_phrase) elif 'es' in language_type: # Spanish print('Input phrase is Spanish') to_japanese(translator, input_phrase) to_chinese_simplified(translator, input_phrase) to_english(translator, input_phrase) else: print('Input phrase should be Japanese, English, Chinese or Spanish')
ここでは、最初に入力されたフレーズが何語かを判定して、それ以外の3言語に翻訳した結果を出力させています。例えば、入力フレーズが日本語だとしたら、それを英語、中国語、スペイン語に翻訳した結果が出力されます。
実行結果の例
まずは日本語からの翻訳例。
次は英語からの翻訳例。
次は中国語から。中国語からの、あるいは中国語への翻訳では声調符号付きのピンインも合わせて表示させるようにしています。これがないと何て発音していいのか分からないですからね。
最後にスペイン語です。
次の取り組み
とりあえずこれで単語や短文の意味を調べながらデータベースでも作って、それを利用した別なアプリを考えてみようと思います。