Generated Announcements
đĄ Pro tip: If youâre new to the app, consider getting familiar with the basic features first.
TL;DR Summary
đŻ Use Windows (local), Azure, or ElevenLabs Text To Speech (TTS) to generate fully compatible sound files on the fly using your dynamic flight info
Important Note
đĄ Continue to use existing sound packs like normal - reality is best, butâŠ
This feature doesnât replace your existing high-quality airline sound packs. Itâs designed to fill in the gaps when you donât have custom audio for specific announcements or airlines. Maybe you donât want to use English files all the time etc. Use real recordings when available, but let this TTS handle the rest!
Why This Feature is Amazing
The Generated TTS feature is pretty interesting because:
- Always Tailored: You get announcements specifically tailored to your airline, no matter what aircraft or route youâre flying
- Local Language Support: Announcements can be in your local language, just like real-life airline operations
- Fully Customizable: Edit announcements to say exactly what you want, incorporating real flight context and details
- Cost-Effective: Azureâs free tier provides 8 hours of audio generation a month, and since these short clips are saved as reusable .ogg files in proper sound pack format, itâs unlikely youâll need to pay for anything. You can use the nicer ElevenLabs as well, which has a great âClone Voiceâ feature.
Overview
The Generated TTS feature automatically synthesizes missing airline announcements using Windows (local), Azure, or ElevenLabs Text-to-Speech, providing a seamless fallback before default audio is used. This ensures your passengers always hear appropriate announcements, even when custom audio files are missing.
Setting up a TTS Provider
You can use Windows (local), Azure, or ElevenLabs. Windows voices are free and offline; Azure has a generous free tier; ElevenLabs has a limited free plan and paid options for cloned/custom voices. Hereâs how to set them up:
Getting Started with Azure TTS
To use this feature, youâll need to set up an Azure Text-to-Speech API key. Iâve found two excellent step-by-step guides that walk you through the entire process:
- docs.merkulov.design - Comprehensive guide from account creation to API key generation
- VitalPBX Blog - Detailed walkthrough with screenshots and specific steps
Important: Youâll need both your API Key and your Azure Region/Location for the app to work properly. Make sure to note both values when setting up your Azure Speech service.
Getting Started with ElevenLabs TTS
You can sign up for a free key and try out these voices. A paid plan allows you to clone your voice and do all sorts of weird and wonderful things. There are free voices to use as well but limited compared to Azure.
Hereâs a short guide on how to get your API key: ElevenLabs API Key
..or to create an API key you can go here once you have an account: https://elevenlabs.io/app/settings/api-keys
IMPORTANT If you restrict the API key youâll need the follow permissions on it for this to work:
- Text to Speech = Has Access
- Voices = Read Only (so we can list the voices in the app)
- Models = Read Only (so we can list the models in the app, the default one is usually fine)
Models See the ElevenLabs documentation on the best model to use. Flash is cheaper than MultiLang for example but reduced quality. In this appâs case it doesnât really matter about super low latency.
Getting Started with Windows voices (SAPI v5 / WinRT/Core)
Use locally installed Windows voices to generate audio, fully offline. Supports both classic SAPI v5 (64âbit) voices and newer WinRT/Core voices available via Windows language packs and the Windows Speech SDK (0.5.1 added support for more Windows voices). You can also use commercial voice packs that install as SAPI v5 voices.
This option is free and simple to use. If a voice doesnât appear, ensure it is a 64âbit SAPI v5 voice or a supported WinRT/Core voice installed for your user.
How It All Works
Source Text Priority
The system follows this lookup order to find announcement text to say:
- Airline-specific: example:
Airline/BoardingWelcome.txt
(highest priority, an override used per airline, edit in the Generated tab with the airline selected and hit âSave txtâ) - Global default: example:
Default/SafetyBriefing.txt
next priority if no airline one found (you can edit this in the app and itâll save your version in yourDefault
folder) - Built-in template: Automatically copied to the airline folder on first use, of which you can always revert back to.
Output and Storage
Generated announcements are saved as .ogg
files alongside their corresponding .txt
files in the airline folder. Once created, these files are reused automatically on subsequent flights (unless set to overwrite), eliminating the need for repeated API calls.
To regenerate an announcement: Simply edit the .txt
file and delete or rename the associated .ogg
file.
Performance and Reliability
- Generation timeout: 5 seconds maximum, so generated on demand without you noticing
- Fallback behavior: If generation fails or times out, the normal audio fallback system takes over
- Efficient caching: Prevents unnecessary API usage for repeated announcements
Example Use Case 1: Virtual Airline Setup - On the Fly Generated
Letâs walk through setting up a virtual airline that doesnât have a sound pack yet and you want to generate the sound files as you go on a flight:
Step-by-Step Setup
- Create Airline Folder: Create an
XYZ
folder in your sound packs directory for your virtual âXYZ Airlinesâ (or enable Airline Folder Auto Creation below) - Pick a Voice: In the new
Settings / Generated
tab choose the nationality and accent that works best for the airline, over 100 to choose from. Remember the âTest Voiceâ uses your free credits, but you can select an existing announcement and try it out first. The generation uses the last one selected or use the âInsert Voiceâ to put in a hint on what you want to use for this announcement. - Set Up Flight: File a SimBrief plan or set a callsign in MSFS with
XYZ 123
as your flight id - Automatic Generation: The new announcements will be generated and play with your flight info, automatically saving
.ogg
sound files as it goes, filling placeholders with real data. - Add Music: Youâll still need your own
BoardingMusic.ogg
- go hunt for some disco or something classy to use! đș - Customize Your Airline:
- Rename the generated files to match your preferences, e.g.
AfterTakeoff[1].ogg
to keep âsetsâ of numbered files together. So either hand curate the files or let it regenerate on the fly using the placeholders. - Create airline-specific text files like
BoardingWelcome.txt
in your airline folder - remember it doesnât have to be in English anymore or use an English accent voice. The TTS works great across accents and languages.
- Rename the generated files to match your preferences, e.g.
Pro tip: If you only have the
.txt
file (and no.ogg
), the system will read it and generate the audio on demand - itâs where the âSave txtâ gets saved to.
Example Use Case 2: Virtual Airline Setup - Pregenerated Audio
Hereâs the steps for setting up a series of announcements up front before you fly:
Step-by-Step Setup
- Create the airline folder
- In your sound packs, create
XYZ
(e.g.,...\Announcements\XYZ
). Or use Airline Folder Auto Creation to have it created for you the first time.
- In your sound packs, create
- Open Settings â Generated
- Pick your TTS voice (you can use Test Voice to hear it first).
- Select the target airline
- Set the Airline dropdown to
XYZ
(not Default). The Generate buttons will enable.
- Set the Airline dropdown to
- Pick a template
- In the left template list, choose (for example)
BoardingWelcome
. Items in bold/green already have a matching.ogg
in the selected airline.
- In the left template list, choose (for example)
- Edit the text (optional)
- Use the right editor to customize. You can use placeholders like
{AIRLINE_NAME}
,{ORIGIN_CODE}
,{DESTINATION_NAME}
,{AIRCRAFT_NAME}
,{TIME_OF_DAY}
.
- Use the right editor to customize. You can use placeholders like
- Save the text to the airline folder
- Click âSave txtâ. This writes
XYZ\BoardingWelcome.txt
(youâll be asked to overwrite if it already exists).
- Click âSave txtâ. This writes
- Generate the audio
- Click âGenerateâ to create
XYZ\BoardingWelcome.ogg
, or - Click âGenerate As..â to enter a different filename (e.g.,
BoardingWelcome[1].ogg
) before saving. - Click âGenerate Allâ to generate a complete set for the current flight from your selections; ideal for batch preâgeneration and respects perâannouncement Insert Voice hints.
- Success is confirmed; the template list will refresh highlighting for files that now exist.
- Click âGenerateâ to create
- Preview and use
- Switch to Sound Files to preview; the new
.ogg
appears underXYZ
. - At runtime, the app will just play your preâgenerated
.ogg
(no TTS call needed).
- Switch to Sound Files to preview; the new
Tips
- To build a set (e.g., multiple versions), repeat âGenerate As..â with names like
AfterTakeoff[1].ogg
,AfterTakeoff[2].ogg
. - You can do the same flow with
Default
selected to preâgenerate fallback audio.
Multi-Lingual Announcements
It is fine to put two or more languages in an announcement, but on Azure they will work better if you use a âMultilingualâ type voice. This example shows such a voice (language-Country-Name+MultilingualNeural) in use with English and Cantonese:
Configuration
Access the Generated TTS settings in Settings â Generated:
- Enable/Disable: Toggle the feature on or off. Default off.
- Azure Region: Select your preferred Azure service region e.g.âwestusâ or âwesteuropeâ as you set up in Azure earlier.
- Model: Select your preferred ElevenLabs model, fast/turbo is fine usually and less credits.
- API Key: Enter your Azure or Elevenlabs Text-to-Speech API key
- Voice: Choose from available Azure or ElevenLabs TTS voices. Pick an accent appropriate for the airline or region.
- Windows Voices: Choose from local Windows SAPI v5 and WinRT/Core voices.
- Airline Folder Auto Creation: When enabled, the app will create the target airline folder automatically during generation/playback based on SimBrief or your MSFS callsign/airline selection.
- Automatic Generated Mode: Optionally overwrite existing
.ogg
files automatically; optionally only when text is dynamic.
đĄ If the voices seem too âcleanâ you can use the new âAudioâ tab âPA Audio Mixâ setting
This feature simulates the audio pattern of a PA system, with a few presets on how light or heavy. The generated voices will use this if this option is turned on (it is off by default)
Testing Your Setup
Use the âTest Voiceâ button to verify your configuration:
- First click: Reads the selected templateâs editor text (if available) or a default test message
- Second click: Stops the playback
Template Management
Built-in Templates
The template editor displays all available built-in announcement templates. Select any template to load its content for editing.
Template Actions
- Save: Writes your customizations to
Default/Name.txt
(creates a global override if no txt found in the airline) - Revert: Removes the override, restoring the original built-in template
- Generate: Creates the
.ogg
for the currently selected template - Generate As..: Creates the
.ogg
with a custom filename - Generate All: Generates a complete set in one click based on current Airline/voice selections; useful if you prefer manual generation without clicking each item. Respects perâannouncement Insert Voice hints.
PerâAnnouncement Voice Overrides
You can specify a different voice for each generated announcement. Use the Insert Voice button in the template editor to add a voice hint on the first line of the template. Overrides can be set per Default or perâAirline template so, for example, a pilot and an attendant can use different voices and in different accents.
Over time, more firstâline hints will be added for voice SSML, e.g. speed, and emphasis. If no override is present, the global voice selection is used (the one you last set).
âReplace existing .oggâ Automatic Generated Mode
When generating announcements, you can allow the app to automatically overwrite existing .ogg
files.
Options in the Generated
tab:
- âReplace existing .oggâ Allow overwrite: If enabled, generation will replace an existing sound file automatically.
- âRegenerate only if dynamicâ Only overwrite when text is dynamic: Restricts overwrites to templates that include dynamic placeholders (e.g., time, weather, SimBrief values), avoiding unnecessary updates when the text is static.
This is ideal for âhandsâoffâ workflows where your templates include dynamic placeholders and you want fresh, contextâaccurate audio each flight without manual cleanup.
Available Placeholders
Enhance your announcements with dynamic content using these placeholders, so you can place these in the text:
Placeholder | Description |
---|---|
{AIRLINE_CODE} |
Airline ICAO code (e.g., DAL) |
{AIRLINE_NAME} |
Airline name (e.g., Delta Air Lines) |
{ORIGIN_CODE} |
Origin airport ICAO code (e.g., KLAS) |
{ORIGIN_NAME} |
Origin airport name (e.g., Harry Reid International) |
{ORIGIN_CITY} |
Origin city/municipality (e.g., Las Vegas) |
{ORIGIN_FULLNAME} |
Origin full name (e.g., Harry Reid International, Las Vegas) |
{DESTINATION_CODE} |
Destination airport ICAO code (e.g., KJFK) |
{DESTINATION_NAME} |
Destination airport name (e.g., John F. Kennedy International) |
{DESTINATION_CITY} |
Destination city/municipality (e.g., New York) |
{DESTINATION_FULLNAME} |
Destination full name (e.g., John F. Kennedy International, New York) |
{AIRCRAFT_CODE} |
Aircraft type ICAO code (e.g., A320) |
{AIRCRAFT_NAME} |
Aircraft type name (e.g., Airbus A320) |
{TIME_OF_DAY} |
Morning, Afternoon, or Evening (based on local sim time) |
{LOCAL_TIME} |
The simâs local time spoken naturally, e.g. great to use in the âAfterLandingâ for telling people what to set their watches to (do people still have watches?) âThe time here in {DESTINATION_CITY} is {LOCAL_TIME}.â == âThe time here in Chicago is 5:14pmâ. |
{DESTINATION_WEATHER} |
Summary of the conditions from the METAR in simbrief of the destination airport. For example, if itâs IFR and raining then itâll be something like âthe weather is âânot so good, with heavy rainâââ. So it says a friendly general weather statement from the technical METAR it has. |
{DESTINATION_TEMPERATURE} |
Destination temperature in Celsius (included in phrase spoken) |
{DESTINATION_TEMPERATURE_F} |
As above but spoken as Fahrenheit |
{LOCAL_TIME_24H} |
Local time as 24âhour HH:MM numeric (e.g., 18:05) for multilingual TTS |
{FLIGHT_TIME} |
Flight time spoken as spoken duration (e.g., â2 hours 14 minutesâ). |
{FLIGHT_TIME_HHMM} |
Flight time in HH:MM numeric for multilingual TTS |
{DESTINATION_TEMPERATURE_C_NUM} |
Destination temperature as a numeric Celsius value |
{SCHED_DEP_LOCAL_24H} |
Scheduled departure in local time (origin) HH:MM |
{SCHED_DEP_UTC_24H} |
Scheduled departure in UTC time HH:MM |
{SCHED_ARR_LOCAL_24H} |
Scheduled arrival in local time (destination) HH:MM |
{SCHED_ARR_UTC_24H} |
Scheduled arrival in UTC time HH:MM |
{DEP_STATUS} |
Example outputs: âWe expect to depart on time.â / âWe are departing late.â / âWe expect to depart early.â |
{ARR_STATUS} |
Example outputs: âWe have arrived on time.â / âWe have arrived late.â / âWe have arrived early.â |
{DEP_LATE} |
Human duration, e.g., â2 hours 5 minutesâ |
{DEP_EARLY} |
Human duration, e.g., â5 minutesâ |
{ARR_LATE} |
Human duration, e.g., â4 hoursâ |
{ARR_EARLY} |
Human duration, e.g., â4 hours 15 minutesâ |
{DEP_LATE_MINUTES} |
Integer minutes late (number only), e.g., 125 |
{DEP_EARLY_MINUTES} |
Integer minutes early (number only), e.g., 5 |
{ARR_LATE_MINUTES} |
Integer minutes late (number only) |
{ARR_EARLY_MINUTES} |
Integer minutes early (number only) |
Notes:
- If a lookup isnât found, the placeholder resolves to empty.
- Name/city data is loaded from Tools JSON datasets shipped with the app. Feel free to edit it.
- If you are missing something from above, check out the XML Placeholders for simbrief data spelunking below.
- Numeric placeholders above are returned as numbers so they read correctly in nonâEnglish voices.
- The *_MINUTES placeholders return numbers only; useful for nonâEnglish voices/locales.
Example valid txt entry: âLadies and gentlemen, good {TIME_OF_DAY}. Welcome on board our {AIRLINE_NAME} flight to {DESTINATION_FULLNAME}, on this {AIRCRAFT_NAME} aircraft. Our {ORIGIN_CITY} based crew is pleased to be with you.â
Conditional Placeholder âIFâ
Use {IF ...}
to conditionally include text based on placeholder presence or a nonâzero numeric value. The content after {IF ...}
up to the next newline is spoken when the condition is true. Use {END}
to wrap multiâline conditional blocks. Blocks can be nested.
Singleâline examples:
{IF ARR_LATE} Weâre arriving {ARR_LATE} late today.
{IF ARR_EARLY} Good news, weâre arriving {ARR_EARLY} early.
{IF ARR_LATE_MINUTES} Numeric late minutes: {ARR_LATE_MINUTES}
Multiline example:
{IF ARR_EARLY}
Good news, we've caught up some time and weâre arriving {ARR_EARLY} early today.
Thank you for your patience.
{END}
Cruise Announcements
Use the flightâs elapsed air time to trigger cruise announcements. Enable this stage in the Announcements tab by turning on CruiseElapsed
. IT IS OFF BY DEFAULT!
How triggers work
- Create files named like
Cruise.ogg
to trigger at 50% elapsed air time. Itâs basically an alias for 50% through. - Or use percentageâbased names like
CruiseElapsed25Percent.ogg
,CruiseElapsed66Percent.ogg
,CruiseElapsed70Percent.ogg
to trigger at those points. You can have many per cruise e.g. a drinks service, breakfast before you arrive etc. - Works from SimBrief planned enâroute time (air time). The simâs elapsed flight time is used for progress, not real time, so pausing or time acceleration is respected.
- Short flights (< ~1 hour) will compress timing slightly so midâcruise announcements still occur before descent.
You can provide .ogg
files, or .txt
files that will be generated on the fly using placeholders.
Helpful placeholders for cruise examples
{LOCAL_TIME}
â spoken local time, great for afterâlanding or time checks{DESTINATION_WEATHER}
â friendly summary derived from destination METAR{DESTINATION_TEMPERATURE}
/{DESTINATION_TEMPERATURE_F}
â temperature in C/F- XML lookups like
{xml_number<general><route_distance>}
,{xml_number<general><initial_altitude>}
,{xml_digits<general><flight_number>}
for rich SimBrief data
Tip: The Status and system tray now show a hint of the Cruise elapsed % the app thinks youâre at, to help you tune when to say thing.
Note:
- Previously, generated files had to be manually removed to regenerate. See Automatic Generated Mode below for new options to overwrite automatically.
XML Placeholders
As of 0.4.5 you can also now directly address simbrief info from XML elements of the generated OFP.
What you do is check your simbrief generated OFP data in a web browser (e.g. https://www.simbrief.com/api/xml.fetcher.php?username=fearlessfrog) and then grab the elements you need and want to use in the announcement, e.g. these all work:
âOur captain today is {xml<api_params><cpt>}
.â
âFlight number is {xml_digits<general><flight_number>}
.â
âDistance today will be {xml_number<general><air_distance>}
miles.â
So âxmlâ will just say it verbatim, âxml_digitsâ will read each digit (good for a flight numbers etc) and âxml_numberâ will use more human sounding number formats, e.g. â1024â is then said as âone thousand and twenty fourâ.
Best Practices
- Keep text natural: Write announcements as you would speak them naturally
- Avoid complex formatting: SSML and tag variants are not yet supported, but looking at it, e.g. pitch, speed
- Test thoroughly: Use the Test Voice feature to ensure your templates sound correct
- Plan for fallbacks: Design templates that work well even when some data is unavailable
- Audio Mix: Use the âPA Audio Mixâ setting on the Audio tab to simulate a PA system. Toggle off if you prefer the clean TTS output.
Note: This feature provides a robust solution for missing announcements while maintaining the authentic airline experience your passengers expect.