Речь в текст на Android - PullRequest
11 голосов
/ 06 мая 2011

Я хочу создать приложение, в котором есть Речь к тексту.

Мне известны такие возможности с использованием RecognizerIntent: http://android -developers.blogspot.com / search / label/ Речь% 20Вход

Однако - я не хочу, чтобы выскочил новый Намерение, я хочу выполнить анализ определенных точек в моем текущем приложении, и я не хочу, чтобы оно выскакивало что-тозаявив, что в настоящее время он пытается записать ваш голос.

Есть у кого-нибудь какие-либо идеи о том, как лучше всего это сделать.Возможно, я думал о том, чтобы попробовать Sphinx 4 - но я не знаю, сможет ли он работать на Android - у кого-нибудь есть какой-либо совет или опыт?!

Мне было интересно, смогу ли я изменить здесь код, возможно,не удосужившись показать пользовательский интерфейс или кнопку и просто выполнить обработку: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html

Приветствия,

Ответы [ 3 ]

17 голосов
/ 06 мая 2011

Если вы не хотите использовать 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);

Внимание! Запустите этот код из потока пользовательского интерфейса и убедитесь, что у вас есть необходимые разрешения.

<uses-permission android:name="android.permission.RECORD_AUDIO" />
4 голосов
/ 06 мая 2011

То, что встроено в Android (которое вы запускаете через намерение), является клиентским действием, которое фиксирует ваш голос и отправляет аудио на сервер Google для распознавания.Вы могли бы построить что-то подобное.Вы можете самостоятельно разместить sphinx (или использовать облачные сервисы распознавания, такие как Yapme.com), самостоятельно записать голос, отправить аудио на распознаватель и вернуть текстовые результаты в свое приложение.Я не знаю, как использовать сервисы распознавания Google без использования Intent на Android (или через Chrome).

Общий консенсус, который я видел до сих пор, заключается в том, что современные смартфоны на самом деле не имеют такой силы, чтобы распознавать речь, подобную сфинксу.Возможно, вы захотите попробовать запустить распознаватель клиентов для себя, но Google использует распознавание сервера.

Для получения дополнительной информации см .:

2 голосов
/ 26 августа 2017

В своей деятельности делайте следующее:

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

    }
}
...