[PYTHON] Recevez des notifications Android pour parler lentement

En utilisant l'application Android Macrodroid et Raspberry pi, la voix prononce lentement la notification du smartphone. J'ai fait un système.

Aperçu

Macrodroid est une application qui permet d'automatiser des tâches sur Android. Diverses actions peuvent être automatiquement exécutées déclenchées par un événement sur Android.

Associez-le à un simple serveur Web configuré dans Razpai, et lorsqu'une notification arrive, envoyez le contenu au serveur Web et jouez la voix avec AquesTalkPi. Production.

environnement

Paramètres du côté de la tarte à la râpe

Si vous utilisez Raspeye, vous devrez peut-être remplacer la carte SD pour recréer l'environnement. Dans un tel cas, si vous avez un Dockerfile, vous n'avez pas à vous rappeler comment créer un environnement.

Je vais donc exécuter un simple serveur Web avec Docker. (Bien que Docker semble exagéré car il n'y a presque pas de quantité de code cette fois)

Le Dockerfile créé cette fois est le suivant.

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.Après avoir lu la licence du programme html, téléchargez ce qui suit
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"]

De plus, le serveur Web simple était exécuté sur Python.

softalk_server.py


# -*- coding:utf-8 -*-
from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib import parse
import subprocess
KEYS = ["app", "title", "message"]


#Faites parler lentement le texte à la voix
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]Texte du dictionnaire composé des touches de_Basé sur dic
#Préparez un message parlé
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}De{title}Le message est intitulé.{message}'.format(
            **text_dic
        )
    else:
        formatted = '{app}De{title}Le message est intitulé.'.format(
            **text_dic
        )
    return formatted


#Serveur Web simple
#Lorsque vous recevez une demande GET, basée sur ce paramètre
#Écouter lentement la voix du haut-parleur
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)
        #En supposant les paramètres de la requête GET
        #Sinon, formaté est Aucun et aucun son n'est lu
        if formatted is not None:
            talk(formatted)
        self.end_headers()


if __name__ == '__main__':
    text = 'Le serveur de notification a démarré'
    talk(text)

    httpd = HTTPServer(("", 8000), RequestHandler)
    httpd.serve_forever()

Exécutez ensuite la commande suivante dans le répertoire où se trouvent Dockerfile et softalk_server.py.

$ docker build -t softalk_notification .
$ docker run -d --name notification_server --device /dev/snd -p 8000:8000 --restart=always softalk_notification

En ajoutant l'option --restart = always, il est pratique de reconstruire automatiquement le conteneur même lorsqu'il est redémarré (même lorsque le démon docker est arrêté).

Il transmet également dev / snd à --device pour jouer le son du haut-parleur en utilisant ALSA.

De plus, le port du serveur Web est défini sur «8000» pour le conteneur et l'hôte.

Si tout se passe bien, la prochaine requête GET devrait parler lentement.

$ curl localhost:8000 --get --data-urlencode 'app=lentement' --data-urlencode 'title=tester' --data-urlencode 'message=lentementしていってね'

Paramètres côté Android

Ensuite, faisons une requête GET au serveur Web lorsque la notification arrive sur Android. Ceci peut être réalisé avec Macrodroid.

Après avoir installé Macrodroid depuis Google Play, créez la macro suivante.

--Déclencheur --Appuyez sur "Événements de l'appareil"> "Notifications"

--Action

URL


192.168.0.2:8000?app=[not_app_name]&title=[not_title]&message=[notification]

Après avoir défini le déclencheur et l'action, appuyez sur la coche en bas à droite de l'écran. Veuillez saisir correctement la catégorie et le nom de la macro.

La configuration est terminée.

en conclusion

Cette fois, c'est le réglage minimum, donc je pense qu'un réglage fin est nécessaire pour une utilisation pratique. Voici les éléments de réglage qui me viennent à l'esprit actuellement.

--Lisez-vous les notifications de toutes les applications: Macrodroid peut spécifier dans une certaine mesure --Lisez-vous toujours à haute voix: Déclenchement temporel Macrodroid (il semble intéressant de juger par la luminosité en combinaison avec Nature remo)

Si vous êtes intéressé, pourquoi ne pas essayer.

Recommended Posts

Recevez des notifications Android pour parler lentement
Notification PUSH de Python vers Android à l'aide de l'API de Google
Habituez-vous d'abord à envoyer