Есть ли способ заставить API Google Speech возвращать в ответ только слова?

Я использую 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, тоже не помогло.


person sunil sunny    schedule 14.03.2017    source источник
comment
Почему speech_context не работает? Если что-то и поможет достичь желаемого результата, так это контекст речи.   -  person blambert    schedule 27.03.2017


Ответы (2)


Взгляните на этот вопрос и ответ.

Вы можете давать подсказки API «речевого контекста», например:

"speech_context": {
  "phrases":["zero", "one", "two", ... "nine", "ten", "eleven", ... "twenty", "thirty,..., "ninety"]
 }

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

"speech_context": {
  "phrases":["eins", "zwei", "drei", ..., "elf", "zwölf" ... ]
 }
person blambert    schedule 15.03.2017
comment
Я не использую облачный речевой API, а речевой API v2 не имеет этого параметра, но все же я могу переключиться на облачный API. Однако это непрактично, я не могу дать все эти числа в качестве подсказок. Пользователь может назвать любые числа. Также в моем приложении есть еще 20 языков. - person sunil sunny; 16.03.2017
comment
О, я не заметил, что вы используете v2. Не уверен, что это поможет, но вам не нужно указывать все числа, только уникальные слова. Вам не нужно будет проходить двадцать один, потому что у вас уже будет двадцать и один отдельно. Это будет держать количество фраз ниже 50, и вы можете отправить до 500 фраз. - person blambert; 16.03.2017

Возможно, вам придется самостоятельно преобразовывать числа (не цифры) в слова. Поскольку в большинстве языков (например, в английском, немецком) есть некоторая логика, вы можете сделать это с помощью алгоритмического подхода.

См. Как преобразовать число в слова в java

person Christoph Bimminger    schedule 25.03.2017
comment
У меня нет проблем с преобразованием чисел в слова. Единственная проблема, с которой я сталкиваюсь, заключается в том, что я не могу различить «1», «2», «3», «4» и 1234, поскольку в обоих случаях результат Google равен 1234, поэтому результат будет преобразован в «одна тысяча двести тридцать четыре». . - person sunil sunny; 26.03.2017