2015-05-22 3 views
0

Я новичок в Android. В настоящее время я работаю над викторины с помощью SpeechRecognizer выбрать ответ на вопросИспользование распознавания речи для выбора радио кнопки на Android

ответ имеет 5 радио кнопку
каждый радио имеет 3 до 5 слов

Ответ Пример:

  • Jhonny любит яблоко
  • Донни любит яблоко
  • Бони любит яблоко
  • Ronney любит яблоко
  • Молли любит яблоко

В настоящее время мое приложение может выбрать только ответ, если распознанные слова все совпало.

что я хочу сделать это.
Как мое приложение может выбрать один из ответов, если распознанное слово больше, чем другое.

так же, как это, если признано слово Molly и apple, поэтому ближайший ответ Molly likes an apple, то мое приложение может выбрать его.
Как я могу это сделать?

Благодарим заранее.

ответ

0

Чтобы он работал хорошо, вам нужно сделать некоторое обходное решение. Мои советы:

  1. Чтобы выбрать имена, которые полностью отличаются друг от друга. Например: Джонни, Стивен, Альфред и т. Д. Причина в том, что имя будет правильно подобрано, а Бонни не будет смешиваться с Джонни.
  2. Если у вас есть правильно выбранные имена, соберите результат распознавания для всех имен (johnny, jonny, johnnie, johny, jonnie) и создайте отдельный массив или список из этих
  3. , чтобы обрабатывать их, используя их как постоянные список или создать карту в соответствии с вашим стилем программирования

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

 public void onResults(Bundle results){ 

      ... 

      //this is your predefined name synonyms 
      List<String> johnnyNameList = (ArrayList<String>);    
      johnnyNameList.add("johnny"); 
      johnnyNameList.add("jonny"); 
      johnnyNameList.add("johnnie"); 
      List<String> katieNameList = (ArrayList<String>);    
      katieNameList.add("katy"); 
      katieNameList.add("katie"); 
      katieNameList.add("kattie"); 

      Map<String, List<String>> namesMap = new HashMap<String, List<String>>(); 
      namesMap.put(johnny, johnnyNameList); 
      namesMap.put(katie, katieNameList); 
      ... 
      List<String> recognitionResult = (ArrayList<String>) results.get(RESULTS_RECOGNITION); 
      for (String resultItem : recognitionResult) { 
        //brake into pieces the results 
        String[] messagePieces = resultItem.split(","); 
        //you process in case the length of the result fits 
        if(messagePieces.length == 4){ 
         //compare predefined name collection with the result first element 
         //A) solution 
         for (String name : johnnyNameList) { 
          if(name.trim().toLowerCase().equals(messagePieces[0])){ 
           //you have a name match 
          } 
         } 
         //B) solution process namesMap which contains all names 
         ... 
         //you can compare the other parts of the result 

         //remove first element of the result 
         for (String piece : messagePieces) { 

         //count matches on the other words 
        } 
        } 

      } 

я сделал что-то подобное в моем проекте, где я имел команды и я должен был признать их и выполнять процессы.

0

Вы можете использовать https://github.com/Simmetrics/simmetrics

, например:

float allowD = 0.95f; 
     AbstractStringMetric metric = new JaroWinkler(); 
if (metric.getSimilarity(choice.toLowerCase(), fromTextRecognizer.trim().toLowerCase()) > allowD) { 
// match found 
} 

Это ЛИЭС также предоставляют другие показатели, которые могут быть использованы

+0

Вы можете хотите проверить свой код. Это из версии 1.x API обновлено немного. – mpkorstanje

Смежные вопросы