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

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

ただいまの
回答率

88.21%

androidで音声認識を実現したい

受付中

回答 0

投稿

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

k126578ta

score 16

前提・実現したいこと

Androidで,アプリを開き,ボタンを押すと音声認識のモードに遷移し,ユーザが何かしゃべるとAndroidが音声認識をし,画面にテキストとして表示する,というようなアプリを実現したいです.現在,日本語と英語で実現することができたのですが,中国語で実現することができません.Androidをオフラインにした状態でもアプリが動くように,言語のダウンロードをしてあります.

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーは発生しないのですが,中国語の音声認識の際に,中国語だけでなく日本語も認識してしまいます.例えば,「こんにちは」という言葉は日本語なので中国語の音声認識では反応しないはずが,中国語の音声認識で反応してしまいます.中国語の音声認識の際には,中国語だけに反応するようにしたいです.

該当のソースコード

package com.example.keita.gtts;
import android.content.Intent;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Locale;

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
    private Button button_jpn;
    private Button button_en;
    private Button button_ch;
    private EditText editText;
    private TextToSpeech tts;
    private String text_jpn;
    private SpeechRecognizer mRecognizer;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button_jpn = findViewById(R.id.button_jpn);
        button_en = findViewById(R.id.button_en);
        button_ch = findViewById(R.id.button_ch);
        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        //tts = new TextToSpeech(this, this);
        mRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
        mRecognizer.setRecognitionListener(new listener());
        button_jpn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v1) {
                Intent intent1 = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                intent1.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ja-JP");
                intent1.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, true);
                intent1.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
                mRecognizer.startListening(intent1);
                //speechText();
            }
        });
        button_en.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v2) {
                Intent intent2 = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                intent2.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.US.toString());
                intent2.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, true);
                intent2.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
                mRecognizer.startListening(intent2);
                //speechText();
            }
        });
        button_ch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v3) {
                Intent intent3 = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                intent3.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-Hans-CN");
                intent3.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, true);
                intent3.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
                mRecognizer.startListening(intent3);
                //speechText();
            }
        });
    }
    @Override
    public void onInit(int status) {
    }
    /*
    private void speechText(){
        text_jpn = editText.getText().toString();
        tts.speak(text_jpn, TextToSpeech.QUEUE_FLUSH, null, null);
    }
    */

    public class listener implements RecognitionListener{
        @Override
        public void onReadyForSpeech(Bundle params) {
            Toast.makeText(getApplicationContext(), "準備終了", Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onBeginningOfSpeech() {
            Toast.makeText(getApplicationContext(), "入力開始", Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onRmsChanged(float rmsdB) {
        }
        @Override
        public void onBufferReceived(byte[] buffer) {
        }
        @Override
        public void onEndOfSpeech() {
            Toast.makeText(getApplicationContext(), "入力終了", Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onError(int error) {
        }
        @Override
        public void onResults(Bundle results) {
            String key = SpeechRecognizer.RESULTS_RECOGNITION;
            ArrayList<String> list = results.getStringArrayList(key);
            String str = "";
            for (String s : list){
                str += s;
            }
            textView.setText(str);
        }
        @Override
        public void onPartialResults(Bundle partialResults) {
        }
        @Override
        public void onEvent(int eventType, Bundle params) {
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button_jpn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="24dp"
        android:text="Japanese"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="100dp"
        android:ems="10"
        android:hint="翻訳するテキストを入力"
        android:inputType="text"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_ch" />

    <Button
        android:id="@+id/button_en"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="20dp"
        android:text="English"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_jpn" />

    <Button
        android:id="@+id/button_ch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="20dp"
        android:text="China"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_en" />

</android.support.constraint.ConstraintLayout>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

試したこと

中国語のLocaleについて調べ,ソースコードに記載した形にしたのですが,うまくいきませんでした.

補足情報(FW/ツールのバージョンなど)

Android Studio 3.1.4
Windows 10
Nexus 5X

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • hoshi-takanori

    2020/04/03 01:07

    音声認識はよく分かりませんが、startListeneing の時に、すでに別の言語で startListeneing されていれば stopListeneing しなくて良いのでしょうか。

    キャンセル

  • k126578ta

    2020/04/03 01:29

    音声認識が終了すると,自動的にstopされてonResultsが呼ばれるので不具合は出ていません.
    音声認識に関してプログラム中で中国語を指定しているのに,日本語の音声入力に反応してしまうことを解決するのを最優先に考えています.

    キャンセル

  • bobmax

    2020/04/07 10:12

    関係あるか分かりませんが、Locale.CHINA.toString()は"zh-CN"でしたが"zh-Hans-CN"でいいんでしょうか。

    キャンセル

まだ回答がついていません

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

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

関連した質問

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