Q: Получите Android SpeechRecognizer для записи чисел как строк / слов, а не как математических чисел - PullRequest
0 голосов
/ 09 января 2019

Сообщество,
Я хочу написать код для приложения для Android, который позволяет Android SpeechRecognizer распознавать последовательность произносимых чисел как результаты дротиков (сообщаются в трех числах в быстрой последовательности). Основная проблема в том, что если вы говорите два числа в быстрой последовательности, Android записывает их вместе (например, «три четыре пятнадцать» -> «34 15». Хорошо, что Android записывает несколько возможных результатов, но, к сожалению, это не помогает для этой проблемы (см. примеры ниже). Самый простой обходной путь был бы, если бы был какой-то способ заставить андроид записывать произнесенные цифры словами, а не цифрами.

Две основные вещи, которые я пробовал:

  1. Поиск по разным результатам, которые возвращает SpeechRecognizer, и анализ на предмет поиска наиболее подходящего.
  2. Разбить строку на определенное слово


Что касается (2)
Я выбрал слово «и» для разделения строки. Я пишу это приложение для немецкой аудитории, и есть немецкие числа, которые содержат «и» (например, 25 - «пять и двадцать»). Конечно, я мог бы использовать другое слово, но в основном это решение довольно не элегантное и не удобное для пользователя.



Соответствующий код:

private void processResult(List<String> results) {
        String res = results.get(0).toLowerCase();
        for (String single:
             results) {
            Log.d("HelloStackflow", single);
        }
        String[] repeatWords = new String[]{"korrigieren", "quatsch", "korrigiere" , "noch mal"};
        int roundScore;

        if (stringContainsItemFromList(res, repeatWords)) {
            startRecording();
            return;
        }

        String[] singles = res.split("und|&");

        if (singles.length > 3) {
            speak("Mehr als 3 Zahlen, Sorry.");
            return;
         }
        else if (singles.length < 3) {
            speak("Weniger als 3 Zahlen, Sorry");
            return;
        }

        throw1 = analyzeThrow(singles[0], score);
        throw2 = analyzeThrow(singles[1], score);
        throw3 = analyzeThrow(singles[2], score);

        Integer[] throwList = new Integer[]{throw1, throw2, throw3};
        for (int anyThrow:
                throwList) {
            if (anyThrow == -999)
                return;
        }

        roundScore = throw1 + throw2 + throw3;
        score = score-roundScore;
        scoreView.setText(String.valueOf(score));

        speak("Du hast "+ singles[0] + ", " + singles[1] + " und " + singles[2] + " geworfen.");
    }

    private int analyzeThrow(String s, int currentScore) {
        if (stringContainsItemFromList(s, new String[]{"nichts", "daneben"}))
            return 0;
        int cleanS = invalidThrowException(s);
        if (cleanS < 1 | cleanS > 60) {
            speak(s+" ist kein gültiger Wurf!");
            return -999;
        }
        if (stringContainsItemFromList(s, new String[]{"doppel", "double"}))
            return 2*cleanS;
        else if (stringContainsItemFromList(s, new String[]{"triple", "dreifach"}))
            return 3*cleanS;
        else
            return cleanS;
    }

    private int invalidThrowException(String s) {
        try {
            return Integer.parseInt(s.replaceAll("[^0-9]", ""));
        } catch (NumberFormatException e) {
            return -999;
        }
    }

    public static boolean stringContainsItemFromList(String inputStr, String[] items)
    {
        for (String item : items) {
            if (inputStr.contains(item)) {
                return true;
            }
        }
        return false;
    }

Так что я бы хотел, чтобы моя программа записывала «три пять двадцать пять», когда я это произнесу. Примеры того, что распознается:

Это сработало бы: «двойные три и семь и тройные двадцать»

2019-01-08 22:41:16.367 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: double 3 und 7 und Triple 20
2019-01-08 22:41:16.368 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: Double 3 und 7 und Triple 20
2019-01-08 22:41:16.368 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: double 3 und 7 und Triple XX
2019-01-08 22:41:16.368 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: Double 3 und 7 und Triple XX
2019-01-08 22:41:16.368 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: double 3 und 7 und Triple 20 Uhr

Для "три пять семь"

2019-01-08 22:38:10.540 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: 357
2019-01-08 22:38:10.540 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: 3.57
2019-01-08 22:38:10.540 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: 35.7
2019-01-08 22:38:10.540 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: 3-5-7
2019-01-08 22:38:10.540 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: 3.5.7

для «пять и двадцать четыре» (проблему с 25 см. Выше)

2019-01-08 22:39:16.583 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: 25 und 4
2019-01-08 22:39:16.583 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: 25 und vier
2019-01-08 22:39:16.583 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: fünfundzwanzig und vier
2019-01-08 22:39:16.583 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: fünfundzwanzig und 4
2019-01-08 22:39:16.583 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: 25 & 4

И, конечно же, один из них

2019-01-08 22:31:19.997 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: Triple 20 Triple 20 Triple 20
2019-01-08 22:31:19.997 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: Triple 20 Triple 20 Triple XX
2019-01-08 22:31:19.997 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: Triple XX Triple XX Triple XX
2019-01-08 22:31:19.997 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: Triple XX Triple 20 Triple 20
2019-01-08 22:31:19.997 26075-26075/com.classikonline.dartv2 D/HelloStackoverflow: Triple 20 Triple 20 Triple 20 Uhr



Спасибо всем большое заранее!

...