Créez une application «Félicitations 2.0» qui recueille des voix de félicitations grâce à la réponse téléphonique automatique avec Twilio API x Python (Flask) x Heroku

introduction

ipod_shuffle

Nous avons créé une application "Félicitations 2.0" qui recueille secrètement les "voix" de "Félicitations pour votre mariage" d'amis et les présente aux mariés. L'histoire originale est un joli blog ici en 2013

Si vous ne l'avez pas lu, veuillez le lire. Je pense que "les programmeurs sont vraiment cool". J'ai été profondément ému par ce blog, j'ai donc fait une copie complète de ce contenu.

Pour résumer brièvement le contenu du blog

--Créez une application téléphonique pour les messages de réponse automatique à l'aide d'une API vocale appelée Twilio

La différence entre le contenu du blog et cette fois est

Bien que le blog ci-dessus et le blog de l'ingénieur du membre planificateur mentionnent le flux de traitement, le code complet du formulaire de travail n'a pas été publié, je vais donc me référer au contenu du blog et faire la même opération On a l'impression qu'il a été implémenté en Python. Le script fragmentaire a été publié sur le blog par les membres ingénieurs.

J'utilise généralement Python pour analyser les données, donc je n'ai jamais utilisé un framework Web comme Flask pour créer quelque chose comme une application, ni un service d'hébergement comme Heroku. était.

C'est pourquoi je vais laisser une note sur les différentes mousses de l'application web (?) Amateur et les points qui ne sont pas expliqués en détail dans le document officiel de l'API Twilio.

Inscrivez-vous avec l'API Twilio

Le blog suivant a été utile pour l'enregistrement Twilio, la méthode de facturation, l'achat d'un numéro de téléphone, l'installation d'un exemple de fichier statique sur S3 et la vérification du comportement. Cette fois, nous ne traiterons pas les fichiers statiques, donc vous pouvez continuer. Ce n'est pas grave si vous terminez l'enregistrement à l'API pour le moment.

Twilio est un service API payant (pas de niveau gratuit), qui facture d'abord 2000 yens comme montant minimum, puis facture 1000 yens supplémentaires. Un appel coûte environ 0,1 à 2 yens, donc je pense que les 2000 premiers yens suffisent pour le développement d'une application simple.

Au fait, si vous demandez "Qu'est-ce que S3?", Cette page vous sera utile.

S3 est un serveur de fichiers cloud exploité par Amazon. L'enregistrement de la première carte de crédit est un problème, mais c'est très bon marché et facile à utiliser, alors utilisez-le. (S3 sera une zone de stockage de données vocales pour le guidage téléphonique automatique)

Créer un environnement local

Suivez les pages ci-dessus pour configurer votre environnement de développement local. La principale chose à faire est l'installation suivante.

--Installation de python --Installez virtualenv

vertualenv construit un environnement virtuel. Lorsque vous hébergez un ensemble de scripts d'application Web sur le serveur Heroku, séparez l'environnement de cette application par verticalenv afin que les modules inutiles, etc. ne soient pas mélangés. Installez-le pour qu'il ne soit pas gênant plus tard (voir ci-dessous si vous souhaitez créer un environnement virtuel avec le package anaconda) Les détails de ngrok seront décrits plus loin.

Comprendre l'API Twilio

Après avoir configuré l'environnement de développement, jetez un œil au contenu du démarrage rapide ci-dessus pour voir quel type de tâche vous pouvez réellement écrire avec l'API Twilio. (Parce que je suis du genre à ne pas comprendre à moins de le déplacer et de voir comment il se comporte ...)

Lorsqu'un appel arrive, Twilio viendra voir TwiML (semblable à XML) à l'URL spécifiée et exécutera le traitement du format qui y est défini à tout moment.

Si vous regardez le didacticiel ci-dessus, vous pouvez voir comment écrire TwiML et comment le générer dynamiquement, mais il existe quelques anciennes descriptions (des descriptions qui ne correspondent pas aux dernières spécifications de l'API) et les scripts Flask sont placés sur le serveur Web essentiel. La méthode d'hébergement n'est pas conviviale, donc je reçois beaucoup de mousse. .. .. Dans ce tutoriel, je pense qu'il suffit de confirmer que "Comment écrire l'API Twilio est comme ça".

Parmi les fonctions de l'API Twilio, l'application créée cette fois gère principalement les appels entrants, tels que «accepter les appels», «lire les fichiers vocaux enregistrés», «enregistrer les messages des utilisateurs», et «accepter la saisie des numéros». J'utilise.

La séquence réelle des applications est la suivante (citée du blog de hmsk)

Ce qui suit est un didacticiel pour chaque fonction, mais comme je l'ai écrit ci-dessus, veuillez noter que certaines parties ne fonctionnent pas même si vous écrivez selon le didacticiel.

Vous trouverez ci-dessous le script Flask terminé que j'ai écrit en faisant référence à la séquence ci-dessus, au didacticiel et à l'utilisation de la dernière API.

(Le fichier mp3 appelé dans le script est les données vocales pour la réponse automatique installée dans S3.)

Exécution dans un environnement local (comment utiliser ngrok)

Ensuite, testez localement si l'application Web créée (script Flask) fonctionne correctement. Puisqu'il est gênant, je veux tester le comportement sans déployer (jusqu'au serveur), mais dans ce cas, ngrok est pratique. C'est gratuit alors utilisons-le.

DL le ngrok qui correspond à votre système d'exploitation à partir de la Page officielle. Sur Mac, brew install ngrok est ok

Décompressez le fichier DL

$ unzip /path/to/ngrok.zip

Après cela, si l'affichage est confirmé avec ./negrok help etc., c'est ok

Afin d'utiliser réellement ngrok, vous devez vous enregistrer en tant qu'utilisateur en vous inscrivant depuis la page officielle de ngrok (gratuitement).

Après vous être enregistré en tant qu'utilisateur et vous être connecté, exécutez ./ngrok authtoken (suivi d'une chaîne de caractères) affiché sur l'écran Get Started dans le terminal. Je vais (Peut-être que cet enregistrement d'utilisateur et cet enregistrement de jeton d'authentification ne sont pas obligatoires)

Après avoir terminé toutes les opérations ngrok, exécutez le .py du script Flask que vous souhaitez exécuter. (Une fois exécuté, il sera prêt à être affiché sur localhost: 5000)

Avec Flask en cours d'exécution, exécutez ./ngrok http 5000 dans une fenêtre séparée.

Ensuite, sur l'écran nouvellement lancé

Forwarding   http://6813xaa9.ngrok.io -> localhost:5000
Forwarding   https://6813xaa9.ngrok.io -> localhost:5000

Puisque quelque chose comme ceci est écrit, enregistrez l'URL affichée (soit http ou https) dans la section "Webhook" de l'écran de gestion de l'API twilio et enregistrez-la. Ce que vous faites localement sera désormais traité comme s'il s'exécutait sur un serveur Web.

Après cela, lorsque vous appelez le numéro de téléphone, le processus écrit dans Flask doit être exécuté.

Au fait, ngrok renvoie une URL aléatoire à chaque démarrage. Si vous souhaitez résoudre ce problème, veuillez vous reporter à l'élément «Les chaînes de caractères aléatoires sont gênantes» sur cette page. (* Cependant, à partir d'avril 2017, vous devrez peut-être devenir membre payant pour obtenir une URL fixe?)

Hébergement sur un serveur Web (comment utiliser Heroku)

Si vous avez un script python qui crée un TwiML pour un comportement statique (par exemple, il suffit de lire automatiquement le mp3 spécifié lorsque vous recevez un appel), placez-le dans S3 et placez l'URL du script sur la page de gestion de l'API Twilio. Vous pouvez le faire en vous inscrivant.

Cependant, si vous souhaitez effectuer des traitements compliqués (comme cette fois) tels que modifier le traitement en fonction du nombre saisi par l'utilisateur, installez un script python sur un serveur externe et de manière dynamique TwiML en fonction du contenu d'entrée de l'utilisateur. Doit être généré.

EC2 d'Amazon Web Service (AWS) et Google App Engine (GAE) de Google Cloud Platform (GCP) peuvent être utilisés à bas prix comme options pour le serveur externe pour installer le script, mais cette fois, le processus cible est simple. Pour cette raison, j'ai décidé d'utiliser Heroku, qui est facile à installer et peut être utilisé gratuitement. Heroku est un service qui vous permet d'exécuter des applications en poussant simplement un ensemble de scripts Web gérés par git vers un serveur Heroku spécifié.

Pour la marche à suivre pour exécuter une application web (Django ou Flask) écrite en Python sur Heroku, je me suis référé au tutoriel officiel ci-dessous.

Le flux général du didacticiel est

--Créez un compte Heroku

C'est comme ça. Facile. À propos, comme l'opération du système de base de données n'est pas effectuée dans l'application créée cette fois, tous les processus d'installation tels que SQLAlchemy et psycopg2 sont ignorés.


Les fichiers minimum qui doivent être envoyés à Heroku pour exécuter l'application sont les trois suivants.

--main.py ・ ・ ・ Fichier du corps principal dans lequel le script de Flask est écrit (ici, le nom du fichier est uniquement main.py) --Procfile ・ ・ ・ Fichier dans lequel sont écrites les commandes d'exécution de main.py (les détails seront décrits plus tard) --requirements.txt ・ ・ ・ Fichier de liste des modules importés par main.py

(Attention) Le traitement suivant est effectué après être entré dans l'environnement virtuel séparé pour l'application par verticalenv ou anaconda.

Enregistrez un compte Heroku http://www.heroku.com/

Installez l'outil CLI Heroku pour votre système d'exploitation à partir ici.

Après l'enregistrement de l'utilisateur et l'installation de la CLI, heroku login dans le terminal

% heroku login 
#->Entrez le mot de passe de l'ID heroku

Placez le répertoire contenant le script python (script Flask) que vous souhaitez déployer sur le serveur Heroku sous contrôle git

$ cd /path/to/dir
$ git init

Créez d'abord requirements.txt et Procfile dans le même répertoire.

$ pip freeze > requirements.txt

(Si vous n'avez pas installé gunicorn, pip install gunicorn) (La partie "principale" correspond au nom du fichier Flask)

$ touch Procfile
$ echo web: gunicorn main:app --log-file - >> Procfile

heroku create dans le (même) répertoire que git init

$ heroku create <Tout nom d'application> --buildpack heroku/python

heroku create émettra l'URL Heroku Enregistrez cette URL dans la section webook de la console API twilio (notez qu'il est facile de l'oublier)

Pousser le script vers heroku

$ git add -A
$ git commit -m “hogehoge”
$ git push heroku master

Flux de lettres rugueux Il est poussé à maîtriser en toute sécurité, et s'il n'y a pas d'erreur, c'est ok

$ heroku open

Ensuite, si le contenu poussé est correct, l'application doit être affichée dans le navigateur.

Si cela a fonctionné localement mais que cela n'a pas fonctionné,

(La plupart du temps, il y a quelque chose qui ne va pas avec le Procfile)

La série de contenus ci-dessus a été soigneusement organisée dans Cet article de Qiita et a été utile.

À propos de Procfile

Il semble que la commande d'exécution de l'application poussée vers Heroku devrait être écrite dans ce qu'on appelle Procfile (Les détails sur Procfile sont écrits ici (https://github.com/herokaijp/devcenter/wiki/procfile) Cependant, même si vous ne le comprenez pas, vous pouvez l'écrire comme suit).

Lors de l'écriture d'un Procfile en utilisant quelque chose appelé gunicorn, j'ai essayé d'imiter ce blog.

Par exemple, si vous souhaitez exécuter un script Flask nommé main.py sur Heroku, Procfile

Il semble que vous n'ayez besoin que d'écrire et d'enregistrer la ligne web: gunicorn main: app --log-file -. (Pas python main.py.)

(Gunicorn semble être recommandé d'utiliser ceci dans divers articles, donc je ne suis pas vraiment sûr, mais je l'utilise pour le moment. Si vous n'utilisez pas gunicorn, Flask et django seront sur le port 5000 Il semble y avoir un problème en se levant)

Vérifiez les applications envoyées à Heroku

Vérifiez les applications actuellement transmises à Heroku (jusqu'à 5 dans le niveau gratuit)

$ heroku apps

Supprimer les applications inutiles

$ heroku destroy --app <nom de l'application>
#->Saisissez à nouveau le nom de l'application pour confirmation

Vérifiez le script en cours d'exécution sur le serveur d'heroku (le temps restant qui peut être démarré dans le cadre libre est également affiché)

$ heroku ps

Vérifier le journal

$ heroku logs #- Vous pouvez voir la queue du journal avec l'option queue

Voir ici pour les autres CLI Heroku

Autre

Vous ne pouvez pas répondre aux appels de l'étranger?

En chemin, j'ai réalisé que le numéro de téléphone que j'avais acheté chez Twilio ne pouvait pas être répondu de l'étranger, alors j'ai fini par demander à un ami vivant à l'étranger de m'envoyer la source sonore enregistrée par l'application d'enregistrement vocal. La signification d'en faire une application pour téléphone. .. .. Peut-être que le numéro de téléphone que j'ai acheté était limité au Japon? (Je n'ai pas enquêté en détail)

Découpage des fichiers mp3

Les données de message de l'utilisateur enregistrées par l'API se trouvent à la destination de connexion depuis https://jp.twilio.com/login/kddi-web. Vous pouvez faire du DL etc. à partir de la console. (Je n'ai pas vérifié combien de messages peuvent être enregistrés, mais dans mon cas, j'ai confirmé que 60 ont été enregistrés.)

Je pense que vous pouvez choisir mp3 ou WAV comme format de stockage de données. Dans mon cas, j'avais l'habitude de télécharger des données audio avec mp3. Si vous souhaitez découper la partie de début ou la partie inférieure des données vocales et les modifier facilement, c'est gratuit et pratique. Vous pouvez facilement couper la voix sur le navigateur (pas de nombre maximum de fichiers particulier).

Problème de lecture de verbe et de fichier m4a

Notez que le fichier m4a généré par l'application enregistreur vocal iPhone en standard ne peut pas être lu avec le verbe de lecture de l'API twilio! (Mp3 est sûr)

--Référence: https://jp.twilio.com/docs/api/twiml/play

Créez un environnement virtuel avec anaconda

Pour ceux qui veulent couper l'environnement avec anaconda au lieu de vertualenv (généralement je pense que verticalenv devrait être utilisé)

Voici comment créer un environnement avec anaconda et y entrer et en sortir

--Référence: Création d'un environnement python pour ceux qui souhaitent devenir data scientists 2016


Construire un environnement virtuel
$ conda create -n <Nom de l'environnement> python=<version> <Écrivez les bibliothèques que vous souhaitez installer séparées par des espaces>

Exemple: conda create -n py_ver2 python = 2.7 numpy scipy pandas jupyter


Il est également possible de créer un nouvel environnement en collectant des environnements anaconda (création d'un environnement virtuel d'anaconda avec anaconda)

$ conda create -n anaconda2 python=2.7 anaconda

Afficher une liste d'environnements virtuels créés avec la conda actuellement existante

$ conda env list

Entrez dans l'environnement virtuel

$ source activate <Nom de l'environnement>

Sortez de l'environnement virtuel

$ source deactivate

référence

Pages référencées autres que les liens ci-dessus

De côté

J'ai écrit le contexte de la création de cette application sur mon blog personnel. Si tu es intéressé.

Recommended Posts

Créez une application «Félicitations 2.0» qui recueille des voix de félicitations grâce à la réponse téléphonique automatique avec Twilio API x Python (Flask) x Heroku
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Créez une application Web simple avec Flask
Application Web facile avec Python + Flask + Heroku
[Python] Créez rapidement une API avec Flask
Créez une application qui devine les étudiants avec Python
Créer une page qui se charge indéfiniment avec python
Créer un babillard avec Heroku, Flask, SQL Alchemy
Un serveur qui fait écho aux données POSTées avec flask / python
Comment déployer une application Web créée avec Flask sur Heroku
Créons un script qui s'enregistre avec Ideone.com en Python.
(Échec) Déployer une application Web créée avec Flask avec heroku
Créer un babillard Heroku, Flask, Python, Nyanko avec "fichier csv"
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez une API Web capable de fournir des images avec Django
Créer un répertoire avec python
[Python / Django] Créer une API Web qui répond au format JSON
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
Créer une API REST qui renvoie l'heure actuelle avec Python3 + Falcon