PHP Text to Speech via Amazon Polly API
Firstly what is Amazon Polly?
Well Amazon Polly is a service that turns text to voice, simple as that. While a big part of their focus is IOT, Amazon Polly can be used in a wide variety of applications: from education to content or even business management. Just imagine a Chef that takes his online orders via Amazon Echo.
What is great for this new service is that already comes with support for 24 languages (atm):
- English (Australian)
- English (British)
- English (Indian)
- English (US)
- English (Welsh)
- French (Canadian)
- Portuguese (Brazilian)
- Portuguese (European)
- Spanish (Latin American)
And such a great product comes with API and PHP SDK that you can download here
The rest is pretty simple once we include the autoloader
Keep in mind that we will need to configure AWS Access Keys.
Creating Amazon Polly Client
use Aws\Polly\PollyClient; $config = [ 'version' => 'latest', 'region' => 'us-east-1', //region 'credentials' => [ 'key' => 'your aws access key', 'secret' => 'your aws secret key', ] ]; $client = new PollyClient($config);
after we just need to configure the SynthesizeSpeech method with required parameters
$args = [ 'OutputFormat' => 'mp3', 'Text' => "<speak><prosody rate='medium'>your text goes here..</prosody></speak>", 'TextType' => 'ssml', 'VoiceId' => "Joanna", ]; $result = $client->synthesizeSpeech($args); $resultData = $result->get('AudioStream')->getContents();
Afterwards we just listen the output
$size = strlen($resultData); // File size $length = $size; // Content length $start = 0; // Start byte $end = $size - 1; // End byte header('Content-Transfer-Encoding:chunked'); header("Content-Type: audio/mpeg"); header("Accept-Ranges: 0-$length"); header("Content-Range: bytes $start-$end/$size"); header("Content-Length: $length"); echo $resultData;
Or we can download the mp3
header('Content-length: ' . strlen($resultData)); header('Content-Disposition: attachment; filename="polly-text-to-speech.mp3"'); header('X-Pad: avoid browser bug'); header('Cache-Control: no-cache'); echo $resultData;