RPi microphone system - real-time audio streaming, beamforming, recording

Paweł Chodaczek b2694d72aa Fix STT: non-blocking audio feed via queue + sender thread 1 miesiąc temu
deploy d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
scripts d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
static 978a800506 Add live STT integration with stt.mm.mk 1 miesiąc temu
templates 978a800506 Add live STT integration with stt.mm.mk 1 miesiąc temu
.gitignore d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
CLAUDE.md 59b2c46bb4 Add CLAUDE.md with project documentation 1 miesiąc temu
README.md d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
agc.py d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
app.js d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
app.py 978a800506 Add live STT integration with stt.mm.mk 1 miesiąc temu
audio_capture.py 978a800506 Add live STT integration with stt.mm.mk 1 miesiąc temu
beamforming.py d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
index.html d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
recorder.py d48b1895c6 Initial commit: mic_system - RPi audio streaming, beamforming, recording 1 miesiąc temu
requirements.txt 978a800506 Add live STT integration with stt.mm.mk 1 miesiąc temu
stt_bridge.py b2694d72aa Fix STT: non-blocking audio feed via queue + sender thread 1 miesiąc temu

README.md

Mic System (RPi Zero 2W + INMP441)

Aplikacja webowa do monitoringu i nagrywania audio mono z 2 mikrofonow I2S (INMP441):

  • waveform w czasie rzeczywistym,
  • tryby mono (mic1, mic2, mono mix) i beamforming (mono),
  • AGC + gain,
  • zapis WAV,
  • lista nagran z odtwarzaniem/pobieraniem/usuwaniem.
  • tryb porownawczy nagrania: jednym kliknieciem zapisuje mic1, mono_mix, beam jako 3 osobne pliki.
  • opcjonalny czas nagrania w sekundach (auto-stop), np. 10 s.
  • podsluch live w przegladarce z wyborem zrodla (mic1, mic2, mono_mix, beam).

Struktura

  • app.py - serwer Flask + Socket.IO + REST
  • audio_capture.py - odczyt I2S, downsample, RMS, routing do nagrywania
  • beamforming.py - delay-and-sum
  • agc.py - AGC stateful
  • recorder.py - zapis WAV w osobnym watku
  • templates/index.html - UI
  • static/app.js - logika frontu
  • static/style.css - styl UI
  • recordings/ - pliki WAV
  • deploy/mic_system.service - autostart przez systemd
  • scripts/setup_rpi.sh - konfiguracja RPi (I2S/ALSA/deps/service)
  • scripts/deploy_from_windows.ps1 - deployment przez SSH z Windows

Start lokalny

cd mic_system
python -m venv .venv
source .venv/bin/activate  # Linux
pip install -r requirements.txt
python app.py

Deployment na RPi

Z Windows (PowerShell):

cd "C:\Users\jeste\OneDrive\BB_projekty_zaruskiego\Projekty 3d\mikrofon_jak_z_telefonu"
.\mic_system\scripts\deploy_from_windows.ps1 -Host 10.0.100.24 -User pch

Skrypt:

  1. tworzy klucz ed25519 jesli brak,
  2. dodaje klucz do ~/.ssh/authorized_keys na RPi,
  3. kopiuje projekt do /home/pch/mic_system,
  4. odpala setup I2S/ALSA/deps/systemd.

Po pierwszym deployu wykonaj reboot RPi:

sudo reboot

Po starcie systemd:

systemctl status mic_system.service

Aplikacja bedzie dostepna na porcie 5000:

http://10.0.100.24:5000

Uwagi techniczne

  • INMP441: 24-bit MSB w ramce 32-bit, konwersja jest robiona jako >> 8.
  • Dla beamformingu przyjeto odstep mikrofonow sasiednich ~0.0424 m (4 sloty na okregu, srednica 6 cm, kat 90 stopni).
  • Karta voiceHAT pracuje sprzetowo na 48000 Hz; aplikacja resampluje dane do 16000/22050/44100.
  • Beamforming ma tryb auto (domyslnie ON): kierunek jest estymowany z pasma mowy (~300-3400 Hz).
  • Pierwsze 300 ms po starcie streamu jest ignorowane.
  • WebSocket wysyla probki downsample do UI, a nagrywanie dostaje pelne dane.
  • Beamforming i AGC dzialaja w czasie rzeczywistym na chunkach.