aioli-cli 0.1.46__tar.gz → 0.2.0__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.2.0/.gitignore +22 -0
- aioli_cli-0.2.0/PKG-INFO +160 -0
- aioli_cli-0.2.0/README.md +130 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/pyproject.toml +26 -20
- aioli_cli-0.2.0/src/aioli_cli/agent_guide.md +111 -0
- aioli_cli-0.2.0/src/aioli_cli/backend_manager.py +1904 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_cli/fetch_ui.py +20 -1
- aioli_cli-0.2.0/src/aioli_cli/lifecycle.py +207 -0
- aioli_cli-0.2.0/src/aioli_cli/main.py +927 -0
- aioli_cli-0.2.0/src/aioli_cli/managed.py +252 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_cli/readiness.py +214 -8
- aioli_cli-0.2.0/src/aioli_cli/registry.py +91 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_cli/setup.py +468 -92
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_cli/status.py +246 -41
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_contract/__init__.py +14 -0
- aioli_cli-0.2.0/src/aioli_contract/advise.py +892 -0
- aioli_cli-0.2.0/src/aioli_contract/audiocpp.py +118 -0
- aioli_cli-0.2.0/src/aioli_contract/config.py +202 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_contract/doctor.py +24 -3
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_contract/fetch.py +601 -139
- aioli_cli-0.2.0/src/aioli_contract/journal.py +99 -0
- aioli_cli-0.2.0/src/aioli_contract/model_ids.py +161 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_contract/probe.py +52 -13
- aioli_cli-0.2.0/src/aioli_contract/short_verb.py +47 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/cli.py +147 -1
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/config.py +53 -18
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/data/models.toml +61 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/doctor.py +4 -9
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/launcher.py +552 -55
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/models.py +38 -3
- aioli_cli-0.2.0/src/aioli_image/models_data.py +392 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/plugin.py +1 -1
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/presets.py +7 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_master/cli.py +15 -2
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_master/doctor.py +3 -3
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_master/ops.py +32 -8
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_master/plugin.py +3 -1
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/backends/__init__.py +8 -0
- aioli_cli-0.2.0/src/aioli_music/backends/acestep_turbo.py +14 -0
- aioli_cli-0.2.0/src/aioli_music/backends/audiocpp_music.py +223 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/backends/base.py +4 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/backends/minimax_comfy.py +42 -9
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/backends/process.py +114 -25
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/backends/yue2.py +24 -9
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/generate_cmd.py +142 -13
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/config.py +17 -34
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/config_data/default.toml +1 -21
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/core/generate.py +56 -2
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/doctor.py +10 -26
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/models.py +51 -8
- aioli_cli-0.2.0/src/aioli_music/models_data.py +253 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/paths.py +1 -1
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/plugin.py +10 -2
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/presets.py +11 -2
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/server.py +106 -32
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/transport/client.py +180 -10
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_podcast/cast.py +59 -3
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_podcast/cli.py +22 -3
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_podcast/episode.py +125 -9
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_podcast/plugin.py +1 -1
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_video/cli.py +114 -20
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_video/doctor.py +5 -3
- aioli_cli-0.2.0/src/aioli_video/managed.py +287 -0
- aioli_cli-0.2.0/src/aioli_video/models_data.py +28 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_video/plugin.py +1 -1
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_video/wgp.py +191 -16
- aioli_cli-0.2.0/src/aioli_video/worker.py +138 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/cli/doctor.py +10 -3
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/cli/engines_cmd.py +2 -2
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/cli/generate.py +81 -11
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/cli/models_cmd.py +7 -3
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/cli/profiles.py +4 -1
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/config/settings.py +39 -4
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/core/generation.py +67 -9
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/core/model_manager.py +45 -1
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/__init__.py +12 -0
- aioli_cli-0.2.0/src/aioli_voice/engines/audiocpp.py +287 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/chatterbox.py +4 -11
- aioli_cli-0.2.0/src/aioli_voice/engines/chatterbox_gguf.py +42 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/kokoro.py +7 -2
- aioli_cli-0.2.0/src/aioli_voice/engines/pocket.py +21 -0
- aioli_cli-0.2.0/src/aioli_voice/engines/qwen3_tts.py +20 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/voxcpm.py +7 -13
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/models_data.py +187 -9
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/plugin.py +10 -2
- aioli_cli-0.1.46/.gitignore +0 -11
- aioli_cli-0.1.46/PKG-INFO +0 -142
- aioli_cli-0.1.46/README.md +0 -110
- aioli_cli-0.1.46/src/aioli_cli/main.py +0 -474
- aioli_cli-0.1.46/src/aioli_cli/registry.py +0 -50
- aioli_cli-0.1.46/src/aioli_contract/advise.py +0 -474
- aioli_cli-0.1.46/src/aioli_contract/config.py +0 -102
- aioli_cli-0.1.46/src/aioli_image/models_data.py +0 -188
- aioli_cli-0.1.46/src/aioli_music/core/jobs.py +0 -262
- aioli_cli-0.1.46/src/aioli_music/models_data.py +0 -136
- aioli_cli-0.1.46/src/aioli_video/models_data.py +0 -53
- aioli_cli-0.1.46/src/aioli_video/worker.py +0 -39
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/LICENSE +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_cli/_plugins.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_contract/readiness.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_contract/ui.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/companions.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/gpu.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/progress.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/stub.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_image/ui.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/backends/acestep.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/backends/llm_caption.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/backends/stub.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/backend_cmd.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/inspire_cmd.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/models_cmd.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/client.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/core/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/core/formats.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/core/layout.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/generator.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/history.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/jsonstore.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/prompts.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/transport/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_music/tui.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_podcast/doctor.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_podcast/feed.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_podcast/script.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_video/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_video/paths.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_video/stub.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/config/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/core/__init__.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/core/profiles.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/core/registry.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/core/types.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/devices.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/doctor.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/moss.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/piper.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/qwen3.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/stub.py +0 -0
- {aioli_cli-0.1.46 → aioli_cli-0.2.0}/src/aioli_voice/engines/xtts.py +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.pyc
|
|
3
|
+
.venv/
|
|
4
|
+
|
|
5
|
+
# caches de herramientas (I6): un `git add -A` no debe commitearlas
|
|
6
|
+
.mypy_cache/
|
|
7
|
+
.pytest_cache/
|
|
8
|
+
.ruff_cache/
|
|
9
|
+
|
|
10
|
+
# cobertura (I4): artefactos del run, se regeneran
|
|
11
|
+
.coverage
|
|
12
|
+
coverage.xml
|
|
13
|
+
|
|
14
|
+
# web
|
|
15
|
+
web/node_modules/
|
|
16
|
+
web/dist/
|
|
17
|
+
web/.astro/
|
|
18
|
+
# copia de ../install.sh que hace `pnpm build`/`pnpm dev`
|
|
19
|
+
web/public/install.sh
|
|
20
|
+
|
|
21
|
+
dist/
|
|
22
|
+
.kaudit/
|
aioli_cli-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: aioli-cli
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: aioli — local-first AI media suite CLI (images, video, music, voice, podcast)
|
|
5
|
+
Author: aioli contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: ai,generative,image,local-first,music,tts,video
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Topic :: Multimedia
|
|
13
|
+
Requires-Python: >=3.12
|
|
14
|
+
Requires-Dist: httpx>=0.27
|
|
15
|
+
Requires-Dist: huggingface-hub>=0.30
|
|
16
|
+
Requires-Dist: inquirerpy>=0.3.4
|
|
17
|
+
Requires-Dist: numpy>=1.26
|
|
18
|
+
Requires-Dist: pillow>=13.0
|
|
19
|
+
Requires-Dist: pydantic-settings>=2.3
|
|
20
|
+
Requires-Dist: pydantic>=2.7
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Requires-Dist: rich>=13.0
|
|
23
|
+
Requires-Dist: soundfile>=0.12
|
|
24
|
+
Requires-Dist: typer>=0.12
|
|
25
|
+
Provides-Extra: voice-kokoro
|
|
26
|
+
Requires-Dist: kokoro-onnx>=0.4; extra == 'voice-kokoro'
|
|
27
|
+
Provides-Extra: voice-piper
|
|
28
|
+
Requires-Dist: piper-tts>=1.2; extra == 'voice-piper'
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
|
|
31
|
+
<p align="center">
|
|
32
|
+
<img src="assets/logo-transparent.png" width="220" alt="logo de aioli — ajo robot" />
|
|
33
|
+
</p>
|
|
34
|
+
|
|
35
|
+
<h1 align="center">🧄 aioli</h1>
|
|
36
|
+
|
|
37
|
+
<p align="center">
|
|
38
|
+
<em>Tu estudio de IA en casa: clona voces, compón canciones, dibuja imágenes,<br />genera vídeo y produce podcasts. Todo en tu máquina. Sin nube.</em>
|
|
39
|
+
</p>
|
|
40
|
+
|
|
41
|
+
<p align="center">
|
|
42
|
+
<a href="https://pypi.org/project/aioli-cli/"><img src="https://img.shields.io/pypi/v/aioli-cli" alt="versión en PyPI" /></a>
|
|
43
|
+
<img src="https://img.shields.io/badge/python-%3E%3D3.12-blue" alt="python >= 3.12" />
|
|
44
|
+
<img src="https://img.shields.io/badge/license-MIT-green" alt="MIT" />
|
|
45
|
+
<img src="https://img.shields.io/badge/GPU-NVIDIA%20recomendada-orange" alt="GPU NVIDIA recomendada" />
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
<p align="center">
|
|
49
|
+
🎙️ Voz • 🎵 Música • 🖼️ Imagen • 🎬 Vídeo • 🎧 Master • 📻 Podcast
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Qué hace (con ejemplos reales)
|
|
55
|
+
|
|
56
|
+
| Plugin | Produce | Ejemplo |
|
|
57
|
+
| --- | --- | --- |
|
|
58
|
+
| 🎙️ `voice` | Voz clonada o sintética en WAV (español nativo con chatterbox, borradores gratis en CPU con piper) | `aioli voice "Hola mundo" --profile vega -o hola.wav` |
|
|
59
|
+
| 🎵 `music` | Canción completa (voz + instrumentos) a partir de un estilo y tu letra; canta en español | `aioli music --preset reggae-consciente -l mi-letra.txt -o tema.mp3` |
|
|
60
|
+
| 🖼️ `image` | Imagen desde texto, edición, inpainting o referencia de personaje (~9 s con FLUX-klein-4b) | `aioli image "un ajo robot"` |
|
|
61
|
+
| 🎬 `video` | Clip MP4 con audio sincronizado desde texto o imagen | `aioli video "un ajo robot bailando" --frames 81 -o ajo.mp4` |
|
|
62
|
+
| 🎧 `master` | Acabado de audio con ffmpeg: mezcla, ducking, reducción de ruido, `-16 LUFS` | `aioli master loudnorm mezcla.wav -o final.wav` |
|
|
63
|
+
| 📻 `podcast` | Episodio MP3 + notas del programa a partir de un guion (voces + cama musical + pausas) | `aioli podcast episode guion.md -o ./ep1` |
|
|
64
|
+
|
|
65
|
+
19 canciones, sus carátulas y varios clips se hicieron así, en local,
|
|
66
|
+
con estos comandos. Sin cuentas ni suscripciones.
|
|
67
|
+
|
|
68
|
+
## Cómo funciona
|
|
69
|
+
|
|
70
|
+
1. `aioli install` inspecciona tu máquina y te dice qué cabe en tu GPU.
|
|
71
|
+
2. `aioli models download` descarga pesos verificados (sha256, reanudables)
|
|
72
|
+
en `~/.local/share/aioli/models` (o donde apunte `AIOLI_MODELS_DIR`).
|
|
73
|
+
3. Generas en local: ni un byte sale de tu máquina. Sin cuentas ni
|
|
74
|
+
suscripciones (ningún modelo del catálogo pide cuenta de HuggingFace).
|
|
75
|
+
|
|
76
|
+
## Instalación
|
|
77
|
+
|
|
78
|
+
Tres pasos (Linux, Mac y Windows):
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 1. uv, el instalador de Python de Astral (si no lo tienes ya)
|
|
82
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh # Linux y Mac
|
|
83
|
+
# Windows (PowerShell): powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
84
|
+
|
|
85
|
+
# 2. aioli
|
|
86
|
+
uv tool install aioli-cli
|
|
87
|
+
|
|
88
|
+
# 3. el asistente: mira tu equipo, te recomienda qué cabe y descarga solo lo que elijas
|
|
89
|
+
aioli install
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Necesitas también `ffmpeg` (Linux: `sudo apt install ffmpeg` · Mac:
|
|
93
|
+
`brew install ffmpeg` · Windows: `winget install ffmpeg`). `aioli doctor`
|
|
94
|
+
te dice si falta algo y cómo arreglarlo. Para actualizar: `aioli update`.
|
|
95
|
+
|
|
96
|
+
> Próximamente: instalador de un solo comando que hace los tres pasos (y
|
|
97
|
+
> ffmpeg, preguntando antes). Ya está en `install.sh` del repo.
|
|
98
|
+
|
|
99
|
+
### ¿No eres técnico? Pídeselo a tu asistente de IA
|
|
100
|
+
|
|
101
|
+
Si usas Claude Code (u otro asistente que ejecuta comandos):
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
aioli agent install # le enseña a tu asistente a instalar y usar aioli
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Y luego pídele, sin más: *«instálame aioli para hacer canciones con mi letra»*.
|
|
108
|
+
El asistente mira tu equipo (`aioli status --json`), te propone qué instalar con
|
|
109
|
+
su tamaño y licencia, **pregunta antes de descargar** y nunca usa `sudo`.
|
|
110
|
+
Para otros asistentes, `aioli agent guide` imprime la misma guía.
|
|
111
|
+
|
|
112
|
+
## Requisitos
|
|
113
|
+
|
|
114
|
+
| Qué | Mínimo | Recomendado |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| SO | Linux (Ubuntu 22.04+), Mac | Ubuntu 24.04 |
|
|
117
|
+
| GPU | ninguna (voz en CPU con piper) | NVIDIA 12–16 GB de VRAM |
|
|
118
|
+
| Disco | 15 GB (un plugin) | 100 GB (el conjunto completo ≈ 60 GB) |
|
|
119
|
+
| Cuenta | — | — (sin cuentas: espejos públicos verificados) |
|
|
120
|
+
|
|
121
|
+
`aioli install` detecta tu máquina (nivel `patata/modesta/capaz/bicha`,
|
|
122
|
+
sí, de patata a bestia) y solo descarga lo que cabe. Los pesos se verifican
|
|
123
|
+
con sha256 y se reanudan si se corta tu conexión.
|
|
124
|
+
|
|
125
|
+
## Uso
|
|
126
|
+
|
|
127
|
+
Camino feliz: `aioli install` → `aioli <plugin> "texto"` → `aioli doctor`
|
|
128
|
+
(solo si algo falla). Las recetas por modelo están en `docs/USAGE.md`.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# imagen: texto → PNG (edición, inpainting y referencia disponibles)
|
|
132
|
+
aioli image "un faro en la niebla"
|
|
133
|
+
aioli image "un faro en la niebla" -m z-image-turbo -o faro.png
|
|
134
|
+
|
|
135
|
+
# música: estilo + tu letra → canción completa
|
|
136
|
+
aioli music "rumba alegre" -l mi-letra.txt -o tema.mp3
|
|
137
|
+
aioli music generate --preset reggae-consciente -l mi-letra.txt -o tema.mp3
|
|
138
|
+
|
|
139
|
+
# voz: crea un perfil, añade una muestra con su transcripción, genera
|
|
140
|
+
aioli voice profiles create vega --language es
|
|
141
|
+
aioli voice profiles add-sample vega ref.wav -t "transcripción exacta del audio"
|
|
142
|
+
aioli voice "Hola mundo" --profile vega --engine chatterbox -o hola.wav
|
|
143
|
+
|
|
144
|
+
# vídeo: texto o imagen → clip con audio
|
|
145
|
+
aioli video "un ajo robot bailando" --frames 81 -o ajo.mp4
|
|
146
|
+
|
|
147
|
+
# podcast: guion con [ROL], [MUSIC:] y [PAUSE:] → episodio + notas
|
|
148
|
+
aioli podcast episode guion.md -o ./ep1
|
|
149
|
+
|
|
150
|
+
# master: remata cualquier audio (mezcla, ducking, -16 LUFS…)
|
|
151
|
+
aioli master loudnorm mezcla.wav -o final.wav
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
`aioli <plugin> --help` detalla cada comando; `aioli doctor` diagnostica
|
|
155
|
+
los fallos.
|
|
156
|
+
|
|
157
|
+
## Licencia
|
|
158
|
+
|
|
159
|
+
MIT. Los pesos de terceros llevan su propia licencia (algunos no comerciales
|
|
160
|
+
o con aceptación previa en HuggingFace); `aioli models` te avisa.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo-transparent.png" width="220" alt="logo de aioli — ajo robot" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">🧄 aioli</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<em>Tu estudio de IA en casa: clona voces, compón canciones, dibuja imágenes,<br />genera vídeo y produce podcasts. Todo en tu máquina. Sin nube.</em>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://pypi.org/project/aioli-cli/"><img src="https://img.shields.io/pypi/v/aioli-cli" alt="versión en PyPI" /></a>
|
|
13
|
+
<img src="https://img.shields.io/badge/python-%3E%3D3.12-blue" alt="python >= 3.12" />
|
|
14
|
+
<img src="https://img.shields.io/badge/license-MIT-green" alt="MIT" />
|
|
15
|
+
<img src="https://img.shields.io/badge/GPU-NVIDIA%20recomendada-orange" alt="GPU NVIDIA recomendada" />
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<p align="center">
|
|
19
|
+
🎙️ Voz • 🎵 Música • 🖼️ Imagen • 🎬 Vídeo • 🎧 Master • 📻 Podcast
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Qué hace (con ejemplos reales)
|
|
25
|
+
|
|
26
|
+
| Plugin | Produce | Ejemplo |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| 🎙️ `voice` | Voz clonada o sintética en WAV (español nativo con chatterbox, borradores gratis en CPU con piper) | `aioli voice "Hola mundo" --profile vega -o hola.wav` |
|
|
29
|
+
| 🎵 `music` | Canción completa (voz + instrumentos) a partir de un estilo y tu letra; canta en español | `aioli music --preset reggae-consciente -l mi-letra.txt -o tema.mp3` |
|
|
30
|
+
| 🖼️ `image` | Imagen desde texto, edición, inpainting o referencia de personaje (~9 s con FLUX-klein-4b) | `aioli image "un ajo robot"` |
|
|
31
|
+
| 🎬 `video` | Clip MP4 con audio sincronizado desde texto o imagen | `aioli video "un ajo robot bailando" --frames 81 -o ajo.mp4` |
|
|
32
|
+
| 🎧 `master` | Acabado de audio con ffmpeg: mezcla, ducking, reducción de ruido, `-16 LUFS` | `aioli master loudnorm mezcla.wav -o final.wav` |
|
|
33
|
+
| 📻 `podcast` | Episodio MP3 + notas del programa a partir de un guion (voces + cama musical + pausas) | `aioli podcast episode guion.md -o ./ep1` |
|
|
34
|
+
|
|
35
|
+
19 canciones, sus carátulas y varios clips se hicieron así, en local,
|
|
36
|
+
con estos comandos. Sin cuentas ni suscripciones.
|
|
37
|
+
|
|
38
|
+
## Cómo funciona
|
|
39
|
+
|
|
40
|
+
1. `aioli install` inspecciona tu máquina y te dice qué cabe en tu GPU.
|
|
41
|
+
2. `aioli models download` descarga pesos verificados (sha256, reanudables)
|
|
42
|
+
en `~/.local/share/aioli/models` (o donde apunte `AIOLI_MODELS_DIR`).
|
|
43
|
+
3. Generas en local: ni un byte sale de tu máquina. Sin cuentas ni
|
|
44
|
+
suscripciones (ningún modelo del catálogo pide cuenta de HuggingFace).
|
|
45
|
+
|
|
46
|
+
## Instalación
|
|
47
|
+
|
|
48
|
+
Tres pasos (Linux, Mac y Windows):
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 1. uv, el instalador de Python de Astral (si no lo tienes ya)
|
|
52
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh # Linux y Mac
|
|
53
|
+
# Windows (PowerShell): powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
54
|
+
|
|
55
|
+
# 2. aioli
|
|
56
|
+
uv tool install aioli-cli
|
|
57
|
+
|
|
58
|
+
# 3. el asistente: mira tu equipo, te recomienda qué cabe y descarga solo lo que elijas
|
|
59
|
+
aioli install
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Necesitas también `ffmpeg` (Linux: `sudo apt install ffmpeg` · Mac:
|
|
63
|
+
`brew install ffmpeg` · Windows: `winget install ffmpeg`). `aioli doctor`
|
|
64
|
+
te dice si falta algo y cómo arreglarlo. Para actualizar: `aioli update`.
|
|
65
|
+
|
|
66
|
+
> Próximamente: instalador de un solo comando que hace los tres pasos (y
|
|
67
|
+
> ffmpeg, preguntando antes). Ya está en `install.sh` del repo.
|
|
68
|
+
|
|
69
|
+
### ¿No eres técnico? Pídeselo a tu asistente de IA
|
|
70
|
+
|
|
71
|
+
Si usas Claude Code (u otro asistente que ejecuta comandos):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
aioli agent install # le enseña a tu asistente a instalar y usar aioli
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Y luego pídele, sin más: *«instálame aioli para hacer canciones con mi letra»*.
|
|
78
|
+
El asistente mira tu equipo (`aioli status --json`), te propone qué instalar con
|
|
79
|
+
su tamaño y licencia, **pregunta antes de descargar** y nunca usa `sudo`.
|
|
80
|
+
Para otros asistentes, `aioli agent guide` imprime la misma guía.
|
|
81
|
+
|
|
82
|
+
## Requisitos
|
|
83
|
+
|
|
84
|
+
| Qué | Mínimo | Recomendado |
|
|
85
|
+
| --- | --- | --- |
|
|
86
|
+
| SO | Linux (Ubuntu 22.04+), Mac | Ubuntu 24.04 |
|
|
87
|
+
| GPU | ninguna (voz en CPU con piper) | NVIDIA 12–16 GB de VRAM |
|
|
88
|
+
| Disco | 15 GB (un plugin) | 100 GB (el conjunto completo ≈ 60 GB) |
|
|
89
|
+
| Cuenta | — | — (sin cuentas: espejos públicos verificados) |
|
|
90
|
+
|
|
91
|
+
`aioli install` detecta tu máquina (nivel `patata/modesta/capaz/bicha`,
|
|
92
|
+
sí, de patata a bestia) y solo descarga lo que cabe. Los pesos se verifican
|
|
93
|
+
con sha256 y se reanudan si se corta tu conexión.
|
|
94
|
+
|
|
95
|
+
## Uso
|
|
96
|
+
|
|
97
|
+
Camino feliz: `aioli install` → `aioli <plugin> "texto"` → `aioli doctor`
|
|
98
|
+
(solo si algo falla). Las recetas por modelo están en `docs/USAGE.md`.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# imagen: texto → PNG (edición, inpainting y referencia disponibles)
|
|
102
|
+
aioli image "un faro en la niebla"
|
|
103
|
+
aioli image "un faro en la niebla" -m z-image-turbo -o faro.png
|
|
104
|
+
|
|
105
|
+
# música: estilo + tu letra → canción completa
|
|
106
|
+
aioli music "rumba alegre" -l mi-letra.txt -o tema.mp3
|
|
107
|
+
aioli music generate --preset reggae-consciente -l mi-letra.txt -o tema.mp3
|
|
108
|
+
|
|
109
|
+
# voz: crea un perfil, añade una muestra con su transcripción, genera
|
|
110
|
+
aioli voice profiles create vega --language es
|
|
111
|
+
aioli voice profiles add-sample vega ref.wav -t "transcripción exacta del audio"
|
|
112
|
+
aioli voice "Hola mundo" --profile vega --engine chatterbox -o hola.wav
|
|
113
|
+
|
|
114
|
+
# vídeo: texto o imagen → clip con audio
|
|
115
|
+
aioli video "un ajo robot bailando" --frames 81 -o ajo.mp4
|
|
116
|
+
|
|
117
|
+
# podcast: guion con [ROL], [MUSIC:] y [PAUSE:] → episodio + notas
|
|
118
|
+
aioli podcast episode guion.md -o ./ep1
|
|
119
|
+
|
|
120
|
+
# master: remata cualquier audio (mezcla, ducking, -16 LUFS…)
|
|
121
|
+
aioli master loudnorm mezcla.wav -o final.wav
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`aioli <plugin> --help` detalla cada comando; `aioli doctor` diagnostica
|
|
125
|
+
los fallos.
|
|
126
|
+
|
|
127
|
+
## Licencia
|
|
128
|
+
|
|
129
|
+
MIT. Los pesos de terceros llevan su propia licencia (algunos no comerciales
|
|
130
|
+
o con aceptación previa en HuggingFace); `aioli models` te avisa.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "aioli-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.2.0"
|
|
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"
|
|
@@ -26,7 +26,7 @@ dependencies = [
|
|
|
26
26
|
"pyyaml>=6.0",
|
|
27
27
|
"numpy>=1.26",
|
|
28
28
|
"soundfile>=0.12",
|
|
29
|
-
"pillow>=
|
|
29
|
+
"pillow>=13.0", # 13.0: 35 CVE corregidos (pip-audit 2026-10-22). stubs de imagen (contrato: stub funciona sin GPU ni extras)
|
|
30
30
|
]
|
|
31
31
|
|
|
32
32
|
|
|
@@ -39,7 +39,6 @@ voice-piper = ["piper-tts>=1.2"] # binario + onnxruntime via pip
|
|
|
39
39
|
# D13: kokoro-onnx fuera de la base (el motor lo importa lazy y el spec
|
|
40
40
|
# declara el extra; antes pesaba en cada fresh install sin usarse).
|
|
41
41
|
voice-kokoro = ["kokoro-onnx>=0.4"] # motor neural ES (CPU, sin clonar)
|
|
42
|
-
music-storage = ["boto3>=1.34"]
|
|
43
42
|
|
|
44
43
|
[project.scripts]
|
|
45
44
|
aioli = "aioli_cli.main:main"
|
|
@@ -100,6 +99,12 @@ only-include = [
|
|
|
100
99
|
"LICENSE",
|
|
101
100
|
]
|
|
102
101
|
|
|
102
|
+
# Gate de tipos canónico del repo: `mypy src` (los 8 paquetes del wheel único,
|
|
103
|
+
# 111 ficheros en verde). `libs/*` y `plugins/*` no aportan código (ver ADR-005),
|
|
104
|
+
# así que un typecheck por miembro sería un falso scope. Lo consume wave-gate.
|
|
105
|
+
[tool.wave-gate]
|
|
106
|
+
typecheck = "mypy src"
|
|
107
|
+
|
|
103
108
|
[tool.pytest.ini_options]
|
|
104
109
|
pythonpath = ["src"]
|
|
105
110
|
testpaths = [
|
|
@@ -111,7 +116,11 @@ testpaths = [
|
|
|
111
116
|
"plugins/podcast/tests",
|
|
112
117
|
"plugins/master/tests",
|
|
113
118
|
]
|
|
114
|
-
|
|
119
|
+
# I4 (2026-10-05, wave-7/T28): cobertura MEDIDA en el run normal (pytest-cov,
|
|
120
|
+
# dev dep). Sin `fail-under` ni exclusiones: medir no es un gate, y un umbral
|
|
121
|
+
# inventado sin baseline sería ruido. Regresión de config:
|
|
122
|
+
# `libs/contract/tests/test_bootstrap.py::TestCoverageConfig`.
|
|
123
|
+
addopts = "-q -n auto --cov=src --cov-report=term-missing --cov-report=xml"
|
|
115
124
|
# Markers: "network" sube a upstream real (gasta red y disco). Opt-in via
|
|
116
125
|
# AIOLI_NET_TESTS=1, lo activa el job smoke-bundles de release.yml.
|
|
117
126
|
markers = [
|
|
@@ -121,6 +130,7 @@ markers = [
|
|
|
121
130
|
[dependency-groups]
|
|
122
131
|
dev = [
|
|
123
132
|
"pytest>=8.0",
|
|
133
|
+
"pytest-cov>=7.0", # I4: cobertura del run normal (term-missing + xml)
|
|
124
134
|
"pillow>=10.0", # solo tests (stubs de imagen); nunca en dependencies
|
|
125
135
|
# H0.4: tooling de CI pineado aqui (no en `uvx` run-steps) para que
|
|
126
136
|
# dependabot lo renueve: no ve herramientas invocadas con `uvx` en los
|
|
@@ -128,6 +138,7 @@ dev = [
|
|
|
128
138
|
"ruff==0.16.8",
|
|
129
139
|
"mypy==2.3.1",
|
|
130
140
|
"pip-audit==2.10.1",
|
|
141
|
+
"pytest-xdist>=3.6",
|
|
131
142
|
]
|
|
132
143
|
|
|
133
144
|
[tool.mypy]
|
|
@@ -161,25 +172,20 @@ ignore_missing_imports = true
|
|
|
161
172
|
module = ["soundfile", "soundfile.*", "tqdm"]
|
|
162
173
|
ignore_missing_imports = true
|
|
163
174
|
|
|
164
|
-
#
|
|
165
|
-
#
|
|
166
|
-
#
|
|
167
|
-
#
|
|
168
|
-
#
|
|
169
|
-
#
|
|
170
|
-
#
|
|
175
|
+
# I3 (2026-10-05, wave-7/T27): los paquetes PROPIOS (`aioli_*`) salen de aquí.
|
|
176
|
+
# Estaban por el falso positivo F-10 (mypy sin venv no resolvía `src/`), pero
|
|
177
|
+
# `ignore_missing_imports` sobre un paquete propio silencia justo lo que debe
|
|
178
|
+
# fallar: un import roto de `aioli_contract`/`aioli_cli`/... pasaba verde.
|
|
179
|
+
# `mypy_path = "src"` + `explicit_package_bases` ya resuelven los paquetes
|
|
180
|
+
# propios con la config leída desde la raíz, que es como lo ejecuta wave-gate y
|
|
181
|
+
# el job `test` de release.yml. Regresión:
|
|
182
|
+
# `libs/contract/tests/test_models_import.py::TestOwnImports`.
|
|
183
|
+
# pytest (dev dep) sí sigue fuera del venv en algunos lenses: ese override se
|
|
184
|
+
# queda.
|
|
171
185
|
[[tool.mypy.overrides]]
|
|
172
|
-
module = ["pytest", "pytest.*"
|
|
186
|
+
module = ["pytest", "pytest.*"]
|
|
173
187
|
ignore_missing_imports = true
|
|
174
188
|
|
|
175
|
-
# DEBT: aioli_music.core.jobs imports aioli_music.core.storage, which does not
|
|
176
|
-
# exist (unimplemented object-storage feature); nothing imports jobs. Decide:
|
|
177
|
-
# implement storage or delete the module. Until then its errors stay hidden
|
|
178
|
-
# but listed here — not silently green.
|
|
179
|
-
[[tool.mypy.overrides]]
|
|
180
|
-
module = ["aioli_music.core.jobs"]
|
|
181
|
-
ignore_errors = true
|
|
182
|
-
|
|
183
189
|
[tool.ruff]
|
|
184
190
|
line-length = 100
|
|
185
191
|
target-version = "py312"
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aioli
|
|
3
|
+
description: Instala, diagnostica y usa aioli (estudio de IA local - voz, música, imagen, vídeo, podcast) en el ordenador del usuario. Úsala cuando el usuario quiera instalar aioli o sus modelos, saber qué puede usar en su equipo, arreglar un fallo de aioli o generar voz, canciones, imágenes o vídeo con aioli.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# aioli: guía para agentes
|
|
7
|
+
|
|
8
|
+
aioli genera voz, música, imagen y vídeo en local. El usuario puede no ser
|
|
9
|
+
técnico: tú ejecutas los comandos, él decide. Todo comando tiene salida
|
|
10
|
+
`--json` estable donde importa; léela en vez de interpretar tablas.
|
|
11
|
+
|
|
12
|
+
## Reglas (no negociables)
|
|
13
|
+
|
|
14
|
+
1. **Pregunta antes de descargar.** Di cuántos GB y para qué; espera un sí.
|
|
15
|
+
2. **Nunca uses `sudo`.** Si falta algo del sistema (ffmpeg), dile al usuario
|
|
16
|
+
el comando exacto y que lo ejecute él.
|
|
17
|
+
3. **Nunca pidas tokens ni contraseñas por el chat.** Ningún modelo del
|
|
18
|
+
catálogo necesita cuenta de HuggingFace; si alguna vez hiciera falta, el
|
|
19
|
+
usuario ejecuta `hf auth login` él mismo.
|
|
20
|
+
4. **Respeta las licencias.** Cada motor trae `license`/`license_note` en
|
|
21
|
+
`aioli status --json`. Si es `no comercial` o `condicional`, avísalo antes
|
|
22
|
+
de instalarlo o de usarlo para algo que el usuario quiera publicar o vender.
|
|
23
|
+
5. **No borres modelos ni configuración** sin que el usuario lo pida.
|
|
24
|
+
6. **No compartas la GPU a ciegas:** si hay otras apps usándola, usa `--gpu`
|
|
25
|
+
(`aioli status --json` → `machine.gpus[].free_gb`).
|
|
26
|
+
|
|
27
|
+
## 1. ¿Está instalado?
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
aioli version # si falla: no está instalado
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Si no está: `uv tool install aioli-cli`. Si tampoco hay `uv`, instálalo
|
|
34
|
+
primero con el instalador oficial de Astral (Linux/Mac:
|
|
35
|
+
`curl -LsSf https://astral.sh/uv/install.sh | sh`; Windows PowerShell:
|
|
36
|
+
`irm https://astral.sh/uv/install.ps1 | iex`) — pide permiso antes. Falta
|
|
37
|
+
`ffmpeg`: dile al usuario el comando de su sistema (regla 2).
|
|
38
|
+
|
|
39
|
+
## 2. Lee el equipo y lo que cabe
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
aioli status --json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- `machine`: sistema, nivel (`patata`/`modesta`/`capaz`/`bicha`), GPUs con
|
|
46
|
+
VRAM libre, RAM y disco libre.
|
|
47
|
+
- `engines[]`: por cada `plugin`/`engine` → `state` (`listo` | `instalable` |
|
|
48
|
+
`no_cabe`), `suggested` (el recomendado para este equipo), `download_gb`,
|
|
49
|
+
`fix` (comando exacto para dejarlo listo), licencia, calidad y velocidad.
|
|
50
|
+
|
|
51
|
+
Propón al usuario los `suggested` que le interesen, con su tamaño y licencia.
|
|
52
|
+
|
|
53
|
+
## 3. Instala lo que el usuario apruebe
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
aioli install --plugins voice,image --yes # usos completos (motor sugerido)
|
|
57
|
+
aioli models download music -b heartmula --yes # un motor concreto (el `fix`)
|
|
58
|
+
aioli backend install video longcat --yes # vídeo: instala WanGP y sus modelos
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Códigos de salida de `aioli install`: `0` hecho, `3` no se eligió nada,
|
|
62
|
+
cualquier otro = error (lee la salida y pasa al paso 5).
|
|
63
|
+
|
|
64
|
+
Comprueba con `aioli status --json` que el motor quedó en `state: "listo"`.
|
|
65
|
+
|
|
66
|
+
## 4. Usarlo
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
aioli voice "Hola, soy Aioli" -o hola.wav # voz (motor por defecto)
|
|
70
|
+
aioli voice profiles create vega --language es # clonar una voz:
|
|
71
|
+
aioli voice profiles add-sample vega muestra.wav # 5-30 s limpios
|
|
72
|
+
aioli voice "Texto" --profile vega -m chatterbox-gguf -o v.wav
|
|
73
|
+
aioli music "rumba alegre, guitarra española" -l letra.txt -o tema.mp3
|
|
74
|
+
aioli music "…" -m heartmula -l letra.txt --gpu auto # mejor dicción en español
|
|
75
|
+
aioli image "un faro en la niebla" -o faro.png
|
|
76
|
+
aioli image "el personaje en la playa" -m flux3-klein -r personaje.png -o p.png
|
|
77
|
+
aioli video "un ajo robot bailando" -o ajo.mp4 # vídeo con voz (NVIDIA)
|
|
78
|
+
aioli video generate "…" -m longcat -r cara.png --audio-guide voz.wav --frames 225 -o avatar.mp4
|
|
79
|
+
# avatar que habla con esa voz
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`aioli <plugin> --help` lista todas las opciones. Las letras de canciones van
|
|
83
|
+
en un fichero de texto con `[verse]`, `[chorus]`, etc.
|
|
84
|
+
|
|
85
|
+
## 5. Si algo falla
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
aioli doctor --json
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`checks[]` trae `name`, `ok` y `detail`. Los `extra:*` de voz en rojo son
|
|
92
|
+
motores opcionales sin instalar: no son un fallo si el usuario no los usa.
|
|
93
|
+
Para un motor concreto, aplica el `fix` de `aioli status --json`. Errores
|
|
94
|
+
típicos y qué hacer:
|
|
95
|
+
|
|
96
|
+
- «No hay espacio en disco»: dile cuánto falta; puede liberar espacio o
|
|
97
|
+
guardar los modelos en otro disco con `AIOLI_MODELS_DIR=/ruta`.
|
|
98
|
+
- «necesita unos N GB de RAM/memoria de vídeo»: ese motor no es para este
|
|
99
|
+
equipo; usa el `suggested`.
|
|
100
|
+
- «checksum mismatch»: repite la descarga; si persiste, avisa al usuario
|
|
101
|
+
(puede ser un problema de red o del repositorio).
|
|
102
|
+
|
|
103
|
+
## 6. Actualizar o desinstalar (solo si lo pide)
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
aioli update --yes # última versión, conserva motores y extras
|
|
107
|
+
aioli uninstall --yes # quita el programa; conserva modelos y creaciones
|
|
108
|
+
aioli uninstall --delete-models --yes # también los modelos (decenas de GB): pregunta antes
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
`uninstall` nunca borra lo que el usuario ha creado ni `~/ai/models`.
|