-
Notifications
You must be signed in to change notification settings - Fork 81
Help
EDDI's speech responder uses Cottle for templating. Cottle has a number of great features, including:
- Ability to set and update variables, including arrays
- Loops
- Conditionals
- Subroutines
Information on how to write Cottle templates is available at https://cottle.readthedocs.io/en/stable/, and EDDI's default templates use a lot of the functions available.
Cottle does not retain state between templates, but EDDI provides a way of doing this with state variables. State variables are provided to each Cottle template, and templates can set state variables that will be made available in future templates.
State variables are available for individual templates in the 'state' object. Note that state variables are not persistent, and the state is empty whenever EDDI restarts. Also, because EDDI responders run asynchronously and concurrently there is no guarantee that, for example, the speech responder for an event will finish before the VoiceAttack responder for an event starts (or vice versa).
EDDI uses the idea of context to attempt to keep track of what it is talking about. This can enhance the experience when used with VoiceAttack by allowing repetition and more detailed information to be provided.
In addition to the basic Cottle features EDDI has a number of features that provide added functionality and specific information for Elite: Dangerous. Details of these functions are as follows:
This function will provide full information for a blueprint, given its name and grade.
BlueprintDetails() takes two mandatory arguments: the name of the blueprint and the grade to retrieve.
Common usage of this is to provide further information about a blueprint, for example:
{set blueprint to BlueprintDetails("Dirty Drive Tuning", 5)}
{len(blueprint.materials)} {if len(blueprint.materials) > 1: different materials are |else: material is} required to produce {blueprint.localizedName}.";
This function will provide full information for a body given its name.
BodyDetails() takes a single mandatory argument of the name of the body for which you want more information. If the body is not in the current system then it can be provided with a second parameter of the name of the system.
Common usage of this is to provide further information about a body, for example:
{set body to BodyDetails("Earth", "Sol")}
Earth is {body.distancefromstar} light years from the system's main star.
This function will provide full information for a cargo, carried in the commander's hold.
CargoDetails() takes one mandatory argument, of two possible forms.
- The first form, a commodity name of the cargo. If the commodity is not in the hold, a 'null' is returned.
- The second form, a mission ID associated with the cargo, as haulage. If the mission ID is not associated with haulage, a 'null' is returned.
Common usage of this is to provide further information about a particular cargo, for example:
{set cargo to CargoDetails("Tea")}
{if cargo && cargo.total > 0: You have {cargo.total} tonne{if cargo.total != 1: s} of {cargo.name} in your cargo hold.}
or for a mission-related event,
{set cargo to CargoDetails(event.missionid)}
{if cargo: {cargo.total} tonne{if cargo.total != 1: s} of {cargo.name} is in your hold for this mission.}
This function will provide full information for a combat rating given its name.
CombatRatingDetails() takes a single argument of the combat rating for which you want more information.
Common usage of this is to provide further information about your rating, for example:
You have been promoted {CombatRatingDetails("Expert").rank} times.
This function will provide the name of your commander.
If you have set up a phonetic name for your commander it will return that, otherwise if your commander name has been set it will return that. The phonetic name uses SSML tags.
This function will provide full information for a commodity, including information that is specific to a market, given the commodity name.
CommodityMarketDetails() takes one mandatory argument and two optional arguments.
- The first argument, the name of the commodity for which you want more information, is mandatory.
- The second argument, the name of the station to reference for market data, is optional. If not given then EDDI will default to the current station (if the current station is not set and no station is specified then this shall return empty).
- The third argument, the name of the system to reference for market data, is optional. If not given then EDDI will default to the current star system (if the specified station cannot be found within the current star system then EDDI shall return empty).
Common usage of this is to provide further information about a commodity, for example:
{set marketcommodity to CommodityMarketDetails("Pesticides", "Chelbin Service Station", "Wolf 397")}
{marketcommodity.name} is selling for {marketcommodity.sellprice} with a current market demand of {marketcommodity.demand} units
This function will provide the distance (in light years) between two systems.
Distance() takes either one, two, or six arguments.
- One argument, the name of the target system (distance calculated relative to the current system)
- Two arguments, the names of the two systems.
- Six arguments, the x, y, z coordinates of the two systems.
Examples of each usage:
{set distance to Distance("Sol", "Betelgeuse")}
{set distance to Distance(from.x, from.y, from.z, to.x, to.y, to.z)}
This function will provide full information for an economy given its name.
EconomyDetails() takes a single argument of the economy for which you want more information.
At current this does not have a lot of use as the economy object only contains its name, but this may be expanded in future.
This function allows you to give emphasis to specific words (to the extent supported by the voice you are using - your mileage may vary). This function uses SSML tags.
Emphasize() takes one mandatory argument: the text to speak with emphasis. If no secondary argument is specified, it shall default to a strong emphasis.
Emphasize() also takes one optional argument: the degree of emphasis to place on the text (legal values for the degree of emphasis include "strong", "moderate", "none" and "reduced").
Common usage of this is to provide a more human-sounding reading of text by allowing the application of emphasis:
That is a {Emphasize('beautiful', 'strong')} ship you have there.
This function will provide full information for an empire rating given its name.
EmpireRatingDetails() takes a single argument of the empire rating for which you want more information.
Common usage of this is to provide further information about your rating, for example:
You have been promoted {EmpireRatingDetails("Lord").rank} times.
This function will provide full information for an Engineer given either the engineer's name or the star system where the engineer resides (including current progress information if you are in game).
EngineerDetails() takes a single argument of either the engineer's name for which you want more information or the star system where the engineer resides. It returns an Engineer object.
This function will provide full information for an exploration rating given its name.
ExplorationRatingDetails() takes a single argument of the exploration rating for which you want more information.
Common usage of this is to provide further information about your rating, for example:
You have been promoted {ExplorationRatingDetails("Surveyor").rank} times.
This function is used inside a script to invoke another script.
F() takes a single parameter that is the name of the script to invoke.
One example of its use is in the script for the event Trade Promotion
:
You have been recognised for your trading ability, {F(\"Honorific\")}.
Here the call to script Honorific
will generate the right title for the player, according to their allegiance.
This function will provide full information for a minor faction given its name.
FactionDetails() typically takes a single argument of the faction name, but may add a system name for filtering.
Common usage of this is to obtain a Faction
object, providing current specifics of a minor faction, for example:
{set faction to FactionDetails("Lavigny's Legion")}
{if faction.name != "":
{faction.name} is present in the
{for presence in faction.presences:
{presence.systemName},
}
{if len(faction.presences) = 1: system |else: systems}.
}
This function will provide full information for an federation rating given its name.
FederationRatingDetails() takes a single argument of the Federation rating for which you want more information.
Common usage of this is to provide further information about your rating, for example:
You have been promoted {FederationRatingDetails("Post Commander").rank} times.
This function will provide full information for a Galnet article given its uuid.
GalnetNewsArticle() takes a single argument of the article uuid for which you want more information.
This function will provide full information for a collection of Galnet articles.
GalnetNewsArticles() takes up to two optional arguments. By default it returns a collection of unread articles. - The first optional argument is a string to filter the results and only return those from a named category (You may use "All" if you'd like to omit this filter). - The second optional argument is a boolean value which should be set to true if you'd like to retrieve all articles rather than all unread articles.
This function will delete a Galnet article from local storage.
It takes a single mandatory argument, the article uuid to delete.
This function will mark a Galnet article as read.
It takes a single mandatory argument, the article uuid to mark as read.
This function will mark a Galnet article as unread.
It takes a single mandatory argument, the article uuid to mark as unread.
This function will retrieve a session state value.
GetState takes one argument: the name of the state value to retrieve. The name of the state value shall be converted to lower-case with spaces changed to underscores.
Common usage of this is to retrieve cumulative or persistent information stored using SetState
during a session, for example:
{SetState("distance_travelled_today", state.distance_travelled_today + event.distance)}
{set distance to GetState("distance_travelled_today")}
This function will provide full information for a government given its name.
GovernmentDetails() takes a single argument of the government for which you want more information.
At current this does not have a lot of use as the government object only contains its name but this may be expanded in future.
This function will turn its argument into a more human number, for example turning 31245 in to "just over thirty thousand".
Humanise() takes one argument: the number to humanise.
Common usage of this is to provide human-sounding numbers when speaking rather than saying every digit, for example:
You have {Humanise(cmdr.credits)} credits.
This function will turn its argument into an ICAO spoken value, for example "NCC" becomes "November Charlie Charlie".
ICAO() takes one argument: the value to turn in to ICAO.
Common usage of this is to provide clear callsigns and idents for ships, for example:
Ship ident is {ICAO(ship.ident)}.
This function will provide records from https://inara.cz for commanders with profiles on that website. Some values may be missing, depending on the completeness of the records and on the commander's sharing settings on https://inara.cz.
InaraDetails() takes one argument: the name of the commander to look up on Inara.cz.
Common usage of this is to provide details about other commanders. See the 'inaracmdr' object for variable details.
This function will provide jump information based on your ship loadout and current fuel level, dependent on the following types:
-
next
range of next jump at current fuel mass and current laden mass -
max
maximum jump range at minimum fuel mass and current laden mass -
total
total range of multiple jumps from current fuel mass and current laden mass -
full
total range of multiple jumps from maximum fuel mass and current laden mass
The returned JumpDetail
object contains properties distance
and jumps
.
Common usage is to provide distance and number of jumps for a specific query:
{set detail to JumpDetails("total")}
Total jump range at current fuel levels is {round(detail.distance, 1)} light years with {detail.jumps} jumps until empty.
{if detail.distance < destdistance:
Warning: Fuel levels insufficient to reach destination. Fuel scooping is required.
}
This function will return a humanised list of items from an array (e.g. this, that, and the other thing).
List() takes a single argument, the array variable with items you want listed.
Common usage is to convert an array to a list, for example:
{set systemsrepaired to ['the hull', 'the cockpit', 'corroded systems']}
The limpet has repaired {List(systemsrepaired)}.
This function will write the supplied text to EDDI's log.
Log() takes a single argument of the string to log.
This function will provide full information for a material given its name.
MaterialDetails() takes either one or two arguments.
The first argument is the name of the material for which you want more information.
Common usage of this is to provide further information about a material, for example:
Iron is a {MaterialDetails("Iron").rarity} material.
The second argument, the name of a star system, is optional. If provided then the bodyname
and bodyshortname
properties in the resulting Material
object will return details from body with the highest concentration of the material within the specified star system.
Common usage of this is to provide recommendations for material gathering.
{set materialName to "Iron"}
{set details to MaterialDetails(materialName, system.name)}
The best place to find {materialName} in {system.name} is on {if details.bodyname != details.bodyshortname: body} {details.bodyshortname}.
This function will provide full information for a mission given its mission ID.
MissionDetails() takes a single argument of the mission ID for which you want more information.
Common usage of this is to provide detailed information about a previously accepted mission, for example:
{set mission to MissionDetails(event.missionid)}
This function will take its argument 1/nth of the time, the rest of time discarding it.
Occasionally() takes two arguments: n, and the text argument.
Note that Occasionally() works on random numbers rather than counters, so in the below example the additional text will not show up every 7th time you boost but will show up on average 1/7 of the times that you boost.
Common usage of this is to provide additional text that is said now and again but would become irritating if said all the time, for example:
Boost engaged. {Occasionally(7, \"Hold on to something.\")}
This function will take one of the arguments available to it, picking randomly.
OneOf() takes as many arguments are you want to give it.
Common usage of this is to provide variation to spoken text, for example:
You have {OneOf(\"docked\", \"finished docking\", \"completed docking procedures\")}.
This function will provide the orbital velocity in meters per second which is required to maintain orbit at the current altitude.
OrbitalVelocity() takes up to three arguments. If no arguments are provided, it'll try to return the velocity needed to maintain orbit around the current body at the current altitude.
- The first optional argument is the altitude in meters to use for the calculation. If no other arguments are provided, the function will provide the orbital velocity relative to the current body.
- The second optional argument is the name of the body. If no third argument is provided, the function will provide the orbital velocity relative the named body in the current star system.
- The third optional argument is the name of the star system to search for the named body provided as the second argument.
Common usage of this is to provide the velocity in meters per second required to orbit a body, for example:
{set velocity to OrbitalVelocity(status.altitude, "Tethys", "Sol")}
Orbital velocity to orbit Tethys at the current altitude is {velocity} meters per second.
This function will attempt to provide phonetic pronunciation for the supplied text. This function uses SSML tags.
P() takes one mandatory and one optional argument. The first argument is the string to be pronounced. The second optional argument describes which set of pronunciation overrides should be applied. Recognized values are: "power", "planettype", "shipmodel", "shipmanufacturer", "body", "starsystem", "station", or "faction".
Common usage of this is to wrap the names of planets, powers, ships etc., for example:
You are in the {P(system.name)} system.
or
You are in the {P(system.name, "starsystem")} system.
This function will pause the speech for a given amount of time. This function uses SSML tags.
Pause() takes one argument: the number of milliseconds to pause.
Common usage of this is to allow speech to sync up with in-game sounds, for example to wait for a known response to a phrase before continuing, for example:
Hello. {Pause(2000)} Yes.
This function will play an audio file as supplied in the argument. This function uses SSML tags. Various common Windows file formats are supported. Any backslashes for path separators must be escaped, so '' must be written as '\'.
Play() takes one mandatory argument: the path to the file to play. This may be an absolute path or relative path. Relative paths are defined relative to the %appdata%/EDDI
configuration directory.
Play() also takes two optional arguments. The first optional argument is a boolean value which if true will play the audio file asynchronously. The second optional argument is a number representing the volume of the audio, where 100 is normal volume.
Common usage of this is to provide a pre-recorded custom audio file rather than use EDDI's text-to-speech, for example:
{Play('C:\\Users\\CmdrMcDonald\\Desktop\\Warning.wav', false, 125)}
{Play('Sounds\\Kills\\doublekill.wav', true, 100)}
The former uses an absolute file path and the latter uses a relative path. The relative path would resolve to C:\Users\CmdrMcDonald\AppData\Roaming\EDDI\Sounds\Kills\doublekill.wav.
After escaping separators, essentially:
- A relative path starting with \ indicates to construct a path relative to the root (C:) of the current working directory.
- A relative path starting with .\ indicates to construct a path relative to the current working directory` and is equivalent to a path without a leading .\
- A relative path starting with ..\ indicates to construct a path relative to the parent of the current working directory
- A relative path starting with ..\..\ indicates to construct a path relative to the grandparent of the current working directory
This function will produce a destination/route. It takes at least one mandatory argument, the type
, and up to two optional arguments.
The type
variable is a mandatory parameter defining the type of command you are sending to the Navigation Monitor. This variable may be used either to plot a new route or to send commands to control a previously plotted route.
Route plotting type
values:
-
carrier
Plots a fleet carrier route between systems. Takes a destination system name as a mandatory 2nd argument, a starting system name as an optional 3rd argument, and the used capacity of the fleet carrier as an optional numeric 4th argument. -
encoded
Plots a course to the nearest encoded materials trader. Takes an optional second numeric argument overriding the maximum distance to the station in light seconds. -
expiring
Plots a course to the destination of your next expiring mission. -
facilitator
Plots a course to the nearest 'Legal Facilities' contact. Takes an optional second numeric argument overriding the maximum distance to the station in light seconds. -
farthest
Plots a course to the active mission destination farthest from your current location. -
guardian
Plots a course to the nearest guardian technology broker. Takes an optional second numeric argument overriding the maximum distance to the station in light seconds. -
human
Plots a course to the nearest human technology broker. Takes an optional second numeric argument overriding the maximum distance to the station in light seconds. -
manufactured
Plots a course to the nearest manufactured materials trader. Takes an optional second numeric argument overriding the maximum distance to the station in light seconds. -
most
Plots a course to the mission destination with the most active missions. Takes a system name as an optional second argument. If set, prefers the system closest to the named system when the mission count is equal. -
nearest
Plots a course to the active mission destination nearest to your current location. -
raw
Plots a course to the nearest raw materials trader. Takes an optional second numeric argument overriding the maximum distance to the station in light seconds. -
route
Plots the shortest path between active mission destinations in light years. Takes a system name as an optional secondary argument. If set, the resulting route shall begin at the specified star system rather than at the current star system. -
scoop
Plots a course to the nearest scoopable star system. Takes an optional second numeric argument to override the search radius in light years. Maximum value: 100. -
source
Destination to nearest mission 'cargo source'. Takes a system name as an optional secondary argument. If set, the resulting route shall identify cargo source locations near the specified star system rather than near the current star system.
Control type
values:
-
cancel
Deactivates guidance along the current plotted route. -
set
Activates guidance along the current plotted route. Takes an optional second argument plot aneutron
route to a specified star system and activates guidance. Takes an optional third argument to set the destination station in the event output. -
update
If guidance is enabled, updates to the next route destination once the current system contains no more active missions. Recalculates the route as required.
Common usage of this is to provide destination/route details, dependent on the 'routetype', for example:
{RouteDetails("cancel")}
{RouteDetails("set", "Achenar", "Macmillan Terminal")}
{set system to RouteDetails("nearest")}
{set system to RouteDetails("most", "Sol")}
Upon success of the query, a 'Route details' event is triggered, providing event data as documented here.
This function will provide the number of seconds since a given timestamp.
SecondsSince() takes a single argument of a UNIX timestamp.
Common usage of this is to check how long it has been since a given time, for example:
Station data is {SecondsSince(station.updatedat) / 3600} hours old.
This function will provide full information for a security level given its name.
SecurityLevelDetails() takes a single argument of the security level for which you want more information.
At current this does not have a lot of use as the security level object only contains its name, but this may be expanded in future.
This function will send a text string to the system clipboard.
SetClipboard takes a single argument: the text to send to the clipboard.
Common usage of this is to allow a text string to be pasted outside of EDDI, for example:
{SetClipboard("Shinrarta Dezhra")}
This function will set a session state value. The value will be available in future scripts or child scripts throughout the remainder of the EDDI session as a property of the persistent 'state' object. If you wish to refer to the stored value in the same script where it was stored then please retrieve the value using the 'GetState' function.
SetState takes two arguments: the name of the state value to set, and its value. The name of the state value will be converted to lower-case and spaces changed to underscores. The value must be either a boolean, a number, a string, or a null / void value; other values will be ignored.
Common usage of this is to keep track of the cumulative or persistent information within a session, for example:
{SetState("distance_travelled_today", state.distance_travelled_today + event.distance)}
This function will provide your ship's callsign in the same way that Elite provides it (i.e. manufacturer followed by first three letters of your commander name).
ShipCallsign() takes an optional ship ID for which to provide the callsign. If no argument is supplied then it provides the callsign for your current ship.
ShipCallsign() takes an optional second argument to permit variations in callsign format. If no second argument is provided then it will provide a callsign from the ship manufacturer and the commander name. Variations are specified in integer format, as follows:
- 1: a callsign from the ship manufacturer and the ship name.
- 2: a callsign from the ship manufacturer and the ship id.
This works best if EDDI is connected to the Frontier API.
This function will provide full information for a ship given its name.
ShipDetails() takes a single argument of the model of the ship for which you want more information.
Common usage of this is to provide further information about a ship, for example:
The Vulture is made by {ShipDetails("Vulture").manufacturer}.
This function will provide the name of your ship.
If you have set up a phonetic name for your ship it will return that, otherwise if you have set up a name for your ship it will return that. The phonetic name uses SSML tags.
ShipName() takes an optional ship ID for which to provide the name. If no argument is supplied then it provides the name for your current ship.
ShipName() also takes an optional ship model. If the optional ship ID is not found then this provides a ship name based on the ship model.
If you have not set up a name for your ship it will just return "your ship".
This function will allow letters and numbers in a string to be pronounced individually. If SSML is enabled, this function will render the text using SSML. If not, it will add spaces between letters in a string & convert to uppercase to assist the voice with achieving the proper pronunciation.
Spacialise() takes one argument: the string of characters to Spacialise.
Common usage of this is to provide a more human-sounding reading of a string of letters that are not a part of known word:
Star luminosity class: {Spacialise(event.luminosityclass)}.
This function allows you to dynamically adjust the pitch of the spoken speech. This function uses SSML tags.
SpeechPitch() takes two mandatory arguments: the text to speak and the pitch at which to speak it (legal values for the pitch include "x-low", "low", "medium", "high", "x-high", "default", as well as percentage values like "-20%" or "+10%").
Common usage of this is to provide a more human-sounding reading of text with variation in the speech pitch:
{SpeechPitch('Ok, who added helium to the life support unit?', 'high')}
{Pause(1000)}
{SpeechPitch('Countering with sodium hexa-flouride.', 'x-low')}
Equilibrium restored.
This function allows you to dynamically adjust the rate of the spoken speech. This function uses SSML tags.
SpeechRate() takes two mandatory arguments: the text to speak and the speech rate at which to speak it (legal values for the speech rate include "x-slow", "slow", "medium", "fast", "x-fast", "default", as well as percentage values like "-20%" or "+20%").
Common usage of this is to provide a more human-sounding reading of text with variation in the speech rate:
{SpeechRate('The quick brown fox', 'x-slow')}
{SpeechRate('jumped over the lazy dog', 'fast')}.
This function allows you to dynamically adjust the volume of the spoken speech. This function uses SSML tags.
Please take care with decibel values. If you accidentally blow out your speakers, that's totally on you.
SpeechVolume() takes two mandatory arguments: the text to speak and the volume at which to speak it (legal values for the speech volume include "silent", "x-soft", "soft", "medium", "loud", "x-loud", "default", as well as relative decibel values like "-6dB"). A value of "+0dB" means no change of volume, "+6dB" means approximately twice the current amplitude, "-6dB" means approximately half the current amplitude.
Common usage of this is to provide a more human-sounding reading of text with variation in speech volume:
{SpeechVolume('The quick brown fox', 'loud')}
{SpeechVolume('jumped over the lazy dog', 'x-soft')}.
This function returns true or false depending on whether the first letter in a string is a vowel.
StartsWithVowel() takes one argument: the string that may or may not start with a vowel.
Common usage of this is to select the word that should proceed the string (e.g. a Adaptive Encryptors Capture vs an Adaptive Encryptors Capture).
{if StartsWithVowel(event.name): an |else: a } {event.name}
This function will provide full information for a faction state given its name.
StateDetails() takes a single argument of the faction state for which you want more information.
At current this does not have a lot of use as the state object only contains its name but this may be expanded in future.
This function will provide full information for a station given its name and optional system.
StationDetails() takes a single mandatory argument of the name of the station for which you want more information. If the station is not in the current system then it can be provided with a second parameter of the name of the system.
Common usage of this is to provide further information about a station, for example:
{set station to StationDetails("Jameson Memorial", "Shinrarta Dezhra")}
Jameson Memorial is {station.distancefromstar} light years from the system's main star.
This function will provide full information for a superpower given its name.
SuperpowerDetails() takes a single argument of the superpower for which you want more information.
At current this does not have a lot of use as the superpower object only contains its name but this may be expanded in future.
This function will provide full information for a star system given its name.
SystemDetails() takes a single argument of the star system for which you want more information.
Common usage of this is to provide further information about a star system, for example:
Sol has {len(SystemDetails("Sol").bodies)} bodies.
This function will provide full information for a trade rating given its name.
TradeRatingDetails() takes a single argument of the trade rating for which you want more information.
Common usage of this is to provide further information about your rating, for example:
You have been promoted {TradeRatingDetails("Peddler").rank} times.
This function will provide information on traffic and hostilities in a star system.
TrafficDetails() takes one mandatory argument and one optional argument.
The first mandatory argument is the name of the star system. The second optional argument defines different data sets that are available:
-
traffic
the number of ships that have passed through the star system (this is the default if no second argument is provided) -
deaths
the number of ships passing through the star system which have been destroyed -
hostility
the percent of ships passing through the star system which have been destroyedThe returned
Traffic
object contains properties representing various timespans:day
,week
andtotal
.
Common usage is to provide information about traffic and hostilities within a star system, for example:
{set trafficDetails to TrafficDetails(system.name)}
{if trafficDetails.day > 0: At least {trafficDetails.day} ships have passed through {system.name} today. }
{set deathDetails to TrafficDetails(system.name, "deaths")}
{if deathDetails.week > 0: At least {deathDetails.week} ships have been destroyed in {system.name} this week. }
This function allows you to add a radio effect to speech.
Transmit() takes one argument: the text to speak. For example:
{Transmit("{ShipName()} returning from orbit.")}
This function allows you to include a different voice in your script than then one currently selected. This function uses SSML tags.
Voice() takes two mandatory arguments: the text to speak and the voice to speak it (legal values for the voice should match one of the voices listed by EDDI's Text-to-Speech
tab."). For Example:
{Voice("Now I can speak", "Microsoft Zira Desktop")}
{Voice("And I can listen", "Microsoft David Desktop")}
This function allows you to discover details about the voices installed on your system. It is intended for use with Voice()
to allow for more dynamic voice selection.
VoiceDetails takes either zero or one arguments.
With zero arguments, the function returns a VoiceDetail
object for the currently selected voice. For example:
The current voice is {VoiceDetail().name}.
With one argument, if the argument is a whole number then the function returns a list of VoiceDetail
objects randomized according to the seed number provided in the argument.
The first voice selected from the seed '12345' is {VoiceDetails(12345)[0].name}.
The first voice selected from the seed '23456' is {VoiceDetails(23456)[0].name}.
If the argument is the name of an installed voice then the function returns a VoiceDetail
object matching the installed voice named in the argument.
{VoiceDetails("Microsoft Zira Desktop").culturename}
{VoiceDetails("Microsoft Zira Desktop").gender}