From 8b96acebf9da78a33107321cdf4fb3d0c8dbc128 Mon Sep 17 00:00:00 2001 From: headroom Date: Mon, 13 Jan 2025 16:07:57 +0000 Subject: [PATCH] Add mp3_session_tagger.py --- mp3_session_tagger.py | 99 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 mp3_session_tagger.py diff --git a/mp3_session_tagger.py b/mp3_session_tagger.py new file mode 100644 index 0000000..07a7b6d --- /dev/null +++ b/mp3_session_tagger.py @@ -0,0 +1,99 @@ +import os +import requests +from pydub import AudioSegment +from pydub.silence import split_on_silence + +def dividir_audio(input_file, min_silence_len=1000, silence_thresh=-40, min_segment_len=5000): + """ + Divideix un fitxer d'àudio en fragments basats en silencis. + :param input_file: Ruta del fitxer d'àudio. + :param min_silence_len: Longitud mínima del silenci (en ms). + :param silence_thresh: Umbral de silenci (en dBFS). + :param min_segment_len: Longitud mínima d'un fragment (en ms). + :return: Llista de fragments d'àudio. + """ + audio = AudioSegment.from_file(input_file) + fragments = split_on_silence( + audio, + min_silence_len=min_silence_len, + silence_thresh=silence_thresh + ) + return [frag for frag in fragments if len(frag) >= min_segment_len] + +def identificar_audio(api_key, fragment, format="mp3"): + """ + Identifica la cançó d'un fragment d'àudio utilitzant l'API d'Audd.io. + :param api_key: Clau d'API d'Audd.io. + :param fragment: Fragment d'àudio (AudioSegment). + :param format: Format de l'àudio (per exemple, 'mp3'). + :return: Informació de la cançó o None si no s'identifica. + """ + try: + # Guardar el fragment temporalment + fragment.export("temp_audio.mp3", format=format) + with open("temp_audio.mp3", "rb") as file: + response = requests.post( + "https://api.audd.io/", + data={"api_token": api_key}, + files={"file": file} + ) + if response.status_code == 200: + result = response.json() + return result.get("result", None) + except Exception as e: + print(f"Error identificant l'àudio: {e}") + finally: + if os.path.exists("temp_audio.mp3"): + os.remove("temp_audio.mp3") + return None + +def processar_arxiu(api_key, input_file, output_file, min_silence_len=1000, silence_thresh=-40, min_segment_len=5000): + """ + Processa un arxiu d'àudio llarg i identifica les cançons dins d'ell. + :param api_key: Clau d'API d'Audd.io. + :param input_file: Ruta del fitxer d'àudio. + :param output_file: Ruta del fitxer de sortida per guardar el resum. + :param min_silence_len: Longitud mínima del silenci (en ms). + :param silence_thresh: Umbral de silenci (en dBFS). + :param min_segment_len: Longitud mínima d'un fragment (en ms). + """ + fragments = dividir_audio(input_file, min_silence_len, silence_thresh, min_segment_len) + print(f"S'han trobat {len(fragments)} fragments a {input_file}.") + + with open(output_file, "w", encoding="utf-8") as out: + out.write(f"Cançons identificades a {input_file}:\n\n") + for i, fragment in enumerate(fragments, start=1): + info = identificar_audio(api_key, fragment) + if info: + title = info.get("title", "Desconegut") + artist = info.get("artist", "Desconegut") + out.write(f"Fragment {i}: {title} - {artist}\n") + print(f"Fragment {i}: {title} - {artist}") + else: + out.write(f"Fragment {i}: No identificat\n") + print(f"Fragment {i}: No identificat") + +def processar_directori(api_key, input_dir, output_dir, min_silence_len=1000, silence_thresh=-40, min_segment_len=5000): + """ + Processa un directori amb arxius d'àudio llargs i identifica les cançons dins de cadascun. + :param api_key: Clau d'API d'Audd.io. + :param input_dir: Directori d'entrada amb arxius d'àudio. + :param output_dir: Directori de sortida per guardar els resums. + :param min_silence_len: Longitud mínima del silenci (en ms). + :param silence_thresh: Umbral de silenci (en dBFS). + :param min_segment_len: Longitud mínima d'un fragment (en ms). + """ + os.makedirs(output_dir, exist_ok=True) + for file in os.listdir(input_dir): + if file.lower().endswith((".mp3", ".wav")): + input_file = os.path.join(input_dir, file) + output_file = os.path.join(output_dir, f"{os.path.splitext(file)[0]}_resultat.txt") + processar_arxiu(api_key, input_file, output_file, min_silence_len, silence_thresh, min_segment_len) + +# Exemple d'ús +if __name__ == "__main__": + API_KEY = "LA_TEVA_API_KEY" # Aconsegueix-la a https://audd.io/ + INPUT_DIR = "directori_entrada" # Directori amb enregistraments llargs + OUTPUT_DIR = "directori_sortida" # Directori per guardar els resultats + + processar_directori(API_KEY, INPUT_DIR, OUTPUT_DIR)