diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index ded38bf..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(python -m py_compile:*)", - "Bash(git add:*)" - ], - "deny": [], - "ask": [] - } -} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5d21ac8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +venv/ +env/ +ENV/ +.venv + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ +.DS_Store + +# Claude Code +.claude/ + +# Data directories (runtime data) +rotary_phone_data/ +recordings/ +sounds/ + +# Configuration +config.json +*.backup + +# Logs +*.log + +# OS +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c8e91d --- /dev/null +++ b/README.md @@ -0,0 +1,304 @@ +# Wedding Phone - Vintage Rotary Phone Audio System + +A Raspberry Pi-based rotary phone system for weddings and events. Guests can pick up the handset to hear custom greeting messages and leave voice recordings. Features a modern web interface for managing messages and recordings. + +## Features + +- **Vintage Phone Integration**: Uses a real rotary phone with GPIO hook detection +- **Custom Greeting Messages**: Upload multiple greeting messages and select which one plays +- **Voice Recording**: Automatically records guest messages after the greeting +- **Web Interface**: Beautiful, responsive web UI for managing the system +- **Audio Playback**: Play recordings and greetings directly in the browser +- **Multiple Message Support**: Upload and manage multiple greeting messages +- **Active Message Selector**: Choose which greeting plays when the phone is picked up +- **HiFiBerry Support**: Optimized for HiFiBerry DAC+ADC Pro audio quality +- **Real-time Status**: Monitor phone status (on-hook/off-hook/recording) +- **Auto-refresh**: Status updates every 5 seconds + +## Hardware Requirements + +- Raspberry Pi (3/4/5 or Zero 2 W) +- HiFiBerry DAC+ADC Pro (or similar audio interface) +- Vintage rotary phone with hookswitch +- Speaker (connected to HiFiBerry output) +- Microphone (connected to HiFiBerry input, or use phone handset mic) + +## Software Requirements + +- Raspberry Pi OS (Bullseye or newer) +- Python 3.7+ +- Required Python packages: + - pyaudio + - flask + - numpy + - RPi.GPIO + - wave (built-in) + +## Installation + +### 1. Clone the Repository + +```bash +git clone https://git.b4l.co.th/grabowski/wedding-phone.git +cd wedding-phone +``` + +### 2. Install Dependencies + +```bash +sudo apt-get update +sudo apt-get install -y python3-pip python3-pyaudio portaudio19-dev +pip3 install flask numpy RPi.GPIO +``` + +### 3. Configure HiFiBerry + +Run the automatic configuration script: + +```bash +chmod +x configure_hifiberry.sh +./configure_hifiberry.sh +``` + +Or follow the manual instructions in `AUDIO_FIX.md`. + +### 4. Test Your Audio + +```bash +python3 test_complete.py +``` + +This will test: +- Speaker playback +- Dial tone generation +- Microphone recording + +### 5. Configure GPIO Pin + +Edit `rotary_phone_web.py` and set your hookswitch GPIO pin: + +```python +HOOK_PIN = 17 # Change to your GPIO pin number +HOOK_PRESSED = GPIO.LOW # Or GPIO.HIGH depending on your switch +``` + +### 6. Run the System + +```bash +python3 rotary_phone_web.py +``` + +The web interface will be available at: +- `http://localhost:8080` +- `http://:8080` + +## Usage + +### Web Interface + +The web interface provides three main sections: + +#### 1. Phone Status +- Shows current phone state (on-hook/off-hook/recording) +- Displays active recording filename +- Auto-refreshes every 5 seconds + +#### 2. Greeting Messages +- **Upload**: Click "Choose WAV File(s)" to upload one or multiple greeting messages +- **Play**: Click "▶️ Play" to preview any greeting in your browser +- **Set Active**: Click "⭐ Set Active" to select which greeting plays when the phone is picked up +- **Delete**: Remove unwanted greetings (cannot delete the active one) +- **Default Tone**: Generate a classic telephone dial tone + +#### 3. Recordings +- **Play**: Listen to recordings directly in the browser +- **Download**: Save recordings to your computer +- **Delete**: Remove unwanted recordings +- **Statistics**: View total recordings, storage used, and total duration + +### Phone Operation + +1. **Guest picks up phone**: System detects via GPIO +2. **Greeting plays**: Active greeting message plays through speaker +3. **Recording starts**: After greeting, system records guest message +4. **Guest hangs up**: Recording stops and saves automatically +5. **Ready for next call**: System returns to waiting state + +## File Structure + +``` +wedding-phone/ +├── rotary_phone_web.py # Main application +├── test_complete.py # Audio testing script +├── configure_hifiberry.sh # HiFiBerry setup script +├── AUDIO_FIX.md # Audio configuration guide +├── README.md # This file +├── .gitignore # Git ignore rules +└── templates/ # Auto-generated on first run + └── index.html # Web interface (embedded in script) +``` + +### Runtime Data (Auto-created) + +``` +/home/berwn/rotary_phone_data/ +├── recordings/ # Voice recordings from guests +├── sounds/ # Greeting message WAV files +└── config.json # Active greeting configuration +``` + +## Configuration + +### Audio Settings + +Edit these constants in `rotary_phone_web.py`: + +```python +CHUNK = 1024 # Audio buffer size +FORMAT = pyaudio.paInt16 # 16-bit audio +CHANNELS = 1 # Mono +RATE = 44100 # 44.1kHz sample rate +RECORD_SECONDS = 300 # Max recording time (5 minutes) +``` + +### HiFiBerry Device Index + +If your HiFiBerry is at a different device index: + +```python +# Line ~103 and ~138 in rotary_phone_web.py +output_device_index=1, # Change this number +input_device_index=1, # Change this number +``` + +Find your device index: + +```bash +python3 -c "import pyaudio; p=pyaudio.PyAudio(); [print(f'{i}: {p.get_device_info_by_index(i)[\"name\"]}') for i in range(p.get_device_count())]" +``` + +### Web Server Port + +```python +WEB_PORT = 8080 # Change to your preferred port +``` + +## Troubleshooting + +### No Sound from Speaker + +1. Check HiFiBerry configuration: + ```bash + aplay -l # List audio devices + amixer -c 3 sset Digital 100% # Set volume (adjust card number) + ``` + +2. Test speaker directly: + ```bash + speaker-test -D plughw:3,0 -c 1 -t wav + ``` + +3. Run the complete test: + ```bash + python3 test_complete.py + ``` + +### Microphone Not Recording + +1. Check microphone is connected to HiFiBerry input +2. Adjust input gain: + ```bash + alsamixer -c 3 + ``` +3. Test recording: + ```bash + arecord -D plughw:3,0 -f cd test.wav -d 5 + aplay test.wav + ``` + +### GPIO Not Detecting Hookswitch + +1. Verify GPIO pin number +2. Check if switch is normally open or closed +3. Test with a simple script: + ```python + import RPi.GPIO as GPIO + GPIO.setmode(GPIO.BCM) + GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP) + print(GPIO.input(17)) # Should change when switch toggles + ``` + +### Web Interface Not Accessible + +1. Check if Flask is running: `ps aux | grep python` +2. Verify firewall: `sudo ufw allow 8080` +3. Check IP address: `hostname -I` +4. Try localhost: `http://127.0.0.1:8080` + +## Auto-start on Boot + +Create a systemd service: + +```bash +sudo nano /etc/systemd/system/wedding-phone.service +``` + +Add: + +```ini +[Unit] +Description=Wedding Phone Service +After=network.target sound.target + +[Service] +Type=simple +User=berwn +WorkingDirectory=/home/berwn/wedding-phone +ExecStart=/usr/bin/python3 /home/berwn/wedding-phone/rotary_phone_web.py +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +``` + +Enable and start: + +```bash +sudo systemctl daemon-reload +sudo systemctl enable wedding-phone.service +sudo systemctl start wedding-phone.service +sudo systemctl status wedding-phone.service +``` + +## API Endpoints + +The system provides REST API endpoints: + +- `GET /` - Web interface +- `GET /api/status` - Phone status JSON +- `GET /api/recordings` - List all recordings +- `GET /api/greetings` - List all greeting messages +- `POST /upload_greeting` - Upload new greeting +- `POST /set_active_greeting` - Set active greeting +- `POST /delete_greeting/` - Delete greeting +- `GET /play_audio//` - Stream audio file +- `GET /download/` - Download recording +- `POST /delete/` - Delete recording +- `POST /restore_default_sound` - Generate default dial tone + +## Contributing + +Feel free to open issues or submit pull requests for improvements. + +## License + +This project is open source and available for personal and commercial use. + +## Credits + +Created for wedding events to capture guest messages in a unique, nostalgic way. + +## Support + +For issues or questions, please open an issue on the repository. diff --git a/__pycache__/rotary_phone_web.cpython-311.pyc b/__pycache__/rotary_phone_web.cpython-311.pyc deleted file mode 100644 index 6f9c1dc..0000000 Binary files a/__pycache__/rotary_phone_web.cpython-311.pyc and /dev/null differ