安卓的Google Cloud Speech API

目前我正在进行一个项目,需要使用Google Cloud Speech API和TextToSpeech。我尝试使用RecognizerIntent进行了一些操作,但我想尝试使用Cloud Speech API。

如果有教程材料或指南会非常有帮助,我已经查看了示例应用,但我在寻找教程、指南或任何能解释相关内容的东西。

这是我使用TTS和RecognizerIntent的解决方案。

  private TextToSpeech tts;private TextToSpeech secondTTS;private TextView speechInputTextView,correctAnswerTextView,wrongAnswerTextView,currentQuestionTextView;private ArrayList<String> correctAnswersArrayList, questionArrayList, sayCorrectArrayList, sayWrongArrayList ,toSay ,toASk;private MediaPlayer mediaPlayer;private DBHelper dbHelper;private SQLiteDatabase sqlDB;private int correctACount,wrongACount,currentQuestion, Unit;private boolean isStarted;private String currentLanguage ;private static int TOTAL_QUESITONS;private final static int REQ_CODE_SPEECH_INPUT = 100;private final static String PAUSE_COMMAND = "pos";private final static String STOP_COMMAND = "stop";private final static String RESTART_COMMNAD = "restart";private final static String REPEAT_COMMAND = "repeat";private final static String EXIT_COMMAND = "exit";@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_unit);    isStarted = true;    mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.unitonemp3);    currentQuestion = 0;    speechInputTextView = (TextView) findViewById(R.id.speechInput);    correctAnswerTextView = (TextView) findViewById(R.id.correctAnswers_TextView);    currentQuestionTextView = (TextView) findViewById(R.id.currentQuestion_TextView);    wrongAnswerTextView = (TextView) findViewById(R.id.wrongAnswer_TextView);    Unit = 1;    currentLanguage = getIntent().getBundleExtra("resultBundle").getString("language");    Button next = (Button) findViewById(R.id.nextButton);    Button changeUnitButton  = (Button) findViewById(R.id.changeUnitButton);    Button playButton = (Button) findViewById(R.id.playButton);    Button pauseButton = (Button) findViewById(R.id.pauseButton);    playButton.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            startSayWithID(questionArrayList.get(currentQuestion), 1000, "say");        }    });    pauseButton.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            tts.stop();            secondTTS.stop();            Intent pauseI = new Intent(UnitActivity.this, PauseActivity.class);            Bundle resultBundle = new Bundle();            resultBundle.putInt("npc", currentQuestion);            pauseI.putExtra("resultBundle", resultBundle);            startActivity(pauseI);        }    });    tts = new TextToSpeech(this, this);    secondTTS = new TextToSpeech(this, this); changeUnitButton.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            secondTTS.stop();            tts.stop();            Unit ++;            mediaPlayer.start();        }    });    Bundle extras = getIntent().getExtras();    if (extras != null) {        currentQuestion = getIntent().getBundleExtra("resultBundle").getInt("npc");    }    ImageView micButton = (ImageView) findViewById(R.id.micButton);    micButton.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (!tts.isSpeaking()) {                currentQuestion = 13;                startSayWithID(questionArrayList.get(currentQuestion), 1000, "questionID");            }        }    });    String[] sayCorrectList = getResources().getStringArray(R.array.sayCorrect);    String[] sayWrongList = getResources().getStringArray(R.array.satWrong);    String[] listToSay = getResources().getStringArray(R.array.toSay);    String[] listToAsk = getResources().getStringArray(R.array.toAsk);    toSay = new ArrayList<>(Arrays.asList(listToSay));    toASk = new ArrayList<>(Arrays.asList(listToAsk));    questionArrayList = new ArrayList<>();    correctAnswersArrayList = new ArrayList<>();    addGerCorrect();    addEngQuestions();    sayCorrectArrayList = new ArrayList<>(Arrays.asList(sayCorrectList));    sayWrongArrayList = new ArrayList<>(Arrays.asList(sayWrongList));    TOTAL_QUESITONS = questionArrayList.size();    mediaPlayer.start();    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {        @Override        public void onCompletion(MediaPlayer mp) {            startSayWithID("Welcome",1000,"instruction");        }    });    next.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            for(int i = 0 ; i< questionArrayList.size();i++){                Log.d(" question  List "," item :"+"pisition "+i+ "" +questionArrayList.get(i));            }            currentQuestion++;            tts.stop();            secondTTS.stop();            startSayWithID("",1000,"instruction");        }    });    tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {        @Override        public void onStart(String utteranceId) {        }        @Override        public void onDone(final String utteranceId) {            runOnUiThread(new Runnable() {                @Override                public void run() {                    if (utteranceId.contains("say")) {                        if (correctAnswersArrayList.get(currentQuestion).contains("tensa23")) {                            startSayWithID(questionArrayList.get(currentQuestion), 1000, "say");                            currentQuestion++;                            Log.d("Current ", "current Question" + currentQuestion + "" + correctAnswersArrayList.get(currentQuestion));                        }else                            startSayWithID(questionArrayList.get(currentQuestion), 1000, "question");                    }                    if (utteranceId.contains("instruction")) {                        if (correctAnswersArrayList.get(currentQuestion).contains("tensa23")) {                            startSayWithID(questionArrayList.get(currentQuestion), 1000, "say");                            currentQuestion++;                            Log.d("Current ","current Question"+currentQuestion +""+correctAnswersArrayList.get(currentQuestion));                        } else if (questionArrayList.get(currentQuestion).contains("?")) {                            startSayWithID(toASk.get(new Random().nextInt(toASk.size())), 1000, "say");                        } else {                            startSayWithID(toSay.get(new Random().nextInt(toSay.size())), 1000, "say");                        }                    }                    if (utteranceId.contains("question")) {                        if(questionArrayList.get(currentQuestion).contains("?")){                            startSayWithID("in Spanish you ask",1000,"german");                        }else{                            startSayWithID("In Spanish you say",1000,"german");                        }                    }                    if (utteranceId.contains("german")) {                        secondTTS.speak(correctAnswersArrayList.get(currentQuestion),TextToSpeech.QUEUE_FLUSH,null,"ask");                    }                    if(utteranceId.contains("ask")){                        startAsk(1000);                    }                }            });        }        @Override        public void onError(String utteranceId) {        }    });    secondTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {        @Override        public void onStart(String utteranceId) {        }        @Override        public void onDone(final String utteranceId) {            runOnUiThread(new Runnable() {                @Override                public void run() {                    if(utteranceId.contains("ask")){                        startAsk(1000);                    }                }            });        }        @Override        public void onError(String utteranceId) {        }    });    // end of MainActivity}private void promptSpeechInput() {    Intent prompIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);    prompIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "es-ES");    prompIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "How do you say \n" +questionArrayList.get(currentQuestion));    try {        startActivityForResult(prompIntent, REQ_CODE_SPEECH_INPUT);    } catch (ActivityNotFoundException a) {        makeText(getApplicationContext(), "speech not supported", Toast.LENGTH_SHORT).show();    }}@Overridepublic void onInit(int status) {    if (status == TextToSpeech.SUCCESS) {        tts.setLanguage(Locale.US);        switch (currentLanguage){            case "Spanish" :                secondTTS.setLanguage(new Locale("es","Es"));                break;            case "Italian" :                secondTTS.setLanguage(Locale.ITALY);                break;            case "German" :                secondTTS.setLanguage(Locale.GERMAN);                break;            case "French" :                secondTTS.setLanguage(Locale.FRENCH);                break;        }    }}protected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    switch (requestCode) {        case REQ_CODE_SPEECH_INPUT: {            if (resultCode == RESULT_OK && null != data) {                ArrayList<String> result = data                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);                speechInputTextView.setText(result.get(0));            }        }        String inputSpeechToString = speechInputTextView.getText().toString().toLowerCase();        if (currentQuestion < TOTAL_QUESITONS && inputSpeechToString.contains(correctAnswersArrayList.get(currentQuestion))) {            currentQuestion++;            correctACount++;            correctAnswerTextView.setText(String.valueOf(correctACount));            currentQuestionTextView.setText(String.valueOf(currentQuestion));            Log.d("Onactivity ", "CurrentQ = " + currentQuestion);            startSayWithID(sayCorrectArrayList.get(new Random().nextInt(sayCorrectArrayList.size())), 1000, "instruction");        } else if (inputSpeechToString.contains(STOP_COMMAND)) {            Intent stopIntent = new Intent(UnitActivity.this, PauseActivity.class);            Bundle resultBundle = new Bundle();            resultBundle.putBoolean("isStarted", isStarted);            stopIntent.putExtra("resultBundle", resultBundle);            startActivity(stopIntent);        } else if (inputSpeechToString.contains(PAUSE_COMMAND)) {            Intent pauseI = new Intent(UnitActivity.this, PauseActivity.class);            Bundle resultBundle = new Bundle();            resultBundle.putInt("npc", currentQuestion);            pauseI.putExtra("resultBundle", resultBundle);            startActivity(pauseI);        } else if (inputSpeechToString.contains(RESTART_COMMNAD)) {            currentQuestion = 0;            startSayWithID("Restarted", 1000, "say");        } else if (inputSpeechToString.contains(REPEAT_COMMAND)) {            startSayWithID(questionArrayList.get(currentQuestion), 1000, "question");        } else if (inputSpeechToString.contains(EXIT_COMMAND)) {            Intent homeIntent = new Intent(Intent.ACTION_MAIN);            homeIntent.addCategory(Intent.CATEGORY_HOME);            homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);            startActivity(homeIntent);        } else {            startSayWithID(sayWrongArrayList.get(new Random().nextInt(sayWrongArrayList.size())), 1000, "instruction");            wrongACount++;            wrongAnswerTextView.setText(String.valueOf(wrongACount));            Log.d("Onactivity ", "CORRECT = " + correctAnswersArrayList.get(currentQuestion));            Log.d("Onactivity ", "You said :  " + inputSpeechToString);        }    }}

回答:

在安卓上设置Google Speech云服务并不是一个简单的1、2、3步骤的过程,但我会给你一些指导。

  1. 从这里下载示例项目,使用语音示例。https://github.com/GoogleCloudPlatform/android-docs-samples/tree/master/speech/Speech
  2. 设置一个Google云项目,启用语音API,并将其链接到你的Gmail账户的计费(你每个月可以免费获得60分钟的语音识别)。
  3. 生成一个认证JSON文件,并将其放入示例项目的“raw”文件夹中。
  4. 在你的电脑上设置Google云服务并获取一个访问令牌。将该访问令牌插入到你的SpeechService.java类中。

*关于步骤3和4的文档:https://cloud.google.com/speech/docs/getting-started

*如果你在尝试将示例项目复制到你自己的项目时遇到问题,请查看这个:在安卓中无法导入com.google.cloud.speech.v1.SpeechGrpc

具体步骤太长了,无法一一列出,我甚至都记不全,如果你遇到具体问题,请告诉我。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注