Spracherkennung und Sprachsynthese

Begonnen von Prof. Dr. Peter Henning, 09 Februar 2017, 08:19:06

Vorheriges Thema - Nächstes Thema

baukater

Zitat von: Prof. Dr. Peter Henning am 09 Februar 2017, 08:19:06


Heute dann mal wieder bei Ivona reingeschaut, um ein paar neue "Festnachrichten" auszuprobieren - und siehe da, Ivona wurde von Amazon aufgekauft und wird jetzt als "Amazon Polly"  angeboten.
Auch das Sichern als MP3 geht jetzt babyeinfach:
https://eu-west-1.console.aws.amazon.com/polly/home/SynthesizeSpeech

Damit ist für mich klar, welchen Weg ich gehen will:

- Hardware, um auch bei Hintergrundgeräuschen einen menschlichen Sprecher und seine Worte zu isolieren (Forschungsthema ...)
- Einen Webdienst, um diese Worte in geschriebenen Text umzuwandeln (Amazon, von mir aus, auch Google, von mir aus)
- Meine eigene semantisch aufgepeppte Software zur Umsetzung in konkrete Handlungen
- Eine TTS-Engine, um Sprache auch wieder auszugeben (Amazon, von mir aus).

LG

pah

Ist es denn schon möglich diesen Dienst über fhem anzusprechen und eine MP3 zu erzeugen, die dann als Sprachausgabe genutzt werden kann?

Gruß
FB7490,Raspi 2/3,HM-Lan,Jeelink Classic (868),Logilink BT0015 Bluetooth 4.0, 2x mySmartUSB light,RS485USB , entities:272 device:14 channel:27 virtual:1, 6 x HM-LC-BL1-FM,4 x HM-LC-SW4-WM, 1 x HM-LC-SW2-FM,1 x Fensterkontakt,1 1x Türkontakt, 1 1x Bewegungsmelder, DECT-200,DECT100,6xAuthentic Xiaom

visionsurfer

@Pah

Ja du hast recht. Das würde grundsätzlich alles jetzt schon gehen. Aber nicht direkt über Alexa, oder sauber nur mit Alexa, bzw. Amazon ECHO.
Bevor ich die Amazon ECHOS im Haus hatte, hab ich auch mit Google NOW usw. gespielt und mit einem Nexus Android Tablet was direkt am Bett steht.

Nach dem Motto "OK Google, stelle den Wecker auf 6 Uhr".

Das hat schon super geklappt.

Mir ist z.B. wichtig das ich keinen Knopf drücken muss. Also arbeite ich lieber mit "Aktivierungswort".
Was mich dann beim Tablet sehr gestört hat und was bei Alexa viel besser ist, ist die Erkennung.

Wenn ich das Tablet dann gegenüber auf einen kleinen Schrank stelle, erkennt es nicht mehr "OK Google". Oder ich muss total brüllen.

Der Amazon ECHO reagiert teilweise aus 10 Meter Entfernung, noch ohne Probleme.

Grüße,
Visionsurfer

Waldmensch

Zitat von: Fixel2012 am 10 Februar 2017, 09:46:23
Das mag wohl sein, aber irgendwie müssen die Daten dann ja noch zu Fhem. Darauf ist alexa glaube ich nicht ausgelegt. Ich denke Alexa ist eher ein Standalone gerät und ist nicht vorgesehen mit anderen Smart Home Controllern zu kommunizieren.

Somit ist im Moment wahrscheinlich keine Schnittstelle Verfügbar die Daten zum echo und dann erst zu Fhem zu schicken.

JustMe hat das wahrscheinlich best möglich und am einfachsten Programmiert.

Ich weiß jetzt nicht in wie fern so ein offener Port wirklich eine Sicherheitslücke ist und was damit alles angestellt werden kann, aber optimal ist es sicherlich nicht!
Also über die HA Bridge geht doch die interne Kommunikation ohne offenen Port. Man legt jeweils FHEM URI's für on/off/dim fest und kann damit sehr viel abfackeln. Zum Beispiel "Alexa, Fernseher Küche 50%" oder "Alexa, Heizung Bad 23 Grad "


Gesendet von iPhone mit Tapatalk

Fixel2012

Habe ich mich bisher noch nicht befasst ::) Aber danke für den Tipp.
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Waldmensch

Mein Küchenfernseher hängt an einer alten DBox2, die bietet über das Webinterface (also URI) mute/unmute/Lautstärke 1-100 an. Komplett an/aus für TV und Box läuft über eine FHEM Schaltsteckdose "Alexa, Küche Anlage an/aus"


Gesendet von iPhone mit Tapatalk

newan

Das müsste auch über den Smart Home skill gehen, da sind ja dann vom Echo/Alexa aus die normalen Hue befehle die nur umgemapped werden.

Was aber nicht geht sind Statien abfragen, wie "Wieviel % steht die Küche" etc. und andere Schaltvorgänge wie "Schalte Küche auf Pro7"..dafür müsstest du ein wenig mehr Logik haben und das geht derzeit nur über den Umweg Cloud -> Port->Bridge->fhem ...

Waldmensch

#36
Mir persönlich ist das zu aufwändig. Zustände setzen reicht mir aus. Zudem weiß ich, wie die Temperatureinstellungen im Automatikmodus sind, da brauche ich nicht groß nachfragen. Wetter kann Alexa schon von Haus aus. Termine werden aus dem Google Kalender geholt und für Musik sorgt die Spotify Kopplung. Ich komme derzeit noch ohne die sehr komplexe Lösung aus.

Edit: warum sollte "Alexa, Küche Pro7 an" nicht funktionieren? Wenn der Receiver das per URI kann, ist es mit der HA Bridge mit ein paar Mausklicks konfiguriert.

Gesendet von iPhone mit Tapatalk

newan

Ja "Alexa, Küche Pro7 an" geht, aber das ja nciht der natürliche Satz. Dieser wäre "Alexa, SCHALTE Fernseher/Küchen Fernseher auf Pro7" und genau das geht nicht.

Will ja das die Sprachsteuerung mich versteht und nicht andersrum bzw ich genau die Sätze sagen muss die es für richtig / möglich hält ;-)

Das sit für immo natürlich alles ausreichend, ging ja darum wie es in der Zukunft sein kann oder mit ph lösung kombinierbar

Waldmensch

Nur um einen längeren Satz benutzen zu können der Aufwand? ;)
Ich verstehe aber was Du meinst.


Gesendet von iPhone mit Tapatalk

visionsurfer

Hi,

genau da ist es halt auch noch nicht richtig RUND. Ich komme halbwegs klar, weil ich grundsätzlich weiß, welche Befehle funktionieren und welche nicht.

Aber meine Frau, stottert sich da einen zusammen. Weil man nicht direkt den natürlichen Sprachgebrauch anwenden kann.

Grüße,
Visionsurfer

Ma_Bo

Genau das ist auch mein Problem, man muss erst überlegen, was man sagen soll um es richtig zu machen.

Genial wäre wenn man irgendwie das was man gesprochen hat auch direkt in fhem in z.B. einem dummy, angezeigt bekommt, also der komplett gesprochene Satz.

Kann man nicht die Seite von Alexa ( http://alexa.amazon.de/spa/index.html#settings/dialogs ), auf der der Verlauf steht, irgendwie auslesen oder die App auf dem Handy irgendwie anzapfen?

Grüße Marcel
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Prof. Dr. Peter Henning

#41
Na gut, plaudern wir etwas aus dem Nähkästchen.

Das Ziel ist, ganz unterschiedliche Formulierungen desselben Sachverhaltes so zu normieren, dass diese ebenfalls erkannt werden. Dazu gehört also (bei syntaktischer Toleranz) eine semantische Analyse.

Nachstehend ein Beispiel aus meiner Spracherkennung.

Darin nehme ich zunächst an dem (von Google) zurückgelieferten Satz eine semantische Analyse vor:
- Normieren bestimmter Spezialsätze
- Analyse der Eingabe nach device, verb, reading, value
- Weiterreichen an ein ziemlich längliches if..elsif..else zum Abarbeiten der einzelnen Befehle.

Das macht aus den ganz rechts stehenden Sätzen (das sind meine Testfälle) die links stehenden Daten.
Zitat
[voiceRecognition] Semantic analysis category=1.1.0: device=gerät, verb=schalten, reading=ein      <=========== dummy schalte das gerät an
[voiceRecognition] Semantic analysis category=1.2.0: device=gerät, verb=schalten, reading=ein      <=========== dummy schalte gerät an
[voiceRecognition] Semantic analysis category=1.1.1: device=gerät, verb=sagen, reading=status      <=========== dummy sage den status von gerät
[voiceRecognition] Semantic analysis category=1.2.1: device=gerät, verb=sagen, reading=status      <=========== dummy sage status von gerät
[voiceRecognition] Semantic analysis category=1.2.1: device=gerät, verb=sagen, reading=status      <=========== dummy sage status gerät
[voiceRecognition] Semantic analysis category=2.1.1: device=gerät, verb=sagen, reading=wert      <=========== dummy wie ist der wert von gerät
[voiceRecognition] Semantic analysis category=2.2.1: device=gerät, verb=sagen, reading=wert      <=========== dummy wie ist wert von gerät
[voiceRecognition] Semantic analysis category=2.1.2: device=gerät, verb=sagen, reading=wert      <=========== dummy wie ist der wert gerät
[voiceRecognition] Semantic analysis category=2.2.2: device=gerät, verb=sagen, reading=wert      <=========== dummy wie ist wert gerät
[voiceRecognition] Semantic analysis category=3.2.4: device=gerät, verb=schalten, reading=aus      <=========== dummy das gerät ausschalten
[voiceRecognition] Semantic analysis category=3.3.5: device=gerät, verb=schalten, reading=aus      <=========== dummy gerät ausschalten
[voiceRecognition] Semantic analysis category=2.1.3: device=wetter, verb=sagen, reading=morgen      <=========== dummy wie ist das wetter von morgen
[voiceRecognition] Semantic analysis category=2.2.3: device=wetter, verb=sagen, reading=morgen      <=========== dummy wie ist wetter von morgen
[voiceRecognition] Semantic analysis category=2.1.3: device=wetter, verb=sagen, reading=morgen      <=========== dummy wie ist das wetter morgen
[voiceRecognition] Semantic analysis category=2.2.3: device=wetter, verb=sagen, reading=morgen      <=========== dummy wie ist wetter morgen
[voiceRecognition] Semantic analysis category=2.2.4: device=wetter, verb=sagen, reading=morgen      <=========== dummy wie ist morgen das wetter
[voiceRecognition] Semantic analysis category=2.2.2: device=wetter, verb=sagen, reading=morgen      <=========== dummy wie ist morgen wetter
[voiceRecognition] Semantic analysis category=3.3.3: device=wetter, verb=sagen, reading=morgen      <=========== dummy wetter von morgen
[voiceRecognition] Semantic analysis category=3.3.3: device=wetter, verb=sagen, reading=morgen      <=========== dummy wetter morgen
[voiceRecognition] Semantic analysis category=3.1.0: device=zeit, verb=schalten, reading=morgen      <=========== dummy guten morgen
[voiceRecognition] Semantic analysis category=3.1.0: device=zeit, verb=schalten, reading=nacht      <=========== dummy gute nacht
[voiceRecognition] Semantic analysis category=1.1.0: device=wecker, verb=schalten, reading=aus      <=========== dummy schalte den wecker aus
[voiceRecognition] Semantic analysis category=1.2.0: device=wecker, verb=schalten, reading=aus      <=========== dummy schalte wecker aus
[voiceRecognition] Semantic analysis category=3.2.4: device=wecker, verb=schalten, reading=aus      <=========== dummy den wecker ausschalten
[voiceRecognition] Semantic analysis category=3.3.5: device=wecker, verb=schalten, reading=aus      <=========== dummy wecker ausschalten
[voiceRecognition] Semantic analysis category=2.1.5: device=wecker, verb=sagen, reading=status      <=========== dummy wie ist die weckzeit
[voiceRecognition] Semantic analysis category=2.1.1: device=wecker, verb=sagen, reading=status      <=========== dummy wie ist der status des weckers
[voiceRecognition] Semantic analysis category=3.3.5: device=wecker, verb=sagen, reading=status      <=========== dummy weckzeit ansagen
[voiceRecognition] Semantic analysis category=3.4.0: device=wecker, verb=sagen, reading=status      <=========== dummy weckzeit
[voiceRecognition] Semantic analysis category=1.1.0: device=wecker, verb=stellen, reading=auf 4 uhr 3     <=========== dummy wecken um 4 uhr 3
[voiceRecognition] Semantic analysis category=1.1.0: device=wecker, verb=stellen, reading=auf 17:00     <=========== dummy stelle den wecker auf 17:00
[voiceRecognition] Semantic analysis category=1.1.0: device=wecker, verb=stellen, reading=auf 13 uhr     <=========== dummy wecken um 13 uhr
[voiceRecognition] Semantic analysis category=3.2.4: device=haus, verb=sagen, reading=status      <=========== dummy das haus ansagen
[voiceRecognition] Semantic analysis category=3.3.5: device=haus, verb=sagen, reading=status      <=========== dummy haus ansagen
[voiceRecognition] Semantic analysis category=3.3.4: device=haus, verb=sagen, reading=status      <=========== dummy haus status
[voiceRecognition] Semantic analysis category=2.1.1: device=haus, verb=sagen, reading=status      <=========== dummy wie ist der status des hauses
[voiceRecognition] Semantic analysis category=2.1.1: device=haus, verb=sagen, reading=status      <=========== dummy wie ist der status vom haus
[voiceRecognition] Semantic analysis category=3.2.4: device=haus, verb=sichern, reading=zu      <=========== dummy das haus sichern
[voiceRecognition] Semantic analysis category=3.3.5: device=haus, verb=sichern, reading=zu      <=========== dummy haus sichern
[voiceRecognition] Semantic analysis category=3.2.4: device=haus, verb=sichern, reading=ent      <=========== dummy das haus entsichern
[voiceRecognition] Semantic analysis category=3.3.5: device=haus, verb=sichern, reading=ent      <=========== dummy haus entsichern
[voiceRecognition] Semantic analysis category=3.3.5: device=alarm, verb=schalten, reading=ein      <=========== dummy alarmanlage scharfschalten
[voiceRecognition] Semantic analysis category=3.3.5: device=alarm, verb=schalten, reading=aus      <=========== dummy alarmanlage unscharf schalten
[voiceRecognition] Semantic analysis category=3.3.5: device=alarm, verb=rufen, reading=wider      <=========== dummy alarm wider rufen
[voiceRecognition] Semantic analysis category=3.3.5: device=alarm, verb=rufen, reading=wider      <=========== dummy alarm widerrufen
[voiceRecognition] Semantic analysis category=1.2.0: device=beleuchtung, verb=schalten, reading=ein      <=========== dummy schalte beleuchtung an
[voiceRecognition] Semantic analysis category=3.3.5: device=beleuchtung, verb=schalten, reading=ein      <=========== dummy licht anschalten
[voiceRecognition] Semantic analysis category=1.2.0: device=beleuchtung_sitzgruppe, verb=schalten, reading=ein      <=========== dummy schalte beleuchtung sitzgruppe an

Der Code dafür, inklusive Testroutine:


##############################################################################
#
#  Spracherkennung
#
##############################################################################

sub TVR(){
  my $str = "";
  #--
  $str .=      voiceRecognition("none","dummy schalte das gerät an");
  $str .= "\n".voiceRecognition("none","dummy schalte gerät an");
  $str .= "\n".voiceRecognition("none","dummy sage den status von gerät");
  $str .= "\n".voiceRecognition("none","dummy sage status von gerät");
  $str .= "\n".voiceRecognition("none","dummy sage status gerät");
  #--
  $str .= "\n".voiceRecognition("none","dummy wie ist der wert von gerät");
  $str .= "\n".voiceRecognition("none","dummy wie ist wert von gerät");
  $str .= "\n".voiceRecognition("none","dummy wie ist der wert gerät");
  $str .= "\n".voiceRecognition("none","dummy wie ist wert gerät");
  #--
  $str .= "\n".voiceRecognition("none","dummy das gerät ausschalten");
  $str .= "\n".voiceRecognition("none","dummy gerät ausschalten");
  #--
  $str .= "\n".voiceRecognition("none","dummy wie ist das wetter von morgen");
  $str .= "\n".voiceRecognition("none","dummy wie ist wetter von morgen");
  $str .= "\n".voiceRecognition("none","dummy wie ist das wetter morgen");
  $str .= "\n".voiceRecognition("none","dummy wie ist wetter morgen");
  $str .= "\n".voiceRecognition("none","dummy wie ist morgen das wetter");
  $str .= "\n".voiceRecognition("none","dummy wie ist morgen wetter");
  $str .= "\n".voiceRecognition("none","dummy wetter von morgen");
  $str .= "\n".voiceRecognition("none","dummy wetter morgen");
  #--
  $str .= "\n".voiceRecognition("none","dummy guten morgen");
  $str .= "\n".voiceRecognition("none","dummy gute nacht");
  #--
  $str .= "\n".voiceRecognition("none","dummy schalte den wecker aus");
  $str .= "\n".voiceRecognition("none","dummy schalte wecker aus");
  $str .= "\n".voiceRecognition("none","dummy den wecker ausschalten");
  $str .= "\n".voiceRecognition("none","dummy wecker ausschalten");
  $str .= "\n".voiceRecognition("none","dummy wie ist die weckzeit");
  $str .= "\n".voiceRecognition("none","dummy wie ist der status des weckers");
  $str .= "\n".voiceRecognition("none","dummy weckzeit ansagen");
  $str .= "\n".voiceRecognition("none","dummy weckzeit");
  $str .= "\n".voiceRecognition("none","dummy wecken um 4 uhr 3");
  $str .= "\n".voiceRecognition("none","dummy stelle den wecker auf 17:00");
  $str .= "\n".voiceRecognition("none","dummy wecken um 13 Uhr");
  #--
  $str .= "\n".voiceRecognition("none","dummy das haus ansagen");
  $str .= "\n".voiceRecognition("none","dummy haus ansagen");
  $str .= "\n".voiceRecognition("none","dummy haus status");
  $str .= "\n".voiceRecognition("none","dummy wie ist der status des hauses");
  $str .= "\n".voiceRecognition("none","dummy wie ist der status vom haus");
  $str .= "\n".voiceRecognition("none","dummy das haus sichern");
  $str .= "\n".voiceRecognition("none","dummy haus sichern");
  $str .= "\n".voiceRecognition("none","dummy das haus entsichern");
  $str .= "\n".voiceRecognition("none","dummy haus entsichern");
  #--
  $str .= "\n".voiceRecognition("none","dummy alarmanlage scharfschalten");
  $str .= "\n".voiceRecognition("none","dummy alarmanlage unscharf schalten");
  $str .= "\n".voiceRecognition("none","dummy alarm wider rufen");
  $str .= "\n".voiceRecognition("none","dummy alarm widerrufen");
  #--
  $str .= "\n".voiceRecognition("none","dummy schalte beleuchtung an");
  $str .= "\n".voiceRecognition("none","dummy licht anschalten");
  $str .= "\n".voiceRecognition("none","dummy schalte beleuchtung sitzgruppe an");
  return $str;
 
}

sub voiceRecognition($$){

  my ($name,$command) = @_;
 
  $command = lc $command;

  #Log 1,"[voiceRecognition] with name=$name and command=$command";
 
  my ($dum,$cmd,$par) = split(/ /,$command,3);
  #Log 1,"[voiceRecognition] with cmd=$cmd and par=$par";
 
  #-- New structure
  my @vr_states    = ("status","wert","wetter","zeit","we((ck)|g\s?)zeit");
  my @vr_times     = ("heute","morgen","übermorgen","nacht");
  my %vr_verbs     = ("schalte"=>"schalten",
                      "setze"=>"setzen",
                      "stelle"=>"stellen",
                      "schließe"=>"schließen",
                      "sichern"=>"sichern",
                      "sage"=>"sagen",
                      "wecken"=>"wecken",
                      "rufen"=>"rufen");
  my @vr_verbs_prt = ("ein","an","aus","um","zu","auf","ent","wider");
  my @vr_prepo     = ("von","vom","des");
  my @vr_prono     = ("wie","wo","wann");
  my @vr_article   = ("der","die","das","den","des");
 
  my $re_states    = "((".join(")|(",@vr_states)."))";
  my $re_times     = "((".join(")|(",@vr_times)."))";
  my $re_verbs_inf = "((".join(")|(",(values %vr_verbs))."))";
  my $re_verbs_1ps = "((".join(")|(",(keys %vr_verbs))."))";
  my $re_verbs_prt = "((".join(")|(",@vr_verbs_prt)."))";
  my $re_prepo     = "((".join(")|(",@vr_prepo)."))";
  my $re_prono     = "((".join(")|(",@vr_prono)."))";
  my $re_article   = "((".join(")|(",@vr_article)."))";
 
  my $cat      =0;
  my $subcat   =0;
  my $subsubcat=0;
   
  my ($verb,$article,$device,$reading,$state,$prepo,$reserve,$value)=("","","","","","","","");
 
  #-- normalize special phrases
  my $commandn = $command;
  $commandn =~ s/wecken um/stelle den wecker auf/;
  $commandn =~ s/beleuchtung sitzgruppe/beleuchtung_sitzgruppe/;
  $commandn =~ s/beleuchtung essgruppe/beleuchtung_essgruppe/;
  $commandn =~ s/beleuchtung fernsehen/beleuchtung_fernsehen/;
  $commandn =~ s/beleuchtung schlummern/beleuchtung_schlummern/;
  $commandn =~ s/\sListe/_liste/;
  $commandn =~ s/\ssichern/ zusichern/;
  $commandn =~ s/unscharf/aus/;
  $commandn =~ s/scharf/ein/;
           
  my @word = split(' ',$commandn,8);
  #-- schalte das gerät an
  #   schalte gerät an
  #   sage den status von gerät
  #   sage status von gerät
  #   sage status gerät
  #   schalte den wecker aus ;
  #   schalte wecker aus
  if( $word[1] =~ /$re_verbs_1ps/){
    $cat = 1;
    $verb = $vr_verbs{$word[1]};
    if( $word[2] =~ /$re_article/){
      $subcat  = 1;
      $article = $word[2];
      $device  = $word[3];
      $reading = $word[4];
      $reserve = $word[5];
    }else{
      $subcat  = 2;
      $device  = $word[2];
      $reading = $word[3];
      $reserve = $word[4];
    }
    #-- verb="sage" => reading
    if(  $device =~ /$re_states/ ){
      if( $reading =~ /$re_prepo/ ){
        $subsubcat  = 1; 
        $reading = $device;
        $device  = $reserve;
      }else{
        $subsubcat  = 1;
        $reserve = $reading;
        $reading = $device;
        $device  = $reserve;
      }
    }
  #-- wie ist der wert von gerät
  #   wie ist wert von gerät
  #   wie ist der wert gerät
  #   wie ist wert gerät
  #   wie ist das wetter morgen
  #   wie ist wetter morgen
  #   wie ist morgen das wetter
  #   wie ist morgen wetter
  #   wie ist die weckzeit
  #   wie ist der status des weckers
  }elsif( $word[1] =~ /$re_prono/){
     $cat = 2;
     $verb    = "sagen";
     #-- take out article
     if( $word[3] =~ /$re_article/){
       $subcat=1;
       $article = $word[3];
       $reading = $word[4];
       #--take out preposition
       if( $word[5] =~ /$re_prepo/ ){
         $subsubcat = 1;
         $device = $word[6];
       #-- no preposition
       }else{
         $subsubcat = 2;
         $device = $word[5];
       }
    #-- no article
    }else{
      $subcat = 2;
      $reading = $word[3];
      #--take out preposition
      if( $word[4] =~ /$re_prepo/ ){
        $subsubcat = 1;
        $device = $word[5];
      #-- no preposition
      }else{
        $subsubcat = 2;
        $device = $word[4];
      }
    }
    #-- exchange on temporal statement
    if( $device =~ /$re_times/ ){
      $subsubcat = 3;
      $reserve = $device;
      $device  = $reading;
      $reading = $reserve;
    }
    if( $device =~ /$re_article/){
      $subsubcat = 4;
      $device  = $word[5];
    }
    if( $device eq ""){
      $subsubcat = 5;
      $device = $reading;
      $reading = "status";
    }
  #-- das gerät anschalten
  #   gerät anschalten
  #   das wetter von morgen
  #   wetter von morgen
  #   das wetter morgen
  #   wetter morgen
  #   guten morgen
  #   gute nacht
  #   den wecker ausschalten
  #   wecker ausschalten
  #   wecker
  }else{
    $cat = 3;
    my $rex = $re_verbs_prt." ?".$re_verbs_inf;
    if( $word[1] =~ /gut.*/){
      $subcat = 1;
      $device="zeit";
      $reading=$word[2];
      $reserve=$word[3];
      $verb="schalten";
    }elsif( $word[1] =~ /$re_article/){
      $subcat = 2;
      $article = $word[1];
      $device  = $word[2];
      #--take out preposition
      if( $word[3] =~ /$re_prepo/ ){
        $subsubcat = 1;
        $reserve = $word[4];
      }else{
        $subsubcat = 2;
        $reserve = $word[3];
      }
      #-- if time
      if( $reserve =~ /$re_times/ ){
        $subsubcat = 3;
        $reading = $reserve;
        $verb    = "sagen";
      }else{
        $subsubcat = 4;
        $reserve =~ /$rex/;
        $verb    = $10; #number verb_prt + 2
        $reading = $1;
      }
    }elsif($word[2] ne ""){
      $subcat = 3;
      $device  = $word[1];
      #--take out preposition
      if( $word[2] =~ /$re_prepo/ ){
        $subsubcat = 1;
        $reserve = $word[3].$word[4];
      }else{
        $subsubcat = 2;
        $reserve = $word[2].$word[3];
      }
      #-- if time
      if( $reserve =~ /$re_times/ ){
        $subsubcat = 3;
        $reading = $reserve;
        $verb    = "sagen";
      }elsif( $reserve =~ /status/ ){
        $subsubcat = 4;
        $reading = "status";
        $verb    = "sagen";
      }else{
        $subsubcat = 5;
        $reserve =~ /$rex/;
        $verb    = $10; #number verb_prt + 2
        $reading = $1;
      }
    }else{
      $subcat  = 4;
      $device  = $word[1];
      $reading = "status";
      $verb    = "sagen";
    }
  }
  #-- normalize devices
  $device = "haus"
    if( $device =~/hauses/);
  $device = "hauseingangstür"
    if( $device =~/haustür/);
  $device = "wecker"
    if( $device =~/we((ck)|g).*/);
  $device = "alarm"
    if( $device =~/alarm.*/);
  $device =~ s/licht/beleuchtung/;
   
  #-- normalize reading an
  $reading = "status"
    if( ($verb eq "sagen") && ($reading eq "an"));
  $reading = "ein"
    if( $reading eq "an");
   
  #-- normalize value
  $value=substr($commandn,index($commandn,"auf")+4)
    if( $reading eq "auf" );
 
  my $str="[voiceRecognition] Semantic analysis category=$cat.$subcat.$subsubcat: device=$device, verb=$verb, reading=$reading $value  \t<=========== $command";
  if( $name eq "none" ){
    return $str;
  }else{
    Log 1,$str;
  }

... Hier folgt dann der Auswertungsteil mit vielen if..elsif..else, die jeweils auf $device/$reading/$verb schauen und den $value verarbeiten

}


Gerne kann man diesen Code ausprobieren, und natürlich sammle ich weitere Testfälle.

LG

pah

Waldmensch

Ich habe gestern irgendwo gelesen, das Amazon die Spracherkennung auch für 3rd Party devices zugänglich machen will. Also für "nicht Echo" Geräte. Ich finde den Artikel nur nicht mehr.


Gesendet von iPhone mit Tapatalk

Fixel2012

Ja habe ich auch gelesen, Sonos arbeitet das in den Play 5 ein
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Prof. Dr. Peter Henning

Das muss schon kommen, wenn sich Amazon gegen Google behaupten will.

Ein Grund mehr, die ganze Steuerung nicht in die Amazon Cloud auszulagern - sondern lokal in FHEM oder einem kleinen Server zu lösen.

Nur noch die Hardware hacken ...

LG

pah