Add mp3_session_tagger.py
This commit is contained in:
parent
68e0ec663e
commit
8b96acebf9
99
mp3_session_tagger.py
Normal file
99
mp3_session_tagger.py
Normal 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)
|
Loading…
Reference in New Issue
Block a user