Add mp3_session_tagger.py

This commit is contained in:
headroom 2025-01-13 16:07:57 +00:00
parent 68e0ec663e
commit 8b96acebf9

99
mp3_session_tagger.py Normal file
View File

@ -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)