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.
Files changed (114) hide show
  1. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/PKG-INFO +1 -1
  2. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/pyproject.toml +1 -1
  3. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/fetch.py +9 -1
  4. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/generation.py +5 -3
  5. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/types.py +1 -0
  6. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/kokoro.py +1 -0
  7. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/models_data.py +1 -1
  8. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/.gitignore +0 -0
  9. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/LICENSE +0 -0
  10. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/README.md +0 -0
  11. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/_plugins.py +0 -0
  12. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/fetch_ui.py +0 -0
  13. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/main.py +0 -0
  14. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/readiness.py +0 -0
  15. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/registry.py +0 -0
  16. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/setup.py +0 -0
  17. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_cli/status.py +0 -0
  18. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/__init__.py +0 -0
  19. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/advise.py +0 -0
  20. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/config.py +0 -0
  21. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/doctor.py +0 -0
  22. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/probe.py +0 -0
  23. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_contract/readiness.py +0 -0
  24. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/__init__.py +0 -0
  25. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/cli.py +0 -0
  26. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/companions.py +0 -0
  27. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/config.py +0 -0
  28. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/data/models.toml +0 -0
  29. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/doctor.py +0 -0
  30. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/gpu.py +0 -0
  31. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/launcher.py +0 -0
  32. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/models.py +0 -0
  33. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/models_data.py +0 -0
  34. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/plugin.py +0 -0
  35. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/presets.py +0 -0
  36. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/stub.py +0 -0
  37. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_image/ui.py +0 -0
  38. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_master/cli.py +0 -0
  39. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_master/doctor.py +0 -0
  40. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_master/ops.py +0 -0
  41. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_master/plugin.py +0 -0
  42. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/__init__.py +0 -0
  43. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/__init__.py +0 -0
  44. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/acestep.py +0 -0
  45. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/base.py +0 -0
  46. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/llm_caption.py +0 -0
  47. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/minimax_comfy.py +0 -0
  48. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/process.py +0 -0
  49. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/stub.py +0 -0
  50. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/backends/yue2.py +0 -0
  51. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/__init__.py +0 -0
  52. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/backend_cmd.py +0 -0
  53. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/generate_cmd.py +0 -0
  54. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/inspire_cmd.py +0 -0
  55. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/cli_commands/models_cmd.py +0 -0
  56. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/client.py +0 -0
  57. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/config.py +0 -0
  58. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/config_data/default.toml +0 -0
  59. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/__init__.py +0 -0
  60. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/formats.py +0 -0
  61. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/generate.py +0 -0
  62. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/jobs.py +0 -0
  63. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/core/layout.py +0 -0
  64. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/doctor.py +0 -0
  65. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/generator.py +0 -0
  66. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/history.py +0 -0
  67. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/jsonstore.py +0 -0
  68. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/models.py +0 -0
  69. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/models_data.py +0 -0
  70. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/paths.py +0 -0
  71. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/plugin.py +0 -0
  72. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/presets.py +0 -0
  73. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/prompts.py +0 -0
  74. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/server.py +0 -0
  75. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/transport/__init__.py +0 -0
  76. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/transport/client.py +0 -0
  77. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_music/tui.py +0 -0
  78. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/cast.py +0 -0
  79. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/cli.py +0 -0
  80. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/doctor.py +0 -0
  81. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/episode.py +0 -0
  82. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/plugin.py +0 -0
  83. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_podcast/script.py +0 -0
  84. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/cli.py +0 -0
  85. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/doctor.py +0 -0
  86. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/models_data.py +0 -0
  87. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/paths.py +0 -0
  88. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/plugin.py +0 -0
  89. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/stub.py +0 -0
  90. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/wgp.py +0 -0
  91. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_video/worker.py +0 -0
  92. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/__init__.py +0 -0
  93. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/doctor.py +0 -0
  94. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/engines_cmd.py +0 -0
  95. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/generate.py +0 -0
  96. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/models_cmd.py +0 -0
  97. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/cli/profiles.py +0 -0
  98. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/config/__init__.py +0 -0
  99. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/config/settings.py +0 -0
  100. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/__init__.py +0 -0
  101. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/model_manager.py +0 -0
  102. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/profiles.py +0 -0
  103. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/core/registry.py +0 -0
  104. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/devices.py +0 -0
  105. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/doctor.py +0 -0
  106. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/__init__.py +0 -0
  107. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/chatterbox.py +0 -0
  108. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/moss.py +0 -0
  109. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/piper.py +0 -0
  110. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/qwen3.py +0 -0
  111. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/stub.py +0 -0
  112. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/voxcpm.py +0 -0
  113. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/engines/xtts.py +0 -0
  114. {aioli_cli-0.1.34 → aioli_cli-0.1.35}/src/aioli_voice/plugin.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: aioli-cli
3
- Version: 0.1.34
3
+ Version: 0.1.35
4
4
  Summary: aioli — local-first AI media suite CLI (images, video, music, voice, podcast)
5
5
  Author: aioli contributors
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aioli-cli"
3
- version = "0.1.34"
3
+ version = "0.1.35"
4
4
  description = "aioli — local-first AI media suite CLI (images, video, music, voice, podcast)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -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:gz") as tf:
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,4 +102,5 @@ KOKORO_SPEC = EngineSpec(
102
102
  size_mb=350,
103
103
  vram_gb=0.0,
104
104
  extra_name="voice-kokoro",
105
+ builtin_voices=True,
105
106
  )
@@ -102,7 +102,7 @@ MODELS.extend(
102
102
  },
103
103
  {
104
104
  "name": "kokoro espeak-ng-data",
105
- "rel": "kokoro/espeak-ng-data-v1.51.tar.gz",
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