13

Speech to text を備えたアプリを作成しようとしています。

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

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

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

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

乾杯、

4

4 に答える 4

20

RecognizerIntentを使用して音声認識を行いたくない場合でも、SpeechRecognizerクラスを使用してそれを行うことができます。ただし、そのクラスを使用するのは、インテントを使用するよりも少し注意が必要です。最後のメモとして、記録されたときにユーザーに知らせることを強くお勧めします。

編集: SpeechRecognizerからインスピレーションを得た (ただし変更された) 小さな例では、 ANR が発生します... Android 音声 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" />
于 2011-05-06T17:39:19.280 に答える
4

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

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

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

于 2011-05-06T17:22:43.143 に答える