/dev/null 2>&1 &'); } } if(isset($_GET["ice_pwd"])) { $ice_pwd = $_GET["ice_pwd"]; if(strcmp($ice_pwd,$config['ICE_PWD']) !== 0) { $contents = preg_replace("/ICE_PWD=.*/", "ICE_PWD=$ice_pwd", $contents); $contents2 = preg_replace("/ICE_PWD=.*/", "ICE_PWD=$ice_pwd", $contents2); } } if(isset($_GET["birdnetpi_url"])) { $birdnetpi_url = $_GET["birdnetpi_url"]; if(strcmp($birdnetpi_url,$config['BIRDNETPI_URL']) !== 0) { $contents = preg_replace("/BIRDNETPI_URL=.*/", "BIRDNETPI_URL=$birdnetpi_url", $contents); $contents2 = preg_replace("/BIRDNETPI_URL=.*/", "BIRDNETPI_URL=$birdnetpi_url", $contents2); $fh = fopen('/etc/birdnet/birdnet.conf', "w"); $fh2 = fopen("./scripts/thisrun.txt", "w"); fwrite($fh, $contents); fwrite($fh2, $contents2); exec('sudo /usr/local/bin/update_caddyfile.sh > /dev/null 2>&1 &'); } } if(isset($_GET["rtsp_stream"])) { $rtsp_stream = str_replace("\r\n", ",", $_GET["rtsp_stream"]); if(strcmp($rtsp_stream,$config['RTSP_STREAM']) !== 0) { $contents = preg_replace("/RTSP_STREAM=.*/", "RTSP_STREAM=$rtsp_stream", $contents); $contents2 = preg_replace("/RTSP_STREAM=.*/", "RTSP_STREAM=$rtsp_stream", $contents2); $fh = fopen('/etc/birdnet/birdnet.conf', "w"); $fh2 = fopen("./scripts/thisrun.txt", "w"); fwrite($fh, $contents); fwrite($fh2, $contents2); exec('sudo systemctl restart birdnet_recording.service'); } } if(isset($_GET["overlap"])) { $overlap = $_GET["overlap"]; if(strcmp($overlap,$config['OVERLAP']) !== 0) { $contents = preg_replace("/OVERLAP=.*/", "OVERLAP=$overlap", $contents); $contents2 = preg_replace("/OVERLAP=.*/", "OVERLAP=$overlap", $contents2); } } if(isset($_GET["confidence"])) { $confidence = $_GET["confidence"]; if(strcmp($confidence,$config['CONFIDENCE']) !== 0) { $contents = preg_replace("/CONFIDENCE=.*/", "CONFIDENCE=$confidence", $contents); $contents2 = preg_replace("/CONFIDENCE=.*/", "CONFIDENCE=$confidence", $contents2); } } if(isset($_GET["sensitivity"])) { $sensitivity = $_GET["sensitivity"]; if(strcmp($sensitivity,$config['SENSITIVITY']) !== 0) { $contents = preg_replace("/SENSITIVITY=.*/", "SENSITIVITY=$sensitivity", $contents); $contents2 = preg_replace("/SENSITIVITY=.*/", "SENSITIVITY=$sensitivity", $contents2); } } if(isset($_GET["full_disk"])) { $full_disk = $_GET["full_disk"]; if(strcmp($full_disk,$config['FULL_DISK']) !== 0) { $contents = preg_replace("/FULL_DISK=.*/", "FULL_DISK=$full_disk", $contents); $contents2 = preg_replace("/FULL_DISK=.*/", "FULL_DISK=$full_disk", $contents2); } } if(isset($_GET["privacy_mode"])) { $privacy_mode = $_GET["privacy_mode"]; if(strcmp($config['PRIVACY_MODE'], "1") == 0 ) { $pmode = "on"; }elseif(strcmp($config['PRIVACY_MODE'], "") == 0) { $pmode = "off"; } if(strcmp($privacy_mode,$pmode) !== 0) { $contents = preg_replace("/PRIVACY_MODE=.*/", "PRIVACY_MODE=$privacy_mode", $contents); $contents2 = preg_replace("/PRIVACY_MODE=.*/", "PRIVACY_MODE=$privacy_mode", $contents2); if(strcmp($privacy_mode,"on") == 0) { exec('sudo sed -i \'s/\/usr\/local\/bin\/server.py/\/usr\/local\/bin\/privacy_server.py/g\' ../../BirdNET-Pi/templates/birdnet_server.service'); exec('sudo systemctl daemon-reload'); exec('restart_services.sh'); header('Location: /log'); } elseif(strcmp($privacy_mode,"off") == 0) { exec('sudo sed -i \'s/\/usr\/local\/bin\/privacy_server.py/\/usr\/local\/bin\/server.py/g\' ../../BirdNET-Pi/templates/birdnet_server.service'); exec('sudo systemctl daemon-reload'); exec('restart_services.sh'); header('Location: /log'); } } } if(isset($_GET["rec_card"])) { $rec_card = $_GET["rec_card"]; if(strcmp($rec_card,$config['REC_CARD']) !== 0) { $contents = preg_replace("/REC_CARD=.*/", "REC_CARD=$rec_card", $contents); $contents2 = preg_replace("/REC_CARD=.*/", "REC_CARD=$rec_card", $contents2); } } if(isset($_GET["channels"])) { $channels = $_GET["channels"]; if(strcmp($channels,$config['CHANNELS']) !== 0) { $contents = preg_replace("/CHANNELS=.*/", "CHANNELS=$channels", $contents); $contents2 = preg_replace("/CHANNELS=.*/", "CHANNELS=$channels", $contents2); } } if(isset($_GET["recording_length"])) { $recording_length = $_GET["recording_length"]; if(strcmp($recording_length,$config['RECORDING_LENGTH']) !== 0) { $contents = preg_replace("/RECORDING_LENGTH=.*/", "RECORDING_LENGTH=$recording_length", $contents); $contents2 = preg_replace("/RECORDING_LENGTH=.*/", "RECORDING_LENGTH=$recording_length", $contents2); } } if(isset($_GET["extraction_length"])) { $extraction_length = $_GET["extraction_length"]; if(strcmp($extraction_length,$config['EXTRACTION_LENGTH']) !== 0) { $contents = preg_replace("/EXTRACTION_LENGTH=.*/", "EXTRACTION_LENGTH=$extraction_length", $contents); $contents2 = preg_replace("/EXTRACTION_LENGTH=.*/", "EXTRACTION_LENGTH=$extraction_length", $contents2); } } if(isset($_GET["audiofmt"])) { $audiofmt = $_GET["audiofmt"]; if(strcmp($audiofmt,$config['AUDIOFMT']) !== 0) { $contents = preg_replace("/AUDIOFMT=.*/", "AUDIOFMT=$audiofmt", $contents); $contents2 = preg_replace("/AUDIOFMT=.*/", "AUDIOFMT=$audiofmt", $contents2); } } $fh = fopen('/etc/birdnet/birdnet.conf', "w"); $fh2 = fopen("./scripts/thisrun.txt", "w"); fwrite($fh, $contents); fwrite($fh2, $contents2); } ?>

Advanced Settings

Privacy mode can be set to 'on' or 'off' to configure analysis to be more sensitive to human detections. Privacy mode 'on' will purge any data that receives even a low Human confidence score. Please note that changing this setting restarts services and replaces the running server. It will take about 90, so please be patient!

When the disk becomes full, you can choose to 'purge' old files to make room for new ones or 'keep' your data and stop all services instead.


Set Audio Card to 'default' to use PulseAudio (always recommended), or an ALSA recognized sound card device from the output of `aplay -L`.


Set Channels to the number of channels supported by your sound card. 32 max.


If you place an RTSP stream URL here, BirdNET-Pi will use that as its audio source.


Set Recording Length in seconds between 6 and 60. Multiples of 3 are recommended, as BirdNET analyzes in 3-second chunks.


Set Extraction Length to something less than your Recording Length. Min=3 Max=Recording Length

BirdNET-Pi Password

This password will protect your "Tools" page and "Live Audio" stream.


Custom URL

Email Me if you would like a BirdNETPi.com subdomain. This would be, https://YourLocation.birdnetpi.com

When you update the URL below, the web server will reload, so be sure to wait at least 30 seconds and then go to your new URL.


The BirdNET-Pi URL is how the main page will be reached. If you want your installation to respond to an IP address, place that here, but be sure to indicate "http://".
Example for IP: http://192.168.0.109
Example if you own your own domain: https://virginia.birdnetpi.com

BirdNET-Lite Settings


Min=0.0, Max=2.9


Min=0.01, Max=0.99


Min=0.5, Max=1.5