#!/usr/bin/env python3 from boto3 import Session from botocore.exceptions import BotoCoreError, ClientError, ProfileNotFound import sys from utils import settings from attr import attrs, attrib from attr.validators import instance_of from TTS.common import get_random_voice voices = [ "Brian", "Emma", "Russell", "Joey", "Matthew", "Joanna", "Kimberly", "Amy", "Geraint", "Nicole", "Justin", "Ivy", "Kendra", "Salli", "Raveena", ] @attrs class AWSPolly: random_voice: bool = attrib( validator=instance_of(bool), default=False ) max_chars: int = 0 def run( self, text, filepath, ) -> None: """ Calls for TTS api Args: text: text to be voiced over filepath: name of the audio file """ try: session = Session(profile_name="polly") polly = session.client("polly") voice = ( get_random_voice(voices) if self.random_voice else str(settings.config["settings"]["tts"]["aws_polly_voice"]).capitalize() if str(settings.config["settings"]["tts"]["aws_polly_voice"]).lower() in [voice.lower() for voice in voices] else get_random_voice(voices) ) try: # Request speech synthesis response = polly.synthesize_speech( Text=text, OutputFormat="mp3", VoiceId=voice, Engine="neural" ) 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: file = open(filepath, "wb") file.write(response["AudioStream"].read()) file.close() # print_substep(f"Saved Text {idx} to MP3 files successfully.", style="bold green") else: # The response didn't contain audio data, exit gracefully print("Could not stream audio") sys.exit(-1) except ProfileNotFound: print("You need to install the AWS CLI and configure your profile") print( """ Linux: https://docs.aws.amazon.com/polly/latest/dg/setup-aws-cli.html Windows: https://docs.aws.amazon.com/polly/latest/dg/install-voice-plugin2.html """ ) sys.exit(-1)