Existe uma maneira de forçar a API do Google Speech a retornar apenas palavras como resposta?
Estou usando o Google nesta API:
https://www.google.com/speech-api/v2/recognize?output=json&lang="+ language_code +" & key = "Minha chave"
para reconhecimento de fala e está funcionando muito bem.
O problema é com números, ou seja, se eu disserone two three four
o resultado será1234
e se eu disserone thousand two hundred thirty four
o resultado ainda é1234
.
Outra questão é que, em outros idiomas, ou seja, a palavraelf
em alemão éeleven
. Se você dizelf
o resultado é11
, em vez de elfo.
Eu sei que não temos controle sobre a API, mas existem parâmetros ou hacks que podemos adicionar a essa API para forçá-la a retornar apenas palavras.
A resposta algumas vezes tem o resultado correto, mas nem sempre.
Estas são respostas de amostra
1) Quando digo "um dois três quatro"
{"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) Quando digo "mil duzentos e trinta e quatro"
{"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}
O que eu fiz.
Verifique se o resultado é um número. Em seguida, divida cada número por espaço e verifique se há a mesma sequência na matriz de resultados. Neste exemplo, O resultado 1234 se torna 1 2 3 4 e pesquisará se há uma sequência semelhante na matriz de resultados e depois a converterá em palavras.
Este é o código.
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 + " ";
}
}
}
Portanto, a questão é quando eu "digo treze quatro oito oito" esse método dividirá 13 como um três e, portanto, não será uma solução confiável.
Atualizar
Tentei a nova API de visão em nuvem (https://cloud.google.com/speech/) e é um pouco melhor que o v2. O resultado paraone two three four
está nas próprias palavras para as quais minha solução alternativa também está funcionando. Mas quando eu digothirteen four eight
ainda é o mesmo resultado que na v2.
E também o elfo ainda tem 11 anos em alemão.
Também tenteispeech_context
isso também não funcionou.