Beszédfelismerő program mozgáskorlátozottaknak

 ( Sicambria | 2010. október 21., csütörtök - 23:49 )

Sziasztok!

Egy egyszerű, kötött szavas beszédfelismerő programot fejlesztek egy mozgásképtelen embernek, akinek nagyban megkönnyítené az életét, ha tudna telefonálni és vezérelni néhány dolgot a lakásában (ZigBee hálózatba kapcsolt mikrokontrolleres beavatkozókkal: TV, ágy, vészhívó). Nem tudom mennyire tudjátok elképzelni azt, hogy semmire se vagytok képesek egyedül.

Először is azt szeretném kérdezni tőletek, hogy használtok-e/ismertek-e valamilyen beszédfelismerő programot PC-n, amit a felhasználó egyszerűen betaníthat 5-20 tetszőleges (magyar) szóra/parancsra. Az elsődleges platform Windows és C#, API/SDK előny lenne. Tehát olyan alkalmazás kellene, hogy kimondasz egy szót és egy háttérben futó program meghív egy megfelelő metódust/programot/akármit.

A nagy megbízhatóság (és a kis erőforrás-igény) lenne a cél, de jelenleg ez még nem teljesül. A legnagyobb problémát a szavak elejének detektálása jelenti, ha valakinek van ötlete, hogyan lehetne a mikrofon bemenetet valami körpuffer-szerű szerkezetben vizsgálni (néhány másodpercet tárolni, majd kiírni a lemezre, ha elhangzik egy szó /200 ms-nál hosszabb jel/), azt nagyon megköszönném, kész kódért a hálám minimum egy rekesz sör :)

A teljes kód GPL-es, a hétvégén felrakom az eddig elkészült forráskódokat a projektoldalra, a dokumentációt még meg kell írnom hozzá. Nem tudom érdemes-e verziókezelőt használni, itt van GIT, de még nem használtam.

http://bettercodes.org/projects/recognition-made-simple

Fejlesztői verzió 2010-10-24:
http://nikportal.cickany.hu/view/index.php?dir=GW%20Software/RMS/Turan%20engine/

sicambria@users.sourceforge.net

Köszönettel:
Incze Gáspár
ÓE-NIK

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Egy Google link itt nem sokat segít.
(Emberi) nyelvfüggetlen, kis erőforrás-igényű megoldásra lenne szükség. Ráadásul ha megvannak az algoritmusok, akkor Linuxra is ki lehetne adni egy füst alatt.

De, segíthet az a linkelt Google keresés...Azt írtad, hogy Windows alapon dolgozol a megoldáson.
A találatokban szerepel a Windows Speech Recognition, ez kombinálható batch-szerű kontrollal is.
Hogy nincs hozzá magyar fonéma-felismerő készlet?
Francia viszont van, és a francia nyelv fonémáival szinte hibátlanul leírható minden magyar szó,
csak új -a francia nyelvben természetesen nem létező- szavakat-kifejezéseket kell rá definiálni, megfelelő "helyesírással".
-
"Attempting to crack SpeedLock can damage your sanity"

Érdekes megközelítés a francia fonémák használata :)
Nagyobb probléma, hogy azon a gépen nem futna a Win7.

Javallom, hogy hasznalj vmi parancsszot, ami az utasitas kezdetet jeloli, ekkor csak egy mintara kell figyelni a buffert.

Pl.: 'Computer! Make a coffee!'

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

A probléma az, hogy a felvevő nem reagál elég gyorsan, ráadásul ez az időtartam nem is állandó. Ha azt mondom "Számítógép", akkor lehet hogy a hangfájlban "ámítógép" vagy "mítógép" lesz, de néha még az eleje is belekerül. Az eltérő környezeti zajok miatt a működés kiszámíthatatlan. Talán járható az az út, hogy az aktiváló szó utáni szünetet, illetve a 2. szó jelfelfutását már jobb eséllyel lehet felismerni.

Mindenkeppen erdemes magat az aktivalo szot is figyelni, mert lehet, hogy valaki a gep mellett pont hasonlo szunetet tart a beszed elejen - akarmilyen okbbol -, es nem jo dolog, ha a gep elkezd onmagatol dolgozni.
Nem hiszem, hogy ne lehetne egy szo rogzitesenek veges szamu lehetoseget belekalkulalni a dologba. Ha csak sima TTS-STT lenne, meg akkor is megteheto lenne, sztem.

Amivel meg lehet jatszani, az a hangero.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.

A felismerési algoritmusok valószínűséggel számolnak, nehéz meghatározni az abszolút küszöböt egy igen/nem típusú válaszhoz (az aktiváló szó hangzott-e el vagy nem). Ha több mintát veszünk fel az segíthet, cserébe lassul a rendszer.

Hát, Macen ez alap, de úgy melékszem Windows alatt is van ilyen funkció (bár lehet, hogy kivették, mert nem volt tökéletes). A Maces sem 100%-os, csak angol morfémákat ért, ellenben baromi könnyű konfigurálni: adott mappába berakod a scripteket valamilyen néven, és ha azt mondod, hogy "kompjúter, (script neve)", akkor végrehajtja.

Helló!

Pár link, amit talán érdemes lenne átnézni:
- http://www.microsoft.com/speech/
- http://www.microsoft.com/windowsxp/using/setup/expert/moskowitz_02september23.mspx
- http://www.microsoft.com/enable/products/windowsvista/speech.aspx
- http://support.microsoft.com/kb/306901
- http://www.instructables.com/id/Use-Spells-to-Control-Your-Computer!/
- http://www.softpedia.com/get/Multimedia/Audio/Other-AUDIO-Tools/VR-Commander.shtml

Ha 0-ról kéne írni, én valami olyasmit tudnék elképzelni, ahogyan a zeneszerkesztő alkalmazásokban működik a "slicer"(~szeletelő). Ennek a lényege, hogy észleli, ha változás van a hangban, pl. egy dobmintát fel tud szeletelni a leütött részek alapján. Ahol hirtelen megnő az amplitúdó, majd hirtelen csökken, ott lenne egy adott "parancs", amit már össze lehetne hasonlítani az előre felvettekkel. Ezt persze real-time-ban véghezvinni gondolom nem egyszerű móka.

real-time-ban inkább egy spektrumképet lenne érdemes tárolni, s azt összehasonlítani a jelenlegivel, s ha tűréshatáron belüli egyezés van, akkor indít. A spektrumot meg lehet valós időben is mérni.

Lehet mérni a spektrumot, illetve ezt még MFCC vektorokká alakítom. Az eltárolt mintákat dinamikus idővetemítéssel hasonlítom össze. Egy neurális hálót is jó lenne kipróbálni, lehet jobban beválna.

VR Commander: lefagy indításkor, talán xp-n hajlandó elindulni
VAC: SAPI failed to initialize (a SAPI 5.1 fent van a gépen)

Lehet, hogy hülye ötlet, de esetleg úgy megoldani, hogy 3*3 másodperces mintákat tárol, nézi a mintákat, keres benne megadott spektrum mintát, nézi az első kettő, és az utolsó kettőben együtt a keresett függvényt, eldobja az utolsót, és veszi a következőt?

Milyen módszerrel és hogyan keresnél mintát? Egy parancs egyébként tipikusan 800-1500 ms hosszú.

Huhh... Én utoljára pascalban programoztam amolyan "pató pál szoftver - szakadt csöves" stílusú dolgokat, így tapasztalatom ebben nincs, csak ötletem, hogy laikusként puskával a fejem mellett hogyan fognék hozzá.
Amire emlékszem még innen-onnan, hogy a magánhangzóknak jellegzetes könnyebben beazonosítható spektrumképe van, így fognék egy referencia képet (hullámformát), és megnézetném egy algoritmussal, hogy bizonyos küszöbön belül hasonló-e (illesztéses próba-szerencse móddal, ami akkor kapcsolna be, ha beszédmintát lát egy megelőző script, ami eldönti, hogy zaj vagy jel-e amit lát [hangerő-hossz tulajdonságok alapján]). Teszem azt (nem valós példák, hasraütésszerűen mondom) a "Kitt- gyere értem!" (:D) parancs esetében figyelném, hogy van-e "i kicsit hosszabb szünet e kisszünet e kisszünet é kisszünet e" spektrumkép (azaz ha i csúcsos hegyesebb szögben, e kerek, é pedig tompább szögben hegyes jelet eredményez, akkor ilyesmit várnék: [/\__∩_∩_^_∩_]. Megpróbálnám csak a magánhangzók alapján belőni, mi lehet az utasítás. Persze így megvan a lehetőség arra, hogy két parancs egyezzende ezt a tanításnál ki lehet küszöbölni rugalmasabb szókinccsel, viszont kevesebb és jobb adatatot kell feldolgozni.
Nem tudom ezzel az agymenéssel mennyit segítettem, remélem nem teljesen hülyeség ;)

http://xvoice.sourceforge.net/
Ez volt a legjobb linuxon azok közül, amiket eddig kipróbáltam, bár jó ideje nem fejlesztik és bugzik is rendesen.

szerintem egyszerű, kell hozzá egy számítógép, azon vannak ilyen valami algoritmusoknak nevezet izék, azok megoldják ezt a konkrét problémát

(gyk: nem a topikra hanem a hsz-ok ra, akinek nem inge..)