migracja MIDletu na Symbiana - proszę o sugestie :)

0

Witam :-)!

Rzecz jest w tym, że mam pewien program napisany na komórkę i chciałbym go przenieść na platformę Symbian.

Mam: MIDlet (CLDC) na komórkę, napisany przy użyciu Wireless Toolkit 2.5.2, który wysyła mały plik tekstowy (a dokładniej to zmienną string) przy użyciu metody POST httpconnection na Servlet, uruchomiony pod TomCatem, a napisany w Eclipse.

Chciałbym mieć: to samo, tylko na Symbiana :-). Przenieść bym chciał, ponieważ ten mały plik tekstowy jest tworzony w oparciu o interakcję telefonu z jego użytkownikiem, a chciałbym wykorzystać rozpoznawanie mowy PocketSphinx (C++) lub Sphinx4 (Java), co wymaga więcej, niż tylko CLDC/CDC, stąd też pomyślałem o Symbianie.

Pozdrawiam :-)!

0

wiekszosc nowych komorek otwiera jave (midlety), nie rozumiem w czym jest problem. wystarczy skompliowac do .jar, wyslac na kome i zainstalowac....

0

Dzięki za odpowiedź :)

Właśnie rzecz jest w tym, że musiał bym w jakiś sposób umożliwić komunikację dwóch programów - mojego MIDletu w Javie i PocketSphinksa w C++. Np. MIDlet uruchamiał by PocketSphinksa, następnie PocketSphinx przeprowadzał rozmowę z użytkownikiem i tworzył plik, który następnie byłby przesyłany z PocketSphinksa do MIDletu, PocketSphinx byłby zamykany i dalej kontunuowane by było wykonanie MIDletu, który właśnie wysłał by ten plik na serwer.

Innymi słowy - w jaki sposób umożliwić MIDletowi w Javie wywołanie programu napisanego w C++?

Dla jasności jeszcze przedstawię to w formie schematu:

  1. Symbian (OS) -> uruchamia -> MIDlet (Java)
  2. MIDlet (Java) -> wywołuje -> PocketSphinx (C++)
  3. PocketSphinx (C++) przeprowadza rozmowę z użytkownikiem
  4. PocketSphinx (C++) -> przesyła plik -> MIDlet (Java)
  5. MIDlet (Java) -> kończy działanie i wraca do -> Symbian (OS)

Pozdrawiam :)!

0

rozumiem ze ten program c++ jest uruchamiany na pc.

musi byc komunikacja miedzy programami, socket w j2me wysyla dane do pc przez internet http://www.java-samples.com/showtutorial.php?tutorialid=738,
nastepnie (program musi byc odpalony na pc nonstop) po odebraniu informacji w np. winsock`u http://www.google.pl/search?q=winsock&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pl:official&client=firefox-a bedzie cos takiego:
1.nasluchuj;
2.jezeli (przyslane dane = wlacz PocketSphinx)
to wlacz program PocketSphinx >>> http://www.dreamincode.net/forums/showtopic18057.htm

i nie wiem co to ten PocketSphinx ;/ wiec nie wiem jak ma sie komunikowac z midletam, ale jezeli to twoj program to uzyj winsock (albo jakiejs innej biblioteki) ....

0

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:

  1. 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 :-)?
  2. 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ć :-).
  3. 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ć?
  4. W jaki sposób mam wpływ na to, która z technologii zostanie wybrana: GSM/GPRS/EDGE/UMTS? Czy wykorzystują one TCP/IP?
  5. 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?
  6. 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 :-)?
  7. 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:

  1. uruchamiany na telefonie komórkowym jako PocketSphinx napisane w Javie
  2. 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:

  1. u siebie na kompie
  2. 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:

  1. serwer odbiera mowę na Winsocku
  2. Winsock przekierowuje tą mowę do programu Sphinx4
  3. Sphinx4 analizuje tą mowę
  4. 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?).
  5. 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.
  6. 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):
  7. httpconnection z MIDletu
  8. 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:
  9. 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.
  10. 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:

  1. 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 :))
  2. 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:

  1. 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.
  2. 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 :-)!

0

1.Watpie, ale popytac na forach producentow nie szkodzi.
2. daruj sobie PS`a, malo zrodel/tutoriali/slaba dokumentacja/ odpychajaca strona domowa.
http://java.sun.com/products/java-media/speech/, nie wiem jak to dziala ale zawsze jest zrobione przez pro.
4.os fona sie tym zajmie.tak.
5.wystarczy kara sim
http://www.heyah.pl/heyah-mix_mobilny-internet.
ta 2 czesc pytania jest troche nie trafiona. tak jak masz polaczenie ADSL to masz dostep do neta i czyli do wszystkich protokolow jakie dziaja "na terenie" internetu. to samo z 3g, ktore laczy cie z internetem....
6. jak mikromiekki cos robi to jest to zazwyczaj nieprzenosne....
7.Pewnie ze nokia, maja spore, bardzo pomocne forum i dobra dokumentacje. Akurat sprzedaje kome :
http://upload.allegro.pl/show_item.php?item=758997034, obsloguje wszystko xD.
8.nie masz google xD?
http://www.gamedev.pl/articles.php?x=view&id=274
http://www.win32developer.com/tutorial.shtm
9. Z czy się je te "przekierowaniami portów na routerze"??
10. mnie tam wystarcza dostep do google.pl jak czegos nie wiem.

widzisz, najlepiej wszystko byloby zrobic z poziomu telefonu, chyba ze konecznie musisz miec to co sie powiedzialo na serwie. generalnie powinienes rozpoznawac mowe na fonie i slowa w postaci stringa wyslac na serwer. (bo dzwiek za duzo wazy).

zamiast winsock`a masz np.
http://coding.debuntu.org/c-linux-socket-programming-tcp-simple-http-client
albo wxWidgets albo Qt (dla zastosowan niekomercyjnych).

Generalnie masz bardzo ambitny projekt. Zrob mozne na poczatek kolko i krzyzyk przez intenet z uzyciem j2me na komie i serwerze ktory przekazuje dane xD.

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 :).

Hehe j2me bawilem sie jak kupilem n96 pol roku temu, mialem przez pare tyg zabawe (ale j2me jest zbyt ograniczone ;/ ) , natomiast od zawsze (2 lat) rozkminialem c++/winsock/winapi/directx/opengl tak dla zabawy. I tez jestem na 3 roku, tyle ze liceum hehe.

0

Dzięki wielkie za Twoją odpowiedź :-)!

Trochę już nad tym siedzę i prace dość powoli poruszają się do przodu. Najlepiej jest rzeczywiście zrobić rozpoznawanie mowy z poziomu telefonu. Co do tego rozpoznawania to widzę dwie opcje:

  1. JSAPI - przeczytałem cały jsapi guide i w sumie to dałoby się napisać MIDleta, który rozpoznaje mowę przy pomocy jsapi, a potem wysyła plik dzięki httpconnection POST na Tomcata. Problem jest taki, że nie bardzo wiem, jak rozpoznawać w jsapi mowę polską. Z tego, co wiem, to jest angielski, niemiecki, japoński itd. No a np. w CMU Sphinx jest SphinxTrain do trenowania modeli akustycznych, więc mógłbym tam wytrenować mowę polską. Nie wiem, jak coś takiego zrobić w samym jsapi.

  2. PocketSphinx - niestety, jest on w języku C, zaś MIDlet mam w Javie. Musiałbym od nowa się nauczyć pisania aplikacji na komórkę, tym razem zamiast MIDlet to np. programowanie w C/C++ pod Symbiana. Czyli albo właśnie połączyć Java MIDlet i C PocketSphinx, albo to pierwsze też przenieść na C++ i wtedy jest główna aplikacja C++ oraz PocketSphinx w C.

Co byś zasugerował :-)?

Pozdrawiam!

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