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
Keymatic würde mir einfallen:
Öffne die Haustür
Schließe die Haustür
oder Kurzform:
Haustür öffnen
Haustür schließen
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