首页 文章

Android上的文字语音[关闭]

提问于
浏览
10

我希望创建一个具有语音到文本的应用程序 .

我使用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

干杯,

3 回答

  • 14

    如果您不想使用 RecognizerIntent 进行语音识别,您仍然可以使用SpeechRecognizer类来执行此操作 . 但是,使用该类比使用intent更棘手 . 作为最后一点,我强烈建议让用户知道他何时被录音,否则他可能会非常安静,当他终于发现时 .

    编辑:一个小例子受到启发(但已更改)this stack overflow entry

    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) {
                    Log.e(TAG, "No voice results");
                } else {
                    Log.d(TAG, "Printing matches: ");
                    for (String match : voiceResults) {
                        Log.d(TAG, match);
                    }
                }
            }
    
            @Override
            public void onReadyForSpeech(Bundle params) {
                Log.d(TAG, "Ready for speech");
            }
    
            @Override
            public void onError(int error) {
                Log.d(TAG,
                        "Error listening for speech: " + error);
            }
    
            @Override
            public void onBeginningOfSpeech() {
                Log.d(TAG, "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线程运行此代码 .

  • 4

    Android内置的功能(通过意图启动)是一种客户端活动,可捕获您的语音并将音频发送到Google服务器进行识别 . 你可以 Build 类似的东西 . 您可以自己托管狮身人面像(或使用像Yapme.com这样的 Cloud 识别服务),自己捕捉声音,将音频发送到识别器,然后将文本结果返回给您的应用 . 我不知道如何在不使用Android(或Chrome)上的Intent的情况下利用Google识别服务 .

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

    有关相关信息,请参阅:

  • 0

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

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

相关问题