Installazione sonora interattiva — Casa di Quartiere, Tuturano (Puglia, IT)
Un archivio sonoro partecipativo di detti dialettali raccolti via Telegram e riprodotti nello spazio fisico. I visitatori inviano un vocale al bot, che lo normalizza e lo aggiunge all'archivio. Un sensore PIR rileva la presenza e riproduce un detto casuale ogni volta che qualcuno si avvicina all'installazione.
🤖 Bot Telegram: @tuturaudiobot
Visitatore → Telegram Bot → Archivio WAV → PIR rileva presenza → Riproduzione
- L'utente invia un vocale al bot Telegram
- Il bot normalizza l'audio e lo salva nell'archivio
- Il sensore PIR rileva un visitatore davanti all'installazione
- Viene riprodotto un detto casuale (senza ripetizioni fino all'esaurimento del ciclo)
- Cooldown di 5 secondi dalla fine della riproduzione
- Raspberry Pi 5
- Waveshare WM8960 Audio HAT
- Sensore PIR HC-SR501 → GPIO 16
- Speaker amplificato
| PIN HAT | GPIO (BCM) | Board | Funzione |
|---|---|---|---|
| SDA | GPIO 2 | 3 | I2C Data |
| SCL | GPIO 3 | 5 | I2C Clock |
| CLK | GPIO 18 | 12 | I2S Bit clock |
| LRCLK | GPIO 19 | 35 | I2S Frame clock |
| DAC | GPIO 21 | 40 | I2S Data out |
| ADC | GPIO 20 | 38 | I2S Data in |
| BUTTON | GPIO 17 | 11 | Pulsante |
- VCC → Pin 2 (5V)
- GND → Pin 6 (GND)
- OUT → GPIO 16 (Pin 36)
- Raspberry Pi OS Trixie (64-bit, headless)
- Connessione internet al primo avvio
- Account Raspberry Pi (per Rpi Connect)
- Bot Telegram creato via @BotFather
scp setup_archivio_detti.sh xyz@<IP_PI>:~/
ssh xyz@<IP_PI>
bash setup_archivio_detti.shLo script:
- Installa il driver WM8960 (richiede riavvio alla prima esecuzione)
- Crea il virtualenv con tutte le dipendenze
- Chiede il token Telegram e lo salva
- Configura il volume ALSA in modo permanente
- Scrive
archivio_detti.py - Crea e abilita il servizio systemd
Nota: se lo script chiede di riavviare, esegui
sudo reboote poi rieseguibash setup_archivio_detti.sh.
archivio-detti/
├── archivio_detti.py # Script principale
├── setup_archivio_detti.sh # Setup automatico
├── README.md
└── archive/ # Generata automaticamente
├── meta.json # Metadati utenti e timestamp
└── detto_*.wav
token.txtearchive/sono esclusi dal repository (.gitignore)
Tutti i parametri sono in cima ad archivio_detti.py:
| Parametro | Default | Descrizione |
|---|---|---|
PIR_PIN |
16 | GPIO del sensore PIR |
ALSA_OUT |
hw:CARD=wm8960soundcard,DEV=0 | Device audio ALSA |
COOLDOWN |
5s | Pausa dopo fine riproduzione |
DISK_LIMIT |
90% | Soglia pulizia automatica disco |
MAX_DURATION |
15s | Durata max prima della pulizia |
FFMPEG_AF |
loudnorm + volume=10dB | Catena di elaborazione audio |
| Comando | Funzione |
|---|---|
/start |
Messaggio di benvenuto e istruzioni |
/archivio |
Numero di detti nell'archivio |
/cancella |
Rimuove il proprio ultimo detto |
/help |
Lista comandi |
- L'utente scrive
/start→ riceve istruzioni - L'utente invia un vocale → viene normalizzato, convertito in stereo WAV e aggiunto all'archivio
- Il bot risponde con il numero progressivo e l'invito a visitare l'installazione
- Con
/cancellal'utente può rimuovere il proprio ultimo contributo
scp /path/to/file.wav xyz@<IP_PI>:~/archivio_detti/archive/Per rinormalizzare i file già presenti:
for f in ~/archivio_detti/archive/*.wav; do
ffmpeg -y -i "$f" -ar 44100 -ac 2 \
-af "loudnorm=I=-16:TP=-1.5:LRA=11,volume=10dB" \
"/tmp/$(basename $f)" && mv "/tmp/$(basename $f)" "$f"
done# Stato
sudo systemctl status archivio_detti
# Log in tempo reale
sudo journalctl -u archivio_detti -f
# Riavvia
sudo systemctl restart archivio_detti
# Ferma
sudo systemctl stop archivio_dettiIl sistema usa Raspberry Pi Connect per accesso remoto senza IP fisso.
rpi-connect signinApri il link nel browser e associa il dispositivo al tuo account.
Vai su connect.raspberrypi.com, seleziona il dispositivo "audio" e clicca Connect.
Il volume viene salvato in modo permanente con alsactl store. Per modificarlo:
# Interattivo
alsamixer -c 0
# Da terminale
amixer -c 0 set 'Speaker' 127
# Salva
sudo alsactl storeQuando il disco supera il 90% di utilizzo, il sistema rimuove automaticamente:
- Prima: i file più lunghi di 15 secondi
- Poi: i file più vecchi, in ordine cronologico
La pulizia continua finché lo spazio non scende sotto la soglia.
Il PIR non risponde
python3 test_pir.pySe dà GPIO busy, cambia pin in archivio_detti.py e sposta il cavo. Pin consigliati: 16, 23, 26.
Nessun audio
aplay -l # verifica card number
aplay -D hw:CARD=wm8960soundcard,DEV=0 archive/*.wav # test direttoConflict bot Telegram
# Assicurati che un solo Pi usi lo stesso token
sudo systemctl stop archivio_detti # sull'altro PiWM8960 non rilevato
cd ~/WM8960-Audio-HAT && sudo ./install.sh && sudo rebootpython-telegram-bot
numpy
soundfile
librosa
scipy
lgpio
gpiozero
MIT
Progetto sviluppato per la Casa di Quartiere di Tuturano, Puglia.
