Dzięki wielkie za Twoją odpowiedź :-), jest mi ona niezmiernie pomocna. Jakbyś nie miał ochoty lub czasu czytać wszystkiego, co napisałem, to na początku postu, powyżej linii, znajduje się podsumowanie :-).
Generalnie to najlepszą opcją na dzień dzisiejszy wydaje mi się stworzenie MIDletu na komórkę z Symbianem oraz PocketSphinksem :-).
Nie wiem:
- Czy jest możliwe, żeby zamiast z PocketSphinksa korzystać w jakiś sposób w swojej aplikacji z zaimplementowanego już na telefonach "voice dialing", które jest właśnie takim rozpoznawamiem mowy :-)?
- Jak miałby program (czyli MIDlet lub aplikacja na serwerze) przekierować mowę z telefonu do Sphinksa (PocketSphniksa lub Sphinksa4)? Aplikacją na serwerze byłby Socket (którą implementację wybrać -> http://pl.wikipedia.org/wiki/Winsock#Inne_implementacje ?). Niemniej lepiej, żeby to MIDlet na komórce z Symbianem wysyłał mowę z komórki do Sphinksa. Pozostaje pytanie jak to zrobić :-).
- Czy to MIDlet zajmowałby się analizowaniem ścieżki algorytmu, w którym akutalnie znajduje się proces rozmowy użytkownika z aplikacją? Myślałem, że jakoś tu można wykorzystać np. VoiceXML. (Swoją drogą to oprócz Sphinksa będę musiał przeczytać jeszcze o JSAPI). A gdyby nie MIDlet, tylko aplikacja na serwer, to w czym ją napisać?
- W jaki sposób mam wpływ na to, która z technologii zostanie wybrana: GSM/GPRS/EDGE/UMTS? Czy wykorzystują one TCP/IP?
- Jakie usługi musiałbym wykupić, związane z dostępem telefonu do 2G/2.5G/3G lub internetu? GSM to jest standard, a TCP/IP protokół. W jaki sposób łączą się standardy z protokołami?
- Czy rzeczywiście potrzebuję się uczyć VB.NET, żeby przekazać mowę do PocketSphinksa? Zwłaszcza, że nie wiem, czy VB.NET dałoby się odpalić na komórce. Jak cos, to musiałbym zrobić to, co jest w tym tutorialu, ale przy pomocy Wireless Toolkit 2.5.2, a nie VB.NET. Pytanie: jak :-)?
- Której firmy telefon wybrać: SPV, Sony (np. Ericsson), Nokia, Siemens, Motorola?
Muszę (a w związku z tym trzeba, żebym znalazł dobre materiały na ten temat):
8. Przeczytać dokumentację PocketSphinksa, potem może o MIDletach (co dokładniej?). Czy mógłbyś mi podać jakieś dobre źródła wiedzy o Winsocku :-)?
9. Dowiedzieć się, jakie programy i porty działają na serwerze (który nie jest moim kompem) - wymaga to przeczytania dokumentacji Apache'a, KeyFocus Web Servera oraz IIS-a, czyli sporo roboty :-). Czy interesować się też powinienem przekierowaniami portów na routerze?
10. Przeczytać coś więcej o Winsocku (do obsługi TCP/IP co jest jeszcze potrzebne?).
11. Przeczytać o Sphinx4, również przykłady przeanalizować, ponadto zrobić przy pomocy programu Train w projekcie CMU Sphinx odpowiednią bazę dźwięków dla j. polskiego.
gall napisał(a)
rozumiem ze ten program c++ jest uruchamiany na pc.
No tak. Jeden program, w MIDlecie, czyli Java, jest uruchamiany na telefonie komórkowym, być może z Symbianem. Natomiast drugi program, w zależności od tego, czy uda mi się to zrobić, będzie albo:
- uruchamiany na telefonie komórkowym jako PocketSphinx napisane w Javie
- uruchamiany na serwerze (komputerze PC) jako w Sphinx4
Czyli wolałbym, żeby był ten program odpalany na komórce (1), ale jeśli się nie uda, to niech będzie odpalany na serwerze (2). Niestety, jest ograniczenie ceny telefonu do 700zł, więc nie wiem, czy komórka sprzętowo podoła rozpoznawaniu mowy PocketSphinx. Jak również, w jaki sposób połączyć PocketSphinx z MIDletem, ale o tym poczytam jeszcze - zacznę od dokumentacji PocketSphinksa, potem może rozszerzę swoją wiedzę z MIDletów.
gall napisał(a)
http://www.java-samples.com/showtutorial.php?tutorialid=738
Wygląda na to, że jeśli uruchomienie PocketSphinksa na komórce nie wypali, ten powyższy link jest kluczem do połączenia głosowego komórki z serwerem :-).
I jeden niezadowolony użytkownik powyższego tutorialu, że nikt go nie poinformował o potrzebnych include'ach :-). Chociaż jak go akuratnie rozumiem :).
Co do zaś numerów portów to będe to testował na dwa sposoby:
- u siebie na kompie
- na serwerze, na którym działają już IIS, Apache, KeyFocus Web Server, PHP, MySQL i jeszcze parę innych rzeczy. Zamiast trzech pierwszych wystarczyłby tylko jeden z nich. W związku z tym, skoro razem działają te trzy programy serwerowe, to muszą zajmować one odpowiednie porty. W związku z tym jest ustawione różne przekierowywanie portów na routerze Pirelli, do którego jest podpięty serwer. Musiałbym więc dokładnie przeanalizować konfigurację tych trzech serwerów pod kątem używania różnych portów, a najpierw czy są w ogóle włączone. Również dobrze by było zrozumieć dokładnie, jak administrator tej sieci przekierowywał porty na routerze.
Sporo osób pod tym linkiem prosi też o gotowy MIDlet, który wykorzystuje te fragmenty kodu :-). Widać nie chciało im się więcej szukać, a potrzebowali takiego rozwiązania :-P.
gall napisał(a)
program musi byc odpalony na pc nonstop
To raczej nie jest problem. Komputer będzie odpalony cały czas w miejscu, gdzie będzie zastosowany ten program, który piszę. Wyłącza się go tylko poza godzinami pracy, więc jedyne co mi pozostaje to wszystko poustawiać tak, żeby się uruchamiało z autostartu. Chyba, że zastosowałbym przesyłanie danych na jakiś zewnętrzny serwer, ale to chyba niezbyt dobra opcja.
gall napisał(a)
po odebraniu informacji w np. winsock`u
Bardzo możliwe, że nie słyszałem o WinSocku, bo mam trochę awersję do programów pisanych przez Microsoft. No ale teraz przeczytałem - swoją drogą Wikipedia jest dobra, opisuje również dlaczego ta specyfikacja nosi taką nazwę, a nie inną :-). Zwłaszcza, że ta historia znowu pokazuje przewagę systemów operacyjnych open-source'owych nad microsoftowymi. Pod linuksem od razu rozwijałyby się niezależne od siebie projekty, implementujące potrzebne funkcje sieciowe. W Microsofcie zrobili to dopiero, gdy było już dawno potrzebne i wiele razy implementowane w sposób niekompatybilny z innymi wersjami.
Ja niestety muszę użyć Windowsa, bo w miejscu, w którym serwer ma się znajdować bardzo możliwe, że będzie już istniała stacja robocza, którą będzie trzeba wykorzystać jednoczesnie jako serwer, a nie tylko hosta.
Skoro samo posiadanie biblioteki winsock.dll nie wystarcza do obsługi TCP/IP to co w takim razie jest jeszcze potrzebne?
Winsock to generalnie zapewnienie obsługi TCP/IP dla aplikacji Windowsowych. Tak właściwie to socket to odpowiedź na moje pytanie, jak ustanowić dwukierunkowe połączenie głosowe na serwerze. Czyli na serwerze musiałbym zainstalować, oprócz Sphinx4, również Winsock. Czy Winsock może się komunikować ze Sphinx4 (czyli dokładniej - czy Winsock może wysłać odebraną z telefonu komórkowego mowę jako input do Sphinx4?)? I podobne pytanie co do outputu, czy Winsock może odebrać mowę z syntezatora mowy, połączonego z programem implementującym algorytm, w jaki użytkownik z telefonem rozmawia z serwerem?
Innymi słowy proces na serwerze wygląda tak:
- serwer odbiera mowę na Winsocku
- Winsock przekierowuje tą mowę do programu Sphinx4
- Sphinx4 analizuje tą mowę
- Wyniki jego analizy są przekazywane do programu zajmującego się komunikacją z użytkownikiem. No a to oznacza program, który w odpowiednim momencie jego wykonania otrzymuje odpowiedź od Sphinksa4 - jakie słowo z dostępnej puli słów zostało wypowiedziane? Przy pomocy if-ów i switche-ów program (w jakim języku go napisać? myślę o C++, skoro to komputer klasy PC - chyba, że lepiej np. w Visual Basicu, skoro używam Microsoftowego Winsocka, to może lepiej korzystać również z innych rozwiązań Microsoftu? Choć Sphinx4 już nie jest Microsoftowy - może więc i rozpoznawanie mowy lepiej użyć windowsowe?).
- Program analizujący przychodzącą mowę wysyła informację do syntezatora mowy (-> punkt 5a) albo bezpośrednio do Winsocka (-> punkt 6).
5a. Syntezator mowy wypowiada zdanie i przekazuje je do Winsocka.
- Winsock dalej wysyła i odbiera dane głosowe do/z Winsocka, dopóki użytkownik nie wyłączy programu
Z opisu gniazda na Wikipedii wnioskuję, że wszystko się opiera o zwykłe przekazywanie danych na odpowiedni port przy użyciu protokołów TCP/IP. Innymi słowy musiałbym używać (2) zamiast (1):
- httpconnection z MIDletu
- połączenie głosowe TCP/IP, odbierane przez Winsock na serwerze, ale przez co wysyłane dokładniej na komórce?
Najpierw będę testował aplikacje na swoim komputerze, który ma dynamiczny adres IP, później będę próbwał na serwerze z adresem IP statycznym.
Podsumowując, sugerujesz, żebym przesyłał mowę przez protokół TCP/IP zamiast httpconnection, przy użyciu Winsocka na serwerze do odbioru, ale:
- czego na komórce do wysłania? Chyba najlepiej MIDlet uruchamiany na komórce z Symbianem. Jednak w takiej sytuacji, jak taki MIDlet na komórce może przekierować to, co ktoś mówi do komórki z inputu komórki do tej części MIDletu, która odpowiada za wysyłanie w czasie rzeczywistym tej mowy na serwer, czyli tej części MIDletu, która działa jako socket.
- której technologii do przesłania z komórki na serwer? GPS/GPRS/EDGE/UMTS? Zrozumiałem, że ode mnie to nie jest zależne, tylko raczej od dostarczyciela dostępu do internetu na komórce. No a to, jak zgaduję, zależy od wykupionej wersji dostępu do internetu od operatora, u którego się ma kartę do telefonu, czy dobrze się domyślam?
gall napisał(a)
1.nasluchuj;
2.jezeli (przyslane dane = wlacz PocketSphinx)
Podsumujmy serwer:
input -> przesłana z MIDletu, który jest Socketem, przy pomocy GSM/GPRS/EDGE/UMTS (czyli protokół TCP/IP i abonament na dostęp do internetu u jednej z popularnych na rynku firm, jak np. Orange) mowa
program, który przyjmuje input przychodzący do serwera -> Winsock
Winsock -> sprawdza, czy przychodzący dźwięk to szumy czy może to być mowa (czy Winsock potrafi coś takiego obsłużyć?)
Winsock -> jeśli jest to mowa, to przekazuje ją jako input do Sphinksa4
Sphinx4 -> co jakiś czas wypluwa fragment tekstu, który jest inputem mojej aplikacji napisanej w Visual Studio C++ lub Microsoft Visual Basic, może w Delphi Borland
moja aplikacja -> podejmuje decyzje co do tego, co syntezator mowy ma powiedzieć lub którą mp3 wybrać
moja aplikacja -> wysyła dźwięk do Winsocketa
Winsocket -> wysyła odpowiedź dźwiękową z serwera do komórki :-)
gall napisał(a)
to wlacz program PocketSphinx >>> http://www.dreamincode.net/forums/showtopic18057.htm
Czyli to jest sposób, w jaki Winsock ma uruchomić Sphinksa4 :-). Chyba nie do końca, bo:
- Mowę wysyła nie aplikacja napisana w C, tylko Winsock. Musiał bym się też zdecydować na konkretną implementację Winsocka (raczej jedną z tych wyliczonych na polskiej Wikipedii (-> http://pl.wikipedia.org/wiki/Winsock#Inne_implementacje ; znów jakoś nie jestem przekonany do implementacji Microsoftu :))
- Sphinx4 być może inaczej przyjmuje input w postaci mowy do rozpoznawania w czasie rzeczywistym
Znaczy to też, że muszę się raczej zdać na VB.NET, a nie żadnego Borlanda czy Visual Studio C++. Czyli pozostaje nauka środowiska dot net :-).
Sporo z terminów przedstawionych w temacie z tego linku jest dla mnie niestety nie znanych :-). Czy zasugerowałbyś jakieś źródło, z którego mógłbym się czegoś nauczyć pod kątem tych technologii?
gall napisał(a)
i nie wiem co to ten PocketSphinx ;/
Najtrudniejszą kwestią w całym tym projekcie jest tak naprawde rozpoznawanie mowy :-). Generalnie to myślałem o dwóch opcjach:
- skorzystać z gotowych metod na rozpoznawanie mowy, zaimplementowanych przez producentów telefonów komórkowych. Zdaje mi się, że coś takiego jednak możliwe nie jest. Trochę korespondowałem z pomocą techniczną Nokii i proponowali mi różne modele komórek - np. takie, które spełniają większość (a być może nawet wszystkie) wymagania PocketSphinksa (-> http://cmusphinx.sourceforge.net/sphinx4/doc/Sphinx4-faq.html#j2me). Zamierzem teraz popytać się trochę na forach poświęconych modelom takim, jak SPV, Sony Ericsson, Sony, Nokia, Siemens, Motorola. Wątpię, żeby producenci telefonów komórkowych umożliwiali komunikowanie się programisty z ich implementacjami rozpoznawania mowy. No a takie rozpoznawanie mowy jest, skoro komórki umożliwiają np. voice dialing. No a właściwie rozpoznawanie mowy to dla mnie tylko cyfry i kilka słów sterujących.
- wykorzystać open-source'owy projekt do rozpoznawania mowy na komórce albo na serwerze, jeśli komórka będzie za słaba. Oprócz PocketSphinksa, z open-source'owych projektów jest jeszcze Julius, ale sprawiał wrażenie gorszego.
gall napisał(a)
jak ma sie komunikowac z midletam, ale jezeli to twoj program to uzyj winsock (albo jakiejs innej biblioteki) ....
Czyli jednak opcja bardziej preferowana, to znaczy komórka (z Symbianem?) na niej MIDlet i PocketSphinx :-). Musiałbym trochę lepiej się dowiedzieć, jak się programuje na komórki z Symbianem :). No a oprócz tego dalej zgłębianie wiedzy o MIDletach :-). Plus jeszcze dokumentacja i przede wszystkim przykłady z plików do pobrania w paczce z PocketSphinksem :-).
Podsumowując kwestię to pozostaje się zdecydować, którą implementację (-> http://pl.wikipedia.org/wiki/Winsock#Inne_implementacje) Winsock wybrać. Jakie mogły by być inne biblioteki :-)?
By the way, długo siedzisz w tych technolgiach? Chyba od początku, jak spróbowałem się zająć tym projektem, nie dostałem jeszcze tak wyczerpującej i kompetentnej odpowiedzi, jak od Ciebie :-). Ogólnie to jest mój pierwszy projekt w branży IT, teraz zaczynam trzeci rok studiów w Gliwicach :).
Niby jest jeszcze jedna technologiczna kwestia, którą w międzyczasie próbuję zgłębić :-). Temat do niej znajduje się tutaj: http://forums.about.com/n/pfx/forum.aspx?msg=5224.2&nav=messages&webtag=ab-compnetwork :-).
Pozdrawiam :-)!