PVA: Carola halt die Klappe!

Ok, Kritik angekommen: Sie redet zuviel, aber muß man deswegen gleich ausfallend werden?

PVA: Carola halt die Klappe!

Wer hat das seinem Sprachassistenten nicht auch schon mal an den Kopf werfen wollen, wenn der zum xten mal Unsinn gehört und einfach dazwischen gequatscht hat? Mit dem neuen Plugin SpeechGuard könnt Ihr das jetzt:

Carola HALT DIE KLAPPE

schaltet die Sprachausgabe für 10 Minuten aus,

Carola DU DARFST WIEDER

schaltet die Sprachausgabe sofort wieder ein.

Wer etwas weniger wütend sprechen möchte, kann das ganz einfach in seiner privaten UserConfig überschreiben bzw. eine alternative einbauen: Einfach in eine Configdatei z.B. ~/.config/pva/conf.d/99-sprachausgabe.conf schreiben:

command:“sprache|aus“,“SHUTUP“,““
command:“sprache|an“,“TALKTOME“,““

Fertig. So einfach ist das.

PVA: unerwartete KDE Connect Interaktion

Hi, völlig überraschend stellt sich heraus, daß Funktion wie geplant funktionieren, aber unerwartete Dinge offenbaren. Die Medienwiedergabe ist so ein Fall.

PVA: unerwartete KDE Connect Interaktion

Ich höre gerade übers Handy Musik und wollte Carola ein paar Reaktionstests unterziehen, als sie nicht reagierte 😐 Da wurde ich natürlich nervös, weil das untypisch war. Ich habe ja erst gedacht, daß die Soundausgabe auf den anderen Kopfhörern liegt, aber das war nicht der Fall. Sprach man sie direkt mit Namen an, reagiert die Kleine wie sie sollte.

Ein neues Mysterium? 🙂

Leider nicht, denn zur Steuerung meines Handies hatte ich KDE Connect auf dem PC gestartet. Ich zeige Euch mal die Topologie:

KDE Connect hat sich auf dem PinePhone die von Lollypop zur Verfügung gestellte MPRIS2 Schnittstelle geschnappt und die über das Netz genutzt. Soweit, so beabsichtigt 🙂 Tatsächlich ist KDE Connect auf dem PC noch einen Schritt weitergegangen und hat auf dem PC die MPRIS2 Schnittstelle von Lollypop exponiert und die hat nun wiederum Carola gesehen und benutzt.

Das bedeutet, ich kann jetzt auf dem PC mit Carola die Musik per Sprache steuern, obwohl beide nichts von einander wissen können, weil KDE Connect die Schnittstellen bridged 😀 Wie geil ist das denn bitte ?!!?!?!?!! 😀

Warum schwieg sie jetzt?

Weil sie, wenn eine Medienwiedergabe läuft, nicht auf den gesprochenen Text reagieren soll. Das ständige dazwischen quatschen würde einfach nur nerven.

PVA: Pluginsystem für Carola

Goldene Zeiten für alle Voice Assistenten Fans unter Euch. Sofern Ihr Java könnt, seid Ihr nun in der Lage Carola um neue Funktionen zu erweitern.

PVA: Pluginsystem für Carola

Im GitHub Pluginsverzeichnis ist ein Beispiel, daß Euch die Möglichkeiten aufzeigt. Ihr könnt reine Kommandoausführung machen, also auf Sprachbefehle lauschen und ausführen, oder Ihr erstellt einen periodischen Dienst, der die ganze Zeit im Hintergrund arbeitet, oder beides 😉

Vor ein paar Tagen habe ich ja auf die neue Prozessüberwachung hingewiesen, die wurde jetzt umgeschrieben, so daß Sie als Plugin arbeitet. Das führte dazu, daß wir die „nervigen“ Audiowarnungen abschalten können, wenn die Ursache bekannt ist.

Was müssen wir machen um ein Plugin zu schrieben?

Nicht so viel wie man denken würde. Erstmal brauchen wir die nötigen Kommandos und Texte:

command:“schalte|warnung|aus“,“SILENCELOADWARNING“,““
command:“schalte|warnung|ein“,“UNSILENCELOADWARNING“,““

text:“de“,“HEALTHRESPONSETURNEDOFF“,“es erfolgen keine weiteren audiowarnungen mehr“
text:“de“,“HEALTHRESPONSETURNEDON“,“Sprachwarnungen eingeschaltet“

Und dann natürlich den Plugincode:

 



package plugins.files;

import plugins.Plugin;
import io.Dos;
import server.PVA;
import hash.StringHash;
import hash.TwoKeyHash;

public class LoadTask extends Plugin {

	private String getFilter = ":silence:";
	private String setFilter = ":silence:";
	private TwoKeyHash validValues = new TwoKeyHash(); // this way we get multiply options for an argument 
	
	public LoadTask() {
		System.out.println("Class LoadTask Constructor called");
	}
	
	public void init(PVA pva) {
		this.pva = pva;
		info.put("hasThread","yes"); // Das sagt dem Pluginloader, das wir einen Prozess laufen lassen wollen
		info.put("hasCodes","yes");  // Das sagt dem PVA Task, daß wir Kommandos verarbeiten
		info.put("name","LoadTask"); // Ein eindeutiger Name, könnte auch de.linux-am-dienstag.LoadTask sein.
		vars.put("silence","no");    // hier merken wir uns, ob wir Sprachwarnungen ausgeben wollen: JA!
		validValues.put("silence","yes","ok"); // Dieses Plugin prüft, ob die Variable "Silence" geändert werden darf und wenn ja wie
		validValues.put("silence","no","ok");
	}
	
	public StringHash getPluginInfo() {
		return this.info;		// wir geben unsere Infos an den PluginManager damit der etwas über uns weiß.
	}

	public String  getVar(String name) {
		if ( getFilter.contains(":"+name+":") )   // Wir prüfen, ob die Variable "name" ausgelesen werden darf.
			return vars.get(name);            // Wenn JA, ann gibt Inhalt zurück
		return ""; // war wohl nichts.
	} 

        // Hier prüfen wir, ob eine bestimmte Variable von außen geändert werden darf. Das KANN man so machen, muß man aber nicht.

	public boolean setVar(String name,String value) {
		if ( getFilter.contains(":"+name+":") && validValues.get(name,value).equals("ok")  )  {
			vars.put(name,value);
			return true;
		}
		return false;
	}
	
	// getActionCodes() gibt alle Kommandos aus, die in der Config für dieses Plugin eingetragen sein sollten, ergo auf was es so hört:

	public String[] getActionCodes() {  return "SILENCELOADWARNING:UNSILENCELOADWARNING".split(":"); };

        // hier führen wir Kommandos aus. Dazu prüfen wir, ob wir das Kommando kennen. 
        // Optional gibt es noch den rohen text der Eingabe, so daß dort Infos ausgelesen werden können.
	public boolean execute(String actioncode, String rawtext) { 
		try {
			if ( actioncode.equals("SILENCELOADWARNING") ) {
				log("schalte warnung aus");
				setVar("silence","yes");
				pva.say( pva.texte.get( pva.config.get("conf","lang_short"), "HEALTHRESPONSETURNEDOFF") );
	
			} else if ( actioncode.equals("UNSILENCELOADWARNING") ) {
	
				log("schalte warnung ein");
				setVar("silence","no");
				pva.say( pva.texte.get( pva.config.get("conf","lang_short"), "HEALTHRESPONSETURNEDON") );
	
			} else return false;
	
			return true;
		}  catch (Exception localException) {
			localException.printStackTrace();
			return true;
		}
	};

	Float lastState = Float.parseFloat("0");
	
       // hier starten wir den eigentlich Überwachungsprozess und lesen die Load aus und berichten über unsere Funde via Sprachausgabe:
	public void run() {
		try {
			String load = "";
			int time = 0;
			boolean inform = false;

			while ( true ) {
				if (isInterrupted()) {
					return;
				}

				Float f = Float.parseFloat( dos.readPipe("cat /proc/loadavg").split(" ")[0].trim() );
				long  c = Long.parseLong( dos.readPipe("grep -c processor /proc/cpuinfo").trim() );
				
				if ( f > c && ( lastState < c || time > 60 ) ) {
						if ( vars.get("silence").equals("no") ) pva.say( pva.texte.get( pva.config.get("conf","lang_short"), "HEALTHRESPONSEHELPHELP") );
						time = 0;
						inform = true;
					
				} else if ( f > ( c*80/100) && ( lastState < ( c*80/100) || time > 60 ) ) {
						if ( vars.get("silence").equals("no") ) pva.say( pva.texte.get( pva.config.get("conf","lang_short"), "HEALTHRESPONSE80P") );
						time = 0;
						inform = true;
				} else if ( f < ( c/2 ) && lastState > (c/2) && inform ) {
						if ( vars.get("silence").equals("no") ) pva.say( pva.texte.get( pva.config.get("conf","lang_short"), "HEALTHRESPONSEOK") );
						inform = false;
				}	

				lastState = f;
				time++;
				sleep(1000L);

			}
		} catch (Exception localException) {
			localException.printStackTrace();
		}
	}
}

Die Load auslesen ist jetzt nicht so dramatisch schwer, so das das Plugin recht kurz ist. Da kann man natürlich auch viel umfangreichere Anwendungen schreiben.

Falls Euch der Javacode nichts sagt, wird es langsam Zeit mal Java zu lernen, daß ist recht einfach 😉

Ein cooles Plugin wäre eine Anbindugn an ChatGPT 😉 Vielleicht will ja mal wer oder fragt doch ChatGPT mal, der braucht doch auch Code 😉