We do not yet claim that there is a fixed standard for Sable tags but we wish to move towards such a standard. In the mean time we have made it easy in Festival to add support for new tags without, in general, having to change any of the core functions.
Two changes are necessary to add a new tags. First, change the
definition in lib/Sable.v0_2.dtd, so that Sable files may use it.
The second stage is to make Festival sensitive to that new tag. The
example in festival/lib/sable-mode.scm
shows how a new text mode
may be implemented for an XML/SGML-based markup language. The basic
point is that an identified function will be called on finding a start
tag or end tags in the document. It is the tag-function's job to
synthesize the given utterance if the tag signals an utterance boundary.
The return value from the tag-function is the new status of the current
utterance, which may remain unchanged or if the current utterance has
been synthesized nil
should be returned signalling a new
utterance.
Note the hierarchical structure of the document is not available in this method of tag-functions. Any hierarchical state that must be preserved has to be done using explicit stacks in Scheme. This is an artifact due to the cross relationship to utterances and tags (utterances may end within start and end tags), and the desire to have all specification in Scheme rather than C++.
The tag-functions are defined in an elements list. They are identified
with names such as "(SABLE" and ")SABLE" denoting start and end tags
respectively. Two arguments are passed to these tag functions,
an assoc list of attributes and values as specified in the document
and the current utterances. If the tag denotes an utterance
break, call xxml_synth
on UTT
and return nil
.
If a tag (start or end) is found in the document and there is no
corresponding tag-function it is ignored.
New features may be added to words with a start and end tag by
adding features to the global xxml_word_features
. Any
features in that variable will be added to each word.
Note that this method may be used for both XML based lamnguages and SGML
based markup languages (though and external normalizing SGML parser is
required in the SGML case). The type (XML vs SGML) is identified
by the analysis_type
parameter in the tts text mode specification.