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ł.
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