# Audio Presentation
# say
Statements
The say statement specifies speech content for Alexa to deliver. It takes one string as an argument (referred to as a Say String) and, like any Litexa string, accommodates the use of line breaks to help legibly format your code.
launch
say "Hello World.
Nice to meet you."
Subsequent say
statements encountered during the same
response are accumulated, then concatenated one after
the other with a single space in between.
It is important to keep track of your punctuation to
avoid accidentally creating run-on sentences.
launch
say "Hello World."
-> askAboutRule
askAboutRule
say "Would you like to play with advanced rules?"
The above skill when launched would produce the speech, "Hello World. Would you like to play with advanced rules?"
For heavily trafficked areas of your skill, you may want to add variations to Alexa's speech. This helps keep your skill from feeling robotic, and prevents your users from glossing over important information hidden in the repetition.
The or
statement can add variations to say
statements.
An automated persistent variable will keep track of the
randomization between or statements and guarantee
that on subsequent runs for the same user, they will
not hear the same variation back to back.
launch
say "Hello."
or "Hi there."
or "Greetings."
say "Welcome to the Guessing Game."
or "Let's play the Guessing Game."
TIP
You can combine the or
statement's variation with the
say
statement's accumulation as above to produce greater
permuting variation.
To keep localization coherent though, you should try to
keep each fragment of speech as complete as possible!
For smaller fragments of sentences, you can use an inline
form of alternation that mirrors the same feature available
when defining utterances: a combination of grouping with
()
characters, and separating alternatives with the |
character.
launch
say "(Hello|Hi) (there|you|)."
This example defines 6 different possible greetings, including "Hi there." and "Hello you". Note the empty trailing alternative in the second group. This creates the cases "Hi" and "Hello".
# Say String Interpolation
As it is very common to inject the values of variables
into Alexa's speech, so Litexa supports that operation
for database and request variables directly in a say
string, relying on the special @
and $
prefixes as
control characters.
say "Hey there, @userName. How are you?"
when "I'm feeling $mood"
with $mood = "happy", "great", "awesome", "fine"
say "Oh, $mood is a fine mood."
In cases where either of those variable types are objects with function members, those are also invocable directly.
say "Your high score is @leaderboard.myHighScore()."
For other interpolation cases, you can inline any valid
expression into a say
statement by using curly braces.
local t = millisecondsSinceStart()
say "You'be been playing for {t/1000/60} minutes."
# SSML Shorthand
Litexa's say strings support some SSML tags via a shorthand notation. Here's a rundown of the supported shorthands.
<...1s>
Creates a pause using the "break" SSML tag. The
value can be expressed in milliseconds <...500ms>
or
<...1s>
seconds.
<sfx ding.mp3>
Plays back an audio file at that location,
using the "audio" SSML tag. Relative file references are
assumed to refer to the litexa/assets
directory.
<!howdy>
Selects a speechcon (opens new window)
using the "say-as" SSML tag in "interpret-as" mode. Note
that punctuation should sit inside the speechcon tags in
order to be read correctly, so you'll want to write
<!howdy.>
rather than <!howdy>.
For more information on supported SSML tags, please see the Alexa Skill Kit documentation (opens new window).
# Escaping Control Characters
The above say string features all rely on treating some
characters as having special meaning, i.e. the @
, the
$
, the {
, the <
and the bracketing "
.
You may find yourself needing to use those characters in
your actual text though. When that happens, you'll need
to escape their special meaning by prefixing them with
a \
character.
say "That will be \$400 please."
say "Her Twitter handle was \@martina."
say "\<amazon:effect name='whispered'>Hi. I am not a human.\</amazon:effect>" # note that you need to escape each tag
Please note that wherever possible, you are better off spelling out words in an SSML string rather than relying on symbols that may have ambiguous meanings and be read incorrectly. So preferably:
say "That will be 400 dollars please."
say "Her Twitter handle was, at martina."
# soundeffect
Statements
Sometimes an audio queue stands alone, maybe it's a piece of music, or a natural delimiter. In that case, there's is a dedicated soundEffect statement to make your code more legible.
launch
soundEffect intro.mp3
say "Hi there."
# Asset File References
We've seen a few references so far to asset names. More
concretely Litexa assets are files of known type under
the litexa/assets
directory. For a skill, these will be
referred to at public URLs on the internet, and usually
fetched directly by the user's device, for example audio
files used in SSML, or image files used in APL.
These files are uploaded automatically by the Litexa deployment mechanism, with each named deployment for a project creating a new online location and copy of the assets to remain in sync with the deployment. References in your code to these files are patched up by the Litexa runtime to point to their correct final locations.
See the Deployment chapter for more information on how asset files end up in the right place.
Asset files can also be localized, with replacement files optionally specified for each language you want to support. See the Localization chapter for more information on that topic.
There is also a Litexa extension for converting WAV audio to Alexa-compatible audio. See the WAV Audio Conversion Appendix for more information on when and how to use it.