13

我正在寻找创建一个具有语音到文本的应用程序。

我知道使用 RecognizerIntent 的这种能力:http ://android-developers.blogspot.com/search/label/Speech%20Input

但是 - 我不希望弹出一个新的 Intent,我想在我当前的应用程序中对某些点进行分析,并且我不希望它弹出一些东西,说明它当前正在尝试记录你的声音。

有没有人对如何最好地做到这一点有任何想法。我可能正在考虑尝试 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 内置的(通过 Intent 启动)是一个客户端活动,它捕获您的声音并将音频发送到 Google 服务器进行识别。你可以建立类似的东西。您可以自己托管 sphinx(或使用 Yapme.com 等云识别服务),自己捕获语音,将音频发送到识别器,然后将文本结果返回到您的应用程序。我不知道如何在不使用 Android 上的 Intent(或通过 Chrome)的情况下利用 Google 识别服务。

到目前为止,我所看到的普遍共识是,今天的智能手机并没有真正具备进行类似 Sphinx 语音识别的能力。您可能想探索自己运行客户端识别器,但 Google 使用服务器识别。

有关一些相关信息,请参见:

于 2011-05-06T17:22:43.143 回答
4

在您的活动中执行以下操作:

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;
        }

    }
}
于 2017-08-26T16:49:41.727 回答
0

向清单添加权限:-

"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;
    }
}
于 2020-01-09T22:11:21.967 回答