pythonamazon-web-servicespython-osamazon-polly

Polly returning 0 bytes


Trying to execute basic tts tasks through AWS polly, I can get the playable mp3 using the CLI with this type of command:

aws polly synthesize-speech --output-format mp3 --voice-id Joanna --text 'Hello, my name is Joanna. I learned about the W3C on 10/3 of last year.' hello.mp3


However, following the example provided here, I'm getting back mp3 files that have 0 bytes.

My code:

from boto3 import Session
from botocore.exceptions import BotoCoreError, ClientError
from contextlib import closing
import os
import sys
import subprocess
from tempfile import gettempdir
session = Session(profile_name="default")
polly = session.client("polly")

try:
    response = polly.synthesize_speech(Text="This is what you wrote. It'd be cool if it also 
worked.",
                                    OutputFormat="mp3",
                                    VoiceId="Joanna",
                                    )
except (BotoCoreError, ClientError) as error:
    print(error)
    sys.exit(-1)

if "AudioStream" in response:
    with closing(response["AudioStream"]) as stream:
        output = ("speech.mp3")
        print(os.path.join(gettempdir(), "hopa"))
    try:
        with open(output, "wb") as file:
            file.write(stream.read())
    except IOError as error:
        print(error)
        sys.exit(-1)
else:
    print("Could not stream audio")
    sys.exit(-1)

os.startfile(output)

Solution

  • Your indents within the with are incorrect.

    This works:

    import boto3
    from botocore.exceptions import BotoCoreError, ClientError
    from contextlib import closing
    import sys
    polly = boto3.client("polly")
    
    try:
        response = polly.synthesize_speech(
            Text="This is what you wrote. It'd be cool if it also worked.",
            OutputFormat="mp3",
            VoiceId="Joanna",
        )
    except (BotoCoreError, ClientError) as error:
        print(error)
        sys.exit(-1)
    
    if "AudioStream" in response:
        with closing(response["AudioStream"]) as stream:
            output = "speech.mp3"
            try:
                with open(output, "wb") as file:
                    file.write(stream.read())
            except IOError as error:
                print(error)
                sys.exit(-1)
    else:
        print("Could not stream audio")
        sys.exit(-1)