12

編集:これについてはすでに言及する必要がありましたが、このコードをサービスで実行しています。アプリ全体がウィジェット ボタンでオン/オフされ、アクティビティはありません。


更新: SDK ソースをプロジェクトにアタッチして、失敗が発生した場所をより正確に把握できるようにしましたが、見た目からすると、パブリック API のみが含まれているため、あまり役に立たないようです.. .この問題を解決するための少なくともデバッグアプローチを提案できる人はいますか? 私はちょっと立ち往生しています。


Android の音声認識パッケージを使用して、ユーザーの音声を録音し、テキストに変換しようとしています。残念ながら、リスニングを開始しようとすると、具体的なことを示さない ANR エラーが表示されます。

SpeechRecognizer API が示すように、メイン スレッドから呼び出そうとすると、RuntimeException がスローされます。これは、処理に負荷がかかりすぎたのではないかと思います... しかし、他のアプリケーションがこの目的で Android API を使用していることは知っており、通常はかなりきびきびしています。

java.lang.RuntimeException: SpeechRecognizer should be used only from the application's main thread

これは、サービスから呼び出そうとしているコードの (トリミングされた) サンプルです。これは適切なアプローチですか?

お時間を割いていただきありがとうございます。これは私がまだ乗り越えられないハードルでした。

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(RecognizerIntent.EXTRA_RESULTS);
        if (voiceResults == null) {
            Log.e(getString(R.string.log_label), "No voice results");
        } else {
            Log.d(getString(R.string.log_label), "Printing matches: ");
            for (String match : voiceResults) {
                Log.d(getString(R.string.log_label), match);
            }
        }
    }

    @Override
    public void onReadyForSpeech(Bundle params) {
        Log.d(getString(R.string.log_label), "Ready for speech");
    }

    @Override
    public void onError(int error) {
        Log.d(getString(R.string.log_label),
                "Error listening for speech: " + error);
    }

    @Override
    public void onBeginningOfSpeech() {
        Log.d(getString(R.string.log_label), "Speech starting");
    }
};
recognizer.setRecognitionListener(listener);
recognizer.startListening(intent);
4

6 に答える 6

5

RECORD_AUDIO パーミッションを必ず使用してください。

于 2011-12-29T20:23:19.190 に答える
4

サービスから、メイン スレッドで実行されているルーパーからレコグナイザーを作成する必要があります。また、RecognizerIntent.EXTRA_RESULTS は SpeechRecognizer.RESULTS_RECOGNITION である必要があります。

擬似コード:

public class VoiceRecognition implements RecognitionListener, Runnable 
{
    @Override
    public void run()
    {
        recognizer = SpeechRecognizer.createSpeechRecognizer(yourContext);
        recognizer.setRecognitionListener((RecognitionListener) this);

         intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
         //... all the intent stuff ...
         intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);
         recognizer.startListening(intent);
    }
    @Override
    public void onResults(Bundle results)
    {
       ArrayList<String> matches;
       matches=results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
    }
 }

....
VoiceRecognition voiceRecognizer = new VoiceRecognition();
Handler loopHandler = new Handler(Looper.getMainLooper());
loopHandler.post(voiceRecognizer);
于 2012-04-17T02:48:16.560 に答える
4

SpeechRecognizer クラスを自分で作成する必要も、RecognizerListener を実装する必要もありません。Googleはそれらを公開しましたが、かなり複雑に見え、おそらく専門家のみが使用できます。

ユーザーの音声からテキストを取得するには、RecognizerIntent.ACTION_RECOGNIZE_SPEECH を使用して組み込みの音声認識アクティビティを起動し、結果が onActivityResult に返されるのを待つだけです。ここでサンプルコードを見てください:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html

この記事から引っ張ってきました。

http://developer.android.com/resources/articles/speech-input.html

幸運を。

于 2011-01-03T00:51:37.523 に答える
1

Google Voice アプリをインストールして、これを機能させました

于 2011-05-06T07:41:51.623 に答える
1

の代わりにgetApplicationContext()this(つまり、サービス インスタンス) を使用します。android.app.Serviceコンテキストから継承します。

于 2011-01-06T20:41:00.777 に答える
1

これが私が遭遇した問題です。これはあなたの問題に関連している可能性があります。この行から、何があってもnullになっていました:

  ArrayList<String> voiceResults = results                .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);  

これに変更すると、問題が完全に修正されました。

  ArrayList<String> voiceResults = results                .getStringArrayList("results_recognition");  

バンドルからキーセットを印刷しましたが、それが唯一の値でした。「results_recognition」の値は、RecognizerIntent.EXTRA_RESULTS に格納されている文字列の値ではないことに注意してください。RecognizerIntent.EXTRA_RESULTS を使用すると、音声認識を行うアクティビティの方法では正常に機能しますが、誰かが SpeechRecognizer を使用する場合は機能しないため、これはバグであると思います。

いずれにせよ、私はおそらくこのウェブサイトを再びチェックすることはありませんが、質問があれば私に電子メールを送ってください.

于 2011-04-13T22:17:28.750 に答える