aioli-cli 0.1.34__tar.gz → 0.1.35__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.
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/PKG-INFO +1 -1
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/pyproject.toml +1 -1
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/fetch.py +9 -1
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/generation.py +5 -3
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/types.py +1 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/kokoro.py +1 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/models_data.py +1 -1
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/.gitignore +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/LICENSE +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/README.md +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/_plugins.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/fetch_ui.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/main.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/readiness.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/registry.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/setup.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/status.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/advise.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/config.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/doctor.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/probe.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/readiness.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/cli.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/companions.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/config.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/data/models.toml +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/doctor.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/gpu.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/launcher.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/models.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/models_data.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/plugin.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/presets.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/stub.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/ui.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_master/cli.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_master/doctor.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_master/ops.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_master/plugin.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/acestep.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/base.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/llm_caption.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/minimax_comfy.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/process.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/stub.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/yue2.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/backend_cmd.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/generate_cmd.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/inspire_cmd.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/models_cmd.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/client.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/config.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/config_data/default.toml +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/formats.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/generate.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/jobs.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/layout.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/doctor.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/generator.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/history.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/jsonstore.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/models.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/models_data.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/paths.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/plugin.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/presets.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/prompts.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/server.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/transport/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/transport/client.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/tui.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/cast.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/cli.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/doctor.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/episode.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/plugin.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/script.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/cli.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/doctor.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/models_data.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/paths.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/plugin.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/stub.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/wgp.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/worker.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/doctor.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/engines_cmd.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/generate.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/models_cmd.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/profiles.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/config/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/config/settings.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/model_manager.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/profiles.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/registry.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/devices.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/doctor.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/__init__.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/chatterbox.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/moss.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/piper.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/qwen3.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/stub.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/voxcpm.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/xtts.py +0 -0
- {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/plugin.py +0 -0
|
@@ -1249,7 +1249,7 @@ def _extract_archive(archive: Path, entry: ModelFile, target: Path | None = None
|
|
|
1249
1249
|
with zipfile.ZipFile(archive) as zf:
|
|
1250
1250
|
_safe_zip_extract(zf, tmp_root)
|
|
1251
1251
|
else:
|
|
1252
|
-
with tarfile.open(archive, "r
|
|
1252
|
+
with tarfile.open(archive, "r:*") as tf:
|
|
1253
1253
|
members = tf.getmembers()
|
|
1254
1254
|
if len(members) > _ARCHIVE_MAX_MEMBERS:
|
|
1255
1255
|
raise ValueError(
|
|
@@ -1264,6 +1264,14 @@ def _extract_archive(archive: Path, entry: ModelFile, target: Path | None = None
|
|
|
1264
1264
|
)
|
|
1265
1265
|
tf.extractall(tmp_root, filter="data")
|
|
1266
1266
|
_tree_confined(tmp_root)
|
|
1267
|
+
# Assets upstream de datos con unico dir raiz (espeak-ng-data):
|
|
1268
|
+
# izar su contenido al staging. No-op para runtimes existentes
|
|
1269
|
+
# (ficheros ya en raiz: top tiene !=1 entrada o no es directorio).
|
|
1270
|
+
top = sorted(tmp_root.iterdir())
|
|
1271
|
+
if len(top) == 1 and top[0].is_dir() and not top[0].is_symlink():
|
|
1272
|
+
for p in sorted(top[0].iterdir()):
|
|
1273
|
+
p.rename(tmp_root / p.name)
|
|
1274
|
+
top[0].rmdir()
|
|
1267
1275
|
exe_name = Path(_normalized_rel(entry.rel)).name
|
|
1268
1276
|
if not exe_name or not (tmp_root / exe_name).is_file():
|
|
1269
1277
|
raise ValueError(f"bundle {entry.url} has no {entry.rel}")
|
|
@@ -25,7 +25,7 @@ from aioli_voice.config.settings import VoiceSettings
|
|
|
25
25
|
from aioli_voice.core.model_manager import ModelManager
|
|
26
26
|
from aioli_voice.core.profiles import ProfileStore
|
|
27
27
|
from aioli_voice.core.registry import create_backend, get_spec
|
|
28
|
-
from aioli_voice.core.types import GeneratedAudio, SampleRef, TTSBackend, VoicePrompt
|
|
28
|
+
from aioli_voice.core.types import EngineSpec, GeneratedAudio, SampleRef, TTSBackend, VoicePrompt
|
|
29
29
|
from aioli_voice.devices import select_device
|
|
30
30
|
|
|
31
31
|
_MAX_CHUNK_CHARS = 300
|
|
@@ -161,7 +161,7 @@ class GenerationService:
|
|
|
161
161
|
raise ValueError("text must be non-empty")
|
|
162
162
|
engine_id = req.engine or self._settings.default_engine
|
|
163
163
|
spec = get_spec(engine_id)
|
|
164
|
-
samples = self._resolve_samples(req)
|
|
164
|
+
samples = self._resolve_samples(req, spec)
|
|
165
165
|
out_path = self._resolve_out_path(req.out_path)
|
|
166
166
|
seed = req.seed if req.seed is not None else secrets.randbelow(2**31)
|
|
167
167
|
model_dir = self._models.ensure_downloaded(spec)
|
|
@@ -186,7 +186,7 @@ class GenerationService:
|
|
|
186
186
|
seed_used=seed,
|
|
187
187
|
)
|
|
188
188
|
|
|
189
|
-
def _resolve_samples(self, req: GenRequest) -> list[SampleRef]:
|
|
189
|
+
def _resolve_samples(self, req: GenRequest, spec: EngineSpec | None = None) -> list[SampleRef]:
|
|
190
190
|
if req.samples:
|
|
191
191
|
return list(req.samples)
|
|
192
192
|
if req.profile_id is not None:
|
|
@@ -196,6 +196,8 @@ class GenerationService:
|
|
|
196
196
|
SampleRef(path=row.path, transcript=row.transcript, duration_s=row.duration_s)
|
|
197
197
|
for row in rows
|
|
198
198
|
]
|
|
199
|
+
if spec is not None and spec.builtin_voices:
|
|
200
|
+
return []
|
|
199
201
|
raise ValueError("generation requires reference samples or an existing profile_id")
|
|
200
202
|
|
|
201
203
|
def _resolve_out_path(self, out_path: Path) -> Path:
|
|
@@ -42,6 +42,7 @@ class EngineSpec:
|
|
|
42
42
|
extra_name: str
|
|
43
43
|
revision: str | None = None
|
|
44
44
|
license_commercial: bool = True # False ⇒ NC marker in engines list + generate warning
|
|
45
|
+
builtin_voices: bool = False # True ⇒ engine ships built-in voices, no reference samples needed
|
|
45
46
|
|
|
46
47
|
|
|
47
48
|
@runtime_checkable
|
|
@@ -102,7 +102,7 @@ MODELS.extend(
|
|
|
102
102
|
},
|
|
103
103
|
{
|
|
104
104
|
"name": "kokoro espeak-ng-data",
|
|
105
|
-
"rel": "kokoro/espeak-ng-data
|
|
105
|
+
"rel": "kokoro/espeak-ng-data/phontab",
|
|
106
106
|
"url": f"{_KOKORO_DATA_BASE}/espeak-ng-data-v1.51.tar.gz",
|
|
107
107
|
"sha256": "7e10dedeb21bf057b30f2e152fee221f7569e02951f4014b36afaec4176dc6c7",
|
|
108
108
|
"size": 12062720,
|
|
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
|
|
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
|