UNPKG

speech-rule-engine

Version:

A standalone speech rule engine for XML structures, based on the original engine from ChromeVox.

120 lines 4.59 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.SsmlRenderer = void 0; const engine_js_1 = require("../common/engine.js"); const EngineConst = __importStar(require("../common/engine_const.js")); const xml_renderer_js_1 = require("./xml_renderer.js"); class SsmlRenderer extends xml_renderer_js_1.XmlRenderer { finalize(str) { return ('<?xml version="1.0"?><speak version="1.1"' + ' xmlns="http://www.w3.org/2001/10/synthesis"' + ` xml:lang="${engine_js_1.Engine.getInstance().options.locale}">` + '<prosody rate="' + engine_js_1.Engine.getInstance().getRate() + '%">' + this.separator + str + this.separator + '</prosody></speak>'); } pause(pause) { return ('<break ' + 'time="' + this.pauseValue(pause[EngineConst.personalityProps.PAUSE]) + 'ms"/>'); } prosodyElement(attr, value) { value = Math.floor(this.applyScaleFunction(value)); const valueStr = value < 0 ? value.toString() : '+' + value.toString(); return ('<prosody ' + attr.toLowerCase() + '="' + valueStr + (attr === EngineConst.personalityProps.VOLUME ? '>' : '%">')); } closeTag(_tag) { return '</prosody>'; } markup(descrs) { SsmlRenderer.MARKS = {}; return super.markup(descrs); } merge(spans) { const result = []; let lastMark = ''; for (let i = 0; i < spans.length; i++) { const span = spans[i]; if (this.isEmptySpan(span)) continue; const kind = SsmlRenderer.MARK_KIND ? span.attributes['kind'] : ''; const id = engine_js_1.Engine.getInstance().options.automark ? span.attributes['id'] : engine_js_1.Engine.getInstance().options.mark ? span.attributes['extid'] : ''; if (id && id !== lastMark && !(SsmlRenderer.MARK_ONCE && SsmlRenderer.MARKS[id])) { result.push(kind ? `<mark name="${id}" kind="${kind}"/>` : `<mark name="${id}"/>`); lastMark = id; SsmlRenderer.MARKS[id] = true; } if (engine_js_1.Engine.getInstance().options.character && span.speech.length === 1 && span.speech.match(/[a-zA-Z]/)) { result.push('<say-as interpret-as="' + SsmlRenderer.CHARACTER_ATTR + '">' + span.speech + '</say-as>'); } else { result.push(span.speech); } } return result.join(this.separator); } isEmptySpan(span) { const sep = span.attributes['separator']; return span.speech.match(/^\s*$/) && (!sep || sep.match(/^\s*$/)); } } exports.SsmlRenderer = SsmlRenderer; SsmlRenderer.MARK_ONCE = false; SsmlRenderer.MARK_KIND = true; SsmlRenderer.CHARACTER_ATTR = 'character'; SsmlRenderer.MARKS = {}; //# sourceMappingURL=ssml_renderer.js.map