NEWS
ALEXA spricht endlich beliebigen text !!!
-
<size size="200">DIESER POST IST NICHT MEHR AKTUELL - WURDE IN ALEXA2-ADAPTER INTEGRIERT</size>
vielleicht habe ich es übersehen und es gibt das schon, aber ich habe seit langen danach gesucht: Alexa soll einen beliebigen text sprechen !!
mit diesem script funktioniert das: https://github.com/thorsten-gehrig/alexa-remote-control.
ist im moment wohl nur für linux user brauchbar !
mit exec() (im javascript) und dem oben genannten bash- script kann man einen beliebigen text ausgeben lassen
beispiel in linux terminal: alexa_remote_control_plain.sh -d Echozimmer -e speak:'endlich kann ich frei reden'
vielleicht findet sich ein programmierer, der daraus ein "pures" javascript machen kann!
-
Das wäre ja was. Habe aus dem Grund einen Google Home Mini für die Sprachansagen.
Dann könnte ich den wo anders einsetzen und auch die Echos sprechen lassen.
-
ist bei mir auch so - habe einen google mini nur für das sprechen - sonst lauter echo s
-
Genial 8-)
Ich habe es auf einer Raspberry erfolgreich getestet, dazu:
-
Neues Verzeichnis "xy" unter /opt/iobroker erstellt
-
In der alexa_remote_control.sh Amazon-User und PW eingetragen und in das neu erstellte Verzeichnis "/opt/iobroker/xy" kopiert
-
In Putty in das erstellte Verzeichnis gewechselt
-
"chmod +x alexa_remote_control.sh" ausgeführt
-
"sudo apt-get install jq" um jq zu installieren
Das war es schon. Jetzt im ioBroker ein JavaScript mit folgendem Code, und Alexa spricht den Text.
exec("bash /opt/iobroker/xy/alexa_remote_control.sh -d Wohnzimmer -e speak:'Guten Abend, Meister'");
Da das Logon-Script für Alexa nicht wirklich funktioniert und auch das Alexa-Script bei mir in letzter Zeit zickt, werde ich wohl erst mal alles umstellen und dieses .sh verwenden auch für TuneIn etc.
-
-
eigentlich habe ich das skript nur wegen dem zickenden alexa logon herangezogen - das mit dem speak habe ich rein zufällig gesehen.
bevor ich alles umstelle warte ich lieber noch wie stabil das login mit dem linux skript ist - kann ja sein, dass in zwei wochen wieder bzw. auch damit probleme auftreten - habe erstmal nur badradio ein und aus umgesetzt und lass das mal 2 wochen laufen
-
Cool. Ich habe es mal soef (Amazon Adapter) geschickt
-
Cool. Ich habe es mal soef (Alexa Adapter) geschickt
-
bevor ich alles umstelle warte ich lieber noch wie stabil das login mit dem linux skript ist - kann ja sein, dass in zwei wochen wieder bzw. auch damit probleme auftreten - habe erstmal nur badradio ein und aus umgesetzt und lass das mal 2 wochen laufen `
Macht auch absolut Sinn erst mal zu testen
Da die Alexa-Scripts allerdings für mich sehr unzuverlässig laufen, habe ich zum testen schon mal komplett umgestellt. Nur ein paar JS-Funktionen, die ich über überwachte Datenpunkte ansteuere (wie schon vorher). Ich mache aber im Endeffekt auch nur TuneIn, die Sprachausgabe ist jetzt echt nice, und Befehl "alles aus".
Dazu habe ich dieses Script unter Global, füllt natürlich keine Datenpunkte usw., aber für den ersten Test läuft es eben:
! ````
/**************************************************************************************- Alexa via Linux Shell fernsteuern.
- Many thanks to Thorsten Gehrig - Lötzimmer
- .sh Script: https://github.com/thorsten-gehrig/alexa-remote-control
- Mehr dazu: https://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html
- Installation: siehe https://forum.iobroker.net/viewtopic.php?f=37&t=15024#p156796
**************************************************************************************/
! /**
- Changelog:
- 0.0.1 - Mic (forum.iobroker.net) - Neu
*/
! ////////////////////////// KONFIGURATION ///////////////////////////////////////
! // Pfad zur .sh-Datei
const M_SH_PATH = '/opt/iobroker/xy/alexa_remote_control.sh';
! ////////////////////////// Ab hier nichts mehr ändern //////////////////////////
! /**- @desc Alexa, say it. Alexa will output the phrase in the room you specify
- @param string strAlexaDevice - the Alexa device
- @param string strPhrase - the phrase
*/
function G_AlexaSayIt(strAlexaDevice, strPhrase) {
G_PerformExec(strAlexaDevice, "-e speak:'" + strPhrase + "'");
}
! /**
- @desc Alexa will turn ALL devices off / pause
*/
function G_AlexaAllPause() {
G_PerformExec("ALL", "-e pause");
}
! /**
- @desc Alexa will turn on the TuneIn station you specify
- @param string strAlexaDevice - the Alexa device
- @param string strStationID - the TuneIn Station ID, e.g. "s259245" for "Het Bosch Waterfront Radio"
*/
function G_AlexaTunein(strAlexaDevice, strStationID) {
G_PerformExec(strAlexaDevice, "-r " + strStationID );
}
! ////////////////////////// Hilfsfunktionen /////////////////////////////////////
! /**- @desc performs the actual exec() function
- @param string strAlexaDevice - the Alexa Device
- @param string strCommand - the command
*/
function G_PerformExec(strAlexaDevice, strCommand) {
exec("bash " + M_SH_PATH + " -d " + strAlexaDevice + " " + strCommand);
}
! ````
-
Guten Abend könnte mir jemand verraten wie ich die globale Funktion aufrufe.
Hab es so versucht aber irgendwie klappt das nicht.
! ````
G_AlexaSayIt("Echo Wohnzimmer", "Das ist ein Test");Gruß Niko
-
hi mic,
ich bin nicht das hellste licht im programmieren - würdest du mir bitte kurz erklären (falls kurz möglich) warum du das global machst. ich mache das ähnlich wie du aber mit einen normalen blockly - hat das einen vorteil? alexa.rede ist ein bashscript, welches das alexa_remote_control_plain.sh nutzt.
-
Hi liv-in-sky,
würdest du mir bitte kurz erklären (falls kurz möglich) warum du das global machst `
Ich arbeite dann mit globalen Scripts Javascripts (JS), wenn ich auf diese von beliebigen anderen Scripts zugreifen möchte.
Im Prinzip ähnlich wie Du, wenn Du "alexa.rede.sh" ausführst, das ist ja quasi auch global verfügbar.
Zu meiner Vorgehensweise:
Ich habe Datenpunkte angelegt, einer heißt z.B. "tunein_current_station" (also Radiosender). Diese Datenpunkte werden überwacht mit einem nicht globalen Script (JS). Diese Datenpunkte spreche ich auch mit Alexa an.
var strObjPathB = 'javascript.0.mic.cloud-trigger.tunein_current_station'; on({id: strObjPathB, change: "any"}, function (obj) {
In diesem nicht globalen Script führe ich dann den gewünschten Code aus wenn sich der Datenpunkt ändert. In diesem Fall wird, sobald "3" in den Datenpunkt eingetragen wird, bei mir der Radiosender 1Live auf der Überall-Gruppe von Alexa gespielt.
G_AlexaTunein('Überall', strStationID);
(strStationID ist in dem Fall dann "s100198" für den Sender 1Live. G_AlexaTunein() führt die Funktion im globalen Script aus, das u.a. eben den exec() für "alexa_remote_control.sh" enthält.
In dem Script schalte ich auch noch den Receiver gleich mit ein.
Vorteil für mich: mein globales Script macht alles für mich, ich muss mich nicht mehr darum kümmern, wie der exec()-Befehl aufgebaut sein muss etc., um das "alexa_remote_control.sh" entsprechend zu steuern. D.h. ich kann das so beliebig einfach erweitern.
Ich bin allerdings erst seit ein paar Monaten bei ioBroker, die Fortgeschrittenen und Profis hier würden das wahrscheinlich noch deutlich eleganter lösen
-
Guten Abend könnte mir jemand verraten wie ich die globale Funktion aufrufe. `
Hi Niko,
funktioniert es denn, wenn Du ohne der globalen Funktion die exec() direkt ausführst?
Also z.B.
exec("bash /opt/iobroker/xy/alexa_remote_control.sh -d Wohnzimmer -e speak:'Das ist ein Test'");
(Pfad etc. natürlich anpassen, und vorausgesetzt, alexa_remote_control.sh funktioniert, wenn Du das z.B. mit Putty testest.)
Mir fällt außerdem auf, dass Du in Deinem Beispiel ein Alexa-Gerät mit "Echo Wohnzimmer" bezeichnest, heißt das wirklich so, also mit "Echo " vorangestellt? Das könnte zum Problem führen, ich hatte auch gemeint, "Echo" und "Alexa" dürfen in den Gerätenamen nicht enthalten sein.
-
Hi,
ja wenn ich die exec so ausführe klappt das ohne Probleme.
bin jetzt gerade durch dich auf die Lösung gekommen.
Hab den Namen "Echo Wohnzimmer" nochmal in Anführungszeichen gesetzt.
Also :
G_AlexaSayIt('"Echo Wohnzimmer"', 'Das ist ein Test');
So funktioniert es jetzt, werde aber bei Gelegenheit die "Echos" umbennen. Wußte nicht das es damit zu Problemen kommen kann.
Super das es jetzt klappt.
-
hi mic,
vielen dank für die ausführliche erklärung
-
Funktioniert wunderbar, danke für die Beschreibung wie man das nutzt
Ich habe es ohne alexarede.sh gemacht und mir das als Vorlage für die einzelnen anderen Scripte in Blockly vorbereitet.
So muss ich nur noch einen Textblock editieren.
der erste Textblock im Screenshot
bash /opt/iobroker/alexaTalk/alexa_remote_control.sh -d
Es müssen die Leerzeichen unbedingt mit eingefügt werden sonst klappts nicht
Blockly Export :
! ````
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="comment" id="W%hp(PL8C~/lyy-KyyEK" x="38" y="38"><field name="COMMENT">bash /opt/iobroker/alexaTalk/alexa_remote_control.sh -d Wohnzimmer -e speak:'Guten Abend, Meister'</field>
<next><block type="schedule" id="-v.JH~cM[EfD@no?]].k"><field name="SCHEDULE">* * * * </field>
<statement name="STATEMENT"><block type="exec" id="[bZ%PACuS/qXQnM,JH%X"><mutation with_statement="false"></mutation>
<field name="WITH_STATEMENT">FALSE</field>
<field name="LOG">log</field>
<value name="COMMAND"><shadow type="text" id="xA}H!7RUZownpg(GHv]S"><field name="TEXT">text</field></shadow>
<block type="text_join" id="/2tm:tVFv(@hH3(IqEW"><mutation items="5"></mutation>
<value name="ADD0"><block type="text" id="8fy9?O!/2OS7lh.~08|"><field name="TEXT">bash /opt/iobroker/alexaTalk/alexa_remote_control.sh -d</field></block></value>
<value name="ADD1"><block type="text" id="siK:tK;BvQRP/@MpHU!"><field name="TEXT">Wohnzimmer</field></block></value>
<value name="ADD2"><block type="text" id="*)ZS3UU6GgA
M_))36?"><field name="TEXT"> -e speak:'</field></block></value>
<value name="ADD3"><block type="text" id="0fOFO4Z]o_MZ6cg#Z;8"><field name="TEXT">Your Text Here!</field></block></value> <value name="ADD4"><block type="text" id="5)VlH?bM
tUbC3Q::0[~"><field name="TEXT">'</field></block></value></block></value></block></statement></block></next></block></xml>Grüße Tom
-
Leider funktioniert es bei mir nicht.
Ich bin wie von Mic beschrieben vorgegangen.
Weder als JS noch direkt in putty kommt eine Ausgabe.
Rufe ich im Terminal alexa_remote_control_plain.sh -d Wohnzimmer -e speak:'endlich kann ich frei reden' aus, kommt nur:
-bash: alexa_remote_control.sh: Kommando nicht gefunden.
Bestimmt nur eine Kleinigkeit für euch…Danke schon mal!
-
Mach mal ein./ beim Aufruf davor
-
versuch mal im directory den befehl :
chmod +x alexa_remote_control.sh
damit machst du die datei ausführbar
-
Leider funktioniert es bei mir nicht.
Ich bin wie von Mic beschrieben vorgegangen.
Weder als JS noch direkt in putty kommt eine Ausgabe.
Rufe ich im Terminal alexa_remote_control_plain.sh -d Wohnzimmer -e speak:'endlich kann ich frei reden' aus, kommt nur:
-bash: alexa_remote_control.sh: Kommando nicht gefunden.
Bestimmt nur eine Kleinigkeit für euch…Danke schon mal! `
Bist du im Verzeichnis wo die .sh-Datei liegt?Befehl lautet: bash alexa_remote_…...
-
Vielen Dank für eure Hilfe!
mit ./ davor oder auch mit bash, wird das Skript ausgeführt. Ich kann mich nur leider nicht anmelden, vermute, dass liegt an der Zwei-Faktor-Anmeldung?
Email und Kennwort habe ich natürlich
im Skript vorher hinterlegt.
chmod, hatte ich bereits gemacht, vielen Dank aber trotzdem!