2021.07.08

Google Translate APIを使用して、テキスト、音声ファイルを翻訳してみた

こんにちは。次世代システム研究室のB.V.Mです。外国人で言葉遣いが間違いましたらご容赦ください。宜しくお願いします。
今期はクラウドを利用したアプリケーション開発の知見を得るために、Google Cloud Platform (GCP)に関する調査しました。
突然なんですがみなさんドラえもんを読みましたか。ドラえもんの道具の中に翻訳こんにゃくがあります。それを食べると、あらゆる言語を自国語として理解できるようになる。自分が話す言語は、相手が使用する言語に自動的に翻訳されるため、言葉の通じなかった相手と自由に会話できる。私はそれがかなり好きでGoogle Translate APIに興味を持って簡単な翻訳アプリを作成して使用方法や注意点など紹介したいと思います。
あまり関係ない話ですが、面白いことを発見しました。昔ドラえもんを読んだとき、翻訳こんにゃくじゃなくて翻訳パンと翻訳されていました。
それは翻訳ミスというか、そもそも私の国はこんにゃくがない原因だと思います。

(以下Google Cloud PlatformをGCP、Google Translate APIをGTAと記載します)

1.Google Translate API

Google Translate APIは、グーグルが提供するREST形式の翻訳APIです。APIに渡した文字列がどの言語で記述されたものかを検出したり、翻訳したりできます。そしてテキストだけじゃなくて音声も翻訳できます。
GoogleページによりGTAは高速で動的な機械翻訳を使用して、コンテンツとアプリを多言語対応できています。公式ページによりGTAの利点は下記のようになります。
  • 多くの言語に対応
  • 言語の検出
  • 用語集のサポート
  • 優れたスケーラビリティ
  • 容易な統合
  • シンプルで手頃な料金設定

1.1 プロダクト スイート

プロダクト スイートは下記の表のようになります。

2. アプリ作成

上記の表により、GTAが多くの機能がありますが、今回はTranslation API Basicを使用してテキストと音声ファイルを日本語に翻訳するAndroidアプリを作成しました。

使用した端末、ツール:
統合開発環境(IDE):Android studio: 4.2.1
端末:Samsung Galaxy S20 FE
Android version: 11

早速ですが、アプリのイメージは以下のようになります。


アプリは2つ機能があります。
  1. テキストを入力して、「TRANSLATE」ボタンを押下すると翻訳して、結果を表示します。
  2. マイクボタンを押下すると、アプリ内に用意した音声ファイルをテキストに変更して、翻訳します。

2.1 GCPに関する準備

アカウント:もちろんGCPを使用するためGCPアカウントが必要です。クレジットカードを登録すれば登録できます。料金は「最初の 500,000 文字 *(1 か月あたり) 無料(毎月 $10 分のクレジットとして適用)」と書いてあります。ですので、使用量が少ないとお金が無料なので、料金が心配なく実装できます。

サービス アカウント キー ファイル:GCPのCredentialsファイルです。アプリでGCPを使用するの際、必要なので、公式ページでのCredentials作成により作成して、準備してください。

2.2 AndroidStudioにCredentialsファイル保存

Credentialsファイルをrawリソースディレクトリにコピーします。 rawのリソースディレクトリを作成するには:
resフォルダを右クリック→「New」をクリック→「Android Resource Directoryをクリックし、リストから「raw」としてリソースタイプを選択します。そうすると、下記のように表示されて、同じく選択してから、Credentialsのjsonファイルをそのフォルダーに保存してください。

今回、gg_credentials.jsonとして保存しました。
それでは、GCPに関する準備が完了しました。コード作成へ進みます。

2.3 テキスト翻訳

まずは使用する変数は下記のようになります。
    private EditText inputToTranslate;
    private TextView originalTextTv;
    private TextView translatedTv;
    Translate translate;
  • inputToTranslate: 入力テキストです。
  • originalTextTv: 結果のところに表示される元テキストです。(Tv:TextViewです。)
  • translatedTv: 翻訳された結果テキストです。
  • translate: GoogleのTranslateサービスです。

2.3.1 翻訳サービス起動

まずはGoogleのTranslateサービスを起動します。
    public void initTranslateService() {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        // get credentials from file
        try (InputStream is = getResources().openRawResource(R.raw.gg_credentials)) {
            // Get credentials:
            final GoogleCredentials myCredentials = GoogleCredentials.fromStream(is);
            // Set credentials and get translate service:
            TranslateOptions translateOptions;
            translateOptions = TranslateOptions.newBuilder()
                    .setCredentials(myCredentials)
                    .build();
            /*
            * ApiKeyも使用できていますが非推奨 (depecated)になりました。
            * translateOptions = TranslateOptions.newBuilder()
            *         .setApiKey("AAAAAAAAAABBBBBBkiCNz3eoOCCCCk") // OK
            *         .build();
            */
            translate = translateOptions.getService();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
現在ApiKeyも使用できていますが非推奨 (depecated)になりましたのでGoogleCredentialsの方を使用してサービスを起動します。
OnCreateにこのようなコードを追加します。
initTranslateService();

2.3.2 翻訳の処理

    public void translate(String originalText) {
        Translation translation = translate.translate(originalText, Translate.TranslateOption.targetLanguage("ja"), Translate.TranslateOption.model("base"));
        String translatedText = translation.getTranslatedText();
        originalTextTv.setText(originalText);
        translatedTv.setText(translatedText);
    }
上記のように1つコマンドでGTAを使用して、翻訳しました。
実は上記のコードtargetLanguageしか設定していないです。それで、GTAは自動的に言語を判定して、翻訳します。起点言語を設定したいとき下記のようにオプションを追加すれば指定できます。
Translate.TranslateOption.sourceLanguage("en")
ここで、translateButtonのsetOnClickListenerを下記のように設定した後、テキスト翻訳機能が完了です。
translateButton.setOnClickListener(v -> {
            if (checkInternetConnection()) {
                String originalText = inputToTranslate.getText().toString();
                translate(originalText);
            } else {
                translatedTv.setText(getResources().getString(R.string.no_connection));
            }
        });

2.4 音声翻訳

2.4.1 音声ファイルのコンフィグ設定

音声ファイル種類が多いです。現在GTAがサーポットしているのはここに確認できます。
音声ファイル種類が多いので、翻訳するの際、ファイルとファイルのコンフィグが必要です。
今回使用するのはGoogleのサンプルファイルbrooklyn_bridge.rawファイルです。Android Studioの「assets」フォルダーに保存します。
brooklyn_bridge.rawファイルのコンフィグは下記のように機能を作成します。
    private RecognitionConfig getRecognitionConfig() {
        // The language of the supplied audio
        String languageCode = "en-US";
        // Sample rate in Hertz of the audio data sent
        int sampleRateHertz = 16000;
        // This field is optional for audio formats.
        // https://cloud.google.com/speech-to-text/docs/reference/rest/v1/RecognitionConfig#AudioEncoding
        RecognitionConfig.AudioEncoding encoding = RecognitionConfig.AudioEncoding.LINEAR16;

        return
                RecognitionConfig.newBuilder()
                        .setLanguageCode(languageCode)
                        .setSampleRateHertz(sampleRateHertz)
                        .setEncoding(encoding)
                        .build();
    }

2.4.2 音声ファイルを読み込む処理

ファイル読み込む時大体2つ方法に分けます。
– ネットからのファイルはUriが必要です。
– ローカルファイル場合ByteString(ファイルデータ)に変換する必要です。

音声ファイルがネットからの場合:
    private RecognitionAudio getRecognitionAudioFromURI() {
        String storageUri = "gs://cloud-samples-data/speech/brooklyn_bridge.raw";
        return RecognitionAudio.newBuilder().setUri(storageUri).build();
    }
ローカルファイルからの場合
    private RecognitionAudio getRecognitionAudioFromFile() throws IOException {
        String actualFilePath = "assets/brooklyn_bridge.raw";
        byte[] data = getBytesData(actualFilePath);
        ByteString content = ByteString.copyFrom(data);
        return RecognitionAudio.newBuilder().setContent(content).build();
    }

    private byte[] getBytesData(String actualFilePath) throws IOException {
        ByteArrayOutputStream buffer;
        byte[] data;
        try (InputStream is = Objects.requireNonNull(this.getClass().getClassLoader()).getResourceAsStream(actualFilePath)) {
            buffer = new ByteArrayOutputStream();
            int nRead;
            data = new byte[10240];
            while ((nRead = is.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, nRead);
            }
        }
        return buffer.toByteArray();
    }

2.4.3 翻訳の処理

翻訳の処理以下の通りです。
    public void translateAudio(RecognitionAudio audio) {
        try {
            CredentialsProvider credentialsProvider = FixedCredentialsProvider.create(ServiceAccountCredentials.fromStream(getResources().openRawResource(R.raw.gg_credentials)));
            SpeechClient speechClient = SpeechClient.create(SpeechSettings.newBuilder().setCredentialsProvider(credentialsProvider).build());

            RecognizeRequest request = RecognizeRequest.newBuilder()
                    .setConfig(getRecognitionConfig())
                    .setAudio(getRecognitionAudioFromFile())
                    .build();
            RecognizeResponse response = speechClient.recognize(request);
            StringBuilder transcript = new StringBuilder();
            for (SpeechRecognitionResult result : response.getResultsList()) {
                // First alternative is the most probable result
                SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
                System.out.printf("Transcript: %s\n", alternative.getTranscript());
                transcript.append(alternative.getTranscript());
            }

            translate(transcript.toString());
        } catch (Exception exception) {
            System.err.println("Failed to create the client due to: " + exception);
        }
    }
RecognizeRequestを作成するとき、setConfigとsetAudioで先ほど作成したコードを使用します。
SpeechClientを利用して、テキストに変換しました。その後transcript.toString()により翻訳必要のテキストを取得します。translate機能により日本語に翻訳してアプリに表示されます。

3. 結果確認

テストの時、英語とベトナム語をテストしました。スペースを含めて、犬と猫という意味のテキストを入力しました。最後に音声ボタンを押下して、音声ファイルを読み込んで翻訳しました。



個人的な印象ではありますが、起点言語を設定しなくても、ちゃんと翻訳できているのはすごいです。それは機械学習のおかげだと思います。処理速度、通信速度の進歩でこれから言語の垣根を簡単に超えられると思います。これは翻訳こんにゃくではないでしょうか。この記事で簡単な使用法ですが、これからより深く調査したいと思います。

参考リンク

最後に

次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。 皆さんのご応募をお待ちしています。

Pocket

関連記事