Your show keeps running. Your voice cuts right through. Announcement Assistant layers pre-recorded messages over your active FPP show audio with silky-smooth automatic ducking — no dead air, no stopping the magic, just clear announcements exactly when you need them. 🎙️✨
- What Is Announcement Assistant?
- Feature Overview
- How It Works (Architecture)
- Real-World Use Cases
- Requirements
- Installation
- Configuration
- The Six Announcement Slots
- Ducking & Fading Explained
- Behavior Modes
- Per-Slot Priority (Interrupt)
- FPP Commands
- Trigger from Sensors & Automations
- Play Count Tracking
- Audio File Tips
- PulseAudio Setup Details
- Troubleshooting
- File Reference
- FAQ
- Credits
Free for personal, hobbyist, and noncommercial use under the PolyForm Noncommercial License 1.0.0.
Using this in a commercial or paid-event display? A separate commercial license is required — contact license.request@christmasinboontontwp.com to arrange one.
If Announcement Assistant has made your show more magical, this repo has a Sponsor button in the sidebar if you'd like to support development.
Announcement Assistant (AA) is a Falcon Player plugin that gives your Christmas light show a voice — without ever stopping the show.
You record six announcements. You configure each slot with a label, an audio file, and a duck level. When you — or a sensor, or a donation box, or an automation — triggers a slot, AA:
- Smoothly fades down the show audio to your configured duck level
- Plays your announcement on top of the live show via PulseAudio mixing
- Smoothly fades the show back up to full volume once the announcement finishes
The lights keep going. The music never stops (it just gets politely quieter for a moment). Your message is crisp and clear. Your visitors know to tune to 103.3 FM. The donation box says thank you. The crowd smiles.
This is true audio mixing — not muting, not pausing, not stopping. The show and the announcement play simultaneously, with the announcement layered on top. And it's built right into FPP with a one-click installer.
| Feature | Description |
|---|---|
| 🎚️ 6 Announcement Slots | Each has its own label, audio file, duck level, and priority flag |
| 🔉 PulseAudio Ducking | Show audio fades to configured % while announcement plays |
| 🌊 Smooth Fade Down/Up | Configurable fade durations (default: 0.5s down, 1.0s up) |
| 🔇 Behavior Modes | Ignore (drop if busy), Queue (wait), or Interrupt (stop current) |
| ⚡ Per-Slot Priority | Mark any slot as high-priority to always interrupt, regardless of global policy |
| ⏱️ Cooldown Protection | Configurable minimum time between triggers to prevent spamming |
| 🎮 Live Trigger Buttons | One-click test and trigger buttons right in the FPP UI |
| ⚡ FPP Commands | "Play" (with slot picker) and "Stop" — usable in FPP sequences, scripts, and schedules |
| 📊 Play Count Tracking | Today and lifetime play counts displayed per slot |
| 🎵 Wide Format Support | WAV, MP3, OGG, FLAC, M4A — uses ffmpeg for format conversion if available |
| 🔧 Auto PulseAudio Setup | Configures system-wide PulseAudio with 48kHz for optimal audio quality |
| 🛑 Clean Stop | Stop button immediately halts playback and restores show audio |
┌──────────────────────────────────────────────────────────────────────┐
│ Raspberry Pi │
│ │
│ ┌───────────────┐ FPP Command / ┌──────────────────────────┐ │
│ │ FPP Web UI │ direct script │ aa_play.sh │ │
│ │ (Trigger │ ─────────────────▶ │ ┌────────────────────┐ │ │
│ │ Buttons) │ │ │ Behavior check │ │ │
│ └───────────────┘ │ │ (ignore/queue/ │ │ │
│ │ │ interrupt) │ │ │
│ ┌───────────────┐ │ └────────────────────┘ │ │
│ │ FPP Sequence │ FPP Command │ ┌────────────────────┐ │ │
│ │ / Schedule │ ─────────────────▶ │ │ Cooldown check │ │ │
│ └───────────────┘ │ └────────────────────┘ │ │
│ │ ┌────────────────────┐ │ │
│ ┌───────────────┐ │ │ Play count track │ │ │
│ │ GPIO / SLED │ Shell script │ └────────────────────┘ │ │
│ │ Sensor Prop │ ─────────────────▶ └────────────┬─────────────┘ │
│ └───────────────┘ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ aa_duck_overlay_pulse.sh │ │
│ │ │ │
│ │ 1. pactl list sink-inputs → capture active show audio IDs │ │
│ │ 2. Smooth fade DOWN (20 steps over fade_down seconds) │ │
│ │ 3. paplay / ffmpeg → play announcement on PulseAudio sink │ │
│ │ 4. Smooth fade UP (20 steps over fade_up seconds) │ │
│ │ 5. EXIT trap → restore volumes on error/signal/stop │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────┴──────────────────────┐ │
│ ▼ ▼ │
│ ┌───────────────────┐ ┌────────────────────┐ │
│ │ PulseAudio Sink │ │ aa_play_counts │ │
│ │ (Show audio at │ │ .json │ │
│ │ duck %) │ │ (today/total per │ │
│ │ + Announcement │ │ slot) │ │
│ │ (100% volume) │ └────────────────────┘ │
│ └───────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ 🔊 Your Speaker │ Show audio + announcement mixed live │
│ └───────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
The key insight: PulseAudio handles all the mixing. The show audio is already playing through PulseAudio. AA identifies the active sink inputs, fades their volume down, injects the announcement as a second stream, and fades the show back up — all while the show keeps running uninterrupted.
This is where AA gets fun. The trigger button in the FPP UI is just the beginning — because AA registers as an FPP Command, you can fire announcements from anywhere FPP can run a command:
| Scenario | How to Set It Up |
|---|---|
| "Welcome to our show!" | Schedule a trigger at show start via FPP's scheduler |
| "Tune to 103.3 FM" | Trigger periodically from an FPP sequence |
| "Please stay on the sidewalk" | Button in the FPP UI for when the crowd gets rowdy |
| "Thank you for your donation!" | Wire a donation box sensor → GPIO → FPP Command |
| "Santa received your letter!" | SLED plugin letter sensor → AA trigger via script |
| "Show ends in 10 minutes" | Schedule near end of show window |
| Scenario | How to Set It Up |
|---|---|
| "They're coming for you..." | Motion sensor → trigger spooky voice overlay |
| "Muwahaha!" | Jump-scare trigger from prop controller |
| Crowd atmosphere layer | Low-duck background narration over music |
| Scenario | How to Set It Up |
|---|---|
| Donation box thank-you | Beam break sensor → FPP GPIO trigger → AA Play command |
| Mailbox letter confirmation | SLED plugin triggers AA via callback script |
| Button-activated greetings | Physical push button on the yard → Pi GPIO → AA |
| Remote triggers | Home Assistant automation → FPP API → AA Command |
- Falcon Player (FPP) 9.x or 10.x+
- PulseAudio (installed automatically)
- pulseaudio-utils (installed automatically)
- libasound2-plugins (installed automatically)
- ffmpeg (optional but recommended — enables all audio formats)
- Raspberry Pi (Pi 3B, 4, or Zero 2W recommended)
- Pi 3.5mm audio output works great
- USB sound cards work great (tested with Sound Blaster Play! 3)
- HDMI audio output works too
- Speaker or amplifier connected to audio output
- FPP must be playing show audio through PulseAudio for ducking to work
Note on USB Sound Cards: AA works with USB audio devices. Make sure your USB sound card is set as the default PulseAudio sink in FPP's audio settings for ducking to target the correct output.
- In FPP, go to Content Setup → Plugin Manager
- Click Available Plugins
- Find "Announcement Assistant (Audio Ducking)" in the list
- Click Install
- Watch the install log — it configures PulseAudio system-wide and validates the socket
- When you see
Install complete, navigate to Announcement Assistant in the left menu
The installer (fpp_install.sh) does several important things automatically:
- Installs
pulseaudio,pulseaudio-utils,libasound2-pluginsvia apt - Configures PulseAudio to run system-wide (so it's available at boot, not per-user)
- Sets PulseAudio sample rate to 48kHz for optimal quality (configurable)
- Creates
/home/fpp/.config/pulse/client.confso thefppuser connects to the system socket at/run/pulse/native - Validates the PulseAudio socket exists and is functional
- Writes a default
announcementassistant.jsonconfig if none exists
⚠️ Important: AA requires PulseAudio to be the active audio system on your Pi. If you're using a different audio output method, the install log will tell you what needs adjusting.
All settings live in:
/home/fpp/media/config/announcementassistant.json
| Setting | Default | Description |
|---|---|---|
duck |
25% |
Default duck level — show audio volume while announcement plays. Lower = more ducking. 15% is very noticeable; 40% is subtle. |
fade_down |
0.5 |
Seconds to fade the show audio down before the announcement starts |
fade_up |
1.0 |
Seconds to fade the show audio back up after the announcement ends |
behavior |
ignore |
What to do if an announcement is already playing: ignore, queue, or interrupt |
cooldown |
3.0 |
Minimum seconds between triggers (applies to ignore mode) |
{
"duck": "25%",
"fade_down": 0.5,
"fade_up": 1.0,
"behavior": "ignore",
"cooldown": 3.0,
"buttons": [
{
"label": "Welcome to the Show!",
"file": "/home/fpp/media/music/announcements/welcome.mp3",
"duck": "20%",
"interrupt": false
},
{
"label": "Tune to 103.3 FM",
"file": "/home/fpp/media/music/announcements/tune_fm.mp3",
"duck": "25%",
"interrupt": false
},
{
"label": "Thank You for Donating!",
"file": "/home/fpp/media/music/announcements/donation_thanks.mp3",
"duck": "15%",
"interrupt": true
},
{
"label": "Stay on the Sidewalk",
"file": "/home/fpp/media/music/announcements/sidewalk.mp3",
"duck": "30%",
"interrupt": false
},
{
"label": "Show Ending Soon",
"file": "/home/fpp/media/music/announcements/ending.mp3",
"duck": "20%",
"interrupt": false
},
{
"label": "Emergency: Clear the Area",
"file": "/home/fpp/media/music/announcements/emergency.mp3",
"duck": "5%",
"interrupt": true
}
],
"telemetry": {
"opt_in": true,
"install_id": "your-uuid-here"
}
}AA gives you 6 configurable announcement slots, each fully independent:
┌────┬──────────────────────┬────────────────────────────────────┬────────┬──────────┬─────────────┐
│ # │ Label │ Audio File │ Duck % │ Priority │ Plays │
├────┼──────────────────────┼────────────────────────────────────┼────────┼──────────┼─────────────┤
│ 1 │ Welcome to the Show! │ .../music/welcome.mp3 │ 20% │ normal │ 12 today │
│ 2 │ Tune to 103.3 FM │ .../music/tune_fm.mp3 │ 25% │ normal │ 8 today │
│ 3 │ Thank You Donation! │ .../music/donation.mp3 │ 15% │ ⚡ HIGH │ 3 today │
│ 4 │ Stay on Sidewalk │ .../music/sidewalk.mp3 │ 30% │ normal │ 2 today │
│ 5 │ Show Ending Soon │ .../music/ending.mp3 │ 20% │ normal │ 1 today │
│ 6 │ (empty) │ — │ 25% │ normal │ 0 today │
└────┴──────────────────────┴────────────────────────────────────┴────────┴──────────┴─────────────┘
Each slot has:
- Label — friendly name shown in the UI and in the FPP Command slot picker
- Audio File — any WAV, MP3, OGG, FLAC, or M4A file on the Pi (auto-scanned from
/home/fpp/media/music) - Duck % — this slot's specific duck level, overriding the global default
- Priority ⚡ — if checked, this slot always interrupts whatever is playing (regardless of global behavior)
- Test Button — play the slot immediately for testing, right from the UI
- Play Count — today / lifetime plays, auto-resetting at midnight
"Ducking" is the technique of temporarily lowering background audio so a foreground sound is clear. Radio stations duck background music under voice-overs. News shows duck ambient sound under reporters. AA does this for your Christmas light show.
Duck % = the show audio level WHILE the announcement plays.
| Duck % | Effect |
|---|---|
5% |
Near-silent show audio — announcement dominates completely |
15% |
Heavy duck — show clearly in background, announcement very prominent |
25% |
Standard duck — noticeable reduction, clean mix (default) |
40% |
Light duck — subtle reduction, gentle overlay feel |
100% |
No ducking — show audio unchanged (announcement mixed in equally) |
Volume
100% ─────────────────╮ ╭────────────────────
╲ ╱
25% ─── show ──────────╲──────────╱── show ──────────────
╲ ╱
0% ╲──────╱ ← announcement plays here
↑ ↑
fade_down fade_up
(0.5s) (1.0s)
◄── show playing ──►◄announcement►◄─── show playing ─►
fade_down(default 0.5s): How long it takes to smoothly lower the show audiofade_up(default 1.0s): How long it takes to smoothly restore the show audio after the announcement ends
The fade uses 20 interpolation steps for buttery-smooth transitions. No click, no pop, no jarring cut.
If the announcement process is killed, interrupted, or crashes, an EXIT trap guarantees the show audio is restored to its original volume. You will never get stuck at 15% volume because something went wrong.
What happens when you trigger an announcement and one is already playing?
- If busy → drop the trigger silently and log it
- If within cooldown → drop the trigger silently and log it
- Best for: donation boxes, sensor props, automated triggers where you never want overlapping audio
- Cooldown timer prevents rapid re-fires from noisy sensors
- If busy → wait up to 5 minutes for the current announcement to finish, then play
- Best for: when you really need every trigger to play, just in order
⚠️ Long queues can pile up — use with care on frequently-fired triggers
- If busy → immediately stop current playback and restore show audio, then play the new announcement
- Best for: global setups where the newest announcement always wins
In the FPP UI, use the Behavior dropdown in the global settings section. Or set it directly in the config JSON:
"behavior": "ignore" // or "queue" or "interrupt"The Priority checkbox (⚡) on each slot overrides the global behavior for that specific slot only.
When a slot has Priority enabled:
- It always interrupts whatever is currently playing
- It ignores the global behavior setting entirely
- Perfect for high-importance announcements that should always cut through
Scenario: Global behavior = "ignore", Slot 3 has Priority ⚡
Normal trigger (Slot 1) while busy → DROPPED (ignore policy)
Priority trigger (Slot 3) while busy → INTERRUPTS current, plays immediately
Set it in the UI with the ⚡ checkbox, or in the config JSON:
{
"label": "Thank You for Donating!",
"file": "/home/fpp/media/music/donation_thanks.mp3",
"duck": "15%",
"interrupt": true
}AA registers two commands in FPP's command system. These appear everywhere FPP accepts commands — sequences, scripts, GPIO triggers, schedules, and the FPP REST API.
Plays a specific announcement slot with full ducking.
| Argument | Type | Description |
|---|---|---|
slot |
String (dropdown) | Which slot to play — auto-populated from your configured slot labels |
Example uses:
- In an FPP sequence: add an "Effect" step → choose "Announcement Assistant - Play" → pick the slot
- In a GPIO trigger: wire a button → "on press" → run this command with the desired slot
- Via REST API:
GET /api/command/Announcement%20Assistant%20-%20Play/Slot%201
Immediately stops any playing announcement and fades the show audio back to full volume.
Example uses:
- Add to a playlist to ensure clean state at show start
- Assign to a "kill" button on your display board
- Trigger at end-of-show cleanup
Because AA uses FPP's command system, anything that can run an FPP command can trigger an announcement.
In FPP → GPIO Inputs:
- Set pin, mode
gpio_pu(pull-up, active-low) - On falling edge (trigger): command =
Announcement Assistant - Play, arg =Slot 2
# Play Slot 3 (index 2) from any script on the Pi
/home/fpp/media/plugins/fpp-AnnouncementAssistant/scripts/aa_play.sh \
"/home/fpp/media/music/donation_thanks.mp3" "15%" "2"
# Or via FPP's REST API
curl "http://localhost/api/command/Announcement%20Assistant%20-%20Play/Slot%203"Pair SLED with AA for the full experience — SLED plays a letter-received video while AA simultaneously plays a "Santa got your letter!" audio announcement over the show music.
# HA action — trigger an announcement via FPP REST API
action: rest_command.fpp_announcement
data:
slot: "Slot%201"# Define in configuration.yaml
rest_command:
fpp_announcement:
url: "http://192.168.1.xxx/api/command/Announcement%20Assistant%20-%20Play/{{ slot }}"
method: getIn FPP's Scheduler, create time-based triggers:
- At 17:00 → FPP Command "Announcement Assistant - Play" → "Welcome to the Show!"
- Every 30 minutes → "Tune to 103.3 FM"
- At 21:50 → "Show Ending in 10 Minutes"
- At 22:00 → "Announcement Assistant - Stop" + stop show playlist
AA tracks how many times each slot has been played — today and lifetime total — displayed right in the settings UI next to each slot.
Slot 1: Welcome to the Show! ▓ 12 today / 847 total
Slot 2: Tune to 103.3 FM ▓ 8 today / 512 total
Slot 3: Thank You Donation! ▓ 3 today / 47 total
- Today counts auto-reset at midnight
- Lifetime totals accumulate across the full season
- Stored in
/home/fpp/media/logs/aa_play_counts.json - Updates happen after every successful play
How many times did you need to ask visitors to stay off the grass this season? Now you'll know. 😄
| Format | Notes |
|---|---|
.wav |
Best — no decoding overhead, instant start |
.mp3 |
Works great with ffmpeg installed |
.ogg |
Excellent quality/size ratio |
.flac |
Lossless — overkill but works |
.m4a |
Works with ffmpeg |
Install ffmpeg for the best experience:
sudo apt install ffmpeg. Without it, AA falls back topaplaywhich only natively handles WAV.
- Record at 48kHz, stereo to match AA's PulseAudio configuration (no resampling needed)
- Use a pop filter and a quiet room — background hiss is very obvious during ducked playback
- Normalize your recordings to around -3dB so they're loud enough to cut through even at moderate duck levels
- Keep announcements short and punchy — under 10 seconds for triggered ones, 15–20 seconds max for scheduled ones
- Add a brief music sting or jingle at the start to signal "something is happening" before the voice kicks in
Drop announcement files anywhere under:
/home/fpp/media/music/
AA scans this entire directory tree and populates the file picker dropdown. A tidy structure:
/home/fpp/media/music/
└── announcements/
├── welcome.mp3
├── tune_103fm.mp3
├── donation_thanks.mp3
├── sidewalk_warning.mp3
└── show_ending.mp3
AA uses system-wide PulseAudio — a single PulseAudio daemon running as a system service, accessible by all users (including fpp and root) via a Unix socket at /run/pulse/native.
This is different from the default per-user PulseAudio that most Linux desktops use. System-wide mode is required because:
- FPP's audio playback runs as the
fppuser - AA's scripts may run as
root(via FPP's plugin system) - Both need to share the same PulseAudio instance for ducking to work
/etc/pulse/daemon.conf ← sets default-sample-rate = 48000
/etc/pulse/system.pa ← system-wide config (loads ALSA, sets socket)
/home/fpp/.config/pulse/client.conf ← fpp user points to unix:/run/pulse/native
# Check if socket exists
ls -la /run/pulse/native
# Check server info
PULSE_SERVER=unix:/run/pulse/native pactl info | grep -E "Server|Default Sink"
# List active sink inputs (should show FPP's audio while a show plays)
PULSE_SERVER=unix:/run/pulse/native pactl list short sink-inputs
# Test a manual announcement playback
PULSE_SERVER=unix:/run/pulse/native paplay /home/fpp/media/music/test.wavThe installer sets PulseAudio's default sample rate to 48kHz to match FPP's native output and avoid resampling artifacts. Pass --no-48k to the install script or manually edit /etc/pulse/daemon.conf if your hardware requires a different rate.
Most likely cause: FPP isn't routing audio through PulseAudio.
# Check what's active on the PulseAudio sink while the show plays
PULSE_SERVER=unix:/run/pulse/native pactl list short sink-inputs
# If this returns nothing, FPP is bypassing PulseAudio.
# Go to FPP → Settings → Audio and set PulseAudio / correct device as output.PulseAudio isn't running or hasn't started yet.
systemctl status pulseaudio
sudo systemctl start pulseaudio
ls -la /run/pulse/native
# If it's not starting at boot, re-run the installer:
sudo bash /home/fpp/media/plugins/fpp-AnnouncementAssistant/fpp_install.shThe EXIT trap handles this automatically, but if PulseAudio was restarted mid-play you can restore manually:
PULSE_SERVER=unix:/run/pulse/native pactl list short sink-inputs | awk '{print $1}' | \
xargs -I{} pactl set-sink-input-volume {} 100%Check the log first:
tail -50 /home/fpp/media/logs/AnnouncementAssistant.log| Log Message | Cause | Fix |
|---|---|---|
BUSY: dropping trigger (policy=ignore) |
Another announcement is playing | Normal — wait, or change behavior to queue |
COOLDOWN: dropping trigger (2s elapsed, cooldown=3s) |
Triggered too fast | Normal — wait for cooldown, or lower cooldown value |
ERROR: File not found: /path/to/file.mp3 |
File path in config is wrong | Check slot config in the UI |
ERROR: Pulse socket missing |
PulseAudio not running | Start PulseAudio (see above) |
ERROR: Could not determine Default Sink |
PulseAudio up but no output | Check audio output in FPP settings |
# Verify the command definition file exists and is valid
cat /home/fpp/media/plugins/fpp-AnnouncementAssistant/commands/descriptions.json | python3 -m json.tool
# Restart FPP to reload commands
sudo systemctl restart fppd# Verify 48kHz is configured
grep "default-sample-rate" /etc/pulse/daemon.conf
# Set it if missing
echo "default-sample-rate = 48000" | sudo tee -a /etc/pulse/daemon.conf
sudo systemctl restart pulseaudioIf you have multiple audio outputs, ensure PulseAudio's default sink matches FPP's audio output:
# List all sinks
PULSE_SERVER=unix:/run/pulse/native pactl list short sinks
# Set the correct one as default
PULSE_SERVER=unix:/run/pulse/native pactl set-default-sink <sink-name>| File | Description |
|---|---|
fpp_install.sh |
Installer — configures system-wide PulseAudio, installs deps, creates default config |
scripts/aa_play.sh |
Main dispatcher — behavior/cooldown logic, play count tracking, telemetry |
scripts/aa_duck_overlay_pulse.sh |
Core engine — PulseAudio fade down/play/fade up with EXIT trap restore |
scripts/aa_stop.sh |
Stop wrapper — delegates to duck script's --stop handler |
scripts/aa_telemetry.py |
Anonymous opt-in telemetry (play counts, daily ping) |
commands/aa_cmd_play.sh |
FPP Command wrapper for Play |
commands/aa_cmd_stop.sh |
FPP Command wrapper for Stop |
commands/descriptions.json |
FPP Command definitions with slot picker contentListUrl |
www/index.php |
Plugin UI — slot config table, trigger buttons, play counts |
www/save.php |
Config save endpoint |
www/trigger.php |
AJAX trigger endpoint for UI test buttons |
www/stop.php |
AJAX stop endpoint |
www/slots.php |
Returns slot list for FPP Command argument picker |
/home/fpp/media/config/announcementassistant.json |
Runtime config (created on first save) |
/home/fpp/media/logs/AnnouncementAssistant.log |
Full play / duck / restore log |
/home/fpp/media/logs/aa_playing.lock |
PID lock file — present while announcement plays |
/home/fpp/media/logs/aa_cooldown.ts |
Last-trigger timestamp for cooldown enforcement |
/home/fpp/media/logs/aa_play_counts.json |
Per-slot today/total play counts |
Q: Does the show audio actually keep playing during the announcement?
A: Yes — 100%. PulseAudio mixes both streams simultaneously. The show audio is never paused or stopped; its volume is just temporarily lowered.
Q: What if FPP is playing a video with audio?
A: Same behavior. AA ducks whatever PulseAudio sink inputs are active, whether they're music files, video audio tracks, or anything else FPP outputs through PulseAudio.
Q: Can I have different duck levels for different announcements?
A: Yes — each slot has its own duck % setting that overrides the global default. Your emergency announcement can duck to 5%, your welcome message can stay at 30%.
Q: What audio formats work?
A: WAV works natively. MP3, OGG, FLAC, and M4A work with ffmpeg installed (sudo apt install ffmpeg). Highly recommended.
Q: Can I use AA without a show playing?
A: Yes — if no show audio is active, AA just plays the announcement at full volume with no ducking needed. It handles "no sink inputs" gracefully.
Q: Will this work with my USB sound card?
A: Yes, tested with Sound Blaster Play! 3 and similar USB audio devices. Make sure the USB card is FPP's selected audio output and PulseAudio's default sink.
Q: How do I record good announcement audio?
A: A ~$30 USB microphone, a quiet room, and Audacity (free) is all you need. Record at 48kHz stereo, normalize to -3dB, export as WAV or MP3. Short and energetic beats long and rambling every time.
Q: Can I trigger AA from Home Assistant without Pi GPIO?
A: Yes — use FPP's REST API. HA sends an HTTP GET to http://<fpp-ip>/api/command/Announcement%20Assistant%20-%20Play/Slot%201. No additional setup needed.
Found a bug? Have a feature idea? PRs and issues are welcome!
- Fork the repo
- Create a feature branch:
git checkout -b feature/my-feature - Commit your changes
- Open a pull request against
main
Bug reports: github.com/focusedonsound/fpp-AnnouncementAssistant/issues
Author: Nick Scilingo (FocusedOnSound)
Built with ❤️ for the Christmas lighting community — and for every show operator who's ever watched a visitor walk across their yard and wished they could say something about it without killing the vibe.
Part of the FocusedOnSound FPP Plugin Collection:
- 🎅 SLED Smart Letters to Santa — sensor-driven Santa Mailbox with video playback, car counting, and Home Assistant integration
- 📺 HDMI CEC Control+ — power your TV or monitor on/off from FPP playlists and schedules