# ============================================================== # Modifierat avsnitt med skapande av ljudfil med artnamn och skrivning av logg # ============================================================== import os from datetime import datetime, timedelta import subprocess # Ordbok för att hålla reda på senaste uppläsningen för varje art last_spoken = {} def extract_detection(file: ParseFileName, detection: Detection): conf = get_settings() # Skapa ett nytt filnamn baserat på detektionsdata new_file_name = f'{detection.common_name_safe}-{detection.confidence_pct}-{file.root}.{conf["AUDIOFMT"]}' # Skapa en katalogstruktur för extraherade ljudfiler new_dir = os.path.join(conf['EXTRACTED'], 'By_Date', f'{file.date}', f'{detection.common_name_safe}') new_file = os.path.join(new_dir, new_file_name) # Kolla om filen redan existerar if os.path.isfile(new_file): log.warning('Extraction exists. Moving on: %s', new_file) else: os.makedirs(new_dir, exist_ok=True) extract_safe(file.file_name, new_file, detection.start, detection.stop) spectrogram(new_file, detection.common_name, new_file.replace(os.path.expanduser('~/'), '')) # Hämta nuvarande tid now = datetime.now() # Kontrollera om arten har lästs upp inom de senaste 10 sekunderna if detection.common_name_safe in last_spoken: time_since_last_spoken = now - last_spoken[detection.common_name_safe] if time_since_last_spoken < timedelta(seconds=10): log.info(f"Skipping {detection.common_name_safe}, last spoken {time_since_last_spoken.seconds} seconds ago") return new_file # Om inte, fortsätt och skapa en TTS-ljudfil med Piper command = f"""echo '{detection.common_name_safe}' | /home/dittid/.local/bin/piper --model /home/dittid/BirdNET-Pi/TTS/sv_SE-nst-medium.onnx --output_file /home/dittid/BirdNET-Pi/TTS/artnamn.wav""" # Kör kommandot med subprocess result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) # Kontrollera om kommandot gick bra if result.returncode != 0: log.error(f"Error creating TTS: {result.stderr}") else: log.info(f"TTS audio created: {result.stdout}") # Skapa sökväg till ljudfilen audio_file = "/home/dittid/BirdNET-Pi/TTS/artnamn.wav" # Spela ljudfilen med aplay subprocess.run(["aplay", audio_file]) # Uppdatera senaste tidpunkten för uppläsningen last_spoken[detection.common_name_safe] = now # Skriv detekterad art till loggfil write_detection_to_log(detection) return new_file def write_detection_to_log(detection: Detection): # Hämta datum och tid för loggposten now = datetime.now() date_str = now.strftime("%Y-%m-%d") time_str = now.strftime("%H:%M:%S") # Formatera loggposten enligt: "ÅÅÅÅ-MM-DD HH:MM:SS artnamn" log_entry = f"{date_str} {time_str} {detection.common_name_safe}\n" # Definiera sökvägen till loggfilen (daglig fil namngiven efter aktuellt datum) log_dir = os.path.join("/home/dittid/BirdNET-Pi/TTS/loggar") os.makedirs(log_dir, exist_ok=True) log_file_path = os.path.join(log_dir, f"{date_str}.txt") # Lägg till loggposten i den dagliga loggfilen with open(log_file_path, 'a') as log_file: log_file.write(log_entry) # ==============================================================