質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.20%

Google Cloud Text to SpeechをAndroid Studioで使用する方法

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 376

uhsi

score 49

先日教えていただいた方法で行いました。
https://github.com/changemyminds/Google-Cloud-TTS-Android
こちらのサンプルを以下のように取り込み以下のファイルのみ編集しました。
AlarmNotification.javaは無関係です。

しかしながら、音声が流れず困っています。確認の方法もわからないためアドバイスをいただけると助かります。

---追記---
mView.startActivity(installIntent);
この行をコメントアウトしていたことが原因でした。失礼いたしました。
しかし、API KEYにキーの制限をしたところ、音声が流れなくなってしまいました。
「Android アプリに使用を限定」と設定し、パッケージ名と SHA-1 署名証明書フィンガープリントを入力しました。
Android Studioから端末にアプリを入れるのではなく、Androidアプリを公開してGoogle Playからダウンロードしなければ音声を再生できないのでしょうか。

package darren.gcptts.model.presenter;

import android.content.Context;
import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.util.Locale;
import darren.gcptts.model.AndroidTTSAdapter;
import darren.gcptts.model.GCPTTSAdapter;
import darren.gcptts.model.SpeechManager;
import darren.gcptts.model.android.AndroidVoice;
import darren.gcptts.model.gcp.AudioConfig;
import darren.gcptts.model.gcp.EAudioEncoding;
import darren.gcptts.model.gcp.ESSMLlVoiceGender;
import darren.gcptts.model.gcp.GCPVoice;
import darren.gcptts.model.gcp.VoiceCollection;
import darren.gcptts.model.gcp.VoiceList;


public class MainActivityPresenter implements VoiceList.IVoiceListener {
    private static final String TAG = "MainActivityPresenter";
    private static final int TEXT_TO_SPEECH_CODE = 0x100;

    private static final long WAIT_TIME = 2000L;
    private long TOUCH_TIME = 0;

    private VoiceList mVoiceList;
    private VoiceCollection mVoiceCollection;

    private SpeechManager mSpeechManager;
    private GCPTTSAdapter mGCPTTSAdapter;

    public MainActivityPresenter() {
        mVoiceList = new VoiceList();
        mVoiceList.addVoiceListener(this);

        mSpeechManager = new SpeechManager();

        // init GCPTTSAdapter and set default
        mGCPTTSAdapter = new GCPTTSAdapter();
        mSpeechManager.setSpeech(mGCPTTSAdapter);
    }

    public void exitApp() {
        if (System.currentTimeMillis() - TOUCH_TIME < WAIT_TIME) {
            // exit app
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(0);
        } else {
            TOUCH_TIME = System.currentTimeMillis();
            //mView.makeToast("Press back again to Exit", false);
        }
    }

    public void onTextToSpeechResult(Context context, int requestCode, int resultCode) {
        if (requestCode == TEXT_TO_SPEECH_CODE) {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                AndroidTTSAdapter androidTTSAdapter = new AndroidTTSAdapter(context);
                AndroidVoice androidVoice = new AndroidVoice.Builder()
                        .addLanguage(Locale.ENGLISH)
                        .addPitch(1.0f)
                        .addSpeakingRate(1.0f)
                        .build();
                androidTTSAdapter.setAndroidVoice(androidVoice);

                // set the next handler
                SpeechManager androidTTSManager = new SpeechManager();
                androidTTSManager.setSpeech(androidTTSAdapter);
                mSpeechManager.setSupervisor(androidTTSManager);
            } else {
//                mView.makeToast("You do not have the text to speech file you have to install", true);
                Intent installIntent = new Intent();
                installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
//                mView.startActivity(installIntent);
            }
        }
    }

    public void initGCPTTSSettings() {
        mVoiceList.start();
    }

    public void initAndroidTTSSetting() {
        Intent checkIntent = new Intent();
        checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
//        mView.startActivityForResult(checkIntent, TEXT_TO_SPEECH_CODE);
    }

    private void initGCPTTSVoice() {
        if (mGCPTTSAdapter == null) return;

        Log.d("debug-a", "nullc");
        String languageCode = "en=US";
        String name = "en-US-Wavenet-A";
        float pitch = (float) 0.0;
        float speakRate = (float) 1.0;

        GCPVoice gcpVoice = new GCPVoice(languageCode, name);
        AudioConfig audioConfig = new AudioConfig.Builder()
                .addAudioEncoding(EAudioEncoding.MP3)
                .addSpeakingRate(speakRate)
                .addPitch(pitch)
                .build();

        mGCPTTSAdapter.setGCPVoice(gcpVoice);
        mGCPTTSAdapter.setAudioConfig(audioConfig);
    }

    @Override
    public void onResponse(String text) {
        JsonElement jsonElement = new JsonParser().parse(text);
        if (jsonElement == null || jsonElement.getAsJsonObject() == null ||
                jsonElement.getAsJsonObject().get("voices").getAsJsonArray() == null) {
            Log.e(TAG, "get error json");
            return;
        }

        JsonObject jsonObject = jsonElement.getAsJsonObject();
        JsonArray jsonArray = jsonObject.get("voices").getAsJsonArray();

        mVoiceCollection = new VoiceCollection();
        for (int i = 0; i < jsonArray.size(); i++) {
            JsonArray jsonArrayLanguage = jsonArray.get(i)
                    .getAsJsonObject().get("languageCodes")
                    .getAsJsonArray();

            if (jsonArrayLanguage.get(0) != null) {
                String language = jsonArrayLanguage.get(0).toString().replace("\"", "");
                String name = jsonArray.get(i).getAsJsonObject().get("name").toString().replace("\"", "");
                String ssmlGender = jsonArray.get(i).getAsJsonObject().get("ssmlGender").toString().replace("\"", "");
                ESSMLlVoiceGender essmLlVoiceGender = ESSMLlVoiceGender.convert(ssmlGender);
                int naturalSampleRateHertz = jsonArray.get(i).getAsJsonObject().get("naturalSampleRateHertz").getAsInt();

                GCPVoice gcpVoice = new GCPVoice(language, name, essmLlVoiceGender, naturalSampleRateHertz);
                mVoiceCollection.add(language, gcpVoice);
            }
        }
    }

    @Override
    public void onFailure(String error) {

    }

    public void startSpeak(String text) {
        mSpeechManager.stopSpeak();
        if (mVoiceCollection == null || mVoiceCollection.size() == 0) {
//            mView.makeToast("Loading Voice Error, please check network or API_KEY.", true);
            Log.d("debug-a", "nullb");
        } else {
            initGCPTTSVoice();
        }

        mSpeechManager.startSpeak(text);
    }

    public void stopSpeak() {
        mSpeechManager.stopSpeak();
    }

    public void resumeSpeak() {
        mSpeechManager.resume();
    }

    public void pauseSpeak() {
        mSpeechManager.pause();
    }

    public void disposeSpeak() {
        mSpeechManager.dispose();
        mSpeechManager = null;
    }
}
package com.XXX.XXX;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.Calendar;

import darren.gcptts.model.presenter.MainActivityPresenter;

public class MainActivity extends AppCompatActivity {

    private MainActivityPresenter mPresenter;

    private AlarmManager am;
    private PendingIntent pending;
    private int requestCode = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPresenter = new MainActivityPresenter();
        mPresenter.initGCPTTSSettings();
        mPresenter.initAndroidTTSSetting();


        Button buttonStart = this.findViewById(R.id.button_start);
        buttonStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                abc();
            }
        });

    }

    public void abc(){
        mPresenter.startSpeak("Hello.World.");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mPresenter.onTextToSpeechResult(this, requestCode, resultCode);
    }

    public void onBackPressed() {
        mPresenter.exitApp();
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

実行時に Logcat に何か出ていませんか?
またマニフェストには、以下の権限がありますか?

 <uses-permission android:name="android.permission.INTERNET" />

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/15 16:47

    失礼いたしました。追記したように一度は再生できたのですがAPI KEYにキーの制限をしたところ、音声が流れなくなってしまいました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る