Added option in Spectrogram view to activate a frequency shift in the audio livestream

This commit is contained in:
Louis Croisez
2023-05-16 10:46:43 +02:00
parent 21e10dd0bd
commit 04dae073f6
4 changed files with 87 additions and 3 deletions
+18 -1
View File
@@ -95,6 +95,23 @@ if(isset($_GET['submit'])) {
} }
} }
if (isset($_GET["activate_freqshift_in_livestream"])) {
$activate_freqshift_in_livestream = trim($_GET["activate_freqshift_in_livestream"]);
//Setting exists already, see if the value changed
if (strcmp($activate_freqshift_in_livestream, $config['ACTIVATE_FREQSHIFT_IN_LIVESTREAM']) !== 0) {
$contents = preg_replace("/ACTIVATE_FREQSHIFT_IN_LIVESTREAM=.*/", "ACTIVATE_FREQSHIFT_IN_LIVESTREAM=\"$activate_freqshift_in_livestream\"", $contents);
$contents2 = preg_replace("/ACTIVATE_FREQSHIFT_IN_LIVESTREAM=.*/", "ACTIVATE_FREQSHIFT_IN_LIVESTREAM=\"$activate_freqshift_in_livestream\"", $contents2);
$fh = fopen("/etc/birdnet/birdnet.conf", "w");
$fh2 = fopen("./scripts/thisrun.txt", "w");
fwrite($fh, $contents);
fwrite($fh2, $contents2);
sleep(1);
exec("sudo systemctl restart livestream.service");
}
}
if(isset($_GET["overlap"])) { if(isset($_GET["overlap"])) {
$overlap = $_GET["overlap"]; $overlap = $_GET["overlap"];
if(strcmp($overlap,$config['OVERLAP']) !== 0) { if(strcmp($overlap,$config['OVERLAP']) !== 0) {
@@ -569,7 +586,7 @@ foreach($formats as $format){
<h2>Accessibility Settings</h2> <h2>Accessibility Settings</h2>
<p>Birdsongs Frequency shifting configuration:<br> <p>Birdsongs Frequency shifting configuration:<br>
This can be useful for hearing impaired people. Note: audio files will only be pitch shifted when the "FREQ SHIFT" button is manually clicked for a detection on the "Recordings" page.<br> This can be useful for hearing impaired people. <br>Note: audio files will only be pitch shifted when the "FREQ SHIFT" button is manually clicked for a detection on the "Recordings" page. <br>The frequency shifting can also be activated for the realtime audio livestream, accessible in the SPECTROGRAM tab of BirdNET-Pi. Once it has been activated, it will be made available for the Live Audio feature as well.<br>Livestream is using ffmpeg for streaming its audio data, so the pitch shifter in that case will use this tool too. If you choose sox as the tool for freq shifting recorded audio files, then you must configure both sox and ffmpeg parameters: sox for recordings, and ffmpeg for livestream.<br>
<p style="margin-left: 40px"> <p style="margin-left: 40px">
+6
View File
@@ -12,6 +12,10 @@ if [ "$LOGGING_LEVEL" == "info" ] || [ "$LOGGING_LEVEL" == "debug" ];then
set -x set -x
fi fi
if [ "$ACTIVATE_FREQSHIFT_IN_LIVESTREAM" == "true" ]; then
FREQSHIFT_OPT='-af rubberband=pitch='${FREQSHIFT_LO}'/'${FREQSHIFT_HI}
fi
if [ -z ${REC_CARD} ];then if [ -z ${REC_CARD} ];then
echo "Stream not supported" echo "Stream not supported"
elif [[ ! -z ${RTSP_STREAM} ]];then elif [[ ! -z ${RTSP_STREAM} ]];then
@@ -34,9 +38,11 @@ elif [[ ! -z ${RTSP_STREAM} ]];then
ffmpeg -nostdin -loglevel $LOGGING_LEVEL -ac ${CHANNELS} -i ${SELECTED_RSTP_STREAM} -acodec libmp3lame \ ffmpeg -nostdin -loglevel $LOGGING_LEVEL -ac ${CHANNELS} -i ${SELECTED_RSTP_STREAM} -acodec libmp3lame \
-b:a 320k -ac ${CHANNELS} -content_type 'audio/mpeg' \ -b:a 320k -ac ${CHANNELS} -content_type 'audio/mpeg' \
${FREQSHIFT_OPT} \
-f mp3 icecast://source:${ICE_PWD}@localhost:8000/stream -re -f mp3 icecast://source:${ICE_PWD}@localhost:8000/stream -re
else else
ffmpeg -nostdin -loglevel $LOGGING_LEVEL -ac ${CHANNELS} -f alsa -i ${REC_CARD} -acodec libmp3lame \ ffmpeg -nostdin -loglevel $LOGGING_LEVEL -ac ${CHANNELS} -f alsa -i ${REC_CARD} -acodec libmp3lame \
-b:a 320k -ac ${CHANNELS} -content_type 'audio/mpeg' \ -b:a 320k -ac ${CHANNELS} -content_type 'audio/mpeg' \
${FREQSHIFT_OPT} \
-f mp3 icecast://source:${ICE_PWD}@localhost:8000/stream -re -f mp3 icecast://source:${ICE_PWD}@localhost:8000/stream -re
fi fi
+59 -1
View File
@@ -316,6 +316,46 @@ function toggleCompression(state) {
} }
} }
function toggleFreqshift(state) {
if (state == true) {
console.log("freqshift activated")
} else {
console.log("freqshift deactivated")
}
var livestream_freqshift_spinner = document.getElementById('livestream_freqshift_spinner');
livestream_freqshift_spinner.style.display = "inline";
// Create the XMLHttpRequest object.
const xhr = new XMLHttpRequest();
// Initialize the request
xhr.open("GET", './views.php?activate_freqshift_in_livestream=' + state + '&view=Advanced&submit=advanced');
// Send the request
xhr.send();
// Fired once the request completes successfully
xhr.onload = function (e) {
// Check if the request was a success
if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
// Restart the audio player in case it stopped working while the livestream service was restarted
var audio_player = document.querySelector('audio#player');
if (audio_player !== 'undefined') {
//central_controls_element.appendChild(h1_loading);
//Wait 2 seconds before restarting the stream
setTimeout(function () {
console.log("Restarting connection with livestream");
audio_player.pause();
audio_player.setAttribute('src', '/stream');
audio_player.load();
audio_player.play();
livestream_freqshift_spinner.style.display = "none";
},
2000
)
}
}
}
}
function initialize() { function initialize() {
document.body.querySelector('h1').remove(); document.body.querySelector('h1').remove();
const CVS = document.body.querySelector('canvas'); const CVS = document.body.querySelector('canvas');
@@ -354,6 +394,7 @@ function initialize() {
gainNode.connect(ACTX.destination); gainNode.connect(ACTX.destination);
document.getElementById("compression").removeAttribute("disabled"); document.getElementById("compression").removeAttribute("disabled");
document.getElementById("freqshift").removeAttribute("disabled");
console.log(SOURCE); console.log(SOURCE);
const DATA = new Uint8Array(ANALYSER.frequencyBinCount); const DATA = new Uint8Array(ANALYSER.frequencyBinCount);
@@ -470,9 +511,21 @@ h1 {
</div> </div>
&mdash; &mdash;
<div style="display:inline" id="comp" > <div style="display:inline" id="comp" >
<label>Compression: </label> <label>Compression: </label>
<input name="compression" type="checkbox" id="compression" disabled> <input name="compression" type="checkbox" id="compression" disabled>
</div> </div>
<div style="display:inline" id="fshift" >
<label>Freq shift: </label>
<?php
if ($config['ACTIVATE_FREQSHIFT_IN_LIVESTREAM'] == "true") {
$freqshift_state = "checked";
} else {
$freqshift_state = "";
}
?>
<input name="freqshift" type="checkbox" id="freqshift" <?php echo($freqshift_state); ?> disabled>
<img id="livestream_freqshift_spinner" src=images/spinner.gif style="height: 25px; vertical-align: top; display: none">
</div>
</div> </div>
<audio style="display:none" controls="" crossorigin="anonymous" id='player' preload="none"><source id="playersrc" src="/stream"></audio> <audio style="display:none" controls="" crossorigin="anonymous" id='player' preload="none"><source id="playersrc" src="/stream"></audio>
@@ -542,4 +595,9 @@ var compression = document.getElementById("compression");
compression.onclick = function() { compression.onclick = function() {
toggleCompression(this.checked); toggleCompression(this.checked);
} }
var freqshift = document.getElementById("freqshift");
freqshift.onclick = function() {
toggleFreqshift(this.checked);
}
</script> </script>
+3
View File
@@ -148,6 +148,9 @@ fi
if ! grep FREQSHIFT_PITCH /etc/birdnet/birdnet.conf &>/dev/null;then if ! grep FREQSHIFT_PITCH /etc/birdnet/birdnet.conf &>/dev/null;then
sudo -u$USER echo "FREQSHIFT_PITCH=-1500" >> /etc/birdnet/birdnet.conf sudo -u$USER echo "FREQSHIFT_PITCH=-1500" >> /etc/birdnet/birdnet.conf
fi fi
if ! grep FREQSHIFT_PITCH /etc/birdnet/birdnet.conf &>/dev/null;then
sudo -u$USER echo "ACTIVATE_FREQSHIFT_IN_LIVESTREAM=\"false\"" >> /etc/birdnet/birdnet.conf
fi
if ! grep HEARTBEAT_URL /etc/birdnet/birdnet.conf &>/dev/null;then if ! grep HEARTBEAT_URL /etc/birdnet/birdnet.conf &>/dev/null;then
sudo -u$USER echo "HEARTBEAT_URL=" >> /etc/birdnet/birdnet.conf sudo -u$USER echo "HEARTBEAT_URL=" >> /etc/birdnet/birdnet.conf
fi fi