Приложение Android для распознавания речи - PullRequest
2 голосов
/ 09 марта 2012

Я создаю приложение, которое принимает команды от пользователя и пишет его в режиме реального времени.Какой лучший вариант для меня взять?Стороннее программное обеспечение, такое как sphinx, или я должен использовать встроенное (распознавание речи Android)?

Во-вторых, я хочу, чтобы оно писало в реальном времени, например, когда я говорю, оно начинает писать?

Ответы [ 2 ]

6 голосов
/ 09 марта 2012

Вы должны использовать встроенное в Android распознавание речи.В частности, вам нужно будет использовать API SpeechRecognier , чтобы не было всплывающего диалогового окна.

Кроме того, не ожидайте, что SpeechRecognizer вернет что-либо в пределах onPartialResults () ,Это редко происходит.

Вы можете попробовать использовать Sphinx, но, похоже, другие разработчики испытывают трудности с его запуском на Android.Тем не менее, sphinx будет единственным вариантом, если вы хотите, чтобы ваше приложение работало без подключения к Интернету.

Вот фрагмент кода, который вам потребуется для использования SpeechRecognizer:

 public void recognizeDirectly(Intent recognizerIntent)
    {
        // SpeechRecognizer requires EXTRA_CALLING_PACKAGE, so add if it's not
        // here
        if (!recognizerIntent.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE))
        {
            recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                    "com.dummy");
        }
        SpeechRecognizer recognizer = getSpeechRecognizer();
        recognizer.startListening(recognizerIntent);
    }

    @Override
    public void onResults(Bundle results)
    {
        Log.d(TAG, "full results");
        receiveResults(results);
    }

    @Override
    public void onPartialResults(Bundle partialResults)
    {
        Log.d(TAG, "partial results");
        receiveResults(partialResults);
    }

    /**
     * common method to process any results bundle from {@link SpeechRecognizer}
     */
    private void receiveResults(Bundle results)
    {
        if ((results != null)
                && results.containsKey(SpeechRecognizer.RESULTS_RECOGNITION))
        {
            List<String> heard =
                    results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            float[] scores =
                    results.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES);
            receiveWhatWasHeard(heard, scores);
        }
    }

    @Override
    public void onError(int errorCode)
    {
        recognitionFailure(errorCode);
    }

    /**
     * stop the speech recognizer
     */
    @Override
    protected void onPause()
    {
        if (getSpeechRecognizer() != null)
        {
            getSpeechRecognizer().stopListening();
            getSpeechRecognizer().cancel();
            getSpeechRecognizer().destroy();
        }
        super.onPause();
    }

    /**
     * lazy initialize the speech recognizer
     */
    private SpeechRecognizer getSpeechRecognizer()
    {
        if (recognizer == null)
        {
            recognizer = SpeechRecognizer.createSpeechRecognizer(this);
            recognizer.setRecognitionListener(this);
        }
        return recognizer;
    }

    // other unused methods from RecognitionListener...

    @Override
    public void onReadyForSpeech(Bundle params)
    {
        Log.d(TAG, "ready for speech " + params);
    }

    @Override
    public void onEndOfSpeech()
    {
    }
4 голосов
/ 30 апреля 2013

Грегм прав, но основная часть вопроса «напиши в реальном времени» осталась без ответа.Вам нужно добавить дополнительный, чтобы указать, что вы заинтересованы в получении части результата обратно:

Добавление дополнительного к цели работает для меня

intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);

Предупреждение: Частичное не возвращаеттолько новый материал, но и предыдущий.Так что вам нужно самостоятельно выполнить проверку на различия ...

...