/* * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include <stdio.h> #include <stdlib.h> #include <libexpat/expat.h> #ifndef _SVOX_SSML_PARSER_H_ #define _SVOX_SSML_PARSER_H_ /** * SvoxSsmlParser * Parses SSML 1.0 XML documents and convertes it to Pico compatible text input */ class SvoxSsmlParser { public: /* construction code */ /** Constructor Creates Expat parser and allocates initial text storage */ SvoxSsmlParser(); /** Destructor Deallocates all resources */ ~SvoxSsmlParser(); /** initSuccessful Verifies that construction was successful return 1 if successful, 0 otherwise */ int initSuccessful(); public: /* public members */ /** parseDocument Parses SSML 1.0 document passed in as argument @ssmldoc - SSML document, partial document input is supported @isFinal - indicates whether input is a complete or partial document, 1 indicates complete document, 0 indicates partial return Expat status code */ int parseDocument(const char* ssmldoc, int isFinal); /** getParsedDocument Returns string containing parse result. This can be passed on to Pico for synthesis return parsed string, NULL if error occurred */ char* getParsedDocument(); /** getParsedDocumentLanguage Returns language string specified in xml:lang attribute of the <speak> tag return language code of SSML document, NULL if not set */ char* getParsedDocumentLanguage(); private: /* static callback functions */ /** starttagHandler Static callback function for Expat start-tag events, internal use only */ static void starttagHandler(void* data, const XML_Char* element, const XML_Char** attributes); /** endtagHandler Static callback function for Expat end-tag events, internal use only */ static void endtagHandler(void* data, const XML_Char* element); /** textHandler Static callback function for Expat text events, internal use only */ static void textHandler(void* data, const XML_Char* text, int length); private: /* element handlers */ /** startElement Handles start of element, called by starttagHandler. */ void startElement(const XML_Char* element, const XML_Char** attributes); /** endElement Handles end of element, called by endtagHandler. */ void endElement(const XML_Char* element); /** textElement Handles text element, called by textHandler. */ void textElement(const XML_Char* text, int length); /* helper functions */ /** convertToSvoxPitch Convertes SSML prosody tag pitch values to SVOX Pico pitch values. */ char* convertToSvoxPitch(const char* value); /** convertToSvoxRate Convertes SSML prosody tag rate values to SVOX Pico speed values. */ char* convertToSvoxRate(const char* value); /** convertToSvoxVolume Convertes SSML prosody tag volume values to SVOX Pico volume values. */ char* convertToSvoxVolume(const char* value); /** convertBreakStrengthToTime Convertes SSML break tag strength attribute values to SVOX Pico break time values. */ char* convertBreakStrengthToTime(const char* value); /** growDataSize Increases size of internal text field. */ int growDataSize(int sizeToGrow); private: /* data members*/ char* m_data; /* internal text field, holds parsed text */ int m_datasize; /* size of internal text field */ XML_Parser mParser; /* Expat XML parser pointer */ int m_isInBreak; /* indicator for handling break tag parsing */ char* m_appendix; /* holds Pico pitch, speed and volume close tags for prosody tag parsing */ char* m_docLanguage; /* language set in speak tag of SSML document */ }; #endif // _SVOX_SSML_PARSER_H_