EurekaMoments

ロボットや自動車の自律移動に関する知識や技術、プログラミング、ソフトウェア開発について勉強したことをメモするブログ

Google翻訳のAPIで4ヶ国語対応の翻訳アプリを作ってみた

背景・目的

プログラミングもしながら語学も学ぶ方法はないかと考えた結果、最初に思いついたのは翻訳アプリを自作してみる事でした。といっても翻訳自体はGoogle翻訳のAPIを利用しているので結構簡単にできました。ただ、作る中でいくつかハマった事があったので、その辺の対処方法にも触れながら今回作った翻訳アプリを紹介しようと思います。

AI時代の翻訳に役立つGoogle活用テクニック

AI時代の翻訳に役立つGoogle活用テクニック

全体ソースコード

アプリのソースコードは以下のGitHubリポジトリで公開しています。

github.com

コードの全体は以下のようになります。

# -*- 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として以下のものをインストールします。

pypi.org

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言語に翻訳した結果を出力させています。例えば、入力フレーズが日本語だとしたら、それを英語、中国語、スペイン語に翻訳した結果が出力されます。

実行結果の例

まずは日本語からの翻訳例。
f:id:sy4310:20181026233333p:plain 次は英語からの翻訳例。
f:id:sy4310:20181026233439p:plain 次は中国語から。中国語からの、あるいは中国語への翻訳では声調符号付きのピンインも合わせて表示させるようにしています。これがないと何て発音していいのか分からないですからね。
f:id:sy4310:20181026234932p:plain
最後にスペイン語です。
f:id:sy4310:20181026235001p:plain

次の取り組み

とりあえずこれで単語や短文の意味を調べながらデータベースでも作って、それを利用した別なアプリを考えてみようと思います。