[PYTHON] Holen Sie sich Android-Benachrichtigungen, um langsam zu sprechen

Mit der Android-App Macrodroid und Raspberry pi spricht die Stimme langsam die Benachrichtigung des Smartphones. Ich habe ein System gemacht.

Überblick

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.

Umgebung

Einstellungen für die Raspeltorte

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していってね'

Android-Seiteneinstellungen

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.

abschließend

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.

Recommended Posts

Holen Sie sich Android-Benachrichtigungen, um langsam zu sprechen
PUSH-Benachrichtigung von Python an Android mithilfe der Google-API
Gewöhne dich zuerst an das Senden