как получить голосовое пробуждение на Android - PullRequest
1 голос
/ 21 марта 2012

Я хочу разбудить какую-то функцию в приложении для Android, сказав "привет, Джек".Насколько я знаю, есть технология, называемая «определение фразы», ​​для распознавания определенной речи, например, «привет, Джек».но я понятия не имею, чтобы реализовать «определение фразы».

У кого-нибудь есть еще идеи или предложения?

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Самый простой и ресурсоэффективный способ - реализовать DTW с динамическим изменением времени для определения ключевых слов

http://en.wikipedia.org/wiki/Dynamic_time_warping

http://www.purduecal.edu/ece/WSEAS.pdf

Вы можете использовать набор инструментов CMUSphinx для извлечения функций MFCC, что сэкономит много времени на их реализацию

http://cmusphinx.sourceforge.net

0 голосов
/ 22 марта 2012

Сначала я предлагаю этот простой подход.

Начните с использования простого набора для соответствия нужным ключевым словам, как в приведенном ниже классе:

public class WordMatcher
{
    private Set<String> words;
    public static final int NOT_IN = -1;

    public WordMatcher(String... wordsIn)
    {
        this(Arrays.asList(wordsIn));
    }

    public WordMatcher(List<String> wordsIn)
    {
        //care about order so we can execute isInAt
        words = new LinkedHashSet<String>(wordsIn);
    }

    public Set<String> getWords()
    {
        return words;
    }

    public boolean isIn(String word)
    {
        return words.contains(word);
    }

    public boolean isIn(String [] wordsIn)
    {
        boolean wordIn = false;
        for (String word : wordsIn)
        {
            if (isIn(word))
            {
                wordIn = true;
                break;
            }
        }
        return wordIn;
    }

Обработайте результаты распознавания следующим образом:

@Override
protected void
        onActivityResult(int requestCode, int resultCode, Intent data)
{
    WordMatcher matchHello = new WordMatcher("hello");
    WordMatcher matchJack = new WordMatcher("jack");

    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE)
    {
        if (resultCode == RESULT_OK)
        {
            List<String> heard =
                    data.
                    getStringArrayListExtra
                            (RecognizerIntent.EXTRA_RESULTS);

            for (String oneResult : heard)
            {
                if (matchHello.isIn(oneResult.split(" ")) && matchJack.isIn(oneResult.split(" "))
                {
                     //SUCCESS!! do something here
                }


            }
        }
        else
        {
            Log.d(TAG, "error code: " + resultCode);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Во-вторых, если это не сработает, введите «похожие на» алгоритмы сопоставления, такие как Soundex .

Кроме того, вы можете захотеть исследовать использование класса SpeechRecognizer напрямую.запускать распознавание речи в фоновом режиме, а не использовать RecognizerIntent, который создает диалог.

...