2017-09-26 15:46:18 +00:00
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
from botocore.exceptions import ClientError
|
|
|
|
import boto3
|
|
|
|
import sure # noqa
|
2017-09-26 18:42:37 +00:00
|
|
|
from nose.tools import assert_raises
|
2017-09-26 15:46:18 +00:00
|
|
|
from moto import mock_polly
|
|
|
|
|
|
|
|
# Polly only available in a few regions
|
|
|
|
DEFAULT_REGION = 'eu-west-1'
|
|
|
|
|
|
|
|
LEXICON_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<lexicon version="1.0"
|
|
|
|
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
|
|
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
|
|
xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
|
|
|
|
http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
|
|
|
|
alphabet="ipa"
|
|
|
|
xml:lang="en-US">
|
|
|
|
<lexeme>
|
|
|
|
<grapheme>W3C</grapheme>
|
|
|
|
<alias>World Wide Web Consortium</alias>
|
|
|
|
</lexeme>
|
|
|
|
</lexicon>"""
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_describe_voices():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
|
|
|
|
resp = client.describe_voices()
|
|
|
|
len(resp['Voices']).should.be.greater_than(1)
|
|
|
|
|
|
|
|
resp = client.describe_voices(LanguageCode='en-GB')
|
|
|
|
len(resp['Voices']).should.equal(3)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.describe_voices(LanguageCode='SOME_LANGUAGE')
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('400')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised an exception')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_put_list_lexicon():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
|
|
|
|
# Return nothing
|
|
|
|
client.put_lexicon(
|
|
|
|
Name='test',
|
|
|
|
Content=LEXICON_XML
|
|
|
|
)
|
|
|
|
|
|
|
|
resp = client.list_lexicons()
|
|
|
|
len(resp['Lexicons']).should.equal(1)
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_put_get_lexicon():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
|
|
|
|
# Return nothing
|
|
|
|
client.put_lexicon(
|
|
|
|
Name='test',
|
|
|
|
Content=LEXICON_XML
|
|
|
|
)
|
|
|
|
|
|
|
|
resp = client.get_lexicon(Name='test')
|
|
|
|
resp.should.contain('Lexicon')
|
|
|
|
resp.should.contain('LexiconAttributes')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_put_lexicon_bad_name():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.put_lexicon(
|
|
|
|
Name='test-invalid',
|
|
|
|
Content=LEXICON_XML
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('InvalidParameterValue')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised an exception')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
|
|
|
|
# Return nothing
|
|
|
|
client.put_lexicon(
|
|
|
|
Name='test',
|
|
|
|
Content=LEXICON_XML
|
|
|
|
)
|
|
|
|
|
2017-09-26 18:42:37 +00:00
|
|
|
tests = (
|
|
|
|
('pcm', 'audio/pcm'),
|
|
|
|
('mp3', 'audio/mpeg'),
|
|
|
|
('ogg_vorbis', 'audio/ogg'),
|
2017-09-26 15:46:18 +00:00
|
|
|
)
|
2017-09-26 18:42:37 +00:00
|
|
|
for output_format, content_type in tests:
|
|
|
|
resp = client.synthesize_speech(
|
|
|
|
LexiconNames=['test'],
|
|
|
|
OutputFormat=output_format,
|
|
|
|
SampleRate='16000',
|
|
|
|
Text='test1234',
|
|
|
|
TextType='text',
|
|
|
|
VoiceId='Astrid'
|
|
|
|
)
|
|
|
|
resp['ContentType'].should.equal(content_type)
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech_bad_lexicon():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
client.put_lexicon(Name='test', Content=LEXICON_XML)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.synthesize_speech(
|
|
|
|
LexiconNames=['test2'],
|
|
|
|
OutputFormat='pcm',
|
|
|
|
SampleRate='16000',
|
|
|
|
Text='test1234',
|
|
|
|
TextType='text',
|
|
|
|
VoiceId='Astrid'
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('LexiconNotFoundException')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised LexiconNotFoundException')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech_bad_output_format():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
client.put_lexicon(Name='test', Content=LEXICON_XML)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.synthesize_speech(
|
|
|
|
LexiconNames=['test'],
|
|
|
|
OutputFormat='invalid',
|
|
|
|
SampleRate='16000',
|
|
|
|
Text='test1234',
|
|
|
|
TextType='text',
|
|
|
|
VoiceId='Astrid'
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('InvalidParameterValue')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised ')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech_bad_sample_rate():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
client.put_lexicon(Name='test', Content=LEXICON_XML)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.synthesize_speech(
|
|
|
|
LexiconNames=['test'],
|
|
|
|
OutputFormat='pcm',
|
|
|
|
SampleRate='18000',
|
|
|
|
Text='test1234',
|
|
|
|
TextType='text',
|
|
|
|
VoiceId='Astrid'
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('InvalidSampleRateException')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised ')
|
2017-09-26 15:46:18 +00:00
|
|
|
|
2017-09-26 18:42:37 +00:00
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech_bad_text_type():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
client.put_lexicon(Name='test', Content=LEXICON_XML)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.synthesize_speech(
|
|
|
|
LexiconNames=['test'],
|
|
|
|
OutputFormat='pcm',
|
|
|
|
SampleRate='16000',
|
|
|
|
Text='test1234',
|
|
|
|
TextType='invalid',
|
|
|
|
VoiceId='Astrid'
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('InvalidParameterValue')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised ')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech_bad_voice_id():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
client.put_lexicon(Name='test', Content=LEXICON_XML)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.synthesize_speech(
|
|
|
|
LexiconNames=['test'],
|
|
|
|
OutputFormat='pcm',
|
|
|
|
SampleRate='16000',
|
|
|
|
Text='test1234',
|
|
|
|
TextType='text',
|
|
|
|
VoiceId='Luke'
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('InvalidParameterValue')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised ')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech_text_too_long():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
client.put_lexicon(Name='test', Content=LEXICON_XML)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.synthesize_speech(
|
|
|
|
LexiconNames=['test'],
|
|
|
|
OutputFormat='pcm',
|
|
|
|
SampleRate='16000',
|
|
|
|
Text='test1234'*376, # = 3008 characters
|
|
|
|
TextType='text',
|
|
|
|
VoiceId='Astrid'
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('TextLengthExceededException')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised ')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech_bad_speech_marks1():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
client.put_lexicon(Name='test', Content=LEXICON_XML)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.synthesize_speech(
|
|
|
|
LexiconNames=['test'],
|
|
|
|
OutputFormat='pcm',
|
|
|
|
SampleRate='16000',
|
|
|
|
Text='test1234',
|
|
|
|
TextType='text',
|
|
|
|
SpeechMarkTypes=['word'],
|
|
|
|
VoiceId='Astrid'
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('MarksNotSupportedForFormatException')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised ')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_polly
|
|
|
|
def test_synthesize_speech_bad_speech_marks2():
|
|
|
|
client = boto3.client('polly', region_name=DEFAULT_REGION)
|
|
|
|
client.put_lexicon(Name='test', Content=LEXICON_XML)
|
|
|
|
|
|
|
|
try:
|
|
|
|
client.synthesize_speech(
|
|
|
|
LexiconNames=['test'],
|
|
|
|
OutputFormat='pcm',
|
|
|
|
SampleRate='16000',
|
|
|
|
Text='test1234',
|
|
|
|
TextType='ssml',
|
|
|
|
SpeechMarkTypes=['word'],
|
|
|
|
VoiceId='Astrid'
|
|
|
|
)
|
|
|
|
except ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('MarksNotSupportedForFormatException')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised ')
|