Add data_analysis/src/data_analysis/cli.py
This commit is contained in:
parent
986b0c9ede
commit
397fb37b30
1 changed files with 88 additions and 0 deletions
88
data_analysis/src/data_analysis/cli.py
Normal file
88
data_analysis/src/data_analysis/cli.py
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
import argparse
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Any, List
|
||||
import numpy as np
|
||||
|
||||
# Lokale Imports
|
||||
def _import_core():
|
||||
try:
|
||||
from data_analysis.core import analyze_patterns, PatternReport # type: ignore
|
||||
return analyze_patterns, PatternReport
|
||||
except ImportError as e:
|
||||
raise RuntimeError(f"Fehler beim Import von core-Modul: {e}")
|
||||
|
||||
|
||||
def _parse_args(argv: List[str] | None = None) -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Analysiert Audiodaten und extrahiert Klangmuster."
|
||||
)
|
||||
parser.add_argument(
|
||||
"--input",
|
||||
required=True,
|
||||
help="Pfad zur Audiodatei, die analysiert werden soll.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output",
|
||||
required=False,
|
||||
default="output/pattern_report.json",
|
||||
help="Pfad zur JSON-Datei, in die der Musterreport geschrieben wird.",
|
||||
)
|
||||
return parser.parse_args(argv)
|
||||
|
||||
|
||||
def _load_audio_data(audio_path: Path) -> np.ndarray:
|
||||
import librosa
|
||||
|
||||
if not audio_path.exists() or not audio_path.is_file():
|
||||
raise FileNotFoundError(f"Audiodatei nicht gefunden: {audio_path}")
|
||||
|
||||
# Librosa lädt Audiodateien als float32-Array
|
||||
data, _ = librosa.load(audio_path, sr=None, mono=True)
|
||||
return data
|
||||
|
||||
|
||||
def _serialize_reports(reports: List[Any]) -> list[dict[str, Any]]:
|
||||
serialized = []
|
||||
for r in reports:
|
||||
if hasattr(r, "__dict__"):
|
||||
serialized.append({
|
||||
"pattern_name": getattr(r, "pattern_name", None),
|
||||
"frequency": getattr(r, "frequency", None),
|
||||
"correlation": getattr(r, "correlation", None),
|
||||
"comments": getattr(r, "comments", None),
|
||||
})
|
||||
elif isinstance(r, dict):
|
||||
serialized.append(r)
|
||||
else:
|
||||
raise TypeError(f"Unbekannter Reporttyp: {type(r)}")
|
||||
return serialized
|
||||
|
||||
|
||||
def main(argv: List[str] | None = None) -> None:
|
||||
args = _parse_args(argv)
|
||||
analyze_patterns, PatternReport = _import_core()
|
||||
|
||||
audio_path = Path(args.input)
|
||||
output_path = Path(args.output)
|
||||
|
||||
audio_data = _load_audio_data(audio_path)
|
||||
|
||||
try:
|
||||
reports = analyze_patterns(audio_data)
|
||||
except Exception as e:
|
||||
print(f"Fehler bei der Analyse: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
serialized = _serialize_reports(reports)
|
||||
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(output_path, "w", encoding="utf-8") as f:
|
||||
json.dump(serialized, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"Analyse abgeschlossen. Ergebnisse in {output_path} gespeichert.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
||||
Loading…
Reference in a new issue