From 5ada3f09c0e10f1cba3c4bc3f30deb13128a48b1 Mon Sep 17 00:00:00 2001 From: Joaquin Madrid Belando Date: Tue, 3 Mar 2026 20:39:29 +0100 Subject: [PATCH] Update replit.md --- replit.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/replit.md b/replit.md index 3c3c28e..f26acb6 100644 --- a/replit.md +++ b/replit.md @@ -57,6 +57,63 @@ Preferred communication style: Simple, everyday language. **Rationale**: Provides accessible feedback to users without requiring external TTS systems, maintains compatibility with DMR audio codecs. +### Scheduled Announcements (Locuciones Programadas) + +**Problem**: Need to broadcast pre-recorded AMBE voice announcements on a schedule to specific talkgroups +**Solution**: Configurable scheduled announcement system in `bridge_master.py` with up to 4 independent announcement slots + +**Configuration in adn.cfg [GLOBAL] section**: +- Slot 1: `ANNOUNCEMENT_*` (ENABLED, FILE, TG, TIMESLOT, MODE, INTERVAL, LANGUAGE) +- Slot 2: `ANNOUNCEMENT2_*` (same parameters with prefix ANNOUNCEMENT2_) +- Slot 3: `ANNOUNCEMENT3_*` (same parameters with prefix ANNOUNCEMENT3_) +- Slot 4: `ANNOUNCEMENT4_*` (same parameters with prefix ANNOUNCEMENT4_) + +Each slot supports: +- `*_ENABLED`: True/False to enable/disable +- `*_FILE`: Name of the .ambe file (without extension, located in Audio//ondemand/) +- `*_TG`: Talkgroup number where the announcement is broadcast +- `*_TIMESLOT`: Timeslot 1 or 2 (default: 2) +- `*_MODE`: `interval` (every X seconds) or `hourly` (at the top of each hour) +- `*_INTERVAL`: Interval in seconds (only used when mode is `interval`) +- `*_LANGUAGE`: Language folder for the AMBE file (e.g., es_ES, en_GB) + +**Behavior**: +- Each slot runs independently with its own LoopingCall timer +- In `hourly` mode: checks every 30 seconds, plays only when minute == 0 +- In `interval` mode: plays at the configured interval +- Broadcasts to ALL MASTER systems simultaneously (like bridge routing) +- Uses adaptive 60ms frame timing for clean audio +- Only plays on MASTER systems (not OPENBRIDGE), excludes ECHO/D-APRS +- Skips systems that are busy (RX or TX active) +- Audio source ID: 5000, uses SERVER_ID as peer ID +- Log labels: LOCUCION (slot 1), LOCUCION-2, LOCUCION-3, LOCUCION-4 + +### Voice Recording System (Grabaciones Locuciones) + +**Problem**: Need to record voice announcements directly from radio traffic for later playback as scheduled announcements +**Solution**: AMBE voice recorder that captures traffic on a configured TG/TS + +**Configuration in adn.cfg [GLOBAL] section**: +- `RECORDING_ENABLED`: True/False to enable/disable recording +- `RECORDING_TG`: Talkgroup to monitor for recording +- `RECORDING_TIMESLOT`: Timeslot to monitor (1 or 2) +- `RECORDING_FILE`: Output filename (without .ambe extension) +- `RECORDING_LANGUAGE`: Language folder (determines save path: Audio//ondemand/.ambe) + +**Behavior**: +- Records any voice transmission on the configured TG/TS +- Extracts raw AMBE bursts (108-bit pairs) from DMRD voice frames +- Maximum recording duration: 2 minutes 45 seconds (2750 frames) +- Automatically saves when transmission ends (voice terminator) or max duration reached +- Saved file is directly compatible with the announcement playback system +- Recording runs in the reactor thread (no blocking) +- Only processes validated frames (after duplicate/rate/loop checks) +- Log label: GRABACION + +**Integration with Announcements**: +- Record with `RECORDING_FILE: mi_locucion` and `RECORDING_LANGUAGE: es_ES` +- Playback with `ANNOUNCEMENT_FILE: mi_locucion` and `ANNOUNCEMENT_LANGUAGE: es_ES` + ### Individual Password Authentication **Problem**: Need individual password authentication per Radio ID (indicativo) for enhanced security @@ -206,4 +263,4 @@ curl -L "http://URL_SECURITY:PORT_SECURITY/descargar?pass=PASS_SECURITY&user_pas ### Language/Voice Assets - Pre-recorded AMBE voice files in Audio/ directory - Multiple language support (en_GB, es_ES, fr_FR, de_DE, dk_DK, it_IT, no_NO, pl_PL, se_SE, pt_PT, cy_GB, el_GR, th_TH, CW) -- Voice file indexing via i8n_voice_map.py \ No newline at end of file +- Voice file indexing via i8n_voice_map.py