Referencia de API REST¶
Esta sección documenta la API REST del Daemon Voice2Machine (v0.2.0+).
Arquitectura Actualizada
Voice2Machine utiliza FastAPI para la comunicación cliente-servidor, reemplazando el sistema anterior basado en Unix Sockets IPC. Esto permite probar endpoints directamente con curl o cualquier cliente HTTP.
Información General¶
| Propiedad | Valor |
|---|---|
| Base URL | http://localhost:8765 |
| Protocolo | HTTP/1.1 + WebSocket |
| Formato | JSON (UTF-8) |
| Documentación Interactiva | http://localhost:8765/docs (Swagger UI) |
Endpoints REST¶
POST /toggle¶
Toggle de grabación (iniciar/detener). Este es el endpoint principal que usa el atajo de teclado.
bash
curl -X POST http://localhost:8765/toggle | jq
json
{
"status": "recording",
"message": "Grabación iniciada",
"text": null
}
json
{
"status": "idle",
"message": "Transcripción completada",
"text": "El texto transcrito aparece aquí..."
}
POST /start¶
Inicia grabación explícitamente. Útil cuando necesitas control separado de inicio/fin.
bash
curl -X POST http://localhost:8765/start | jq
json
{
"status": "recording",
"message": "Grabación iniciada",
"text": null
}
POST /stop¶
Detiene grabación y transcribe el audio capturado.
bash
curl -X POST http://localhost:8765/stop | jq
json
{
"status": "idle",
"message": "Transcripción completada",
"text": "El texto transcrito aparece aquí..."
}
POST /llm/process¶
Procesa texto con LLM (limpieza, puntuación, formato). El backend se selecciona según config.toml.
bash
curl -X POST http://localhost:8765/llm/process \
-H "Content-Type: application/json" \
-d '{"text": "hola como estas espero que bien"}' | jq
json
{
"text": "Hola, ¿cómo estás? Espero que bien.",
"backend": "gemini"
}
POST /llm/translate¶
Traduce texto a otro idioma usando LLM.
bash
curl -X POST http://localhost:8765/llm/translate \
-H "Content-Type: application/json" \
-d '{"text": "Buenos días", "target_lang": "en"}' | jq
json
{
"text": "Good morning",
"backend": "gemini"
}
GET /status¶
Retorna el estado actual del daemon.
bash
curl http://localhost:8765/status | jq
json
{
"state": "idle",
"recording": false,
"model_loaded": true
}
Estados posibles:
| Estado | Descripción |
|---|---|
idle |
Esperando comandos |
recording |
Grabando audio |
processing |
Transcribiendo o procesando con LLM |
GET /health¶
Health check para systemd/scripts de monitoreo.
bash
curl http://localhost:8765/health | jq
json
{
"status": "ok",
"version": "0.2.0"
}
WebSocket¶
WS /ws/events¶
Stream de eventos en tiempo real. Útil para mostrar transcripción provisional mientras el usuario habla.
const ws = new WebSocket('ws://localhost:8765/ws/events');
ws.onmessage = (event) => {
const { event: eventType, data } = JSON.parse(event.data);
console.log(`Evento: ${eventType}`, data);
};
```
=== "Conexión (Python)"
```python
import asyncio
import websockets
async def listen():
async with websockets.connect('ws://localhost:8765/ws/events') as ws:
async for message in ws:
print(message)
asyncio.run(listen())
```
**Eventos emitidos:**
| Evento | Campos | Descripción |
| ---------------------- | -------------------------------- | ---------------------------------------------------- |
| `transcription_update` | `text: str`, `final: bool` | Actualización de transcripción (provisional o final) |
| `heartbeat` | `timestamp: float`, `state: str` | Latido para mantener conexión viva |
---
## Modelos de Datos
### ToggleResponse
```python
class ToggleResponse(BaseModel):
status: str # 'recording' | 'idle'
message: str # Mensaje descriptivo
text: str | None # Texto transcrito (solo en stop)
StatusResponse¶
class StatusResponse(BaseModel):
state: str # 'idle' | 'recording' | 'processing'
recording: bool # True si está grabando
model_loaded: bool # True si Whisper está en VRAM
LLMResponse¶
class LLMResponse(BaseModel):
text: str # Texto procesado/traducido
backend: str # 'gemini' | 'ollama' | 'local'
Códigos de Error¶
| Código HTTP | Significado |
|---|---|
200 |
Operación exitosa |
422 |
Error de validación (payload inválido) |
500 |
Error interno del servidor |
Depuración
Usa la documentación interactiva en http://localhost:8765/docs para probar endpoints visualmente.