Hallo zusammen,
nachdem die Plattform der offline Spracherkennung snips nun endgültig geschlossen ist, haben sich mehrere Alternativen aufgetan.
Die -meiner Ansicht nach- vielversprechendste und bereits weit entwickelte Alternative stellt die diesmal wirklich offene Plattform Rhasspy dar. Dieses github-Projekt ist relativ weit entwickelt und die dazugehörige community arbeitet mit Hochdruck an der Weiterentwicklung.
Siehe hier https://community.rhasspy.org/
Ein sehr gutes und ausführliches howto gibt es auch bereits. Siehe hier: https://rhasspy.readthedocs.io/en/latest/
MQTT und API sind bereits möglich, wobei in den kommenden Wochen das MQTT-Protokoll mit der Version 2.5 noch erweitert werden soll.
Der bestehende „snips“-LBS (19000289) von vento66 kann weitestgehend auch für Rhasspy verwendet werden.
d.JPG
Auf der Rhasspy gui lassen sich intents, slots und zusammenstellen. Alternativ können die *.inis auch per FTP bearbeitet und angepasst werden. Der etwas geänderte hat derzeit die ID 19100004
Auf der gui von Rhasspy schaut ein Beispiel derzeit wie folgt aus:
c.JPG
Trainierte Sätze:
b.JPG
Hier kann nochmal per Eingabe getestet werden, welche json string ausgegeben wird ohne den Einfluss von Sprache:
a.JPG
Ein Manko mit dem bestehenden „snips“-LBS gibt es allerdings noch. Ich hab nun schon mehrere Wochen versucht es zu lösen, allerdings ohne Erfolg. Vielleicht findet sich ja jemand, der es noch einbauen könnte.
Der bestehende LBS verarbeitet derzeit die slots:
Nachteil dabei ist, dass im Grunde noch ein slot für „location“ fehlt. Schwierig bzw. umständlich dabei wird es bei Sätzen wie:
f.JPG
Für dieses aufgeführte Beispiel gibt es allein schon zahlreiche Möglichkeiten, was in welcher Reihenfolge gesprochen werden könnte. Zum Beispiel diese hier:
e.JPG
Jede einzelne Variante muss angelegt und trainiert werden. Um dies zu vereinfachen und
Folgende Optimierung für den Baustein könnte ich mir folgendes vorstellen:
An E10 liegt nicht nur „mia“, sondern „mia|nachbarseite“ an und der Baustein soll dabei folgendes machen:
Wenn am Eingang [n] Trennzeichen | vorhanden, dann nutze Variable 1 [mia] für slot_room und Varibale 2 [nachbarseite] für slot_location. Ansonsten nehme Variable 1 als slot_name. Im Anschluss soll der Baustein durchlaufen und den entsprechenden Ausgang belegen.
Damit wären alle Optionen abgedeckt und man kann die „slot-Sätze“ relativ schnell in der gui zusammenbauen.
In den vergangenen Wochen habe ich es mit dutzenden funktionen (explode, preg_split,str_split, usw.) und vielen vielen Variationen versucht, immer ohne Erfolg.
Kann hier jemand weiterhelfen?
So schaut der code derzeit aus
BTW:
Irgendwann bin ich umgestiegen und habe mir einen (eigentlich) ganz simplen Baustein zusammen bauen wollen, der im ersten Schritt die Trennung eines Eingangs vornimmt und auf dem entsprechenden Ausgang wieder ausgibt. Ebenfalls ohne Erfolg.
Woran hapert es hierbei?
g.JPG
Danke und Gruß
edit:
Matrix Voice ist ebenfalls auf Rhasspy aufmerksam geworden und hat bereits erste Installationsanleitungen und Tipps hochgeladen:
https://www.hackster.io/matrix-labs/...sistant-faa221
https://www.hackster.io/matrix-labs/...creator-97f92e
nachdem die Plattform der offline Spracherkennung snips nun endgültig geschlossen ist, haben sich mehrere Alternativen aufgetan.
Die -meiner Ansicht nach- vielversprechendste und bereits weit entwickelte Alternative stellt die diesmal wirklich offene Plattform Rhasspy dar. Dieses github-Projekt ist relativ weit entwickelt und die dazugehörige community arbeitet mit Hochdruck an der Weiterentwicklung.
Siehe hier https://community.rhasspy.org/
Ein sehr gutes und ausführliches howto gibt es auch bereits. Siehe hier: https://rhasspy.readthedocs.io/en/latest/
MQTT und API sind bereits möglich, wobei in den kommenden Wochen das MQTT-Protokoll mit der Version 2.5 noch erweitert werden soll.
Der bestehende „snips“-LBS (19000289) von vento66 kann weitestgehend auch für Rhasspy verwendet werden.
d.JPG
Auf der Rhasspy gui lassen sich intents, slots und zusammenstellen. Alternativ können die *.inis auch per FTP bearbeitet und angepasst werden. Der etwas geänderte hat derzeit die ID 19100004
Auf der gui von Rhasspy schaut ein Beispiel derzeit wie folgt aus:
c.JPG
Trainierte Sätze:
b.JPG
Hier kann nochmal per Eingabe getestet werden, welche json string ausgegeben wird ohne den Einfluss von Sprache:
a.JPG
Ein Manko mit dem bestehenden „snips“-LBS gibt es allerdings noch. Ich hab nun schon mehrere Wochen versucht es zu lösen, allerdings ohne Erfolg. Vielleicht findet sich ja jemand, der es noch einbauen könnte.
Der bestehende LBS verarbeitet derzeit die slots:
- Slot name device
- Slot name OnOff
- Slot name value
Nachteil dabei ist, dass im Grunde noch ein slot für „location“ fehlt. Schwierig bzw. umständlich dabei wird es bei Sätzen wie:
f.JPG
Für dieses aufgeführte Beispiel gibt es allein schon zahlreiche Möglichkeiten, was in welcher Reihenfolge gesprochen werden könnte. Zum Beispiel diese hier:
e.JPG
Jede einzelne Variante muss angelegt und trainiert werden. Um dies zu vereinfachen und
Folgende Optimierung für den Baustein könnte ich mir folgendes vorstellen:
An E10 liegt nicht nur „mia“, sondern „mia|nachbarseite“ an und der Baustein soll dabei folgendes machen:
Wenn am Eingang [n] Trennzeichen | vorhanden, dann nutze Variable 1 [mia] für slot_room und Varibale 2 [nachbarseite] für slot_location. Ansonsten nehme Variable 1 als slot_name. Im Anschluss soll der Baustein durchlaufen und den entsprechenden Ausgang belegen.
Damit wären alle Optionen abgedeckt und man kann die „slot-Sätze“ relativ schnell in der gui zusammenbauen.
In den vergangenen Wochen habe ich es mit dutzenden funktionen (explode, preg_split,str_split, usw.) und vielen vielen Variationen versucht, immer ohne Erfolg.
Kann hier jemand weiterhelfen?
So schaut der code derzeit aus
PHP-Code:
###[DEF]###
[name = RhasspySpeech v0.1]
[e#1 option = Debug #init=8 ]
[e#2 trigger = MQTT Payload ]
[e#3 important = Rhasspy IntentName #init=switchlight ]
[e#4 important = Slot Name Device #init=rooms_name ]
[e#5 important = Slot Name OnOff #init=switchstate_name ]
[e#6 important = Slot On Synonyms #init=ein,an,einschalten,auf,aufdrehen]
[e#7 important = Slot Off Synonyms #init=aus,ausschalten,ab,abdrehen ]
[e#8 option = Slot Name Value #init=brightness ]
[e#9 option = Multiplikator #init=2.55 ]
[e#10 = Names 0 ]
[e#11 = Names 1 ]
[e#12 = Names 2 ]
[e#13 = Names 3 ]
[e#14 = Names 4 ]
[e#15 = Names 5 ]
[e#16 = Names 6 ]
[e#17 = Names 7 ]
[e#18 = Names 8 ]
[e#19 = Names 9 ]
[a#10 = Output 0 ]
[a#11 = Output 1 ]
[a#12 = Output 2 ]
[a#13 = Output 3 ]
[a#14 = Output 4 ]
[a#15 = Output 5 ]
[a#16 = Output 6 ]
[a#17 = Output 7 ]
[a#18 = Output 8 ]
[a#19 = Output 9 ]
[v#100 = 0.1 ] // Version
[v#101 = 19100002 ] // LBS ID
[v#102 = RhasspySpeech] // LBS name
[v#103 = 3 ] // Loglevel
[v#104 = 1 ] // One logfile per instance
[v#105 = 1 ] // log ID in each line
###[/DEF]###
###[HELP]###
###[/HELP]###
###[LBS]###
<?php
function LB_LBSID($id) {
if ($E=logic_getInputs($id)) {
if ($E[2]['refresh'] == 1 && $E[2]['value'] != "") {
setLogicElementVar($id, 103, $E[1]['value']); // set loglevel to #VAR 103
LB_LBSID_logging($id, "LBS: LBS started",7);
LB_LBSID_logging($id, "LBS: Payload changed to ".$E[2]['value'], 6);
$jsonArray = json_decode($E[2]['value'], true);
if(json_last_error() == JSON_ERROR_NONE){
$slotName = strtolower(trim($E[4]['value']));
$OnArray = explode(",",strtolower(trim($E[6]['value'])));
LB_LBSID_logging($id,"On Array ",8,$OnArray);
$OffArray = explode(",",strtolower(trim($E[7]['value'])));
LB_LBSID_logging($id,"Off Array ",8,$OffArray);
$jsonArray = json_decode($E[2]['value'], true);
for ($i = 10; $i < 20; $i++) {
LB_LBSID_logging($id, "Lese Eingang $i ".$E[$i]['value'],8);
if($E[$i]['value'] != ''){
$locationArray[$i] = strtolower(trim($E[$i]['value']));
}
}
LB_LBSID_logging($id,"Device Array ",8,$locationArray);
$intentName = explode(":",$jsonArray["intent"]["intentName"]);
$intentName = strtolower(trim($intentName[1]));
$pos = $loc = $ent = '';
unset($val);
$Name = false;
if ( $intentName == strtolower(trim($E[3]['value'])) ) {
$ent = $intentName;
foreach($jsonArray['slots'] as $slots ){
if(strtolower(trim($slots['slotName'])) == strtolower(trim($E[5]['value']))){
$Name=true;
break;
}
}
$brightArray = explode(",", strtolower($E[8]['value']));
LB_LBSID_logging($id,"Bright Array ",8,$brightArray);
$switch = 0;
foreach($jsonArray['slots'] as $slots ){
if(strtolower(trim($slots['slotName'])) == strtolower(trim($E[8]['value']))){
$Name=true;
break;
}
}
if($Name){
foreach($jsonArray['slots'] as $slots ){
if(in_array(strtolower(trim($slots['value']['value'])),$locationArray)){
if(strtolower(trim($slots['slotName'])) == $slotName){
$loc = $slots['value']['value'];
$posarray = (array_keys($locationArray, strtolower(trim($slots['value']['value']))));
$pos = $posarray[0];
break;
}
}
}
foreach($jsonArray['slots'] as $slots ){
if(in_array(strtolower(trim($slots['value']['value'])),$OnArray)){
$val = 1;
LB_LBSID_logging($id,"On found $val ",8);
$switch = 1;
break;
}
}
foreach($jsonArray['slots'] as $slots ){
if(in_array(strtolower(trim($slots['value']['value'])),$OffArray)){
$val = 0;
$switch = 1;
LB_LBSID_logging($id,"Off found $val $pos",8);
break;
}
}
if($switch != 1){
foreach($jsonArray['slots'] as $slots ){
if(in_array(strtolower(trim($slots['slotName'])),$brightArray)){
$switch = 0;
$val = $slots['value']['value'];
LB_LBSID_logging($id,"val found $val ",8);
break;
}
}
}
if($ent != ''){LB_LBSID_logging($id,"Snips IntentName found: $ent ",8);}
if($loc != ''){LB_LBSID_logging($id,"Slot Name Device found: $loc ",8);}else{LB_LBSID_logging($id,"Slot Name Device not found",8);}
if($val != ''){LB_LBSID_logging($id,"Slot Name Value found: $val ",8);}else{LB_LBSID_logging($id,"Slot Name Value not found",8);}
if($pos != ''){LB_LBSID_logging($id,"Slot Name Device Key found: $pos" ,8);}else{LB_LBSID_logging($id,"Slot Name Device not in array",8);}
}
if(isset($val) && $pos != ''){
LB_LBSID_logging($id,"switch $switch". $E[9]['value'],1);
if($E[9]['value'] != '' && $switch == 0){
$val = round(($val*$E[9]['value']),0);
LB_LBSID_logging($id,"Multiplikator erkannt ".$E[9]['value']." Neuer Wert $val" ,8);
}
logic_setOutput($id,$pos, $val);
LB_LBSID_logging($id,"Ausgang $pos auf $val gesetzt" ,8);
}
}else{
LB_LBSID_logging($id,"Snips IntentName not found",8);
}
}else{
if(phpversion() < 5.5){
LB_LBSID_logging($id,"incorrect JSON string " ,3);
}else {
LB_LBSID_logging($id,"incorrect JSON string - ".json_last_error_msg() ,3);
}
}
}
}
}
function LB_LBSID_logging($id, $msg, $priority, $var = NULL){
$E = getLogicEingangDataAll($id);
$logLevel = getLogicElementVar($id, 103);
if (is_int($priority) && $priority <= $logLevel && $priority > 0) {
$logLevelNames = array(
'none',
'emerg',
'alert',
'crit',
'err',
'warning',
'notice',
'info',
'debug'
);
$version = getLogicElementVar($id, 100);
$lbsNo = getLogicElementVar($id, 101);
$logName = getLogicElementVar($id, 102) . "-LBS$lbsNo";
$logName = preg_replace('/ /', '_', $logName);
if (logic_getVar($id, 104))
$logName .= "-$id";
if (logic_getVar($id, 105) == 1)
//$msg .= " ($id)";
strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo;
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg);
if (isset($var)) {
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================");
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var));
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================");
}
}
}
?>
###[/LBS]###
###[EXEC]###
<?
// nothing to do
?>
###[/EXEC]###
BTW:
Irgendwann bin ich umgestiegen und habe mir einen (eigentlich) ganz simplen Baustein zusammen bauen wollen, der im ersten Schritt die Trennung eines Eingangs vornimmt und auf dem entsprechenden Ausgang wieder ausgibt. Ebenfalls ohne Erfolg.
Woran hapert es hierbei?
g.JPG
PHP-Code:
###[DEF]###
[name = Liste zerlegen (0.2) ]
[e#1 TRIGGER = Liste ]
[e#3 OPTIONAL = Trenner #init=\|]
[a#1 = Liste ]
[a#2 = Element 1 ]
[a#3 = Element 2 ]
###[/DEF]###
###[LBS]###
<?
function LB_LBSID($id) {
if ($E=logic_getInputs($id)) {
$temp = explode('|',$E[1]['value']);
logic_setOutput($id,$i,$temp);
}
}
?>
###[/LBS]###
Danke und Gruß
edit:
Matrix Voice ist ebenfalls auf Rhasspy aufmerksam geworden und hat bereits erste Installationsanleitungen und Tipps hochgeladen:
https://www.hackster.io/matrix-labs/...sistant-faa221
https://www.hackster.io/matrix-labs/...creator-97f92e
Kommentar