Erstellen Sie eine "Congratulations 2.0" -App, die Glückwunschstimmen mit automatischer Telefonantwort mit Twilio API x Python (Flask) x Heroku sammelt

Einführung

ipod_shuffle

Wir haben eine "Congratulations 2.0" -App erstellt, die heimlich die "Stimmen" von "Congratulations on your Marriage" von Freunden sammelt und sie Braut und Bräutigam präsentiert. Die ursprüngliche Geschichte ist ein schöner Blog hier im Jahr 2013

Wenn Sie es nicht gelesen haben, lesen Sie es bitte. Ich finde "Programmierer sind wirklich cool". Dieser Blog hat mich tief bewegt und ich habe eine vollständige Kopie dieses Inhalts erstellt.

Um den Inhalt des Blogs kurz zusammenzufassen

--Erstellen Sie eine Telefon-App für die automatische Beantwortung von Nachrichten mithilfe einer Sprach-API namens Twilio

Der Unterschied zwischen dem Inhalt des Blogs und dieser Zeit ist

Obwohl das obige Blog und das Blog des Ingenieurs des Planungsmitglieds den Verarbeitungsablauf erwähnen, wurde der vollständige Code des Arbeitsformulars nicht veröffentlicht, sodass ich auf den Inhalt des Blogs verweisen und den gleichen Vorgang ausführen werde Es fühlt sich an, als wäre es in Python implementiert worden. Das fragmentarische Skript wurde von den Ingenieursmitgliedern im Blog veröffentlicht.

Normalerweise verwende ich Python zum Analysieren von Daten, daher habe ich nie ein Webframework wie Flask verwendet, um so etwas wie eine App zu erstellen, noch habe ich einen Hosting-Service wie Heroku verwendet. war.

Aus diesem Grund werde ich eine Notiz über die verschiedenen Moose der Webanwendung (?) Amateur und die Punkte hinterlassen, die im offiziellen Dokument der Twilio API nicht ausführlich erläutert werden.

Registrieren Sie sich bei Twilio API

Der folgende Blog war hilfreich für die Twilio-Registrierung, die Abrechnungsmethode, den Kauf einer Telefonnummer, die Installation einer statischen Beispieldatei in S3 und die Verhaltensprüfung. Dieses Mal werden wir keine statischen Dateien verarbeiten, daher ist es in Ordnung, sie durchzugehen. Es ist in Ordnung, wenn Sie die Registrierung für die API vorerst abschließen.

Twilio ist ein kostenpflichtiger API-Service (keine kostenlose Stufe), der zuerst mindestens 2000 Yen und dann weitere 1000 Yen berechnet. Ein Anruf kostet ungefähr 0,1 bis 2 Yen, daher denke ich, dass die ersten 2000 Yen für eine einfache Anwendungsentwicklung ausreichen.

Übrigens, wenn Sie fragen "Was ist S3?", Ist diese Seite hilfreich.

S3 ist ein Cloud-Dateiserver, der von Amazon betrieben wird. Die erste Kreditkartenregistrierung ist mühsam, aber sehr billig und einfach zu bedienen. Verwenden Sie sie also. (S3 wird ein Sprachdatenspeicherbereich für die automatische Telefonführung sein.)

Erstellen einer lokalen Umgebung

Befolgen Sie die obigen Seiten, um Ihre lokale Entwicklungsumgebung einzurichten. Die Hauptsache ist die folgende Installation.

vertualenv erstellt eine virtuelle Umgebung. Wenn Sie eine Reihe von Web-App-Skripten auf dem Heroku-Server hosten, trennen Sie die Umgebung für diese App mit Verticalenv, damit keine unnötigen Module usw. eingemischt werden. Installieren Sie es so, dass es später nicht störend wird (siehe unten, wenn Sie eine virtuelle Umgebung mit dem Anaconda-Paket erstellen möchten). Details von ngrok werden später beschrieben.

Grundlegendes zur Twilio-API

Sehen Sie sich nach dem Einrichten der Entwicklungsumgebung den Inhalt des obigen Schnellstarts an, um festzustellen, welche Art von Aufgabe Sie mit der Twilio-API tatsächlich schreiben können. (Weil ich der Typ bin, den ich nur verstehen kann, wenn ich ihn tatsächlich bewege und sehe, wie er sich verhält ...)

Wenn ein Anruf eingeht, wird Twilio TwiML (XML-like) unter der angegebenen URL sehen und die Verarbeitung des dort definierten Formats jederzeit ausführen.

Wenn Sie sich das obige Tutorial ansehen, können Sie sehen, wie TwiML geschrieben und dynamisch generiert wird. Es gibt jedoch einige alte Beschreibungen (Beschreibungen, die nicht den neuesten API-Spezifikationen entsprechen), und Flask-Skripte werden auf dem wesentlichen Webserver abgelegt. Die Hosting-Methode ist unfreundlich, daher bekomme ich viel Moos. .. .. In diesem Tutorial reicht es meiner Meinung nach aus, um zu bestätigen, dass "das Schreiben der Twilio-API so ist".

Unter den Funktionen der Twilio-API verarbeitet die diesmal erstellte Anwendung hauptsächlich eingehende Anrufe wie "Annehmen von Anrufen", "Abspielen aufgezeichneter Sprachdateien", "Aufzeichnen von Nachrichten von Benutzern", "Akzeptieren von Zahleneingaben" usw. Ich benutze.

Die tatsächliche Reihenfolge der Apps ist wie folgt (zitiert aus hmsks Blog).

Das Folgende ist ein Tutorial für jede Funktion, aber wie ich oben geschrieben habe, beachten Sie bitte, dass es einige Teile gibt, die nicht funktionieren, selbst wenn Sie gemäß dem Tutorial schreiben.

Unten finden Sie das fertige Flask-Skript, das ich unter Bezugnahme auf die obige Sequenz, das Tutorial und die Verwendung der neuesten API geschrieben habe.

(Die im Skript aufgerufene MP3-Datei enthält die in S3 installierten Sprachdaten für die automatische Antwort.)

Ausführung in lokaler Umgebung (Verwendung von ngrok)

Testen Sie anschließend lokal, ob die erstellte Webanwendung (Flask-Skript) ordnungsgemäß funktioniert. Da es problematisch ist, möchte ich das Verhalten ohne Bereitstellung (bis zum Server) testen, aber in diesem Fall ist "ngrok" praktisch. Es ist kostenlos, also lass es uns benutzen.

DL das ngrok, das Ihrem Betriebssystem entspricht, von der offiziellen Seite. Auf dem Mac ist "Brew Install Ngrok" in Ordnung

Entpacken Sie die DL-Datei

$ unzip /path/to/ngrok.zip

Wenn danach die Anzeige mit "./negrok help" usw. bestätigt wird, ist dies in Ordnung

Um ngrok tatsächlich nutzen zu können, müssen Sie sich als Benutzer registrieren, indem Sie sich von der offiziellen Seite von ngrok (kostenlos) anmelden.

Nachdem Sie sich als Benutzer registriert und angemeldet haben, führen Sie "./ngrok authtoken (gefolgt von einer Zeichenfolge)" aus, das auf dem Bildschirm Erste Schritte im Terminal angezeigt wird. ich werde (Möglicherweise ist diese Benutzerregistrierung und Registrierung des Authentifizierungstokens nicht obligatorisch.)

Führen Sie nach Abschluss aller ngrok-Vorgänge die .py-Datei des Flask-Skripts aus, das Sie ausführen möchten. (Wenn es ausgeführt wird, kann es auf localhost angezeigt werden: 5000)

Führen Sie bei laufendem Flask ./ngrok http 5000 in einem separaten Fenster aus.

Dann auf dem neu gestarteten Bildschirm

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

Da so etwas geschrieben ist, registrieren Sie die angezeigte URL (entweder http oder https) im Abschnitt "Webhook" des Twilio API-Verwaltungsbildschirms und speichern Sie sie. Was Sie lokal tun, wird jetzt so behandelt, als würde es auf einem Webserver ausgeführt.

Wenn Sie danach die Telefonnummer anrufen, sollte der in Flask geschriebene Prozess ausgeführt werden.

Übrigens gibt ngrok bei jedem Start eine zufällige URL zurück. Wenn Sie dies beheben möchten, lesen Sie bitte den Punkt "Zufällige Zeichenfolgen sind problematisch" auf dieser Seite. (* Ab April 2017 müssen Sie jedoch möglicherweise ein bezahltes Mitglied werden, um eine feste URL zu erhalten?)

Hosting auf einem Webserver (Verwendung von Heroku)

Wenn Sie ein Python-Skript haben, das eine TwiML für statisches Verhalten erstellt (z. B. spielen Sie die angegebene MP3-Datei automatisch ab, wenn Sie einen Anruf erhalten), fügen Sie sie in S3 ein und geben Sie die URL des Skripts auf der Twilio API-Verwaltungsseite ein. Sie können dies tun, indem Sie sich registrieren.

Wenn Sie jedoch eine komplizierte Verarbeitung durchführen möchten (z. B. diesmal), z. B. die Verarbeitung gemäß der vom Benutzer eingegebenen Nummer ändern möchten, installieren Sie ein Python-Skript auf einem externen Server und TwiML dynamisch entsprechend dem Eingabeinhalt des Benutzers. Muss generiert werden.

EC2 von Amazon Web Service (AWS) und Google App Engine (GAE) von Google Cloud Platform (GCP) können zu einem niedrigen Preis als Optionen für den externen Server zur Installation des Skripts verwendet werden. Diesmal ist der Zielprozess jedoch einfach. Aus diesem Grund habe ich mich für Heroku entschieden, das einfach zu installieren und kostenlos verwendet werden kann. Heroku ist ein Dienst, mit dem Sie eine App ausführen können, indem Sie einfach eine Reihe von von git verwalteten Web-Skripten auf einen bestimmten Heroku-Server übertragen.

Für das Verfahren zum Ausführen einer Webanwendung (Django oder Flask), die in Python auf Heroku geschrieben wurde, habe ich auf das offizielle Tutorial unten verwiesen.

Der allgemeine Ablauf des Tutorials ist

--Erstelle ein Heroku-Konto --Heroku Command Line Interface (CLI) DL

Es ist wie es ist. Einfach. Übrigens werden alle Installationsprozesse wie SQLAlchemy und psycopg2 übersprungen, da der DB-Systemvorgang in der diesmal erstellten Anwendung nicht ausgeführt wird.


Die Mindestdateien, die an Heroku gesendet werden müssen, um die App auszuführen, sind die folgenden drei.

--main.py ・ ・ ・ Hauptkörperdatei, in die Flask's Skript geschrieben ist (hier lautet der Dateiname nur main.py) --Procfile ・ ・ ・ Datei, in die Befehle zum Ausführen von main.py geschrieben werden (Details werden später beschrieben) --requirements.txt ・ ・ ・ Liste der von main.py importierten Module

(Achtung) Die folgende Verarbeitung wird ausgeführt, nachdem die virtuelle Umgebung betreten wurde, die für die Anwendung durch vertikale Energie oder Anakonda getrennt ist.

Registrieren Sie ein Heroku-Konto http://www.heroku.com/

Installieren Sie das Heroku CLI-Tool für Ihr Betriebssystem von hier.

Nach der Benutzerregistrierung und CLI-Installation "Heroku Login" im Terminal

% heroku login 
#->Geben Sie das Heroku-ID-Passwort ein

Platzieren Sie das Verzeichnis mit dem Python-Skript (Flask-Skript), das Sie auf dem Heroku-Server bereitstellen möchten, unter Git-Kontrolle.

$ cd /path/to/dir
$ git init

Erstellen Sie zunächst unter demselben Verzeichnis die Anforderungen.txt und Procfile

$ pip freeze > requirements.txt

(Wenn Sie kein Gunicorn installiert haben, pip install gunicorn) (Der "Hauptteil" entspricht dem Namen der Flask-Datei.)

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

heroku create im (gleichen) Verzeichnis, das git init war

$ heroku create <Beliebiger App-Name> --buildpack heroku/python

heroku create gibt die Heroku-URL aus Registrieren Sie diese URL im Webook-Bereich der Twilio-API-Konsole (beachten Sie, dass sie leicht zu vergessen ist).

Schieben Sie das Skript zu Heroku

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

Grobe Buchstaben fließen Es wird gedrückt, um sicher zu meistern, und wenn es keinen Fehler gibt, ist es in Ordnung

$ heroku open

Wenn der gepusste Inhalt korrekt ist, sollte die App im Browser angezeigt werden.

Wenn es lokal funktioniert hat, aber nicht funktioniert hat,

(Meistens stimmt etwas mit dem Procfile nicht)

Die obige Reihe von Inhalten wurde in Dieser Qiita-Artikel übersichtlich organisiert und war hilfreich.

Über Procfile

Es scheint, dass der Ausführungsbefehl der an Heroku gesendeten Anwendung in das sogenannte Procfile geschrieben werden sollte (Details zu Procfile finden Sie in hier. Selbst wenn Sie es nicht verstehen, können Sie es wie folgt schreiben.

Beim Schreiben eines Procfiles mit dem Namen Gunicorn habe ich versucht, [diesen Blog] nachzuahmen (http://shkh.hatenablog.com/entry/2013/01/01/192857).

Wenn Sie beispielsweise ein Flask-Skript mit dem Namen main.py auf Heroku ausführen möchten, wird das Procfile ausgeführt

Es scheint, dass Sie nur die Zeile "web: gunicorn main: app --log-file-" schreiben und speichern müssen. (Nicht python main.py.)

("Gunicorn" scheint empfohlen zu werden, dies in verschiedenen Artikeln zu verwenden, daher bin ich mir nicht sicher, aber ich verwende es vorerst. Wenn Sie "Gunicorn" nicht verwenden, befinden sich Flask und Django auf Port 5000 Beim Aufstehen scheint es ein Problem zu geben.

Überprüfen Sie die Apps, die an Heroku gesendet wurden

Überprüfen Sie die Apps, die derzeit an Heroku gesendet werden (bis zu 5 in der kostenlosen Stufe).

$ heroku apps

Löschen Sie nicht benötigte Apps

$ heroku destroy --app <App Name>
#->Geben Sie den App-Namen zur Bestätigung erneut ein

Überprüfen Sie das Skript, das derzeit auf dem Heroku-Server ausgeführt wird (die verbleibende Zeit, die im freien Frame gestartet werden kann, wird ebenfalls angezeigt).

$ heroku ps

Überprüfen Sie das Protokoll

$ heroku logs #- Sie können das Protokollende mit der Option Ende sehen

Weitere Heroku-CLIs finden Sie hier

Andere

Sie können Anrufe aus Übersee nicht beantworten?

Unterwegs stellte ich fest, dass die von Twilio gekaufte Telefonnummer nicht aus dem Ausland beantwortet werden konnte, sodass mir ein im Ausland lebender Freund die von der Diktiergerät-App aufgezeichnete Tonquelle schickte. Die Bedeutung, es zu einer Telefon-App zu machen. .. .. Vielleicht war die Telefonnummer, die ich gekauft habe, auf Japan beschränkt? (Ich habe nicht im Detail untersucht)

MP3-Dateien zuschneiden

Die von der API aufgezeichneten Nachrichtendaten des Benutzers befinden sich am Anmeldeziel von https://jp.twilio.com/login/kddi-web. Sie können DL usw. über die Konsole ausführen. (Ich habe nicht überprüft, wie viele Nachrichten gespeichert werden können, aber in meinem Fall habe ich bestätigt, dass 60 Nachrichten gespeichert wurden.)

Ich denke, Sie könnten MP3 oder WAV als Datenspeicherformat wählen. In meinem Fall habe ich Audiodaten mit MP3 heruntergeladen. Wenn Sie den Anfangsteil oder den unteren Teil der Sprachdaten ausschneiden und einfach bearbeiten möchten, ist dies kostenlos und bequem. Sie können die Stimme im Browser einfach trimmen (keine bestimmte maximale Anzahl von Dateien).

Spielen Sie Verb und M4A-Datei Problem

Beachten Sie, dass die von der iPhone Voice Recorder App standardmäßig ausgegebene m4a-Datei nicht mit dem Wiedergabeverb der twilio API abgespielt werden kann! (Mp3 ist sicher)

Erstellen Sie eine virtuelle Umgebung mit anaconda

Für diejenigen, die die Umgebung mit Anaconda anstelle von Vertualenv schneiden möchten (normalerweise denke ich, dass Verticalenv verwendet werden sollte)

Hier erfahren Sie, wie Sie mit anaconda eine Umgebung erstellen und ein- und aussteigen


Aufbau einer virtuellen Umgebung
$ conda create -n <Umgebungsname> python=<Ausführung> <Schreiben Sie die Bibliotheken, die Sie installieren möchten, getrennt durch Leerzeichen>

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


Es ist auch möglich, eine neue Umgebung zu erstellen, indem Anakonda-Umgebungen gesammelt werden (Erstellen einer virtuellen Umgebung von Anakonda mit Anakonda).

$ conda create -n anaconda2 python=2.7 anaconda

Zeigen Sie eine Liste der virtuellen Umgebungen an, die mit der aktuell vorhandenen Bedingung erstellt wurden

$ conda env list

Betreten Sie die virtuelle Umgebung

$ source activate <Umgebungsname>

Raus aus der virtuellen Umgebung

$ source deactivate

Referenz

Andere Seiten als die oben genannten Links

Beiseite

Ich habe den Hintergrund für die Erstellung dieser App in meinem persönlichen Blog geschrieben. Wenn Sie interessiert sind.

Recommended Posts

Erstellen Sie eine "Congratulations 2.0" -App, die Glückwunschstimmen mit automatischer Telefonantwort mit Twilio API x Python (Flask) x Heroku sammelt
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Erstellen Sie eine einfache Web-App mit Flasche
Einfache Web-App mit Python + Flask + Heroku
[Python] Erstellen Sie schnell eine API mit Flask
Erstellen Sie eine App, die Schüler mit Python errät
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
Erstellen Sie ein Bulletin Board mit Heroku, Flask, SQL Alchemy
Ein Server, der POST-Daten mit flask / python wiedergibt
So stellen Sie eine mit Flask erstellte Web-App für Heroku bereit
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
(Fehler) Stellen Sie eine mit Flask mit Heroku erstellte Web-App bereit
Erstellen Sie Heroku, Flask, Python, Nyanko Bulletin Board mit "CSV-Datei"
Tornado - Erstellen wir eine Web-API, die JSON problemlos mit JSON zurückgibt
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Erstellen Sie ein Verzeichnis mit Python
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
Erstellen Sie mit Python3 + Falcon eine REST-API, die die aktuelle Uhrzeit zurückgibt