This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Amazon Polly
#7
Here's an example on how to access Amazon Polly. Make sure you set region, accesskey, secretkey and voice variables correctly.

This has been tested on the latest RC1 firmware, but you also need to install package updates to have support for sha256 function:
Standard LM: https://dl.openrb.com/misc/luaencdec_20170426_mxs.ipk
LM power version: https://dl.openrb.com/misc/luaencdec_20170426_imx6.ipk

Code:
function getpollyurl(text)
  -- CONFIG VARIABLES
  local region = 'eu-west-1' -- your AWS region
  local accesskey = 'xxx'
  local secretkey = 'yyy'
  local voice = 'Joey' -- list of voices: https://aws.amazon.com/polly/details/

  -- same as JS encodeURIComponent
  local function encode(str)
    return (str:gsub("[^%w%-_%.%!%~%*%'%(%)]", function(c)
      return string.format("%%%02X", c:byte(1,1))
    end))
  end

  function toquerystring(items)
    local res = {}
    for _, item in ipairs(items) do
      res[ #res + 1 ] = item[ 1 ] .. '=' .. encode(item[ 2 ])
    end
    return table.concat(res, '&')
  end

  function getkey(key, datestamp, regionname, servicename)
    local kdate = encdec.hmacsha256(datestamp, 'AWS4' .. key, true)
    local kregion = encdec.hmacsha256(regionname, kdate, true)
    local kservice = encdec.hmacsha256(servicename, kregion, true)
    return encdec.hmacsha256('aws4_request', kservice, true)
  end

  local encdec = require('encdec')
  local method = 'GET'
  local service = 'polly'
  local host = service .. '.' .. region .. '.amazonaws.com'
  local api = '/v1/speech'
  local endpoint = 'https://' .. host .. api
  local amzdate = os.date('!%Y%m%dT%H%M%SZ')
  local datestamp = os.date('!%Y%m%d')
  local algorithm = 'AWS4-HMAC-SHA256'
  local canonicaluri = api
  local canonicalheaders = 'host:' .. host
  local signedheaders = 'host'
  local credentialscope = datestamp .. '/' .. region .. '/' .. service .. '/' .. 'aws4_request'
  local canonicalquerystring = toquerystring({
    { 'OutputFormat', 'mp3' },
    { 'Text', text },
    { 'TextType', 'text' },
    { 'VoiceId', voice },
    { 'X-Amz-Algorithm', algorithm },
    { 'X-Amz-Credential', accesskey .. '/' .. credentialscope },
    { 'X-Amz-Date', amzdate },
    { 'X-Amz-SignedHeaders', signedheaders },
  })
  local payloadhash = encdec.sha256('')
  local canonicalrequest = table.concat({
    method,
    api,
    canonicalquerystring,
    canonicalheaders,
    '',
    signedheaders,
    payloadhash
  }, '\n')
  local stringtosign = table.concat({
    algorithm,
    amzdate,
    credentialscope,
    encdec.sha256(canonicalrequest)
  }, '\n')
  local signingkey = getkey(secretkey, datestamp, region, service)
  local signature = encdec.hmacsha256(stringtosign, signingkey)

  return endpoint .. '?' .. canonicalquerystring .. '&X-Amz-Signature=' .. signature
end

url = getpollyurl('testing polly from logic machine')

require('ssl.https')
res, status = ssl.https.request(url)
if res then
  -- res contains the mp3 file
else
  alert('Polly request failed: ' .. tostring(status))
end
Reply


Messages In This Thread
Amazon Polly - by bmodeco - 25.04.2017, 20:43
RE: Amazon Polly - by gjniewenhuijse - 26.04.2017, 07:27
RE: Amazon Polly - by bmodeco - 26.04.2017, 09:38
RE: Amazon Polly - by bmodeco - 26.04.2017, 18:16
RE: Amazon Polly - by admin - 27.04.2017, 05:53
RE: Amazon Polly - by bmodeco - 27.04.2017, 13:31
RE: Amazon Polly - by admin - 02.05.2017, 06:10
RE: Amazon Polly - by bmodeco - 02.05.2017, 20:14

Forum Jump: