代码之家  ›  专栏  ›  技术社区  ›  Vaclovas RekaÅ¡ius Jr.

安卓。如何在不显示谷歌弹出窗口的情况下对文本进行语音输入?

  •  1
  • Vaclovas RekaÅ¡ius Jr.  · 技术社区  · 10 年前

    你好,安卓开发者,

    我是机器人开发的初学者。陷入这个问题-

    我想进行语音到文本输入,但我不想出现谷歌弹出窗口。我见过多个应用程序没有语音输入,所以也许有人能帮我解决这个问题?

    这里是弹出窗口的屏幕截图 enter image description here

    这是我的MainActivity代码

    公共类MainActivity扩展了AppCompatActivity{

    private TextView resultTV;
    
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
        resultTV = (TextView) findViewById(R.id.resultTV);
    }
    
    
    public void onButtonClick(View view) {
    
        if (view.getId() == R.id.imageButton) {
    
            promtSpeechInput();
    
        }
    
    
    }
    
    public void promtSpeechInput() {
    
        Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
          i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
          i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
          i.putExtra(RecognizerIntent.EXTRA_PROMPT, "SAY SOMETHING");
          i.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
    
    
    
        try {
    
            startActivityForResult(i, 100);
            Toast.makeText(MainActivity.this, "Say something kiddo", Toast.LENGTH_LONG).show();
    
    
    
        } catch (Exception e) {
            Toast.makeText(MainActivity.this, "Sorry, your device not support speech inputs", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    
    
    }
    
    
    public void onActivityResult(int request_code, int result_code, Intent i){
    
    
            super.onActivityResult(request_code,result_code,i);
    
            switch (request_code)
            {
    
                case 100: if(result_code == RESULT_OK && i != null){
                    ArrayList<String> result = i.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
    
                    resultTV.setText(result.get(0));
    
                }
                break;
    
            }
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   user5894647    10 年前

    尝试使用我创建的这个活动,当切换按钮打开时,录制开始,并且使用RmsChanged()方法在进度条中显示音调的波动,识别的文本显示在文本视图中

    public class MainActivity extends Activity implements RecognitionListener
    {
    private TextView returnedText;
    private ToggleButton toggleButton;
    private ProgressBar progressBar;
    private SpeechRecognizer speech = null;
    private Intent recognizerIntent;
    private String LOG_TAG = "VoiceRecognitionActivity";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        returnedText = (TextView) findViewById(R.id.textView1);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        toggleButton = (ToggleButton) findViewById(R.id.toggleButton1);
        Button recordbtn = (Button) findViewById(R.id.mainButton);
    
    
        progressBar.setVisibility(View.INVISIBLE);
        speech = SpeechRecognizer.createSpeechRecognizer(this);
        speech.setRecognitionListener(this);
        recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,
                                  "en");
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                                  this.getPackageName());
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                                  RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 3000);
    
        toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                                             boolean isChecked) {
                    if (isChecked) {
                        progressBar.setVisibility(View.VISIBLE);
                        progressBar.setIndeterminate(true);
                        speech.startListening(recognizerIntent);
                    } else {
                        progressBar.setIndeterminate(false);
                        progressBar.setVisibility(View.INVISIBLE);
                        speech.stopListening();
                    }
                }
            });
    
    
    
    
    
    
    }
    
    @Override
    public void onResume() {
        super.onResume();
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        if (speech != null) {
            speech.destroy();
            Log.i(LOG_TAG, "destroy");
        }
    
    }
    
    @Override
    public void onBeginningOfSpeech() {
        Log.i(LOG_TAG, "onBeginningOfSpeech");
        progressBar.setIndeterminate(false);
        progressBar.setMax(10);
    }
    
    @Override
    public void onBufferReceived(byte[] buffer) {
        Log.i(LOG_TAG, "onBufferReceived: " + buffer);
    }
    
    @Override
    public void onEndOfSpeech() {
        Log.i(LOG_TAG, "onEndOfSpeech");
        progressBar.setIndeterminate(true);
        toggleButton.setChecked(false);
    }
    
    @Override
    public void onError(int errorCode) {
        String errorMessage = getErrorText(errorCode);
        Log.d(LOG_TAG, "FAILED " + errorMessage);
        returnedText.setText(errorMessage);
        toggleButton.setChecked(false);
    }
    
    @Override
    public void onEvent(int arg0, Bundle arg1) {
        Log.i(LOG_TAG, "onEvent");
    }
    
    @Override
    public void onPartialResults(Bundle arg0) {
        Log.i(LOG_TAG, "onPartialResults");
    ArrayList<String> matches = arg0
            .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        String text = "";
        for (String result : matches)
            text += result + "\n";
    
        returnedText.setText(text);
    
    
    }
    
    @Override
    public void onReadyForSpeech(Bundle arg0) {
        Log.i(LOG_TAG, "onReadyForSpeech");
    }
    
    @Override
    public void onResults(Bundle results) {
        Log.i(LOG_TAG, "onResults");
    
    }
    
    @Override
    public void onRmsChanged(float rmsdB) {
        Log.i(LOG_TAG, "onRmsChanged: " + rmsdB);
        progressBar.setProgress((int) rmsdB);
    
    }
    
    public static String getErrorText(int errorCode) {
        String message;
        switch (errorCode) {
            case SpeechRecognizer.ERROR_AUDIO:
                message = "Audio recording error";
                break;
            case SpeechRecognizer.ERROR_CLIENT:
                message = "Client side error";
                break;
            case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
                message = "Insufficient permissions";
                break;
            case SpeechRecognizer.ERROR_NETWORK:
                message = "Network error";
                break;
            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                message = "Network timeout";
                break;
            case SpeechRecognizer.ERROR_NO_MATCH:
                message = "No match";
                break;
            case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
                message = "RecognitionService busy";
                break;
            case SpeechRecognizer.ERROR_SERVER:
                message = "error from server";
                break;
            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                message = "No speech input";
                break;
            default:
                message = "Didn't understand, please try again.";
                break;
        }
        return message;
    }
    
    
    
    
      }
    

    不要忘记在您的手册中添加此许可证

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
        2
  •  1
  •   akhil Rao    10 年前

    尝试此代码

        SpeechRecognizer recognize=SpeechRecognizer.createSpeechRecognizer(this);
        recognize.setRecognitionListener(new RecognitionListener() {
            @Override
            public void onReadyForSpeech(Bundle bundle) {
    
            }
    
            @Override
            public void onBeginningOfSpeech() {
    
            }
    
            @Override
            public void onRmsChanged(float v) {
    
            }
    
            @Override
            public void onBufferReceived(byte[] bytes) {
    
            }
    
            @Override
            public void onEndOfSpeech() {
    
            }
    
            @Override
            public void onError(int i) {
                Toast.makeText(getApplicationContext(),"ERROR",Toast.LENGTH_LONG).show();
            }
    
            @Override
            public void onResults(Bundle bundle) {
                String output = bundle.getString(SpeechRecognizer.RESULTS_RECOGNITION);
                 Toast.makeText(getApplicationContext(),output,Toast.LENGTH_LONG).show();
            }
    
            @Override
            public void onPartialResults(Bundle bundle) {
    
            }
    
            @Override
            public void onEvent(int i, Bundle bundle) {
    
            }
        });
     recognize.startListening(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH));