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.
- {echo_vector-1.0.3 → echo_vector-1.0.4}/PKG-INFO +1 -1
- echo_vector-1.0.4/echovector/__init__.py +18 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/cli/main.py +11 -1
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/core.py +9 -2
- echo_vector-1.0.3/echovector/__init__.py +0 -7
- {echo_vector-1.0.3 → echo_vector-1.0.4}/.claude/commands/release.md +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/.claude/settings.json +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/.github/workflows/workflow.yml +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/.gitignore +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/.pre-commit-config.yaml +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/.python-version +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/CLAUDE.md +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/Makefile +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/README.md +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/api/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/api/server.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/chunker.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/metadata.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/processor.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/audio/streaming.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/cli/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/ast_model.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/base.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/cache.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/clap.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/factory.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/hubert.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/local.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/wav2vec2.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/embeddings/whisper_enc.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/evaluation/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/evaluation/metrics.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/indexing/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/indexing/base.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/indexing/faiss_index.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/indexing/store.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/search/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/search/engine.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/search/filters.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/search/results.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/utils/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/utils/config.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/echovector/utils/logging.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/pyproject.toml +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/conftest.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/e2e/test_cli.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/fixtures/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/fixtures/audio_generators.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/integration/__init__.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/integration/test_integration.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/test_audio.mp3 +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_api.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_audio_processor.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_chunker.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_core.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_embeddings.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_faiss_index.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_results.py +0 -0
- {echo_vector-1.0.3 → echo_vector-1.0.4}/tests/unit/test_search_engine.py +0 -0
- {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
|
+
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
|
-
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|