web-dev-qa-db-ja.com

Android

音声認識機能を備えたアプリを作成したいと考えています。

RecognizerIntentを使用してこの種の機能を認識しています: http://Android-developers.blogspot.com/search/label/Speech%20Input

ただし、新しいインテントをポップアップさせたくない、現在のアプリの特定のポイントで分析を実行したい、そして現在あなたの声を録音しようとしていることを示す何かをポップアップさせたくない。

これを行うための最善の方法について誰かにアイデアがあります。私はおそらくSphinx4を試すことを考えていましたが、これがAndroid)で実行できるかどうかはわかりませんが、誰かアドバイスや経験がありますか?!

ここのコードを変更して、UIやボタンを表示せずに処理を実行できるかどうか疑問に思っていました: http://developer.Android.com/resources/samples/ApiDemos/src/com/ example/Android/apis/app/VoiceRecognition.html

乾杯、

11
RenegadeAndy

RecognizerIntentを使用して音声認識を行いたくない場合でも、 SpeechRecognizer クラスを使用して行うことができます。ただし、そのクラスを使用することは、インテントを使用するよりも少し注意が必要です。最後に、記録されたときにユーザーに知らせることを強くお勧めします。そうしないと、最終的に見つけたときに、非常にセットアップされている可能性があります。

編集:からインスピレーションを得た(しかし変更された)小さな例 SpeechRecognizerはANRを引き起こします... Android Speech API の助けが必要です

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
        RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
        "com.domain.app");

SpeechRecognizer recognizer = SpeechRecognizer
        .createSpeechRecognizer(this.getApplicationContext());
RecognitionListener listener = new RecognitionListener() {
    @Override
    public void onResults(Bundle results) {
        ArrayList<String> voiceResults = results
                .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        if (voiceResults == null) {
            System.out.println("No voice results");
        } else {
            System.out.println("Printing matches: ");
            for (String match : voiceResults) {
                System.out.println(match);
            }
        }
    }

    @Override
    public void onReadyForSpeech(Bundle params) {
        System.out.println("Ready for speech");
    }

    /**
     *  ERROR_NETWORK_TIMEOUT = 1;
     *  ERROR_NETWORK = 2;
     *  ERROR_AUDIO = 3;
     *  ERROR_SERVER = 4;
     *  ERROR_CLIENT = 5;
     *  ERROR_SPEECH_TIMEOUT = 6;
     *  ERROR_NO_MATCH = 7;
     *  ERROR_RECOGNIZER_BUSY = 8;
     *  ERROR_INSUFFICIENT_PERMISSIONS = 9;
     *
     * @param error code is defined in SpeechRecognizer
     */
    @Override
    public void onError(int error) {
        System.err.println("Error listening for speech: " + error);
    }

    @Override
    public void onBeginningOfSpeech() {
        System.out.println("Speech starting");
    }

    @Override
    public void onBufferReceived(byte[] buffer) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onEndOfSpeech() {
        // TODO Auto-generated method stub

    }

    @Override
    public void onEvent(int eventType, Bundle params) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPartialResults(Bundle partialResults) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onRmsChanged(float rmsdB) {
        // TODO Auto-generated method stub

    }
};
recognizer.setRecognitionListener(listener);
recognizer.startListening(intent);

重要:このコードはUIスレッドから実行し、必要な権限があることを確認してください。

<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
18
Stephan

Android(インテントを介して起動する)に組み込まれているのは、音声をキャプチャし、認識のために音声をGoogleサーバーに送信するクライアントアクティビティです。同様のものを作成できます。ホストすることもできます。自分でスフィンクス(またはYapme.comなどのクラウド認識サービスを使用)し、自分で音声をキャプチャし、音声を認識機能に送信して、テキストの結果をアプリに返します。Google認識サービスを活用する方法がわかりません。 Android(またはChrome経由)でのインテントの使用。

私がこれまで見てきた一般的なコンセンサスは、今日のスマートフォンには、スフィンクスのような音声認識を行うための馬力が実際にはないということです。クライアントレコグナイザーを自分で実行することを検討することもできますが、Googleはサーバー認識を使用します。

関連情報については、以下を参照してください。

4
Michael Levy

あなたの活動では、次のことを行います。

Image button buttonSpeak = findView....;// initialize it.
buttonSpeak.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            promptSpeechInput();
        }
    });



private void promptSpeechInput() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
    intent.putExtra(RecognizerIntent.EXTRA_Prompt,
            getString(R.string.speech_Prompt));
    try {
        startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
    } catch (ActivityNotFoundException a) {
        Toast.makeText(getApplicationContext(),
                getString(R.string.speech_not_supported),
                Toast.LENGTH_SHORT).show();
    }
}

    @Override
   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) {

                result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

      EditText input ((EditText)findViewById(R.id.editTextTaskDescription));
      input.setText(result.get(0)); // set the input data to the editText alongside if want to.

            }
            break;
        }

    }
}
3
Saurabh Singh

マニフェストに権限を追加します:-

"Android.permission.RECORD_AUDIO"

ボタンがクリックされたときにgetSpeechInput()を呼び出します(リスナーを使用)

public void getSpeechInput() {

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());

    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, 10);
    } else {
        Toast.makeText(this, "Your Device Don't Support Speech Input", Toast.LENGTH_SHORT).show();
    }
}

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

    switch (requestCode) {
        case 10:
            if (resultCode == RESULT_OK && data != null) {
                ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                Toast.makeText(this, result.get(0), Toast.LENGTH_SHORT).show();

            }
            break;
    }
}
0