Joepv schreef op woensdag 05 december 2012 @ 08:53:
[...]
Als je een iPhone hebt kun je
SiriProxy gebruiken, heb dit zelf gebouwd en werkt echt goed. Je Siri commando's worden afgevangen door je proxy en deze stuurt je domotica systeem aan. Ik heb de commando's zo gemaakt dat ze met regex geparsed worden en zo kun je heel natuurlijk spreken en hoef je ook niet exact dezelfde zin te zeggen. Voorbeelden van mijn systeem
vind je hier.

Dit is wel heel mooi zeg!
Als je met regex werkt, maakt de woordvolgorde dan nog wat uit?
Ik ben met iets vergelijkbaars bezig, alleen werkt mijn systeem net wat anders. We nemen bijvoorbeeld een opdracht die op twee verschillende manieren gegeven kan worden:
"Can you please turn on my kitchen light?"
"Switch the damned kitchen light on!"
Wat ik als eerste doe is de handel matchen tegen een aantal werkwoorden die erin staan. Hier worden de werkwoorden 'can', 'turn' en 'switch' gevonden. Aan het werkwoord 'can' heb ik ingesteld dat het genegeerd moet worden in het bepalen van de opdracht aangezien het vaak een niet relevant hulpwerkwoord is. 'Turn' en 'switch' zijn in mijn code objecten en bevatten hun eigen code om hun context te analyseren. 'Turn' en 'switch' hebben in een domotica systeem min of meer dezelfde betekenis. Er moet iets geturnd of geswitcht worden. Switch is een alias op turn dus beide zinnen gaan verder op de class Turn. Turn op zich is dus niet erg zinnig, daarom gaat de code in Turn.analyzeContext() op zoek naar de betekenis. Toevoegingen aan turn zijn over het algemeen 'on', 'off' of 'to'. In het Engels staan deze over het algemeen óf meteen na het werkwoord, óf achteraan de zin. Daar gaan we dus zoeken om verwarring (Man
on a Ledge...) te voorkomen. We weten nu dat er iets on geturnd moet worden. Ik heb vervolgens een lijst met andere objecten (appliances) die bewerkt kunnen worden. In die lijst staan bijvoorbeeld de objecten 'kitchen light', 'television' en 'heater'. Een zelfde lijst is er overigens ook voor media, turn on music bijvoorbeeld.
Die lijsten worden vergeleken waarbij de Turn classe de voorkeur legt op de appliances. Één van die objecten heeft als tag kitchen light. Dit wordt bij mij ook via een regex gedaan. Dat object matched dus. De Turn classe voert dan Appliance.TurnOn() uit waarna het appliance object de domotica aanstuurt (EventGhost::event('a.KitchenLight.change',1) in mijn code). Voor het doorgeven van geïnterpreteerde opdrachten aan de applicance objecten wil ik trouwens liever met events gaan werken. Enerzijds om het te centraliseren, anderzijds om niet met een enorme hoop aan methods te eindigen. Daarnaast wil ik het uitlezen van de zinnen onderbrengen in een andere class die rekening houdt met woorden die hetzelfde klinken maar wellicht verkeerd verstaan zijn. Hiervoor wil ik gaan matchen op basis van soundex of metaphone functies. Als ik het matchen volledig daaraan over kan laten hoop ik nog iets van een confidence level in te bouwen, nu wordt immers steeds de eerste match gepakt.
Bugged nog aan alle kanten, maar het is goed op weg. En leuk om te maken
Edit: Vind dat wel erg slim om gewoon Siri te gebruiken als voice input/output! Heeft me op het idee gebracht om te kijken of ik Google Now (ben geen Apple man

) kan gebruiken. Alleen wil ik dat dan wel op mijn mediacenter hebben draaien en niet op mijn telefoon. Lastig, want in de Android Emulator staat die functie uit. Maar dit moet gewoon kunnen

Zou toch vet zijn! Onderscheppen, eerst zelf kijken of er wat van te maken valt, en anders doorsturen naar Google. Kan die met zijn Knowledge Graph meteen kijken of je een andere vraag stelt. Kan ik mijn mediacenter ook vragen hoeveel 5 / 0 is! En dan wel dekking zoeken natuurlijk..
[
Voor 16% gewijzigd door
doltishDuke op 05-12-2012 19:19
]