Я использую Googles этот API: -
https://www.google.com/speech-api/v2/recognize?output=json&lang="+ language_code+"&key="Мой ключ"
для распознавания речи, и это работает очень хорошо.
Проблема заключается в числах, то есть, если я скажу 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 и будет искать, есть ли аналогичная последовательность в массиве результатов, а затем преобразовывать ее в слова. Во втором случае нет 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
, тоже не помогло.
speech_context
не работает? Если что-то и поможет достичь желаемого результата, так это контекст речи. - person blambert   schedule 27.03.2017