[PYTHON] Ich habe ein System erstellt, mit dem Sie nur durch einen Anruf twittern können

Ich möchte twittern, habe aber kein Smartphone oder Computer zur Hand. Es gibt aber feste Telefone. Was ist los?

Selbst in einer solchen Situation haben wir ein System erstellt, mit dem Sie mit einem einzigen Anruf twittern können.

Wie es funktioniert

スライド1.JPG

Technologie zu verwenden

Vorbereitung

Tun Sie es in einer Linux-Umgebung. Diesmal habe ich Debian mit VPS verwendet.

Es ist nicht erforderlich, eine spezielle Bibliothek zu installieren. Erstellen Sie einfach eine LAMP-Umgebung. Bitte ändern Sie das Verzeichnis im Quellcode entsprechend.

Es scheint, dass Twilio auch Sprache erkennen kann, aber da es kein Japanisch unterstützt, haben wir diesmal die Bing Speech API für die Spracherkennung übernommen.

Twilio vorbereiten

Holen Sie sich einfach einen Account. Es gibt bezahlte Konten und kostenlose Konten (mit Einschränkungen für Testversionen), aber in diesem Fall konnten wir es mit einem kostenlosen Konto implementieren.

Dieser Bereich ist hilfreich für die Kontoerfassung und den Mechanismus. Twilio First Step

Vorbereiten der Bing Speech API

Sie können es von der Seite hier herunterladen. azure.JPG

Sie können den Schlüssel sofort erhalten, indem Sie den Nutzungsbedingungen zustimmen und sich über "API-Schlüssel abrufen" anmelden. Sie können sich auch mit Ihrem Github-Konto anmelden.

Es werden zwei Arten von Schlüsseln ausgegeben, aber es scheint, dass beide verwendet werden können.

Programm

Die Verarbeitung auf der Twilio-Seite ist in TwiML und PHP geschrieben, und die andere Verarbeitung ist in Python geschrieben.

Schreiben Sie TwiML

Platzieren Sie die folgende XML-Datei an einem Ort, auf den über das Internet zugegriffen werden kann, z. B. auf einem Webserver. Stellen Sie dann die URL auf der Twilio-Kontoseite ein.

record.xml


<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say language="ja-JP">Notieren Sie den Inhalt des Tweets. Drücken Sie nach der Aufnahme auf Scharf.</Say>
<Record method="GET" timeout="60" maxLength="30" finishOnKey="#" action="./get.php" />
</Response>

Diese wenigen Zeilen sprechen automatisch und zeichnen sogar auf. TwiML Es ist gut, weil es leicht zu verstehen und leicht ist. Weitere Informationen finden Sie unter Offizielle Referenz.

Schreiben Sie PHP

Dies ist der Teil von action =" ./ get.php ", der in <Record> von TwiML geschrieben ist. Der Prozess wird nach dem Schließen des Aufrufs an "get.php" übergeben.

get.php


<?php

//URL der Aufnahmedatei abrufen
$recordingUrl = $_GET['RecordingUrl'];
$recordingUrl .= ".wav";

//Aufnahmedatei herunterladen
exec("wget -N -O ./record.wav $recordingUrl");

//Führen Sie Python aus
exec("python ./tweet.py");

?>

Wie Sie in der Referenz sehen können, sendet das Attribut "action" "RecordingUrl" als Parameter. Sie können es per GET oder POST erhalten. Es ist dasselbe wie HTML und andere Formulare. Dieses Mal habe ich GET mit der Methode von TwiML angegeben, also ist es GET.

Beachten Sie, dass abhängig von den Berechtigungseinstellungen der Datei oder des Zielverzeichnisses möglicherweise keine Parameter abgerufen oder Audio nicht gespeichert werden. Ich war ein paar Tage lang besorgt, weil ich die super-super rudimentären Probleme im Zusammenhang mit der Erlaubnis nicht lösen konnte.

Führen Sie nach dem Herunterladen der aufgezeichneten Sprachdatei das Python-Programm aus, um die Spracherkennung → Tweet-Verarbeitung durchzuführen.

Schreiben Sie Python

Dieser Artikel hat mir geholfen, ein Python-Programm zu erstellen. So konvertieren Sie Twilios Stimme mithilfe der Bing Speech API von Microsoft in Text

Erstellen Sie zunächst settings.py, um auf den API-Schlüssel für Tweets zu verweisen.

settings.py


CONSUMER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxx"
CONSUMER_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ACCESS_TOKEN = "xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ACCESS_TOKEN_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Als nächstes folgt ein Programm, das alles von der Spracherkennung bis zu Tweets ausführt.

tweet.py


#coding:utf-8
from requests_oauthlib import OAuth1Session
import json
import settings
import requests
import urllib

#Holen Sie sich Token von der API
def authorize():

    url = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"

    headers = {
        "Content-type": "application/x-www-form-urlencoded",
        "Ocp-Apim-Subscription-Key": "Erhaltener Schlüssel"
    }

    response = requests.post(url, headers=headers)

    if response.ok:
        _body = response.text
        return _body
    else:
        response.raise_for_status()

#Speichern Sie den erworbenen Token
token = authorize()

#Dateiauswahl
infile = open("record.wav","r")
data = infile.read()

#Werfen Sie zur API und erhalten Sie Ergebnisse
def speech_to_text( raw_data, token, lang="ja-JP", samplerate=8000, scenarios="ulm"):
    data = raw_data
    params = {
        "version": "3.0",
        "requestid": "b2c95ede-97eb-4c88-81e4-80f32d6aee54",
        "appid": "D4D52672-91D7-4C74-8AD8-42B1D98141A5",
        "format": "json",
        "locale": lang,
        "device.os": "Windows",
        "scenarios": scenarios,
        "instanceid": "565D69FF-E928-4B7E-87DA-9A750B96D9E3"
    }

    url = "https://speech.platform.bing.com/recognize?" + urllib.urlencode(params)
    headers = {"Content-type": "audio/wav; samplerate={0}".format(samplerate),
               "Authorization": "Bearer " + token }

    response = requests.post(url, data=data, headers=headers)

    if response.ok:
        result = response.json()["results"][0]
        return result["lexical"]
    else:
        raise response.raise_for_status()

#Speichern Sie die von der API erfassten Daten
message = speech_to_text(data,token,lang="ja-JP", samplerate=8000, scenarios="ulm")

#settings.Holen Sie sich Token von py
twitter = OAuth1Session(settings.CONSUMER_KEY, settings.CONSUMER_SECRET, settings.ACCESS_TOKEN, settings.ACCESS_TOKEN_SECRET)

#Tweet
params = {"status":"%s"%message}
req = twitter.post("https://api.twitter.com/1.1/statuses/update.json",params = params

Versuchen anzurufen

Wenn Sie die Twilio-Nummer anrufen, wird "Aufzeichnen des Tweet-Inhalts. Drücken Sie nach der Aufnahme Scharf." Angezeigt. Teilen Sie also den Inhalt mit, den Sie twittern möchten. Es wird nach einer Weile getwittert.

Es scheint nicht zu funktionieren, wenn es zu lang oder zu kurz ist.

Herausforderungen zeigen

Es hat vorerst funktioniert, aber es gibt einige Probleme.

1. Aus irgendeinem Grund tritt in Twilio ein Fehler auf (hinzugefügt am 26. Oktober 2017)

Am Ende des Aufrufs wird angezeigt, dass ein Anwendungsfehler aufgetreten ist. Der Fehler wird auch im Twilio-Debugger angezeigt, wurde jedoch nicht behoben.

→ Ich habe es gelöst und einen Artikel geschrieben. Über Systemfehler, mit denen Sie nur telefonisch twittern können

2. Festlegen von Berechtigungen

Diesmal war ich ziemlich süchtig nach den rudimentären Berechtigungseinstellungen. Es gibt einige Teile, die ich noch nicht verstanden habe, daher ist ein Studium erforderlich.

3. Sicherheitsgeschichte

Ich bin der Meinung, dass dies nicht gut für die Sicherheit ist, z. B. das gewaltsame Ausführen mit "exec ()" während des Programms. (Befehlsinjektion) Danach ist es notwendig, die Datenübertragung von PHP für CSRF-Maßnahmen zu entwickeln.

Ich möchte den Zugriff auf TwiML einschränken, frage mich aber, ob dies möglich ist.

4. Die aufgezeichnete Datei verbleibt auf Twilio (hinzugefügt am 27.10.2017)

Aufgezeichnete Dateien bleiben auf Twilio und sammeln sich bei jedem Tweet an. Es scheint, dass es mit der API gelöscht werden kann, so dass es scheint, dass dieses Problem gelöst werden kann.

→ Ich habe ein Programm zum Löschen geschrieben und daraus einen Artikel gemacht. Alle aufgezeichneten Daten mit Twilio löschen

Recommended Posts

Ich habe ein System erstellt, mit dem Sie nur durch einen Anruf twittern können
Ich habe ein Programm erstellt, um Sie per LINE zu benachrichtigen, wenn Schalter eintreffen
Ich habe eine verdammte App gemacht, mit der du nicht überspringen kannst
Ich habe Sie dazu gebracht, Befehle über einen WEB-Browser auszuführen
[Python] Ich habe eine Funktion erstellt, die AES entschlüsselt und entschlüsselt, indem ich sie einfach mit pycrypto geworfen habe.
Ich habe versucht, ein System zu erstellen, das nur gelöschte Tweets abruft
Wollen Sie nicht sagen, dass Sie ein Gesichtserkennungsprogramm erstellt haben?
Ich habe einen Twitter-Bot erstellt, der das von #PokemonGO gefangene Pokemon murmelt
Erstellt einen Dienst, mit dem Sie J-League-Daten durchsuchen können
Ich habe ein Buch geschrieben, in dem Sie maschinelle Lernimplementierungen und -algorithmen auf ausgewogene Weise lernen können.
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
Ich habe eine Bibliothek konoha gemacht, die den Tokenizer auf ein schönes Gefühl umstellt
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
Ich habe ein System erstellt, das automatisch entscheidet, ob es morgen mit Python ausgeführt wird, und es zu Google Kalender hinzufügt.
Ich habe einen Zeilenbot erstellt, der Python verwendet, um ungelesene E-Mails aus Google Mail abzurufen!
Ich habe gerade ein Tool erstellt, mit dem Daten mithilfe der GUI-Operation einfach als Diagramm angezeigt werden können
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
Ich habe ein Modul in C-Sprache erstellt, das von Python geladene Bilder filtert
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Ich habe ein Tool erstellt, um Hy nativ zu kompilieren
Ich habe ein Tool erstellt, um neue Artikel zu erhalten
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Ich habe vergessen, VIM zu bedienen, also habe ich ein Video zum Auswendiglernen gemacht. 3 Videos nach Level
Ich habe eine Bibliothek erstellt, um japanische Sätze schön zu brechen
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe ein Skript erstellt, um ein Snippet in README.md einzufügen
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich habe einen Code erstellt, um illustration2vec in ein Keras-Modell zu konvertieren
Eine Geschichte, von der ich bei np.where süchtig war
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Ermöglicht die Auswahl nach Namen aus dem Django-Benutzernamen
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
Erstellt einen Toolsver, der Betriebssystem, Python, Module und Toolversionen an Markdown ausspuckt
Ich habe ein Tool erstellt, mit dem das Erstellen und Installieren eines öffentlichen Schlüssels etwas einfacher ist.
Lern-Roadmap, mit der Sie Services mit Python von Grund auf neu entwickeln und veröffentlichen können
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Ich habe ein grobes Ansible-Modul geschrieben, mit dem Sie Virtualenv verwenden können, indem Sie Pythonz installieren.
Einführung von "Sherlock", einem CLI-Tool, mit dem Sie in SNS nach Benutzernamen suchen können
Erstellt ein Tool, mit dem Sie bequem Parameter für Modelle des maschinellen Lernens festlegen können
Python-Skript, das den Status des Servers über den Browser überprüfen kann