[PYTHON] Écoutez un roman qui sera sur Amazon Polly

Cet article est l'article du 18ème jour du CPS Lab Advent Calendar 2016.


Lorsque vous lisez un roman, vous pouvez être inquiet de la suite et vouloir lire la suite en conduisant ou en mangeant. De plus, je pense qu'il y a des moments où vous voulez lire sur un trajet du matin ou un train scolaire, mais vous ne pouvez pas tenir un livre, un Kindle ou un smartphone dans un train bondé.

Si vous utilisez Amazon Polly, vous pouvez maintenant écouter un roman qui serait très facile à convertir en voix.

Cependant, Polly a les [limites] suivantes (https://docs.aws.amazon.com/ja_jp/polly/latest/dg/limits.html).

La taille du texte d'entrée est de 1500 caractères facturables maximum (3000 caractères au total). Les balises SSML ne sont pas comptées comme des caractères facturables. Vous pouvez spécifier jusqu'à 5 lexiques à appliquer au texte d'entrée. Le flux audio de sortie (composite) est limité à 5 minutes. Passé ce délai, le reste de l'audio sera coupé

J'ai donc pensé convertir chaque épisode du roman en voix, mais peut-être que j'étais pris dans la limite et que je ne connaissais pas les personnages à facturer pour 1500, alors je l'ai divisé en 1000 caractères et je l'ai converti, et enfin un J'ai créé un programme pour synthétiser et enregistrer au format MP3.

AWS CLI Préparons-nous pour Polly pour le moment. Cette fois, je le ferai avec Python, mais je le ferai car il est nécessaire de préparer l'AWS CLI. C'est facile à dire, et si vous regardez ici, vous le comprendrez, mais expliquons-le grossièrement.

Installez-le d'abord. Je vais le faire en Python, donc je peux utiliser pip.

pip install awscli

MaxOS El Capitan personnes

pip install awscli --ignore-installed six

Seulement ça. Ensuite, je pense que j'ai pu l'installer, donc je vais définir la clé d'accès et ainsi de suite.

$ aws configure
AWS Access Key ID []: your access key
AWS Secret Access Key []: your secret key
Default region name [us-east-1]: us-east-1
Default output format [None]:

C'est acceptable. La région peut être n'importe quelle région où Polly peut être utilisé, mais si vous ne savez pas, «us-east-1» est très bien.

AWS SDK for Python (Boto3) Un SDK appelé Boto3 est disponible pour une utilisation avec python, alors utilisez-le.

pip install boto3

c'est tout.

Ensuite, l'exemple qui se trouvait dans here est le même, mais il est converti en exécutant le code suivant. Ensuite, le lecteur mp3 par défaut commencera et commencera à parler.

"""Getting Started Example for Python 2.7+/3.3+"""
from boto3 import Session
from botocore.exceptions import BotoCoreError, ClientError
from contextlib import closing
import os
import sys
import subprocess
from tempfile import gettempdir

# Create a client using the credentials and region defined in the [adminuser]
# section of the AWS credentials file (~/.aws/credentials).
session = Session(profile_name="adminuser")
polly = session.client("polly")

try:
    # Request speech synthesis
    response = polly.synthesize_speech(Text="Hello world!", OutputFormat="mp3",
                                        VoiceId="Joanna")
except (BotoCoreError, ClientError) as error:
    # The service returned an error, exit gracefully
    print(error)
    sys.exit(-1)

# Access the audio stream from the response
if "AudioStream" in response:
    # Note: Closing the stream is important as the service throttles on the
    # number of parallel connections. Here we are using contextlib.closing to
    # ensure the close method of the stream object will be called automatically
    # at the end of the with statement's scope.
    with closing(response["AudioStream"]) as stream:
        output = os.path.join(gettempdir(), "speech.mp3")

        try:
            # Open a file for writing the output as a binary stream
            with open(output, "wb") as file:
                file.write(stream.read())
        except IOError as error:
            # Could not write to file, exit gracefully
            print(error)
            sys.exit(-1)

else:
    # The response didn't contain audio data, exit gracefully
    print("Could not stream audio")
    sys.exit(-1)

# Play the audio using the platform's default player
if sys.platform == "win32":
    os.startfile(output)
else:
    # the following works on Mac and Linux. (Darwin = mac, xdg-open = linux).
    opener = "open" if sys.platform == "darwin" else "xdg-open"
subprocess.call([opener, output])

VoiceId Il existe pas mal de types de voix, mais comme il n'y a qu'un seul Mizuki en japonais, je vais l'utiliser.

Divisez et convertissez

Une fois arrivé ici, le reste est facile. Tout d'abord, enregistrez le roman de Naruro localement. Ensuite, lisez le fichier texte enregistré et divisez-le en 1000 caractères chacun.

def split_str(s, n):
    length = len(s)
    return [s[i:i + n] for i in range(0, length, n)]

f = open(filename)
text = f.read()
f.close()
texts = split_str(text, 1000)

De plus, disons que le processus de lancement à Polly est finalement transformé en fonction, et stream.read () est retourné comme valeur de retour. Ensuite, tout ce que vous avez à faire est de l'écrire sur MP3

out = open('output.mp3', 'wb')
for item in texts:
    stream = request_speech(item)
    out.write(stream)
out.close()    

C'est tout ce qu'on peut en dire. Eh bien, pour plus de détails, veuillez consulter Référence officielle car il est généralement écrit. C'est en japonais.

Résumé

C'est comme si je l'avais demandé, mais cela me vient à l'esprit. Cependant, si vous ne l'écoutez pas de manière très intensive, vous ne pourrez pas du tout saisir le flux, donc je pense qu'il est probablement impossible de l'écouter pendant que vous travaillez. De plus, comme ils parlent tous de la même voix et du même ton, il y a un sentiment d'inconfort dans la conversation. Eh bien, comme prévu. Je pense que ce serait tout à fait différent si vous pouviez choisir entre des voix masculines et féminines avant la conversation. De plus, je peux personnaliser les mots avec Lexicon, mais il ne semble pas prendre en charge le japonais. Dissolution!

Comme mentionné ci-dessus, le code source est publié sur Github. nshiba/TextToSpeechFromPolly

Recommended Posts

Écoutez un roman qui sera sur Amazon Polly
Comment créer un environnement Python sur Amazon Linux 2
J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10
[Python] Un programme qui calcule le nombre de chaussettes jumelées
Comment créer un bot Janken qui peut être facilement déplacé (commentaire)
Une histoire à laquelle j'étais accro à essayer d'installer LightFM sur Amazon Linux
Générer semi-automatiquement une description du package à enregistrer dans PyPI
Je voulais créer rapidement un serveur de messagerie utilisable librement avec postfix + dovecot sur EC2
Comment mettre à jour PHP sur Amazon Linux 2
Comment tester sur une page authentifiée par Django
Notes pour créer des figures pouvant être publiées dans des revues avec matplotlib
Atcoder Beginner Contest A, B Résumé d'entrée qui a tendance à être un problème Python
Comment publier un blog sur Amazon S3 avec le moteur de blog statique `` Pélican '' pour Pythonista
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
Comment installer la bibliothèque Python qui peut être utilisée par les sociétés pharmaceutiques
J'ai écrit un script pour relancer la montre gulp qui mourra bientôt
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
[Hackason] À propos de la création d'un outil pouvant être imprimé sur Raspberry Pi [Outil pratique]