echo-vector 1.0.3__tar.gz → 1.0.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. {echo_vector-1.0.3 → echo_vector-1.0.4}/PKG-INFO +1 -1
  2. echo_vector-1.0.4/echovector/__init__.py +18 -0
  3. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/cli/main.py +11 -1
  4. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/core.py +9 -2
  5. echo_vector-1.0.3/echovector/__init__.py +0 -7
  6. {echo_vector-1.0.3 → echo_vector-1.0.4}/.claude/commands/release.md +0 -0
  7. {echo_vector-1.0.3 → echo_vector-1.0.4}/.claude/settings.json +0 -0
  8. {echo_vector-1.0.3 → echo_vector-1.0.4}/.github/workflows/workflow.yml +0 -0
  9. {echo_vector-1.0.3 → echo_vector-1.0.4}/.gitignore +0 -0
  10. {echo_vector-1.0.3 → echo_vector-1.0.4}/.pre-commit-config.yaml +0 -0
  11. {echo_vector-1.0.3 → echo_vector-1.0.4}/.python-version +0 -0
  12. {echo_vector-1.0.3 → echo_vector-1.0.4}/CLAUDE.md +0 -0
  13. {echo_vector-1.0.3 → echo_vector-1.0.4}/Makefile +0 -0
  14. {echo_vector-1.0.3 → echo_vector-1.0.4}/README.md +0 -0
  15. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/api/__init__.py +0 -0
  16. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/api/server.py +0 -0
  17. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/__init__.py +0 -0
  18. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/chunker.py +0 -0
  19. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/metadata.py +0 -0
  20. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/processor.py +0 -0
  21. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/streaming.py +0 -0
  22. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/cli/__init__.py +0 -0
  23. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/__init__.py +0 -0
  24. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/ast_model.py +0 -0
  25. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/base.py +0 -0
  26. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/cache.py +0 -0
  27. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/clap.py +0 -0
  28. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/factory.py +0 -0
  29. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/hubert.py +0 -0
  30. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/local.py +0 -0
  31. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/wav2vec2.py +0 -0
  32. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/whisper_enc.py +0 -0
  33. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/evaluation/__init__.py +0 -0
  34. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/evaluation/metrics.py +0 -0
  35. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/indexing/__init__.py +0 -0
  36. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/indexing/base.py +0 -0
  37. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/indexing/faiss_index.py +0 -0
  38. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/indexing/store.py +0 -0
  39. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/search/__init__.py +0 -0
  40. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/search/engine.py +0 -0
  41. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/search/filters.py +0 -0
  42. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/search/results.py +0 -0
  43. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/utils/__init__.py +0 -0
  44. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/utils/config.py +0 -0
  45. {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/utils/logging.py +0 -0
  46. {echo_vector-1.0.3 → echo_vector-1.0.4}/pyproject.toml +0 -0
  47. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/__init__.py +0 -0
  48. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/conftest.py +0 -0
  49. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/e2e/test_cli.py +0 -0
  50. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/fixtures/__init__.py +0 -0
  51. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/fixtures/audio_generators.py +0 -0
  52. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/integration/__init__.py +0 -0
  53. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/integration/test_integration.py +0 -0
  54. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/test_audio.mp3 +0 -0
  55. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_api.py +0 -0
  56. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_audio_processor.py +0 -0
  57. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_chunker.py +0 -0
  58. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_core.py +0 -0
  59. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_embeddings.py +0 -0
  60. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_faiss_index.py +0 -0
  61. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_results.py +0 -0
  62. {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_search_engine.py +0 -0
  63. {echo_vector-1.0.3 → echo_vector-1.0.4}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echo_vector
3
- Version: 1.0.3
3
+ Version: 1.0.4
4
4
  Summary: Semantic text search over audio files without full transcription
5
5
  Project-URL: Homepage, https://github.com/ahron-maslin/echo_vector
6
6
  Project-URL: Documentation, https://github.com/ahron-maslin/echo_vector#readme
@@ -0,0 +1,18 @@
1
+ """EchoVector: Audio vector embedding and processing library."""
2
+
3
+ import warnings
4
+
5
+ from echovector.core import EchoVector
6
+
7
+ # librosa falls back to its deprecated audioread loader for formats libsndfile
8
+ # can't decode natively (e.g. m4a/aac), emitting a noisy FutureWarning we can't
9
+ # act on from here.
10
+ warnings.filterwarnings(
11
+ "ignore",
12
+ message="librosa.core.audio.__audioread_load",
13
+ category=FutureWarning,
14
+ )
15
+
16
+ __version__ = "0.1.0"
17
+
18
+ __all__ = ["EchoVector"]
@@ -5,6 +5,7 @@ from typing import Annotated
5
5
 
6
6
  import typer
7
7
  from rich.console import Console
8
+ from rich.progress import Progress
8
9
  from rich.table import Table
9
10
 
10
11
  from echovector import EchoVector
@@ -74,7 +75,16 @@ def index(
74
75
  )
75
76
  if reset:
76
77
  engine.reset()
77
- count = engine.index(files, recursive=recursive)
78
+
79
+ with Progress(console=console) as progress:
80
+ task = progress.add_task("Indexing files...", total=None)
81
+
82
+ def _on_file_indexed(done: int, total: int, file_path: Path) -> None:
83
+ progress.update(
84
+ task, total=total, completed=done, description=f"Indexed {file_path.name}"
85
+ )
86
+
87
+ count = engine.index(files, recursive=recursive, on_file_indexed=_on_file_indexed)
78
88
  except Exception as exc:
79
89
  console.print(f"[bold red]Indexing failed:[/bold red] {exc}")
80
90
  raise typer.Exit(code=1) from exc
@@ -1,6 +1,6 @@
1
1
  """Core public API for EchoVector."""
2
2
 
3
- from collections.abc import Sequence
3
+ from collections.abc import Callable, Sequence
4
4
  from pathlib import Path
5
5
  from tempfile import TemporaryDirectory
6
6
  from typing import Any, cast
@@ -67,6 +67,7 @@ class EchoVector:
67
67
  recursive: bool | None = None,
68
68
  batch_size: int = 16,
69
69
  force: bool = False,
70
+ on_file_indexed: Callable[[int, int, Path], None] | None = None,
70
71
  ) -> int:
71
72
  """Index audio chunks from paths or directories.
72
73
 
@@ -76,6 +77,9 @@ class EchoVector:
76
77
  batch_size: Number of chunks to embed per batch.
77
78
  force: If True, remove and re-index files that are already stored.
78
79
  If False (default), already-indexed files are skipped.
80
+ on_file_indexed: Optional callback invoked after each file is
81
+ processed, with (files_done, total_files, file_path). Useful
82
+ for reporting progress.
79
83
 
80
84
  Returns:
81
85
  Number of new chunks added to the index.
@@ -103,7 +107,7 @@ class EchoVector:
103
107
  chunk_ids: list[str] = []
104
108
  chunk_metadata: list[dict[str, Any]] = []
105
109
 
106
- for file_path in files:
110
+ for file_number, file_path in enumerate(files, start=1):
107
111
  audio = self.audio_processor.load_audio(str(file_path))
108
112
  for (
109
113
  chunk_number,
@@ -131,6 +135,9 @@ class EchoVector:
131
135
  chunk_ids = []
132
136
  chunk_metadata = []
133
137
 
138
+ if on_file_indexed is not None:
139
+ on_file_indexed(file_number, len(files), file_path)
140
+
134
141
  if chunk_paths:
135
142
  self._add_chunk_batch(chunk_paths, chunk_ids, chunk_metadata)
136
143
 
@@ -1,7 +0,0 @@
1
- """EchoVector: Audio vector embedding and processing library."""
2
-
3
- from echovector.core import EchoVector
4
-
5
- __version__ = "0.1.0"
6
-
7
- __all__ = ["EchoVector"]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes