Я использую Googles для этого api: -
https://www.google.com/speech-api/v2/recognize?output=json&lang= "+ language_code +" & key = "Мой ключ"
для распознавания речи, и он работает очень хорошо.
Проблема связана с числами i.e, если я скажу one two three four
, результат будет 1234
и если я скажу one thousand two hundred thirty four
, результат все равно 1234
.
Другая проблема заключается в том, что с другими языками, то есть слово elf
на немецком языке eleven
. Если вы скажете elf
, результат 11
, а не эльф.
Я знаю, что у нас нет контроля над api, но есть ли какие-либо параметры или хаки, которые мы можем добавить к этому api, чтобы заставить его возвращать только слова.
Ответ несколько раз имеет правильный результат, но не всегда.
Это примеры ответов
1) Когда я говорю "один два три четыре"
{"result":[{"alternative":[{"transcript":"1234","confidence":0.47215959},{"transcript":"1 2 3 4","confidence":0.25},{"transcript":"one two three four","confidence":0.25},{"transcript":"1 2 34","confidence":0.33333334},{"transcript":"1 to 34","confidence":1}],"final":true}],"result_index":0}
2) Когда я говорю "тысяча двести тридцать четыре"
{"result":[{"alternative":[{"transcript":"1234","confidence":0.94247383},{"transcript":"1.254","confidence":1},{"transcript":"1284","confidence":1},{"transcript":"1244","confidence":1},{"transcript":"1230 4","confidence":1}],"final":true}],"result_index":0}
Что я сделал.
Проверьте, является ли результат числом, затем разделите каждое число пробелом и проверьте, есть ли такая же последовательность в массиве результатов. В этом, например, Результат 1234 становится 1 2 3 4 и будет искать, если в массиве результатов есть аналогичная последовательность, а затем преобразовать его в слова. В 2-м случае нет 1 2 3 4, поэтому будет придерживаться исходного результата.
Это код.
String numberPattern = "[0-9]";
Pattern r1 = Pattern.compile(numberPattern);
Matcher m2 = r1.matcher(output);
if (m2.find()) {
char[] digits2 = output.toCharArray();
String digit = "";
for (char c: digits2) {
digit += c + " ";
}
for (int i = 1; i < jsonArray2.length(); i++) {
String value = jsonArray2.getJSONObject(i).getString("transcript");
if (digit.trim().equals(value.trim())) {
output = digit + " ";
}
}
}
Итак, проблема в том, что я говорю "тринадцать четыре восемь", этот метод разделит 13 на три и, следовательно, не будет надежным решением.
Обновление
Я попробовал новое облачное зрение api (https://cloud.google.com/speech/), и это немного лучше, чем v2. Результат для one two three four
есть в самих словах, для которых работает мой обход. Но когда я говорю thirteen four eight
, он остается тем же результатом, что и в v2.
А также эльф все еще 11 на немецком языке.
Также пробовал speech_context
, который также не работал.