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.
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.
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
Vous pouvez l'obtenir à partir de la page ici.
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é.
Le traitement côté Twilio est écrit en TwiML et PHP, et l'autre traitement est écrit en Python.
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.
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.
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
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.
Cela a fonctionné pour le moment, mais il y a des problèmes.
À 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
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.
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.
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