pimatic-tts
Version:
Pimatic plugin providing Text-to-Speech capability
106 lines (79 loc) • 3.35 kB
text/coffeescript
module.exports = (env) ->
_ = env.require 'lodash'
Promise = env.require 'bluebird'
M = env.matcher
commons = require('pimatic-plugin-commons')(env)
class TTSActionProvider extends env.actions.ActionProvider
constructor: (, ) ->
parseAction: (input, context) =>
ttsInput = {
text:
input: null
static: false
parsed: null
volume: null
repeat: null
interval: null
device: null
resource: null
}
SpeechDevices = _(.deviceManager.devices).values().filter( (device) => device.hasAction("toSpeech") ).value()
setDevice = (m, d) => ttsInput.device = d
setText = (m, input) =>
ttsInput.text.input = input
ttsInput.text.static = !.variableManager.extractVariables(input).length > 0
setVolume = (m, v) =>
m.match([" with volume "]).matchNumber( (m, v) =>
ttsInput.volume = v
)
setRepetition = (m, r) =>
m.match([" repeating "]).matchNumber( (m, r) =>
ttsInput.repeat = r
).match([" times"])
_setInterval = (m, w) =>
m.match([" every "]).matchNumber( (m, w) =>
ttsInput.interval = w
).match([" s", " seconds"])
m = M(input, context)
.match(["speak ", "Speak ", "say ", "Say "])
.matchStringWithVars(setText)
.match(" using ")
.matchDevice(SpeechDevices, setDevice)
.optional(setVolume)
.optional(setRepetition)
.optional(_setInterval)
if m.hadMatch()
match = m.getFullMatch()
return {
token: match
nextInput: input.substring(match.length)
actionHandler: new TTSActionHandler(, , ttsInput)
}
else
return null
class TTSActionHandler extends env.actions.ActionHandler
constructor: (, , ) ->
= commons.base @, 'Pimatic-TTS-TTSActionProvider'
super()
setup: () ->
(.device)
super()
executeAction: (simulate) =>
return new Promise( (resolve, reject) =>
return .variableManager.evaluateStringExpression(.text.input).then( (text) =>
.text.parsed = text
env.logger.debug __("TTSActionHandler - Device: '%s', Text: '%s'", .device.id, .text.parsed)
if simulate
return __("would convert Text to Speech: \"%s\"", .text.parsed)
else
return .device.toSpeech().then( (result) =>
env.logger.debug result
resolve result
).catch( (error) =>
.rejectWithErrorString Promise.reject, error
)
).catch( (error) => .rejectWithErrorString Promise.reject, error )
).catch( (error) => .rejectWithErrorString Promise.reject, error )
destroy: () ->
super()
return TTSActionProvider