Речь в текст на Android

Я ищу для создания приложения, которое имеет речевое сообщение для текста.

Я знаю эту способность, используя RecognizerIntent: http://android-developers.blogspot.com/search/label/Speech%20Input

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

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

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

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

+10
источник поделиться
3 ответа

Если вы не хотите использовать 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" />
+16
источник

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

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

Для некоторых связанных сведений см.:

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

    }
}
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос