Сообщество,
Я хочу написать код для приложения для Android, который позволяет Android SpeechRecognizer распознавать последовательность произносимых чисел как результаты дротиков (сообщаются в трех числах в быстрой последовательности). Основная проблема в том, что если вы говорите два числа в быстрой последовательности, Android записывает их вместе (например, «три четыре пятнадцать» -> «34 15». Хорошо, что Android записывает несколько возможных результатов, но, к сожалению, это не помогает для этой проблемы (см. примеры ниже).
Самый простой обходной путь был бы, если бы был какой-то способ заставить андроид записывать произнесенные цифры словами, а не цифрами.
Две основные вещи, которые я пробовал:
- Поиск по разным результатам, которые возвращает SpeechRecognizer, и анализ на предмет поиска наиболее подходящего.
- Разбить строку на определенное слово
Что касается (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
Спасибо всем большое заранее!