Run black on moto & test directories.
This commit is contained in:
parent
c820395dbf
commit
96e5b1993d
507 changed files with 52541 additions and 47814 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue