Подтвердить что ты не робот

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

Я использую 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, который также не работал.

4b9b3361

Ответ 1

Посмотрите на этот вопрос и ответ.

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

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

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

"speech_context": {
  "phrases":["eins", "zwei", "drei", ..., "elf", "zwölf" ... ]
 }

Ответ 2

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

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