Modulentwicklung für Rhasspy Sprachassistent

Begonnen von drhirn, 11 März 2021, 15:59:50

Vorheriges Thema - Nächstes Thema

drhirn

Zitat von: Beta-User am 31 Mai 2022, 16:54:48
Dann lasse man Rhasspy in Ruhe trainieren (öhm, mein Server kam da an seine Grenzen...)

Von durchschnittlich 4s für's Training auf
Training completed in 73.96 second(s)

;D

Beta-User

Zitat von: drhirn am 01 Juni 2022, 09:48:42
Von durchschnittlich 4s für's Training auf
Training completed in 73.96 second(s)

;D
;D ;D ;D ...
Hatte ja "Spaß" versprochen 8) . Bei meiner ollen 2-Kern-AMD-Murmel kannst du bequem Faktor 10 nehmen, und wie gesagt: Man merkt es dann auch in der Auswertung (was ich bei deinem Server noch nicht annehme)...
(OT: Es hat sich für mich bewährt, sowas auf eher schwächerer Hardware auszutesten. Auch meine damaligen ersten Fehlkonfigurationen in FHEM wären mir vermutlich auf meinem jetzigen Server gar nicht aufgefallen, auf dem Pi2B aber schon...)

Na ja, jedenfalls ist die "Endlosbuchstabier-Option" mAn. nicht der Stein der Weisen, selbst wenn man das vermutlich in erträgliche Regionen bringt, wenn man z.B. die Zahl der möglichen Buchstaben etwas reduziert und/oder die möglichen Varianten pro Buchstabe.

Grundlage war übrigens von hier: https://de.wikipedia.org/wiki/Buchstabiertafel#Tabelle_mit_historischen,_aktuellen_und_diskutierten_Versionen (und auch das u.a. darunter zu findende ICAO-Alphabet).

Wenn Buchstabieren, dann also eher nach dem Vorschlag von JensS. Muss ich aber auch erst mal in Ruhe testen...
Zitat von: JensS am 31 Mai 2022, 22:20:09
Das Problem bei der Erkennung von einzelnen Buchstaben wie "a" ist, dass die ASR schon auf den Sprecher hört, obwohl aus dem Lautsprecher noch Sprachausgabe tönt. [...] Bei der Langversion (nach DIN) "Anton" ist daher die Erkennung besser.
Neben dem Echo-Thema sehe ich aber ein paar weitere "Wölkchen am Horizont":
- Die Kurzversionen dürften "nogo-Zone" sein. Sonst wird Stille nicht nach "CancelAction" ("nein" ist mein kürzestes Wort und das wird anscheinend für Stille erkannt) abgeleitet und so ggf. dann auch kein IntentFilter-Reset durchgeführt. Außerdem könnte es sein, dass sonst neuerdings eine Sprachausgabe ertönt, weil (bei deaktiviertem Intent ) "intentNotRecognized"-Messages versendet werden.
- Wenn man einzeln buchstabiert, muss der User immer sauber aufpassen, dass er im Timing bleibt;
- läßt man Mehrfacheingaben zu (vielleicht bis zu max. 5-8?), gilt das vermutlich umso mehr;
- im Prinzip müßte/könnte man zwischendurch prüfen lassen, ob das (Zwischen-) Ergebnis bereits hinreichend ist (das klingt aber nach (für meine Begriffe) ziemlich komplexem Code);
- das ganze müßte generischer aufgebaut sein, also für im Prinzip beliebige Eingaben tauglich sein (das Ende wäre dann durch einen entsprechenden Key, z.B. {Spelling:end} zu kennzeichnen). customData dürfte dann dazu dienen, das zu füllende Datenfeld zu benennen? (Zwischenspeichern muss dann anders gehen, was aber kein allzugroßes Ding sein sollte, machen wir in anderen Fällen ja auch).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

drhirn

Ich würde da nicht zu viel Energie rein stecken. Hab so das Gefühl, da kommen keine wirklich brauchbaren Lösungen raus.
Das Einzige, was ich mir vorstellen könnte ist, dass Rhasspy das Profil bzw. die Sprache wechseln kann. Und man dann halt einen Satz wie "Spiel bitte das englische Lied Blowing in the Wind" verwendet.

Beta-User

#1458
Na ja, "Energie reinstecken" ist relativ.

Prinzipiell fände ich es cool, wenn das mit der Musikauswahl (abseits irgendwelcher starren vorgefertigten Lösungen, z.B. via Playlist/Szenenauswahl) klappen würde. Manchmal muss man halt auf sowas eine Zeitlang "rumkauen" bis man einen brauchbren Weg findet. Mal sehen.
Und wenn einzelne Bausteinchen mal getestet bzw. optimiert (oder als Irrweg bekannt) sind, hat das ja auch was...

In
Zitat von: drhirn am 01 Juni 2022, 10:36:45
einen Satz wie "Spiel bitte das englische Lied Blowing in the Wind" verwendet.
ist vermutlich ein doppeltes Problem zu finden:
- Die Auswertung (Schalter für "englisch") müßte "zwischendurch" in Rhasspy erfolgen. Wäre mir neu, dass das bei der Eingabe ginge (@JensS: Das Beispiel für die Ausgabe mit Miminc 3 hatte ich gesehen, cool!)
- Wenn Rhasspy weiß, welche phonemische Schreibweise "Blowing in the Wind" hat, ist es vermutlich völlig egal, welche Sprache es ursprünglich mal war, das muss halt im Zeitpunkt der Erkennung hinterlegt sein. Daher auch mein Hinweis, dass es mir eher unwahrscheinlich erscheint, meine Sammlung ohne größeren Nacharbeitsaufwand per script in einen slot zu packen.

Wobei: Mein nächster gedanklicher Angang wäre gewesen, zumindest mal zu versuchen, eine "artist"-Liste mit den "wichtigsten" Künstlern zu basteln (z.B.: alle, die mehr wie 20-100 Titel in der Datenbank haben). Weiß nicht, ob da "Earth, Wind & Fire" auftaucht, aber "Boold, Sweat &Tears" bestimmt, und dann würde man zumindest mal eine Vorstellung davon bekommen, wie in etwa der tatsächliche Aufwand aussähe...

OT:
Falls jemand eine allgemeine Script-Idee dazu hat (also für ein slot program, https://rhasspy.readthedocs.io/en/latest/training/#slot-programs, analog https://community.rhasspy.org/t/whats-the-craziest-thing-you-can-or-cannot-do-with-rhasspy/3648/24), würde mir das ggf. schon sehr weiterhelfen. Nur eben nicht für KODI, und nach Möglichkeit auch nicht "alles auf einmal"... Hier ginge die Abfrage entweder auf dem "MPD-Way" oder über DNLA-Methoden (es läuft auch ein miniDNLA-Server (oder wie auch immer das heutzutage heißt)).

Nachtrag: ggf. eine Basis - https://manuel-io.github.io/blog/2020/03/29/query-minidlna-to-list-media-files/
und auch interessant: https://python.hotexamples.com/de/examples/mpd/MPDClient/list/python-mpdclient-list-method-examples.html
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Beta-User

Zitat von: JensS am 01 Juni 2022, 15:50:29
https://kamprianis.eu/michalis/i.think/personal/210612-home-assistant-example.html
Sowas in der Art?
Jo!

Nur halt für MPD oder eben "ReadyMedia" (wie miniDNLA jetzt wohl heißt). Das Problem ist wohl, dass die beide - zumindest nach meinen bisherigen kurzen Recherchen - keine abgegrenzten Suchläufe (in obigem Code: "die ersten 100 Playlisten") zu kennen scheinen. Bedeutet: Man muss sich wohl für diese beiden mehr oder weniger immer eine Gesamtliste/die ganze Datenbank schicken lassen und kann dann selbst rauswerfen, was man nicht braucht. Tja, wenn man jetzt programmieren könnte...

Na ja, jedenfalls war bisher der "Playlisten-Modus" nicht so meiner (es gibt ihn, aber mehr als Hilfsmittel, um Radiostationen aus TvHeadend abzuspielen), aber gerade das scheint zum einen der häufiger anzutreffende Weg zu sein und zum anderen ist das auch der, für den am meisten Code schon (für mich) einfach zu verwerten vorhanden wäre (in Perl ;) , im MPD-Modul)....
Mal sehen, ob ich damit (irgendwann!) anfange?

An sich wäre es "besser" (=generischer und auch für meinen "2. Player" universeller nutzbar), den DNLA-Weg zu nehmen, MPD scheint etwas aus der Mode gekommen zu sein (kann aber "normalize" für die Lautstärke, daher ist mir der zumindest im Moment noch sehr viel lieber ;) ). Oder nehme ich doch noch mal einen Anlauf mit KODI?!? (Oder schau mal in den UPNP-FHEM-Modul-Code, da war doch auch einiges los in letzter Zeit...?!?)

Muss da wohl noch etwas drauf rumkauen ;D ::) ;D ...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

#1461
Beim mpd kannst du über telnet u.a. nach den Playlists fragen:
echo listplaylists | nc 192.168.x.x 6600
Mit commands kanst du dir die commands auflisten lassen.

p.s. Wenn du das in (FHEM) perl machen willst, kannst du doch ein MPD-Device definieren und mit get MPD playlists oder get MPD music arbeiten. Der ganzen Ramsch muss dann aber rüber zu Rhasspy und dort in ein Verzeichnis geschrieben werden.
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Beta-User

Thx, die Ausgabe erklärt dann auch, was im MPD-Modulcode erst etwas komisch anmutet...

Damit ich's wiederfinden: https://mpd.readthedocs.io/en/latest/protocol.html enthält die komplette Beschreibung, und eine gute Ausgangsbasis hat man, wenn man schlicht erst mal alles abruft mit
echo list album group albumartist | nc 192.168.xx.xx 6600 > mpdcontents.txt (strg+c für's Beenden des Vorgangs).

Da sowieso eine Nachbearbeitung erforderlich erscheint, ist es vermutlich einfacher, erst mal damit eine (automatisiert erstellte) slot-Datei zu basteln, statt direkt ein slot-Programm draus zu machen (bei mir sind da u.A. auch unicode-codierte Interpretennamen in japanischen Schriftzeichen (?) dabei...).

Achso: Das MPD-Device direkt anzuzapfen ist vermutlich keine gute Idee, irgendwann (ziemlich schnell) hatte ich dem verboten, nach den ergänzenden Infos beim Server anzuklopfen. Stellt man loadPlaylists oder loadMusic auf was anderes wie "0", steht FHEM praktisch ::) ... Hat mich bisher nicht näher interessiert, warum, weil andere Wege sowieso bequemer waren, und auch jetzt geht es ja eigentlich darum, wie man es generisch macht - also optimalerweise ganz außerhalb von FHEM (was ja Perl nicht ausschließt ;) ).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

#1463
Zitat von: Beta-User am 01 Juni 2022, 19:29:35
echo list album group albumartist | nc 192.168.xx.xx 6600 > mpdcontents.txt (strg+c für's Beenden des Vorgangs).
Kleiner Tipp - ein -q 1 beendet die Verbindung automatisch.
echo list album group albumartist | nc -q 1 192.168.x.x 6600 > mpdcontents.txt

Letztlich wäre (aus meiner Sicht) ein Script in Python die beste Wahl, da Rhasspy das in allen Systemen mitbringt.

Gruß Jens

p.s. Hab gerade mit Hilfe deines Links zu MPD Folgendes gelesen:
ZitatAll data between the client and the server is encoded in UTF-8
Unicode wäre dann ungewöhnlich.
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

JensS

#1464
Hier ein lauffähiges Pythonscript in /username/.config/rhasspy/profiles/de/slots/import
Diese Datei muss ausfürbar sein. Es werden automatisch die Slots import und fhemtester angelegt.
Leider zickt MPD rum und es kommt nur OK MPD 0.21.4. Mit dem list .* beim FHEM-Telnetport funktioniert es.
#!/usr/bin/env python3

import socket

server_addr = ("192.168.x.x", 6600)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.settimeout(2)
file = open("/pi/.config/rhasspy/profiles/de/slots/fhemtester","w")
client_socket.connect(server_addr)
sendestring = b'listplaylists\n'
client_socket.send(sendestring)
while True:
  datenstring = client_socket.recv(2048)
  datenstring = datenstring.decode()
  file.write((datenstring+"\n"))
  if "OK\n" in datenstring:
    break
file.close()
client_socket.close()
del client_socket
print("Das ist eine Platzhalterdatei")


Aufgerufen wird das Ganze beim Training durch [fhemtest]
$import
in der sentences.ini.

p.s. Geht nun doch.  :)
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Beta-User

 :) Bin mit Perl schon etwas weiter...

#!/usr/bin/perl

#perl ./getMpdSlots.pl > mpd_contents_out.txt

use strict;
use warnings;
use IO::Socket;

my $host = '127.0.0.10';
my $port = '6600'; #default
my $timeout = 2;
my $password = '';

my $maxartists = 10;

my $sock = IO::Socket::INET->new(
    PeerHost => $host,
    PeerPort => $port,
    Proto    => 'tcp',
    Timeout  => $timeout
    );

printf("started\n");
die $! if !$sock;

printf("sock ok\n");

while (<$sock>)  # MPD rede mit mir , egal was ;)
{ last if $_ ; } # end of output.

chomp $_;

die  "not a valid mpd server, welcome string was: $_." if $_ !~ m{\AOK MPD (.+)\z};

if ($password ne '') {
  # lets try to authenticate with a password
  print $sock "password $password\r\n";
  while (<$sock>) { last if $_ ; } # end of output.

  chomp;

  if ( $_ !~ m{\AOK\z} ) {
    print $sock "close\n";
    close($sock);
    die "password auth failed : $_." ;
  }
}

my ($artists, $artist, @playlists);

#start playlist request
print $sock "listplaylists\r\n";
while (<$sock>) {
  die  "ACK ERROR $_" if $_ =~ s/^ACK //; # oops - error.
  last if $_ =~ m/^OK/;    # end of output.

  if ( $_ =~ m{\A(?:playlist[:]\s)(.+)} ) {
    push @playlists, $1;
  }
}

print $sock "list album group albumartist\r\n";
while (<$sock>) {
  die "ACK ERROR $_" if $_ =~ s/^ACK //; # oops - error.
  last if $_ =~ m/^OK/;    # end of output.

  if ( $_ =~ m{\A(?:AlbumArtist[:]\s)(.*)} ) {
    $artist = $1;
  }
  if ( $_ =~ m{\A(?:Album[:]\s)(.*)} ) {
    next if !$artist || !$1 || $artist eq "Various Artists";
    $artists->{$artist}->{cnt}++;
    push @{$artists->{$artist}->{albums}}, $1;
  }
}

#got all data?
print $sock "close\n";
close($sock);


printf("Playlists section \n\n") if @playlists;
for ( @playlists ) {
    printf("( ( %s ):%s )\n", $_, $_);
}

printf("\n") if @playlists;
my @artlist = sort {
        $artists->{$b}{cnt} <=> $artists->{$a}{cnt}
        or
        $artists->{$a} <=> $artists->{$b}
        }  keys %{$artists};

printf("Artists section \n\n") if @artlist;
my $albums;
for my $i (0..$maxartists-1) {
    printf("( ( %s ):%s )\n", $artlist[$i], $artlist[$i]);
    for my $alb ( @{$artists->{$artlist[$i]}->{albums}} ) {
        $albums->{$alb} = 1;
    };
}

printf("\nAlbums section \n\n") if @artlist;
for my $alb (sort keys %{$albums}) {
    printf("( ( %s ):%s )\n", $alb, $alb);
}

1;

__END__

ABER: Das Ergebnis ist nur bedingt "tauglich" (wie erwartet).

Werde vermutlich mal versuchen,
- einen "cleanup"-Code zwischenzuschalten, der die Rohdaten "links" so aufbereitet, dass Rhasspy das auch trainiert...
- einen kombinierten Slot zu basteln, der Album und Artist gleich in tauglicher Kombination zusammenbringt {Album} <by> {Artist}.

Dazu ist vermutlich mein "Altschnippselchen" hier noch hilfreich:
for my $i (0..$maxartists-1) {
    for my $alb ( @{$artists->{$artlist[$i]}->{albums}} ) {
        printf("( ( %s ):%s )\n", $alb, $alb);
    };
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

Zitat von: JensS am 02 Juni 2022, 20:13:31
p.s. Geht nun doch.  :)
:)

Das Problem (oder besser: eines der vielen Probeme....) ist weniger die Playlist-Geschichte. Das sollte in den Griff zu bekommen sein, obwohl "MediaControl" bisher auch noch keinen passenden Command kann. ABER: Zumindest das kann MPD heute schon, wenn man ihn passend füttert... (der Verstärker wohl eher nicht).

Ab da wird es aber dann lustig...

Ein paar findings:
- MPD (heutiges FHEM-Modul) kann keine Artist/Album-Anweisungen verarbeiten (=> kleine Erweiterung notwendig);
- Die Syntax, um das dann sinnvoll zu befüllen, ist lustig (https://mpd.readthedocs.io/en/latest/protocol.html#escaping-string-values) => die Vorverarbeitung der dann eventuell irgendwann in RHASSPY ankommenden Daten ist noch viel lustiger...
- Mein erster Wurf für "kombinierten Bereinigungscode" scheint zu laufen, da kommt dann z.B. sowas raus:
( ( Chicago three ):Chicago III ){Album} <by> ( ( Chicago ):Chicago ){AlbumArtist}
( ( [The] Song Remains the Same ):The Song Remains the Same ){Album} <by> ( ( Led Zeppelin ):Led Zeppelin ){AlbumArtist}
( ( Preservation Act one ):Preservation Act 1 ){Album} <by> ( ( [The] Kinks ):The Kinks ){AlbumArtist}
( ( Ballads  and  Blues 1982 - 1994 ):Ballads & Blues 1982 - 1994 ){Album} <by> ( ( Gary Moore ):Gary Moore ){AlbumArtist}
( ( Happiness Is the Road  Volume 1  Essence ):Happiness Is the Road, Volume 1: Essence ){Album} <by> ( ( Marillion ):Marillion ){AlbumArtist}

Bin mal gespannt, ob Rhasspy mit den so bereinigten Zwischenergebnissen im Training klarkommt. Überraschend fand ich gestern, dass die "guesses" von Rhasspy eigentlich ganz ok waren, wie denn die (relativ wenigen) englischen Begriffe so auszusprechen wären.

Wie man erahnen kann, ist da einiges dabei, was man trotzdem nochmal nachbearbeiten müßte oder auf eine Art "ignore"-Liste setzen. Da Rhasspy die slots immer wieder zu "shuffeln" scheint, ist Wiederfinden irgendeiner Info ziemlich spaßfrei, und man kann das ganze mAn. auch nur zu einem gewissen Punkt sinnvoll automatisieren. Mit "einfach mal so nebenbei" machen lassen, ist vermutlich kein Blumentopf, aber ein Stall von Problemem zu gewinnen, v.a., wenn man eine größere Sammlung hat.

Danach dann der nächste Schritt => Vorbereitung für die MPD-Ansteuerung.

Daneben habe ich mal in die commandref zu YAMAHA_.* geschaut, v.a. auch YAMAHA_MC. Aber da findet sich nichts in Sachen Playlist-Steuerung (obwohl mein Yamaha das "irgendwie" kann, wenn ich die Musiccast-App auf meinen ReadyMedia-Server loslasse...). Muss wohl damit etwas spielen und ggf. auch die "neuen" Module zu DLNA-Geräten mal installieren...

Alles also ein weites Feld ::) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

#1467
So, nach etwas testen ein kleiner Zwischenstand:

RHASSPY (svn-Version, Doku und Feinschliff fehlen noch) kann jetzt auch "playlist"-Befehle absetzen (MPD wird automatisch erkannt).

sentence dazu:
[de.fhem:MediaControls]
atDevice=[(am|des|bei|beim|auf dem)] $de.fhem.Device-media{Device}

spiele{Command:cmdPlaylist} $de.playlists{Playlist} <atDevice>

Theoretisch sollte das mit einer etwas abgewandelten Fassung von JensS's Script direkt gehen.




Ansonsten ist es weniger "spaßig", weil das Training mit meinen automatisierten slots/Keys nicht so recht will. Es hilft zwar weiter, den "input" um Klammern usw. zu erleichtern, aber Klammern "hinten" führen auch zu Syntaxfehlern beim Training. 

Mal sehen, für mich wäre der "Umweg" über die musicbrainz-Tags denkbar:
echo list album group artist group musicbrainz_albumid | nc 192.168.xx.xx 6600

Und es könnte für den Rest auch ausreichend sein, die "unleserlichen" Teile einfach wegzulassen, und das ganze dann z.B. an MPD als Perl-regex-like EXPRESSION zu übergeben. Das ist dann aber schon sehr speziell auf MPD zugeschnitten. Für mich nicht der Beinbruch, aber eben doch dann nicht so universell.

Na ja, anbei jedenfalls mal meine aktuellen weiteren Codes, falls jemand mit basteln will ;) ...

Zum MPD siehe auch https://forum.fhem.de/index.php/topic,18517.msg1223957.html#msg1223957, es geht damit auch sowas:set myMPD addSelection ((artist =~ 'Gary.M') AND (album =~ 'Run.for'))

EDIT: script ist so geändert, dass es auch als slot-Programm tauglich sein sollte (oben einfach den "$mode" entsprechend einstellen. Wenn möglich, gibt es jetzt die/eine musicbrainz-Id aus (es kann zu Problemen/Verwechslungen mit gleich benannten Alben kommen, wenn man den "Einzel-slot" generieren läßt).
"Problemzeichen" sind durch Punkte ersetzt, v.a. da, wo es keine eindeutige ID gibt (v.a. bei Albennamen mit Sonderzeichen).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

Zitat von: Beta-User am 04 Juni 2022, 13:09:37
Es hilft zwar weiter, den "input" um Klammern usw. zu erleichtern, aber Klammern "hinten" führen auch zu Syntaxfehlern beim Training. 

Rhasspy verarbeitet die Syntax der sentences.ini nicht immer sauber. Wenn eine Zeile innerhalb eines Intents mit "[" beginnt, sollte ein Backslash davor helfen. Die Erfahrungen sind aber anders und im Anwendungsfall hilft eine Kapselung der eckigen Klammern vorn und eventuell auch hinten, da Rhasspy alle eckigen Klammer hinten als Abschluss eines Intents erkennt.
spiele{Command:cmdPlaylist} $de.playlists{Playlist} ([(am|des|bei|beim|auf dem)] $de.fhem.Device-media{Device})

Bin mal wieder auf dem Sprung und schaffe es dieses WE auch nicht zu testen.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Beta-User

#1469
Na ja, mal sehen...

Anbei eine aktualisierte Fassung des scripts

Was leider nicht ganz klappt, ist das Ding gleich universell als slot-script via bash aufrufen zu können, mit der Frage, wie man den "$mode" mit dem Aufruf auf der shell übergibt, bin ich bisher nicht klargekommen...

Was aber gehen sollte: Auf die eigenen Bedürfnisse anpassen, und dann entprechend viele Kopien unter passendem Namen (und dem jeweiligen korrekten $mode) verwenden.

In $mode=4 kommt dann bei Alben, die musicbrainz-ID's haben dann z.B. sowas raus:
( ( Lola versus Powerman and the Moneygoround  Part One ):(895abd03-6d7d-4fde-8016-05dcee7fc4b7) ){AlbumId} [<by> ( ( [The] Kinks ):(The.Kinks) ){AlbumArtist}]
( ( Radiation ):(cf54eea5-b411-42e0-9a74-d8c140ef34e3) ){AlbumId} [<by> ( ( Marillion ):(1a02e1e4-000e-46fa-83de-f3a36674e4fc) ){AlbumArtistId}]

Damit müßte sich was anfangen lassen....

Ist das nicht so optimiert getaggt, müßte auch sowas hier ausreichen:
( ( Chicago eight teen ):(Chicago.18) ){Album} [<by> ( ( Chicago ):(Chicago) ){AlbumArtist}]
MPD kann ja auch Perl-regex-like Anweisungen verarbeiten.

Jetzt lasse ich mal Trainieren und irgendwann schau' ich dann mal, wie man das "an den MPD" bringt 8) ...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files