Rozpoznawanie mowy - algorytmy powiązane

1

Ostatnio dłubie prze androidzie z rozpoznawaniem mowy. Korzystam z usługi rozpoznawania mowy od googla (dołączona do Androida), której jakość jest taka sobie.

Mam jakiś zestaw komend typu: "<komenda> <parametr>" gdzie <komenda> i <parametr> reprezentują kilka słów ze znanego zbioru.
Np: "otwórz plik cienista dolina" "usuń plik niebieskie niebo" itp
Usługa googla zwraca mi około pięciu możliwości o różnej jakości.
No i teraz problem. Jak efektywnie zmierzyć dopasowanie tego czego się z podziewam z tym co dostałem od usługi?
(niestety API androida nie dostarcza wyników pośrednich takich jak zapis fonetyczny tego co zostało rozpoznane).

Problem też jest taki, że dostępne komendy mają synonimy o różnej długości, więc stwierdzenie gdzie się kończy komenda a gdzie zaczyna parametr, nie jest trywialne.

Obecnie po prostu mierzę odległość Levensteina pomiędzy tym czego się spodziewam (generuje wszystkie spodziewane kombinacje), a to co uzyskałem i wyszukuję najbliższego dopasowania. Jeśli najmniejsza odległość Levensteina nie spełnia odpowiedniej relacji z długością spodziewanej komendy, to odrzucam wyniki jako niezadowalające.
Efekt nie jest zły, ale chciałbym to jeszcze poprawić. Czy znane są wam jakieś algorytmy, które lepiej się sprawdzą?
Inna metryka odległości? Na przykład taka, która pozwoli na detekcję prefiksów o rożnej długości.

A może znacie jakaś inną lepszą usługę rozpoznawania mowy, którą łatwo można wykorzystać na androidzie?

Liczę na jakiś feadback, który naprowadzi mnie na odpowiednie "tory".

0

Co dokładnie dostajesz od Androida? Mógłbyś podać jakiś przykład?

1

Np komenda typu: “switch to the song: All my love”
daje rezultaty (w kolejności prawdopodobieństwa):

  • switch to the phone call although my toe
  • sweet to the phone call although my toe
  • switch to the phone call although my toes
  • sweet to the phone call although my toes
  • sweet the phone call although my toe
    Te wyniki googla są dla mojego algorytmu nie do przyjęcia.
    Albo przy innej próbie:
  • sweet to the song all I know
  • sweetie to the song all I know
  • sweet to the phone co all I know
  • sweet to the phone cause all I know
  • sweet to the song all my toe (tą odpowiedź mój algorytm akceptuje)

Po polsku nie próbowałem, ale dyktując SMS-a błędy są w podobnym tonie, więc te kiepskie odpowiedzi nie wynikają z łamania przez mnie angielskiego.
Zresztą słowa "phone" i "song" brzmią zupełnie inaczej, więc nie rozumiem czemu google ma w tym miejscu takie kłopoty. Chętnie wykorzystam alternatywne usługi rozpoznawania mowy, które będą dawać lepsze wyniki (niekoniecznie w postaci końcowego tekstu, zapis fonetyczny byłby chyba lepszy/łatwiejszy do analizowania).

0

Przeglądałem trochę dokumentację (android.speach), jedyną szansę widzę w zmianie modelu języka (są chyba do wyboru dwa). Ogólnie to jak dostajesz już na wyjściu tekst, to niewiele możesz zrobić. Teoretycznie mógłbyś ominąć to gotowe API i opracować jakiś oddzielny model ograniczony tylko do słów przydatnych dla twojej aplikacji, ale już samo zebranie danych jest trudne i czasochłonne, nie mówiąc już o wiedzy i pracy potrzebnej do opracowania dobrego modelu.

0

Sposób na algorytmicznie usprawnienie tego jest taki, że można sobie powyliczać prawdopodobieństwa że słowo X występuje po słowie Y. Potem dla wszystkich sekwencji słów, wyplutych przez Androida liczysz prawdopodobieństwa wystąpienia takiej sekwencji i wybierasz tą z najwyższym prawdopodobieństwem.
Innymi słowy możesz użyć łańcuch Markova, dzięki czemu uwzględnisz kontekst, w jakim słowa występują. Oczywiście jest to dosyć problematyczne, chociażby skąd brać dane do wytrenowania modelu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1