2017-03-14 11 views
17

używam gogli tego API: -Czy istnieje sposób zmuszenia api Google Speech do zwracania tylko słów jako odpowiedzi?

https://www.google.com/speech-api/v2/recognize?output=json&lang= "+ kod_języka +" & key = "Mój przycisk"

dla rozpoznawania mowy i to działa bardzo dobrze.

Problem jest z numerami I.E, jeśli powiem one two three four wynik będzie 1234 i jeśli powiem one thousand two hundred thirty four wynik jest nadal 1234.

Inną kwestią jest to, że w przypadku innych języków, tj. W języku niemieckim oznaczenie elf jest eleven. Jeśli powiesz, że elf, wynikiem jest 11, zamiast elfa.

Wiem, że nie mamy kontroli nad interfejsem API, ale czy są jakieś parametry lub hacki, które możemy dodać do tego API, aby zmusić go do zwracania tylko słów.

Czasami odpowiedź ma poprawny wynik, ale nie zawsze.

Są to przykładowe reakcje

1) Kiedy mówię "jeden dwa trzy cztery"

{"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) Kiedy mówię "jeden tysiąc dwieście trzydzieści cztery"

{"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} 

Co zrobiłem.

Sprawdź, czy wynik jest liczbą, a następnie podziel każdą liczbę przez spację i sprawdź, czy w tablicy wyników jest taka sama sekwencja. W tym na przykład Wynik 1234 staje się 1 2 3 4 i wyszukuje, jeśli istnieje podobna sekwencja w tablicy wyników, a następnie przekształca ją w słowa. W drugim przypadku nie ma wartości 1 2 3 4, więc pozostanie przy oryginalnym wyniku.

To jest kod.

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 + " "; 
      } 
     } 
    } 

Więc problem jest kiedy „say 1304 osiem” metoda ta będzie podzielona 13 jako jeden trzy i stąd nie niezawodnym rozwiązaniem.

Aktualizacja

Próbowałem nowe API chmura Vision (https://cloud.google.com/speech/) i jest trochę lepiej niż v2. Wynik dla one two three four jest w samych słowach, dla których również działa moje obejście. Ale kiedy mówię: thirteen four eight, wciąż jest taki sam, jak w v2.

A także elf nadal ma 11 w języku niemieckim.

Również wypróbowany speech_context, który również nie zadziałał.

+0

w jaki sposób jest 'nie speech_context' działa? Jeśli cokolwiek pomoże ci osiągnąć pożądany rezultat, jest to kontekst mowy. – blambert

Odpowiedz

2

Spójrz na to question and answer.

można dać API „kontekst Mowa” podpowiedzi, jak to:

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

sobie wyobrazić, to może pracować w innych językach też, jak niemieckim.

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

Nie korzystam z api mowy w mowie w chmurze i api v2 w mowie nie ma tego parametru, ale mimo to jestem w stanie przejść na api w chmurze. Jednak nie jest to praktyczne, nie mogę podać wszystkich tych liczb jako wskazówek. Użytkownik może powiedzieć dowolne liczby. Ponadto w mojej aplikacji jest jeszcze 20 języków. –

+0

Och, nie zauważyłem, że używasz v2. Nie wiem, czy to pomaga, ale nie musisz podawać * wszystkich * liczb, tylko unikalnych * słów *. Nie musiałbyś podawać "dwadzieścia jeden", ponieważ masz już "dwadzieścia" i "jeden" osobno. Dzięki temu liczba zwrotów będzie poniżej 50, a Ty możesz wysłać do 500 fraz. – blambert

0

Konieczna może być samodzielna zamiana cyfr (bez cyfr) na słowa. Ponieważ istnieje pewna logika w większości języków (na przykład angielski, niemiecki), można to zrobić za pomocą podejścia algorytmicznego.

Zobacz How to convert number to words in java

+0

Nie mam problemów z konwersją liczb na słowa. Jedyny problem, jaki mam, to nie mogę rozróżnić między "1" "2" "3" 4 "a 1234, ponieważ w obu przypadkach wynik z google wynosi 1234, stąd wynik zostanie zamieniony na" tysiąc dwieście trzydzieści cztery " . –

Powiązane problemy