Run black on moto & test directories.

This commit is contained in:
Asher Foa 2019-10-31 08:44:26 -07:00
commit 96e5b1993d
507 changed files with 52541 additions and 47814 deletions

View file

@ -2,5 +2,5 @@ from __future__ import unicode_literals
from .models import polly_backends
from ..core.models import base_decorator
polly_backend = polly_backends['us-east-1']
polly_backend = polly_backends["us-east-1"]
mock_polly = base_decorator(polly_backends)

View file

@ -32,33 +32,36 @@ class Lexicon(BaseModel):
try:
root = ET.fromstring(self.content)
self.size = len(self.content)
self.last_modified = int((datetime.datetime.now() -
datetime.datetime(1970, 1, 1)).total_seconds())
self.lexemes_count = len(root.findall('.'))
self.last_modified = int(
(
datetime.datetime.now() - datetime.datetime(1970, 1, 1)
).total_seconds()
)
self.lexemes_count = len(root.findall("."))
for key, value in root.attrib.items():
if key.endswith('alphabet'):
if key.endswith("alphabet"):
self.alphabet = value
elif key.endswith('lang'):
elif key.endswith("lang"):
self.language_code = value
except Exception as err:
raise ValueError('Failure parsing XML: {0}'.format(err))
raise ValueError("Failure parsing XML: {0}".format(err))
def to_dict(self):
return {
'Attributes': {
'Alphabet': self.alphabet,
'LanguageCode': self.language_code,
'LastModified': self.last_modified,
'LexemesCount': self.lexemes_count,
'LexiconArn': self.arn,
'Size': self.size
"Attributes": {
"Alphabet": self.alphabet,
"LanguageCode": self.language_code,
"LastModified": self.last_modified,
"LexemesCount": self.lexemes_count,
"LexiconArn": self.arn,
"Size": self.size,
}
}
def __repr__(self):
return '<Lexicon {0}>'.format(self.name)
return "<Lexicon {0}>".format(self.name)
class PollyBackend(BaseBackend):
@ -77,7 +80,7 @@ class PollyBackend(BaseBackend):
if language_code is None:
return VOICE_DATA
return [item for item in VOICE_DATA if item['LanguageCode'] == language_code]
return [item for item in VOICE_DATA if item["LanguageCode"] == language_code]
def delete_lexicon(self, name):
# implement here
@ -93,7 +96,7 @@ class PollyBackend(BaseBackend):
for name, lexicon in self._lexicons.items():
lexicon_dict = lexicon.to_dict()
lexicon_dict['Name'] = name
lexicon_dict["Name"] = name
result.append(lexicon_dict)
@ -111,4 +114,6 @@ class PollyBackend(BaseBackend):
available_regions = boto3.session.Session().get_available_regions("polly")
polly_backends = {region: PollyBackend(region_name=region) for region in available_regions}
polly_backends = {
region: PollyBackend(region_name=region) for region in available_regions
}

View file

@ -1,63 +1,418 @@
# -*- coding: utf-8 -*-
VOICE_DATA = [
{'Id': 'Joanna', 'LanguageCode': 'en-US', 'LanguageName': 'US English', 'Gender': 'Female', 'Name': 'Joanna'},
{'Id': 'Mizuki', 'LanguageCode': 'ja-JP', 'LanguageName': 'Japanese', 'Gender': 'Female', 'Name': 'Mizuki'},
{'Id': 'Filiz', 'LanguageCode': 'tr-TR', 'LanguageName': 'Turkish', 'Gender': 'Female', 'Name': 'Filiz'},
{'Id': 'Astrid', 'LanguageCode': 'sv-SE', 'LanguageName': 'Swedish', 'Gender': 'Female', 'Name': 'Astrid'},
{'Id': 'Tatyana', 'LanguageCode': 'ru-RU', 'LanguageName': 'Russian', 'Gender': 'Female', 'Name': 'Tatyana'},
{'Id': 'Maxim', 'LanguageCode': 'ru-RU', 'LanguageName': 'Russian', 'Gender': 'Male', 'Name': 'Maxim'},
{'Id': 'Carmen', 'LanguageCode': 'ro-RO', 'LanguageName': 'Romanian', 'Gender': 'Female', 'Name': 'Carmen'},
{'Id': 'Ines', 'LanguageCode': 'pt-PT', 'LanguageName': 'Portuguese', 'Gender': 'Female', 'Name': 'Inês'},
{'Id': 'Cristiano', 'LanguageCode': 'pt-PT', 'LanguageName': 'Portuguese', 'Gender': 'Male', 'Name': 'Cristiano'},
{'Id': 'Vitoria', 'LanguageCode': 'pt-BR', 'LanguageName': 'Brazilian Portuguese', 'Gender': 'Female', 'Name': 'Vitória'},
{'Id': 'Ricardo', 'LanguageCode': 'pt-BR', 'LanguageName': 'Brazilian Portuguese', 'Gender': 'Male', 'Name': 'Ricardo'},
{'Id': 'Maja', 'LanguageCode': 'pl-PL', 'LanguageName': 'Polish', 'Gender': 'Female', 'Name': 'Maja'},
{'Id': 'Jan', 'LanguageCode': 'pl-PL', 'LanguageName': 'Polish', 'Gender': 'Male', 'Name': 'Jan'},
{'Id': 'Ewa', 'LanguageCode': 'pl-PL', 'LanguageName': 'Polish', 'Gender': 'Female', 'Name': 'Ewa'},
{'Id': 'Ruben', 'LanguageCode': 'nl-NL', 'LanguageName': 'Dutch', 'Gender': 'Male', 'Name': 'Ruben'},
{'Id': 'Lotte', 'LanguageCode': 'nl-NL', 'LanguageName': 'Dutch', 'Gender': 'Female', 'Name': 'Lotte'},
{'Id': 'Liv', 'LanguageCode': 'nb-NO', 'LanguageName': 'Norwegian', 'Gender': 'Female', 'Name': 'Liv'},
{'Id': 'Giorgio', 'LanguageCode': 'it-IT', 'LanguageName': 'Italian', 'Gender': 'Male', 'Name': 'Giorgio'},
{'Id': 'Carla', 'LanguageCode': 'it-IT', 'LanguageName': 'Italian', 'Gender': 'Female', 'Name': 'Carla'},
{'Id': 'Karl', 'LanguageCode': 'is-IS', 'LanguageName': 'Icelandic', 'Gender': 'Male', 'Name': 'Karl'},
{'Id': 'Dora', 'LanguageCode': 'is-IS', 'LanguageName': 'Icelandic', 'Gender': 'Female', 'Name': 'Dóra'},
{'Id': 'Mathieu', 'LanguageCode': 'fr-FR', 'LanguageName': 'French', 'Gender': 'Male', 'Name': 'Mathieu'},
{'Id': 'Celine', 'LanguageCode': 'fr-FR', 'LanguageName': 'French', 'Gender': 'Female', 'Name': 'Céline'},
{'Id': 'Chantal', 'LanguageCode': 'fr-CA', 'LanguageName': 'Canadian French', 'Gender': 'Female', 'Name': 'Chantal'},
{'Id': 'Penelope', 'LanguageCode': 'es-US', 'LanguageName': 'US Spanish', 'Gender': 'Female', 'Name': 'Penélope'},
{'Id': 'Miguel', 'LanguageCode': 'es-US', 'LanguageName': 'US Spanish', 'Gender': 'Male', 'Name': 'Miguel'},
{'Id': 'Enrique', 'LanguageCode': 'es-ES', 'LanguageName': 'Castilian Spanish', 'Gender': 'Male', 'Name': 'Enrique'},
{'Id': 'Conchita', 'LanguageCode': 'es-ES', 'LanguageName': 'Castilian Spanish', 'Gender': 'Female', 'Name': 'Conchita'},
{'Id': 'Geraint', 'LanguageCode': 'en-GB-WLS', 'LanguageName': 'Welsh English', 'Gender': 'Male', 'Name': 'Geraint'},
{'Id': 'Salli', 'LanguageCode': 'en-US', 'LanguageName': 'US English', 'Gender': 'Female', 'Name': 'Salli'},
{'Id': 'Kimberly', 'LanguageCode': 'en-US', 'LanguageName': 'US English', 'Gender': 'Female', 'Name': 'Kimberly'},
{'Id': 'Kendra', 'LanguageCode': 'en-US', 'LanguageName': 'US English', 'Gender': 'Female', 'Name': 'Kendra'},
{'Id': 'Justin', 'LanguageCode': 'en-US', 'LanguageName': 'US English', 'Gender': 'Male', 'Name': 'Justin'},
{'Id': 'Joey', 'LanguageCode': 'en-US', 'LanguageName': 'US English', 'Gender': 'Male', 'Name': 'Joey'},
{'Id': 'Ivy', 'LanguageCode': 'en-US', 'LanguageName': 'US English', 'Gender': 'Female', 'Name': 'Ivy'},
{'Id': 'Raveena', 'LanguageCode': 'en-IN', 'LanguageName': 'Indian English', 'Gender': 'Female', 'Name': 'Raveena'},
{'Id': 'Emma', 'LanguageCode': 'en-GB', 'LanguageName': 'British English', 'Gender': 'Female', 'Name': 'Emma'},
{'Id': 'Brian', 'LanguageCode': 'en-GB', 'LanguageName': 'British English', 'Gender': 'Male', 'Name': 'Brian'},
{'Id': 'Amy', 'LanguageCode': 'en-GB', 'LanguageName': 'British English', 'Gender': 'Female', 'Name': 'Amy'},
{'Id': 'Russell', 'LanguageCode': 'en-AU', 'LanguageName': 'Australian English', 'Gender': 'Male', 'Name': 'Russell'},
{'Id': 'Nicole', 'LanguageCode': 'en-AU', 'LanguageName': 'Australian English', 'Gender': 'Female', 'Name': 'Nicole'},
{'Id': 'Vicki', 'LanguageCode': 'de-DE', 'LanguageName': 'German', 'Gender': 'Female', 'Name': 'Vicki'},
{'Id': 'Marlene', 'LanguageCode': 'de-DE', 'LanguageName': 'German', 'Gender': 'Female', 'Name': 'Marlene'},
{'Id': 'Hans', 'LanguageCode': 'de-DE', 'LanguageName': 'German', 'Gender': 'Male', 'Name': 'Hans'},
{'Id': 'Naja', 'LanguageCode': 'da-DK', 'LanguageName': 'Danish', 'Gender': 'Female', 'Name': 'Naja'},
{'Id': 'Mads', 'LanguageCode': 'da-DK', 'LanguageName': 'Danish', 'Gender': 'Male', 'Name': 'Mads'},
{'Id': 'Gwyneth', 'LanguageCode': 'cy-GB', 'LanguageName': 'Welsh', 'Gender': 'Female', 'Name': 'Gwyneth'},
{'Id': 'Jacek', 'LanguageCode': 'pl-PL', 'LanguageName': 'Polish', 'Gender': 'Male', 'Name': 'Jacek'}
{
"Id": "Joanna",
"LanguageCode": "en-US",
"LanguageName": "US English",
"Gender": "Female",
"Name": "Joanna",
},
{
"Id": "Mizuki",
"LanguageCode": "ja-JP",
"LanguageName": "Japanese",
"Gender": "Female",
"Name": "Mizuki",
},
{
"Id": "Filiz",
"LanguageCode": "tr-TR",
"LanguageName": "Turkish",
"Gender": "Female",
"Name": "Filiz",
},
{
"Id": "Astrid",
"LanguageCode": "sv-SE",
"LanguageName": "Swedish",
"Gender": "Female",
"Name": "Astrid",
},
{
"Id": "Tatyana",
"LanguageCode": "ru-RU",
"LanguageName": "Russian",
"Gender": "Female",
"Name": "Tatyana",
},
{
"Id": "Maxim",
"LanguageCode": "ru-RU",
"LanguageName": "Russian",
"Gender": "Male",
"Name": "Maxim",
},
{
"Id": "Carmen",
"LanguageCode": "ro-RO",
"LanguageName": "Romanian",
"Gender": "Female",
"Name": "Carmen",
},
{
"Id": "Ines",
"LanguageCode": "pt-PT",
"LanguageName": "Portuguese",
"Gender": "Female",
"Name": "Inês",
},
{
"Id": "Cristiano",
"LanguageCode": "pt-PT",
"LanguageName": "Portuguese",
"Gender": "Male",
"Name": "Cristiano",
},
{
"Id": "Vitoria",
"LanguageCode": "pt-BR",
"LanguageName": "Brazilian Portuguese",
"Gender": "Female",
"Name": "Vitória",
},
{
"Id": "Ricardo",
"LanguageCode": "pt-BR",
"LanguageName": "Brazilian Portuguese",
"Gender": "Male",
"Name": "Ricardo",
},
{
"Id": "Maja",
"LanguageCode": "pl-PL",
"LanguageName": "Polish",
"Gender": "Female",
"Name": "Maja",
},
{
"Id": "Jan",
"LanguageCode": "pl-PL",
"LanguageName": "Polish",
"Gender": "Male",
"Name": "Jan",
},
{
"Id": "Ewa",
"LanguageCode": "pl-PL",
"LanguageName": "Polish",
"Gender": "Female",
"Name": "Ewa",
},
{
"Id": "Ruben",
"LanguageCode": "nl-NL",
"LanguageName": "Dutch",
"Gender": "Male",
"Name": "Ruben",
},
{
"Id": "Lotte",
"LanguageCode": "nl-NL",
"LanguageName": "Dutch",
"Gender": "Female",
"Name": "Lotte",
},
{
"Id": "Liv",
"LanguageCode": "nb-NO",
"LanguageName": "Norwegian",
"Gender": "Female",
"Name": "Liv",
},
{
"Id": "Giorgio",
"LanguageCode": "it-IT",
"LanguageName": "Italian",
"Gender": "Male",
"Name": "Giorgio",
},
{
"Id": "Carla",
"LanguageCode": "it-IT",
"LanguageName": "Italian",
"Gender": "Female",
"Name": "Carla",
},
{
"Id": "Karl",
"LanguageCode": "is-IS",
"LanguageName": "Icelandic",
"Gender": "Male",
"Name": "Karl",
},
{
"Id": "Dora",
"LanguageCode": "is-IS",
"LanguageName": "Icelandic",
"Gender": "Female",
"Name": "Dóra",
},
{
"Id": "Mathieu",
"LanguageCode": "fr-FR",
"LanguageName": "French",
"Gender": "Male",
"Name": "Mathieu",
},
{
"Id": "Celine",
"LanguageCode": "fr-FR",
"LanguageName": "French",
"Gender": "Female",
"Name": "Céline",
},
{
"Id": "Chantal",
"LanguageCode": "fr-CA",
"LanguageName": "Canadian French",
"Gender": "Female",
"Name": "Chantal",
},
{
"Id": "Penelope",
"LanguageCode": "es-US",
"LanguageName": "US Spanish",
"Gender": "Female",
"Name": "Penélope",
},
{
"Id": "Miguel",
"LanguageCode": "es-US",
"LanguageName": "US Spanish",
"Gender": "Male",
"Name": "Miguel",
},
{
"Id": "Enrique",
"LanguageCode": "es-ES",
"LanguageName": "Castilian Spanish",
"Gender": "Male",
"Name": "Enrique",
},
{
"Id": "Conchita",
"LanguageCode": "es-ES",
"LanguageName": "Castilian Spanish",
"Gender": "Female",
"Name": "Conchita",
},
{
"Id": "Geraint",
"LanguageCode": "en-GB-WLS",
"LanguageName": "Welsh English",
"Gender": "Male",
"Name": "Geraint",
},
{
"Id": "Salli",
"LanguageCode": "en-US",
"LanguageName": "US English",
"Gender": "Female",
"Name": "Salli",
},
{
"Id": "Kimberly",
"LanguageCode": "en-US",
"LanguageName": "US English",
"Gender": "Female",
"Name": "Kimberly",
},
{
"Id": "Kendra",
"LanguageCode": "en-US",
"LanguageName": "US English",
"Gender": "Female",
"Name": "Kendra",
},
{
"Id": "Justin",
"LanguageCode": "en-US",
"LanguageName": "US English",
"Gender": "Male",
"Name": "Justin",
},
{
"Id": "Joey",
"LanguageCode": "en-US",
"LanguageName": "US English",
"Gender": "Male",
"Name": "Joey",
},
{
"Id": "Ivy",
"LanguageCode": "en-US",
"LanguageName": "US English",
"Gender": "Female",
"Name": "Ivy",
},
{
"Id": "Raveena",
"LanguageCode": "en-IN",
"LanguageName": "Indian English",
"Gender": "Female",
"Name": "Raveena",
},
{
"Id": "Emma",
"LanguageCode": "en-GB",
"LanguageName": "British English",
"Gender": "Female",
"Name": "Emma",
},
{
"Id": "Brian",
"LanguageCode": "en-GB",
"LanguageName": "British English",
"Gender": "Male",
"Name": "Brian",
},
{
"Id": "Amy",
"LanguageCode": "en-GB",
"LanguageName": "British English",
"Gender": "Female",
"Name": "Amy",
},
{
"Id": "Russell",
"LanguageCode": "en-AU",
"LanguageName": "Australian English",
"Gender": "Male",
"Name": "Russell",
},
{
"Id": "Nicole",
"LanguageCode": "en-AU",
"LanguageName": "Australian English",
"Gender": "Female",
"Name": "Nicole",
},
{
"Id": "Vicki",
"LanguageCode": "de-DE",
"LanguageName": "German",
"Gender": "Female",
"Name": "Vicki",
},
{
"Id": "Marlene",
"LanguageCode": "de-DE",
"LanguageName": "German",
"Gender": "Female",
"Name": "Marlene",
},
{
"Id": "Hans",
"LanguageCode": "de-DE",
"LanguageName": "German",
"Gender": "Male",
"Name": "Hans",
},
{
"Id": "Naja",
"LanguageCode": "da-DK",
"LanguageName": "Danish",
"Gender": "Female",
"Name": "Naja",
},
{
"Id": "Mads",
"LanguageCode": "da-DK",
"LanguageName": "Danish",
"Gender": "Male",
"Name": "Mads",
},
{
"Id": "Gwyneth",
"LanguageCode": "cy-GB",
"LanguageName": "Welsh",
"Gender": "Female",
"Name": "Gwyneth",
},
{
"Id": "Jacek",
"LanguageCode": "pl-PL",
"LanguageName": "Polish",
"Gender": "Male",
"Name": "Jacek",
},
]
# {...} is also shorthand set syntax
LANGUAGE_CODES = {'cy-GB', 'da-DK', 'de-DE', 'en-AU', 'en-GB', 'en-GB-WLS', 'en-IN', 'en-US', 'es-ES', 'es-US',
'fr-CA', 'fr-FR', 'is-IS', 'it-IT', 'ja-JP', 'nb-NO', 'nl-NL', 'pl-PL', 'pt-BR', 'pt-PT', 'ro-RO',
'ru-RU', 'sv-SE', 'tr-TR'}
LANGUAGE_CODES = {
"cy-GB",
"da-DK",
"de-DE",
"en-AU",
"en-GB",
"en-GB-WLS",
"en-IN",
"en-US",
"es-ES",
"es-US",
"fr-CA",
"fr-FR",
"is-IS",
"it-IT",
"ja-JP",
"nb-NO",
"nl-NL",
"pl-PL",
"pt-BR",
"pt-PT",
"ro-RO",
"ru-RU",
"sv-SE",
"tr-TR",
}
VOICE_IDS = {'Geraint', 'Gwyneth', 'Mads', 'Naja', 'Hans', 'Marlene', 'Nicole', 'Russell', 'Amy', 'Brian', 'Emma',
'Raveena', 'Ivy', 'Joanna', 'Joey', 'Justin', 'Kendra', 'Kimberly', 'Salli', 'Conchita', 'Enrique',
'Miguel', 'Penelope', 'Chantal', 'Celine', 'Mathieu', 'Dora', 'Karl', 'Carla', 'Giorgio', 'Mizuki',
'Liv', 'Lotte', 'Ruben', 'Ewa', 'Jacek', 'Jan', 'Maja', 'Ricardo', 'Vitoria', 'Cristiano', 'Ines',
'Carmen', 'Maxim', 'Tatyana', 'Astrid', 'Filiz'}
VOICE_IDS = {
"Geraint",
"Gwyneth",
"Mads",
"Naja",
"Hans",
"Marlene",
"Nicole",
"Russell",
"Amy",
"Brian",
"Emma",
"Raveena",
"Ivy",
"Joanna",
"Joey",
"Justin",
"Kendra",
"Kimberly",
"Salli",
"Conchita",
"Enrique",
"Miguel",
"Penelope",
"Chantal",
"Celine",
"Mathieu",
"Dora",
"Karl",
"Carla",
"Giorgio",
"Mizuki",
"Liv",
"Lotte",
"Ruben",
"Ewa",
"Jacek",
"Jan",
"Maja",
"Ricardo",
"Vitoria",
"Cristiano",
"Ines",
"Carmen",
"Maxim",
"Tatyana",
"Astrid",
"Filiz",
}

View file

@ -9,7 +9,7 @@ from moto.core.responses import BaseResponse
from .models import polly_backends
from .resources import LANGUAGE_CODES, VOICE_IDS
LEXICON_NAME_REGEX = re.compile(r'^[0-9A-Za-z]{1,20}$')
LEXICON_NAME_REGEX = re.compile(r"^[0-9A-Za-z]{1,20}$")
class PollyResponse(BaseResponse):
@ -19,71 +19,75 @@ class PollyResponse(BaseResponse):
@property
def json(self):
if not hasattr(self, '_json'):
if not hasattr(self, "_json"):
self._json = json.loads(self.body)
return self._json
def _error(self, code, message):
return json.dumps({'__type': code, 'message': message}), dict(status=400)
return json.dumps({"__type": code, "message": message}), dict(status=400)
def _get_action(self):
# Amazon is now naming things /v1/api_name
url_parts = urlsplit(self.uri).path.lstrip('/').split('/')
url_parts = urlsplit(self.uri).path.lstrip("/").split("/")
# [0] = 'v1'
return url_parts[1]
# DescribeVoices
def voices(self):
language_code = self._get_param('LanguageCode')
next_token = self._get_param('NextToken')
language_code = self._get_param("LanguageCode")
next_token = self._get_param("NextToken")
if language_code is not None and language_code not in LANGUAGE_CODES:
msg = "1 validation error detected: Value '{0}' at 'languageCode' failed to satisfy constraint: " \
"Member must satisfy enum value set: [{1}]".format(language_code, ', '.join(LANGUAGE_CODES))
msg = (
"1 validation error detected: Value '{0}' at 'languageCode' failed to satisfy constraint: "
"Member must satisfy enum value set: [{1}]".format(
language_code, ", ".join(LANGUAGE_CODES)
)
)
return msg, dict(status=400)
voices = self.polly_backend.describe_voices(language_code, next_token)
return json.dumps({'Voices': voices})
return json.dumps({"Voices": voices})
def lexicons(self):
# Dish out requests based on methods
# anything after the /v1/lexicons/
args = urlsplit(self.uri).path.lstrip('/').split('/')[2:]
args = urlsplit(self.uri).path.lstrip("/").split("/")[2:]
if self.method == 'GET':
if self.method == "GET":
if len(args) == 0:
return self._get_lexicons_list()
else:
return self._get_lexicon(*args)
elif self.method == 'PUT':
elif self.method == "PUT":
return self._put_lexicons(*args)
elif self.method == 'DELETE':
elif self.method == "DELETE":
return self._delete_lexicon(*args)
return self._error('InvalidAction', 'Bad route')
return self._error("InvalidAction", "Bad route")
# PutLexicon
def _put_lexicons(self, lexicon_name):
if LEXICON_NAME_REGEX.match(lexicon_name) is None:
return self._error('InvalidParameterValue', 'Lexicon name must match [0-9A-Za-z]{1,20}')
return self._error(
"InvalidParameterValue", "Lexicon name must match [0-9A-Za-z]{1,20}"
)
if 'Content' not in self.json:
return self._error('MissingParameter', 'Content is missing from the body')
if "Content" not in self.json:
return self._error("MissingParameter", "Content is missing from the body")
self.polly_backend.put_lexicon(lexicon_name, self.json['Content'])
self.polly_backend.put_lexicon(lexicon_name, self.json["Content"])
return ''
return ""
# ListLexicons
def _get_lexicons_list(self):
next_token = self._get_param('NextToken')
next_token = self._get_param("NextToken")
result = {
'Lexicons': self.polly_backend.list_lexicons(next_token)
}
result = {"Lexicons": self.polly_backend.list_lexicons(next_token)}
return json.dumps(result)
@ -92,14 +96,11 @@ class PollyResponse(BaseResponse):
try:
lexicon = self.polly_backend.get_lexicon(lexicon_name)
except KeyError:
return self._error('LexiconNotFoundException', 'Lexicon not found')
return self._error("LexiconNotFoundException", "Lexicon not found")
result = {
'Lexicon': {
'Name': lexicon_name,
'Content': lexicon.content
},
'LexiconAttributes': lexicon.to_dict()['Attributes']
"Lexicon": {"Name": lexicon_name, "Content": lexicon.content},
"LexiconAttributes": lexicon.to_dict()["Attributes"],
}
return json.dumps(result)
@ -109,80 +110,94 @@ class PollyResponse(BaseResponse):
try:
self.polly_backend.delete_lexicon(lexicon_name)
except KeyError:
return self._error('LexiconNotFoundException', 'Lexicon not found')
return self._error("LexiconNotFoundException", "Lexicon not found")
return ''
return ""
# SynthesizeSpeech
def speech(self):
# Sanity check params
args = {
'lexicon_names': None,
'sample_rate': 22050,
'speech_marks': None,
'text': None,
'text_type': 'text'
"lexicon_names": None,
"sample_rate": 22050,
"speech_marks": None,
"text": None,
"text_type": "text",
}
if 'LexiconNames' in self.json:
for lex in self.json['LexiconNames']:
if "LexiconNames" in self.json:
for lex in self.json["LexiconNames"]:
try:
self.polly_backend.get_lexicon(lex)
except KeyError:
return self._error('LexiconNotFoundException', 'Lexicon not found')
return self._error("LexiconNotFoundException", "Lexicon not found")
args['lexicon_names'] = self.json['LexiconNames']
args["lexicon_names"] = self.json["LexiconNames"]
if 'OutputFormat' not in self.json:
return self._error('MissingParameter', 'Missing parameter OutputFormat')
if self.json['OutputFormat'] not in ('json', 'mp3', 'ogg_vorbis', 'pcm'):
return self._error('InvalidParameterValue', 'Not one of json, mp3, ogg_vorbis, pcm')
args['output_format'] = self.json['OutputFormat']
if "OutputFormat" not in self.json:
return self._error("MissingParameter", "Missing parameter OutputFormat")
if self.json["OutputFormat"] not in ("json", "mp3", "ogg_vorbis", "pcm"):
return self._error(
"InvalidParameterValue", "Not one of json, mp3, ogg_vorbis, pcm"
)
args["output_format"] = self.json["OutputFormat"]
if 'SampleRate' in self.json:
sample_rate = int(self.json['SampleRate'])
if "SampleRate" in self.json:
sample_rate = int(self.json["SampleRate"])
if sample_rate not in (8000, 16000, 22050):
return self._error('InvalidSampleRateException', 'The specified sample rate is not valid.')
args['sample_rate'] = sample_rate
return self._error(
"InvalidSampleRateException",
"The specified sample rate is not valid.",
)
args["sample_rate"] = sample_rate
if 'SpeechMarkTypes' in self.json:
for value in self.json['SpeechMarkTypes']:
if value not in ('sentance', 'ssml', 'viseme', 'word'):
return self._error('InvalidParameterValue', 'Not one of sentance, ssml, viseme, word')
args['speech_marks'] = self.json['SpeechMarkTypes']
if "SpeechMarkTypes" in self.json:
for value in self.json["SpeechMarkTypes"]:
if value not in ("sentance", "ssml", "viseme", "word"):
return self._error(
"InvalidParameterValue",
"Not one of sentance, ssml, viseme, word",
)
args["speech_marks"] = self.json["SpeechMarkTypes"]
if 'Text' not in self.json:
return self._error('MissingParameter', 'Missing parameter Text')
args['text'] = self.json['Text']
if "Text" not in self.json:
return self._error("MissingParameter", "Missing parameter Text")
args["text"] = self.json["Text"]
if 'TextType' in self.json:
if self.json['TextType'] not in ('ssml', 'text'):
return self._error('InvalidParameterValue', 'Not one of ssml, text')
args['text_type'] = self.json['TextType']
if "TextType" in self.json:
if self.json["TextType"] not in ("ssml", "text"):
return self._error("InvalidParameterValue", "Not one of ssml, text")
args["text_type"] = self.json["TextType"]
if 'VoiceId' not in self.json:
return self._error('MissingParameter', 'Missing parameter VoiceId')
if self.json['VoiceId'] not in VOICE_IDS:
return self._error('InvalidParameterValue', 'Not one of {0}'.format(', '.join(VOICE_IDS)))
args['voice_id'] = self.json['VoiceId']
if "VoiceId" not in self.json:
return self._error("MissingParameter", "Missing parameter VoiceId")
if self.json["VoiceId"] not in VOICE_IDS:
return self._error(
"InvalidParameterValue", "Not one of {0}".format(", ".join(VOICE_IDS))
)
args["voice_id"] = self.json["VoiceId"]
# More validation
if len(args['text']) > 3000:
return self._error('TextLengthExceededException', 'Text too long')
if len(args["text"]) > 3000:
return self._error("TextLengthExceededException", "Text too long")
if args['speech_marks'] is not None and args['output_format'] != 'json':
return self._error('MarksNotSupportedForFormatException', 'OutputFormat must be json')
if args['speech_marks'] is not None and args['text_type'] == 'text':
return self._error('SsmlMarksNotSupportedForTextTypeException', 'TextType must be ssml')
if args["speech_marks"] is not None and args["output_format"] != "json":
return self._error(
"MarksNotSupportedForFormatException", "OutputFormat must be json"
)
if args["speech_marks"] is not None and args["text_type"] == "text":
return self._error(
"SsmlMarksNotSupportedForTextTypeException", "TextType must be ssml"
)
content_type = 'audio/json'
if args['output_format'] == 'mp3':
content_type = 'audio/mpeg'
elif args['output_format'] == 'ogg_vorbis':
content_type = 'audio/ogg'
elif args['output_format'] == 'pcm':
content_type = 'audio/pcm'
content_type = "audio/json"
if args["output_format"] == "mp3":
content_type = "audio/mpeg"
elif args["output_format"] == "ogg_vorbis":
content_type = "audio/ogg"
elif args["output_format"] == "pcm":
content_type = "audio/pcm"
headers = {'Content-Type': content_type}
headers = {"Content-Type": content_type}
return '\x00\x00\x00\x00\x00\x00\x00\x00', headers
return "\x00\x00\x00\x00\x00\x00\x00\x00", headers

View file

@ -1,13 +1,11 @@
from __future__ import unicode_literals
from .responses import PollyResponse
url_bases = [
"https?://polly.(.+).amazonaws.com",
]
url_bases = ["https?://polly.(.+).amazonaws.com"]
url_paths = {
'{0}/v1/voices': PollyResponse.dispatch,
'{0}/v1/lexicons/(?P<lexicon>[^/]+)': PollyResponse.dispatch,
'{0}/v1/lexicons': PollyResponse.dispatch,
'{0}/v1/speech': PollyResponse.dispatch,
"{0}/v1/voices": PollyResponse.dispatch,
"{0}/v1/lexicons/(?P<lexicon>[^/]+)": PollyResponse.dispatch,
"{0}/v1/lexicons": PollyResponse.dispatch,
"{0}/v1/speech": PollyResponse.dispatch,
}