Supportmodul 95_Speech2Text

Begonnen von Prof. Dr. Peter Henning, 16 Februar 2017, 08:39:31

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

Nach dem großen Interesse, das durch die Amazon-Geräte ausgelöst wurde, habe ich mir meine schon länger laufende Spracherkennung vorgenommen und beschlossen, darau ein Helpermodul 95_Speech2Text zu machen. Der Anfang ist sehr bescheiden, es geht zunächst einmal nur darum, aus einem wilden und eventuell nur teilweise erkannten Sprachstring ein normiertes und weiter verarbeitbares Kommando zu machen.

Beispiel: Ich möchte aus dem rechts stehenden Sprachstring "dummy ..." die Aktionen und Geräte herausfiltern
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

Den Code dafür habe ich an anderer Stelle schon gepostet, hier noch einmal:

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/licht/;
  $commandn =~ s/licht ([b-y])/licht_$1/;
  $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;
    #-- guten morgen / gute nacht
    if( $word[1] =~ /gut.*/){
      $subcat = 1;
      $device="zeit";
      $reading=$word[2];
      $reserve=$word[3]
        if( $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 = "hausstür"
    if( $device =~/hauseingangstür/);
  $device = "wecker"
    if( $device =~/we((ck)|g).*/);
  $device = "alarm"
    if( $device =~/alarm.*/);
   
  #-- 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 ";
  if( $name eq "none" ){
    return $str;
  }else{
    Log 1,$str;
  }


Ich würde gerne noch ein paar weitere Ideen für Steuersätze lesen.

LG

pah

Simon74

Keymatic würde mir einfallen:
Öffne die Haustür
Schließe die Haustür

oder Kurzform:
Haustür öffnen
Haustür schließen

Prof. Dr. Peter Henning

Das ist aber semantisch nicht korrekt:

Mit "Öffnen" ist das tatsächliche Öffnen gemeint - die Keymatic fährt die Falle ganz ein, oder ein Türöffner wird betätigt. Die Haustür springt dabei auf.
"Schließen" kann die Keymatic aber nicht, nur "Abschließen" und ""Aufschließen".

Bewusst und aus der Betriebserfahrung heraus daher: Ich verwende "sichern" und "entsichern", um den Zustand des Schlosses zu verändern, und "öffnen" zum tatsächlichen Öffnen.

LG

pah