pimatic-tts
Version:
Pimatic plugin providing Text-to-Speech capability
79 lines (61 loc) • 2.53 kB
text/coffeescript
module.exports = (env) ->
_ = env.require 'lodash'
commons = require('pimatic-plugin-commons')(env)
t = env.require('decl-api').types
Promise = env.require 'bluebird'
googleAPI = require('google-tts-api')
request = require('request')
lame = require('lame')
fs = require('fs')
TTSDevice = require("./TTSDevice")(env)
class GoogleTTSDevice extends TTSDevice
constructor: (, lastState) ->
= .id
= .name
= _.cloneDeep
= _.cloneDeep
.getSpeed = {
description: "Returns the Voice speed"
returns:
speed:
type: t.number}
.speed = {
description: "Voice speed"
type: t.number
acronym: 'Voice Speed:'
discrete: true}
= {
speed: .speed ? 100
audioDecoder: lame.Decoder
audioFormat: 'mp3'
maxStringLenght: 200
}
super()
getSpeed: -> Promise.resolve(.speed)
generateResource: (file) =>
return new Promise( (resolve, reject) =>
.rejectWithErrorString Promise.reject, __("%s: A maximum of 200 characters is allowed.", , .text.parsed.length) unless .text.parsed.length < .maxStringLenght
googleAPI(.text.parsed, .language, .speed/100).then( (resource) =>
fsWrite = fs.createWriteStream(file)
.on('finish', () =>
fsWrite.close( () =>
env.logger.info __("%s: Speech resource for '%s' successfully generated.", , .text.parsed)
resolve file
)
)
.on('error', (error) =>
fs.unlink(file)
.rejectWithErrorString Promise.reject, error
)
resRead = request.get(resource)
.on('error', (error) =>
msg = __("%s: Failure reading audio resource '%s'. Error: %s", , resource, error)
env.logger.debug msg
.rejectWithErrorString Promise.reject, msg
)
resRead.pipe(fsWrite)
).catch( (error) => .rejectWithErrorString Promise.reject, error )
).catch( (error) => .rejectWithErrorString Promise.reject, error )
destroy: () ->
super()
return GoogleTTSDevice