[PYTHON] J'ai créé un système qui vous permet de tweeter simplement en passant un appel téléphonique

Je veux tweeter, mais je n'ai pas de smartphone ou d'ordinateur sous la main. Mais il existe des téléphones fixes. Quel est le problème?

Même dans une telle situation, nous avons créé un système qui vous permet de tweeter avec un seul appel téléphonique.

Comment ça fonctionne

スライド1.JPG

Technologie à utiliser

Préparation

Faites-le dans un environnement Linux. Cette fois, j'ai utilisé Debian avec VPS.

Il n'est pas nécessaire d'installer une bibliothèque spéciale, il suffit de créer un environnement LAMP. Veuillez modifier le répertoire dans le code source comme il convient.

Il semble que Twilio puisse également reconnaître la voix, mais comme il ne prend pas en charge le japonais, nous avons cette fois adopté l'API Bing Speech pour la reconnaissance vocale.

Préparer Twilio

Créez simplement un compte. Il existe des comptes payants et des comptes gratuits (avec des restrictions sur les essais), mais dans ce cas, nous avons pu l'implémenter avec un compte gratuit.

Cette zone sera utile pour l'acquisition et le mécanisme de compte. Première étape Twilio

Préparation de l'API Bing Speech

Vous pouvez l'obtenir à partir de la page ici. azure.JPG

Vous pouvez obtenir la clé immédiatement en acceptant les conditions d'utilisation et en vous connectant à partir de "Get API Key". Vous pouvez également vous connecter avec votre compte Github.

Deux types de clés seront émis, mais il semble que l'un ou l'autre puisse être utilisé.

programme

Le traitement côté Twilio est écrit en TwiML et PHP, et l'autre traitement est écrit en Python.

Ecrire TwiML

Placez le fichier XML suivant dans un emplacement accessible à partir d'Internet, tel qu'un serveur Web. Ensuite, définissez l'URL depuis la page du compte twilio.

record.xml


<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say language="ja-JP">Enregistrez le contenu du tweet. Après l'enregistrement, appuyez sur Sharp.</Say>
<Record method="GET" timeout="60" maxLength="30" finishOnKey="#" action="./get.php" />
</Response>

Ces quelques lignes parleront et même enregistreront automatiquement. TwiML C'est bien parce que c'est facile à comprendre et facile. Pour plus de détails, reportez-vous à Référence officielle.

Ecrire PHP

C'est la partie de ʻaction = "./ get.php" écrite dans de TwiML. Le processus est passé à get.php` après la fermeture de l'appel.

get.php


<?php

//Obtenir l'URL du fichier d'enregistrement
$recordingUrl = $_GET['RecordingUrl'];
$recordingUrl .= ".wav";

//Télécharger le fichier d'enregistrement
exec("wget -N -O ./record.wav $recordingUrl");

//Exécutez python
exec("python ./tweet.py");

?>

Comme vous pouvez le voir dans la référence, RecordingUrl est envoyé comme paramètre depuis l'attribut ʻaction. Vous pouvez le recevoir par GET ou POST. C'est la même chose que HTML et d'autres formulaires. Cette fois, j'ai spécifié GET avec method` de TwiML, donc c'est GET.

Notez qu'en fonction des paramètres d'autorisation du fichier ou du répertoire de destination d'enregistrement, les paramètres peuvent ne pas être obtenus ou l'audio peut ne pas être enregistré. J'étais inquiet pendant quelques jours parce que je ne pouvais pas résoudre les problèmes de permission super rudimentaires.

Après avoir téléchargé le fichier vocal enregistré, exécutez le programme python pour effectuer la reconnaissance vocale → traitement des tweets.

Ecrire Python

Cet article m'a aidé à créer un programme Python. Comment convertir la voix de Twilio en texte à l'aide de l'API Bing Speech de Microsoft

Tout d'abord, créez settings.py pour faire référence à la clé API pour les tweets.

settings.py


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

Next est un programme qui exécute tout, de la reconnaissance vocale aux tweets.

tweet.py


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

#Obtenir des jetons de l'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": "Clé obtenue"
    }

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

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

#Stocker le jeton acquis
token = authorize()

#Sélection de fichiers
infile = open("record.wav","r")
data = infile.read()

#Jetez-vous à l'API et obtenez des résultats
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()

#Stocker les données acquises par l'API
message = speech_to_text(data,token,lang="ja-JP", samplerate=8000, scenarios="ulm")

#settings.Obtenir un jeton de 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

Essayez d'appeler

Lorsque vous appelez le numéro Twilio, il annoncera "Enregistrez le contenu du tweet. Après l'enregistrement, appuyez sur Sharp.", Alors indiquez le contenu que vous souhaitez tweeter. Il sera tweeté après un certain temps.

Cela ne semble pas fonctionner s'il est trop long ou trop court.

Point de défis

Cela a fonctionné pour le moment, mais il y a des problèmes.

1. Pour une raison quelconque, une erreur se produit dans Twilio (Ajouté le 26 octobre 2017)

À la fin de l'appel, il est dit "Une erreur d'application s'est produite". L'erreur est également affichée dans le débogueur de Twilio, mais elle n'a pas été résolue.

→ Je l'ai résolu, alors j'ai écrit un article. À propos des erreurs système qui vous permettent de tweeter simplement en appelant

2. Définition des autorisations

Cette fois, j'étais assez accro aux paramètres d'autorisation rudimentaires. Il y a certaines parties que je n'ai pas encore comprises, donc une étude est nécessaire.

3. Histoire de sécurité

Je pense que cela ne semble pas bon pour la sécurité, comme l'exécution forcée avec ʻexec () `pendant le programme. (Injection de commande) Après cela, il est nécessaire de concevoir le transfert de données de PHP pour les mesures CSRF.

Je veux restreindre l'accès à TwiML, mais je me demande si cela peut être fait.

4. Le fichier enregistré reste sur Twilio (ajouté le 2017/10/27)

Les fichiers enregistrés resteront sur Twilio et s'accumuleront à chaque fois que vous tweetez. Il semble qu'il puisse être supprimé avec l'API, il semble donc que ce problème puisse être résolu.

→ J'ai écrit un programme de suppression, alors j'en ai fait un article. Supprimer toutes les données enregistrées avec Twilio

Recommended Posts

J'ai créé un système qui vous permet de tweeter simplement en passant un appel téléphonique
J'ai créé un programme pour vous avertir par LINE lorsque les commutateurs arrivent
J'ai fait une putain d'application qui ne te laisse pas sauter
Je vous ai fait exécuter des commandes depuis un navigateur WEB
[Python] J'ai créé une fonction qui déchiffre et décrypte AES simplement en le lançant avec pycrypto.
J'ai essayé de créer un système qui ne récupère que les tweets supprimés
Vous ne voulez pas dire que vous avez créé un programme de reconnaissance faciale?
J'ai créé un robot Twitter qui marmonne le Pokémon capturé par #PokemonGO
Création d'un service qui vous permet de rechercher des données J-League
J'ai écrit un livre qui vous permet d'apprendre les implémentations et les algorithmes d'apprentissage automatique de manière équilibrée.
J'ai créé une application Web en Python qui convertit Markdown en HTML
J'ai créé un konoha de bibliothèque qui fait passer le tokenizer à une belle sensation
J'ai fait un script pour afficher des pictogrammes
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
Je viens de créer un outil pour afficher facilement les données sous forme de graphique par opération GUI
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
J'ai fait un module en langage C qui filtre les images chargées par Python
Une histoire à laquelle j'étais accro après la communication SFTP avec python
J'ai créé un outil pour compiler nativement Hy
J'ai créé un outil pour obtenir de nouveaux articles
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
J'ai oublié d'utiliser VIM, j'ai donc fait une vidéo pour la mémorisation. 3 vidéos par niveau
J'ai fait une bibliothèque pour bien séparer les phrases japonaises
J'ai créé une VM qui exécute OpenCV pour Python
J'ai fait un script pour mettre un extrait dans README.md
J'ai créé un module Python pour traduire les commentaires
J'ai créé un code pour convertir illustration2vec en modèle Keras
Une histoire à laquelle j'étais accro chez np.where
J'ai fait une commande pour marquer le clip de la table
Vous permet de sélectionner par nom à partir du nom d'utilisateur Django
J'ai créé une bibliothèque python qui fait rouler le rang
Création d'un toolver qui crache le système d'exploitation, Python, les modules et les versions d'outils à Markdown
J'ai créé un outil qui facilite un peu la création et l'installation d'une clé publique.
Feuille de route d'apprentissage qui vous permet de développer et de publier des services à partir de zéro avec Python
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai écrit un module Ansible brut qui vous permet d'utiliser Virtualenv en installant Pythonz.
Présentation de «Sherlock», un outil CLI qui vous permet de rechercher des noms d’utilisateur dans SNS
Création d'un outil qui facilite la définition des paramètres des modèles d'apprentissage automatique
Script Python qui peut vérifier l'état du serveur à partir du navigateur