Mit der Android-App Macrodroid und Raspberry pi spricht die Stimme langsam die Benachrichtigung des Smartphones. Ich habe ein System gemacht.
Macrodroid ist eine Anwendung, die Aufgaben unter Android automatisieren kann. Verschiedene Aktionen können automatisch ausgeführt werden, ausgelöst durch ein Ereignis unter Android.
Verknüpfen Sie dies mit einem einfachen Webserver, der in Razpai eingerichtet wurde. Wenn eine Benachrichtigung eingeht, senden Sie den Inhalt an den Webserver und spielen Sie die Stimme mit AquesTalkPi. Ausgabe.
Wenn Sie Raspeye verwenden, müssen Sie möglicherweise die SD-Karte ersetzen, um die Umgebung neu zu erstellen. In einem solchen Fall müssen Sie sich nicht daran erinnern, wie Sie eine Umgebung erstellen, wenn Sie über eine Docker-Datei verfügen.
Also werde ich einen einfachen Webserver mit Docker betreiben. (Obwohl Docker übertrieben zu sein scheint, weil diesmal fast keine Code-Menge vorhanden ist)
Die diesmal erstellte Docker-Datei lautet wie folgt.
Dockerfile
FROM balenalib/rpi-raspbian:buster
RUN apt-get update && \
apt-get -y install --no-install-recommends alsa-utils python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# https://www.a-quest.com/products/aquestalkpi.Laden Sie nach dem Lesen der HTML-Programmlizenz Folgendes herunter
RUN mkdir /root/bin && \
curl -kL "https://www.a-quest.com/cgi-bin/download.php?download=1&readed=yes" -o /tmp/aquestalk.tgz && \
tar xzvf /tmp/aquestalk.tgz -C /tmp && \
mv /tmp/aquestalkpi/AquesTalkPi /root/bin && \
mv /tmp/aquestalkpi/aq_dic /root/bin && \
rm /tmp/aquestalk.tgz && rm -r /tmp/aquestalkpi
ADD ./softalk_server.py /root/bin
EXPOSE 8000
CMD ["python3", "/root/bin/softalk_server.py"]
Außerdem wurde der einfache Webserver unter Python ausgeführt.
softalk_server.py
# -*- coding:utf-8 -*-
from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib import parse
import subprocess
KEYS = ["app", "title", "message"]
#Lassen Sie den Text langsam mit der Stimme sprechen
def talk(text):
p1 = subprocess.Popen(
["/root/bin/AquesTalkPi", text],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
p2 = subprocess.Popen(
["aplay"],
stdin=p1.stdout, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT
)
p1.stdout.close() # SIGPIPE if p2 exits.
p2.communicate()[0]
# [app, title, messa]Wörterbuchtext bestehend aus den Schlüsseln von_Basierend auf dic
#Bereiten Sie eine gesprochene Nachricht vor
def format_message(text_dic):
if text_dic['title'] is None:
return None
if text_dic['message'] is None:
return None
if len(text_dic['message']) < 40:
formatted = '{app}Von{title}Die Nachricht trägt den Titel.{message}'.format(
**text_dic
)
else:
formatted = '{app}Von{title}Die Nachricht trägt den Titel.'.format(
**text_dic
)
return formatted
#Einfacher Webserver
#Wenn Sie eine GET-Anforderung erhalten, die auf diesem Parameter basiert
#Spielen Sie die Stimme langsam aus dem Lautsprecher
class RequestHandler(SimpleHTTPRequestHandler, object):
def do_GET(self):
query = parse.urlparse(self.path).query
query_dic = parse.parse_qs(query)
self.send_response(200)
for key in KEYS:
if key not in query_dic:
query_dic[key] = None
else:
query_dic[key] = query_dic[key][0]
print('query = {}'.format(query_dic))
formatted = format_message(query_dic)
#Angenommen, die Parameter der GET-Anforderung
#Wenn nicht, ist "Keine" formatiert und es wird kein Audio abgespielt
if formatted is not None:
talk(formatted)
self.end_headers()
if __name__ == '__main__':
text = 'Benachrichtigungsserver gestartet'
talk(text)
httpd = HTTPServer(("", 8000), RequestHandler)
httpd.serve_forever()
Führen Sie dann den folgenden Befehl in dem Verzeichnis aus, in dem sich "Dockerfile" und "softalk_server.py" befinden.
$ docker build -t softalk_notification .
$ docker run -d --name notification_server --device /dev/snd -p 8000:8000 --restart=always softalk_notification
Durch Hinzufügen der Option "--restart = always" ist es praktisch, den Container automatisch neu zu erstellen, selbst wenn er neu gestartet wird (auch wenn der Docker-Daemon gestoppt ist).
Es wird auch "dev / snd" an "--device" übergeben, um den Ton des Lautsprechers mit ALSA abzuspielen.
Außerdem ist der Webserver-Port sowohl für den Container als auch für den Host auf "8000" eingestellt.
Wenn alles gut geht, sollte die nächste GET-Anfrage langsam sprechen.
$ curl localhost:8000 --get --data-urlencode 'app=langsam' --data-urlencode 'title=Prüfung' --data-urlencode 'message=langsamしていってね'
Als nächstes stellen wir eine GET-Anfrage an den Webserver, wenn die Benachrichtigung an Android kommt. Dies kann mit Macrodroid erreicht werden.
Erstellen Sie nach der Installation von Macrodroid über Google Play das folgende Makro.
--Auslösen
--Aktion
URL
192.168.0.2:8000?app=[not_app_name]&title=[not_title]&message=[notification]
Tippen Sie nach dem Einstellen des Auslösers und der Aktion auf das Häkchen unten rechts auf dem Bildschirm. Bitte geben Sie die Kategorie und den Makronamen entsprechend ein.
Das Setup ist abgeschlossen.
Diesmal ist es die Mindesteinstellung, daher denke ich, dass eine Feineinstellung für den praktischen Gebrauch erforderlich ist. Das Folgende sind die Einstellungselemente, die derzeit in den Sinn kommen.
Wenn Sie interessiert sind, probieren Sie es einfach aus.