Ankündigung

Einklappen
Keine Ankündigung bisher.

Siri-Proxy - wer hat know how und will mitbasteln?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ThorstenGehrig
    antwortet
    Hi Berliner,
    danke - aber wie setzte ich das in der listen-zeile um?
    Bitte 2 konkrete Hilfestellungen:
    Code:
    1. Beispiel
      listen_for /(Rollladen|Jalousie) im Wohnzimmer (auf) ([0-9,]*[0-9])/i do |number|
        say "Rolladen wird im Wohnzimmer auf #{number[2]} % gefahren " #say something to the user!
    
    2. Beispiel:
      listen_for /Wecker (für|von) Verena (auf) ([0-9,]*[0-9]):([0-9,]*[0-9]) Uhr (einstellen|stellen|einschalten)/i do |number|
        say "Okay, Wecker für Verena wird auf #{number[2]}:#{number[3]} eingestellt"
    Sorry - stehe ein bisschen auf dem Schlauch: schubst mich runter ;-)

    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • Berliner
    antwortet
    Code:
    md = /(Porsche) (\w+)/.match(opa)
    md[0]          #-> "Porsche 944"          alles
    md[1]          #-> "Porsche"      erste Klammer
    md[2]          #-> "944"         zweite Klammer
    md.pre_match   #-> "Opa fährt einen "    vorher
    md.post_match  #-> " Turbo"             nachher
    Code:
    $&  #-> alles:           "Porsche 944"
    $1  #-> erste Klammer:   "Porsche"
    $2  #-> zweite Klammer:  "944"
    $`  #-> vorher:          "Opa fährt einen "
    $'  #-> nachher:         " Turbo
    Rubybuch-Wiki

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Hi,
    @RalMue: hört sich gut an. Die Frage ist aber - ob sich der Aufwand lohnt!
    Besonders meine ich den "lern"-Algorythmus. Im Prinzip könnte man sich die Toilette=Bad=Klo einmal fix definieren - da wird irgendwann der Lernprozess abgeschlossen sein.
    Ich will aber keinen Bremsen :-)

    @All: ich habe immernoch mein Problem die Variablen richtig zu füllen:
    Das geht - hier wird der Wert schön in "number" geschrieben:
    Code:
    listen_for /Rollladen im Wohnzimmer auf ([0-9,]*[0-9])/i do |number|
    Das hier geht nicht:
    Code:
    listen_for /(Rollladen|Jalousie) im Wohnzimmer (auf) ([0-9,]*[0-9])/i do |number|
    Hier wird "number" nicht richtig gefüllt. Ich vermute mal ich muss irgendwie definieren das "number"=zahl aus 3. Klammer.

    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    Das ist eine gute Idee!

    Ich versuche gerade auch Quellen zu finden wie Apple das grob macht. Werden die als Objekt gelieferten Antworten z.B. auf dem iPhone verarbeitet oder bekommt es irgendwie schon eine Handlungsanweisung vom Server mit? Weil gerade wenn Apple wirklich Siri für Apps zulassen würde, müsste ja jede App selbst parsen und damit wäre pro App mit einer großen Menge von Daten zu rechnen.

    Wenn also jemand Quellen zur groben Funktionsweise von Siri hat wäre ich dankbar. Irgendwer im www wird doch bestimmt schon sämtliche Sources auf dem iPhone 4S gecheckt haben ;-)

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Interessant wäre auch noch die Möglichkeit, Befehle zu verketten. Also wenn drei zusammengehörige Muster gefunden wurden den Algorithmus mit dem verbleibenden Text zu wiederholen. Dadurch wären Sätze wie "Schalte das Licht im Badezimmer ein und stelle die Heizung auf 22 Grad". Beim zweiten Teil könnte man dann eine fehlende Angabe durch die aus dem ersten Teil ersetzen (hier z.B. das Zimmer = "Badezimmer").

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    Stimmt, daran habe ich gerade gar nicht gedacht :-D Also zwei Wörter :-)

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Zitat von RalMue Beitrag anzeigen
    In meinen Augen reicht sogar wenn nur "an" erkannt wird, der folgende Dialog ist halt etwas länger.

    Was meint ihr, macht das Sinn oder habe ich einen logischen Fehler drin?
    Die gesamte Idee ist an sich gut, bei zu einfachen Wörtern könnte es jedoch schnell zu Problemen kommen. Wenn du alleine auf "an" reagierst wirst du mit Siri für andere Sachen nicht mehr glücklich werden. Beispiel: Schicke eine Nachricht an meine Freundin das ich später komme. Wie Thorsten auch schon meinte, Minimum zwei Wörter sollten schon matchen.

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    Ich möchte euch hier mal, bevor ich mich dumm und dämlich programmiere, grob mein Konzept zum parsen der Befehle vorstellen.

    Ich habe eine Datenbank, in der Synonyme miteinander in Verbindung stehen. Der als Text gelieferte Satz wird zerlegt oder mit Regexp durchsucht. Der Einstieg in einen Befehl erfolgt erstmal über den Interaktionsgegenstand plus Matching auf die Datenbank. So baue ich mir ähnlich dem hardcodierten "Teste.*Proxy" einen dynamischen Befehlsblock auf, auf den gematcht wird.

    Fehlt im Eingabestring, also dem gesprochenen und in Text umgewandelten Text, die Ortsangabe (kein Matching auf Tabelle 'Räume'), erfolgt die Nachfrage, welcher Raum gemeint wurde.

    Soweit waren wir ja schon, und jetzt kommt meine Idee für eine Lernoption: Wurde nur ein Wort gefunden, z.b "hell" lasse ich Siri von jeder Kategorie, die hinterlegt ist nachfragen ob das gemeint war. Wird diese Frage mit ja beantwortet, werden die "wichtigen" Wörter des Satzes in die DB geschrieben und verknüpft.

    Ablaufbeispiel: "Schalte das Licht auf der Toilette an."
    #Matching erfolgt auf eine Anzahl von Objekten z.B Licht/ Heizung etc., auf eine Anzahl Räume z.B. Bad/ Küche etc. und auf eine Anzahl Befehle z.B. An/aus etc.
    Erkannt wird: Licht und an, der Befehl Licht und an ohne Raum passt aber nicht.
    "Wiederhole deinen Raum:"
    "Toilette"
    "Ich kenne die Räume: Küche, Bad, Wohnzimmer, Schlafzimmer. Was passt am Besten?"
    "Bad"
    "Das Licht in der Toilette ist nun an. Ich habe Toilette als Synonym für Bad gespeichert."

    #Toilette wird in der DB unter Räume gespeichert und als Synonym zu Bad gekennzeichnet.

    Das selbe passiert natürlich analog auch wenn Bad erkannt wurde aber nicht Licht sondern Lampe. Am Anfang ist das schwierig, aber mit der Zeit sollten das gut klappen. In meinen Augen reicht sogar wenn nur "an" erkannt wird, der folgende Dialog ist halt etwas länger.

    Was meint ihr, macht das Sinn oder habe ich einen logischen Fehler drin?

    Einen Kommentar schreiben:


  • tht
    antwortet
    Ohne mich näher damit beschäftigt zu haben, sieht es für mich wie eine vom Syntax her "abgespeckte Form" von RegEx aus:
    • Klammern kapseln Ausdrücke
    • Der Punkt wird als Wildcard-Symbol verwendet, der Stern entspricht dem Multiplikator (0 bis n)
    • Die Piep steht für ein oder


    Wie Ralf schon geschrieben hat, kommt dann noch die Reihenfolge dazu.

    In dem Bsp.

    listen_for /(Teste.*Proxy)|(Proxy.*testen)/i do

    ergibt das dann:

    Wenn
    "Teste" irgendwas dazwischen "Proxy"
    ODER
    "Proxy" irgendwas dazwischen "testen"
    gehört wird, erfolgt die Sprachausgabe oder gewünschte Aktion.

    Diese Mechanismen angereichert um etwas KI dürften das Rezept für Siri sein.

    Unter Akzeptanz einer Anfangs längeren Lernphase könnte man sogar ein sich durch Fragen an den User anpassendes System aufbauen (wenn man noch Prolog mit einsetzt, Lisp könnte vllt auch klappen).

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    Das ist ein simpler regulärer Suchstring. Getestet wird, ob in der Sucheingabe "Teste" und "Proxy" vorkommt. Allerdings ist die Reihenfolge wichtig, deshalb sowohl "Teste.*Proxy" als auch "Proxy.*testen".

    Code:
    listen_for /((mag|möchte).*Musik|Lautsprecher.*(an|ein))/i do
    Piepe bedeutet "oder".

    Also "Ich mag gerne Musik hören" würde ebenso gehen wie "Ich möchte Musik hören"

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Hi

    kannst du mir das genauer erklären?
    Code:
    listen_for /(Teste.*Proxy)|(Proxy.*testen)/i do
        say "Siri Proxy funktioniert!" #say something to the user!
        
        request_completed
      end
    Mach er hier in der ersten klammer
    "Teste.*" = Teste ist irgendwo im Text
    und
    "Proxy" muss vorkommen
    Die zweite Klammer
    "Proxy.*" = Proxy kommt irgendwo vor
    "testen" muss vorkommen
    Die "Pipe" zwischen den beiden Afragen bedeutet eine von beiden bedingungen muss vorkommen...

    Warum machst du dann nicht
    listen_for /(Teste.*Proxy)|(testen.*Proxy)/i do
    kommt doch aufs selbe raus, oder?

    Code:
    listen_for /((mag|möchte).*Musik|Lautsprecher.*(an|ein))/i do
    Irgendwo muss mag oder mächte vorkommen
    Irgendwo muss Musik oder Lautsprecher vorkommen
    Irgendwo muss an oder ein vorkommen

    Warum ist dann der 2. Teil nicht in klammern?

    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    Ich weiß nicht ob ihr es schon rausgefunden habt, mit .* bei listen_for wird auf das Vorkommen von Wörtern geprüft:

    Code:
    listen_for /(Teste.*Proxy)|(Proxy.*testen)/i do
        say "Siri Proxy funktioniert!" #say something to the user!
        
        request_completed
      end
    "Kannst du bitte den Proxy testen" funktioniert jetzt ebenso wie "Teste mal bitte den Proxy du doofe Nuss" :-)

    Verknüpft mit dem | Operator kann man schon viel abdecken:

    Code:
    listen_for /((mag|möchte).*Musik|Lautsprecher.*(an|ein))/i do

    Einen Kommentar schreiben:


  • Berliner
    antwortet
    Zitat von RalMue Beitrag anzeigen
    Ich als alter Schwarzmaler sehe aber vorher die Gefahr, dass Apple die Server dicht macht. Aber toi toi toi!
    As reported by the hackers, the new iOS 5.1 also carries limited Siri API support for developers and enables them to give some Siri love to their applications, as we have already seen the couple of applications with limited integration of Siri into the third party application’s core. The new limited iPhone 4S Siri API’s allow developers to call some functions on their applications but still not allows them to fully integrate it in the core of the application.
    In short, the availability of this limited Siri API support in iOS 5.1 beta 1 show that Apple has also been considering to roll out official API system for developers to create their applications according to their Siri feature need, or could allow them to develop such apps, which wake up on the Siri’s API calls. We have already seen the couple of Siri hacks from the SiriProxy, a web-based Siri proxy server that allows users/ developers to generate their own commands on Siri.
    Quelle: freakgeeks.com


    Vielleicht gehts also genau in die andere Richtung! Gut für uns ;-)

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    Meine Planung geht ebenfalls in diese Richtung, JaKop.

    Ich möchte z.B. sagen "Entspannungsmodus Schlafzimmer", dann wird das Licht gedimmt, die Dekobeleuchtung geht an, die Lautsprecher gehen an und aus iTunes wird auf diese Lautsprecher die Playlist "xyz" gestreamt.

    Oder für das Wohnzimmer einen "Filmemodus" mit verknüpften Schaltvorgängen im Hintergrund.

    Allerdings wären für mich auch Abweichungen vom normalen Betriebsvorgang interessant. Beispiel: "Heize in 10 Minuten die Heizung im Bad auf 27 Grad".

    Ich als alter Schwarzmaler sehe aber vorher die Gefahr, dass Apple die Server dicht macht. Aber toi toi toi!

    Einen Kommentar schreiben:


  • JaKop
    antwortet
    Zitat von ThorstenGehrig Beitrag anzeigen
    Rollladen oder Licht sind ja ganz nett - vorallem zum Zeigen.
    Aber in einem richtigen Smarthome schaltet man ja kaum noch Licht und die Rollladen fahren auch zu 99% automatisch.
    Die Frage ist jetzt: welche Befehle machen überhaupt sinn?
    Ich denke, dass hier im Wesentlichen die Betriebszustände des Hauses sowie die Szenen gefragt sind

    Code:
    listen_for /(Schatz|Hasi|Mausi) (kuscheln)/i do
        say "Aber die Kinder...." #say something to the user!
        #wasGood = system( "groupswrite ip:wiregate <Szene Romantikbeleuchtung>)
        #wasGood = system( "groupswrite ip:multiroom <lauschige Musik">)
         request_completed #always complete your request! Otherwise the phone will "spin" at the user!
      end
    Kritisch ist dann nur noch, in welchem Zimmer man gerade ist, damit das richtige Zimmer eingestellt wird.

    Einen Kommentar schreiben:

Lädt...
X