API Local
<- volver a la raíz del documento
¿Qué hace la API Local?
Audio Forge incluye un pequeño servidor integrado que se ejecuta en tu máquina. Permite que herramientas externas, como un plugin de Elgato Stream Deck, un script personalizado o cualquier aplicación en tu PC, controlen la reproducción a través de HTTP o WebSocket, sin necesidad de software adicional.
Si ya utilizas la integración de MQTT, la API Local admite los mismos comandos exactos. La diferencia es que se ejecuta completamente en tu máquina sin ninguna configuración: no se necesita instalar un broker, ni configurar una red.
Habilitar la API Local
Ve a Configuración → Control externo → API Local y asegúrate de que la función esté habilitada (por defecto, está activada).
Puedes configurar:
- Activado (por defecto: activado).
- Número de Puerto (por defecto: 8329).
- Escuchar en LAN (por defecto: desactivado). Cuando está activado, los dispositivos en tu red local pueden acceder a la API. Cuando está desactivado, solo el software en la misma máquina puede conectarse.
- Clave de API (generada automáticamente). Requerida al conectarse desde otro dispositivo en la red. Puedes copiarla o regenerarla desde Configuración.
Una vez habilitada, Audio Forge escucha en http://localhost:8329. Si “Escuchar en LAN” está activado, escucha en todas las interfaces de red.
Primeros pasos
Abre una terminal e intenta:
# See what's playing right now
curl http://localhost:8329/api/state
# List every library and category
curl http://localhost:8329/api/catalog
# List one-shot Echo sounds that are playing now
curl http://localhost:8329/api/echoes/active
# Play a category
curl -X POST http://localhost:8329/api/command ^
-H "Content-Type: application/json" ^
-d "{\"command\":\"play\",\"section\":\"Music\",\"categoryName\":\"Battle\"}"
Eso es todo, si Audio Forge se está ejecutando con la API Local habilitada, recibirás respuestas en formato JSON inmediatamente.
Puntos finales HTTP
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/state | Estado de reproducción actual |
| GET | /api/catalog | Catálogo completo de la biblioteca y categorías |
| GET | /api/icon/{categoryUuid} | Renderiza un icono de categoría como datos de imagen |
| GET | /api/echoes/active | Sonidos Echo de un solo disparo que se están reproduciendo actualmente |
| GET | /api/info | Versión de la API y características disponibles (consulta Detecting features) |
| GET | /api/ai_director/status | Estado de Director de IA (consulta Director de IA) |
| POST | /api/command | Ejecuta un comando (cuerpo JSON) |
GET /api/state
Devuelve una instantánea JSON de lo que Audio Forge está haciendo en este momento:
{
"libraryUuid": "...",
"libraryName": "[Default]",
"musicPlaying": true,
"ambiancePlaying": false,
"musicVolume": 0.75,
"ambianceVolume": 0.5,
"echoesVolume": 1.0,
"musicCategories": [{"uuid": "...", "name": "Battle"}],
"ambianceCategories": [{"uuid": "...", "name": "Rain"}],
"lastEcho": {"uuid": "...", "name": "Thunder", "at": "2025-06-01T12:34:56Z"},
"categoryVolume": {"<uuid>": 0.5}
}
Todos los campos de volumen utilizan la escala de visualización de la aplicación, desde 0.0 hasta 1.0.
Para Música y Ambiente, 0.5 es el volumen normal (unidad) y 1.0 es el
máximo aumentado. Para Echoes, 1.0 es el volumen normal.
categoryVolume contiene valores de tiempo de ejecución actuales y puede ser escaso. Utiliza el volume de cada
categoría desde /api/catalog cuando necesites un valor completo para cada categoría, incluidas las categorías que aún no se han utilizado.
GET /api/catalog
Devuelve cada biblioteca con sus categorías de Música y Ambiente:
{
"activeLibraryUuid": "...",
"libraries": [
{
"uuid": "...",
"name": "[Default]",
"music": [{
"uuid": "...",
"name": "Battle",
"enabledInForge": true,
"trackCount": 3,
"volume": 0.5
}],
"ambiance": [{
"uuid": "...",
"name": "Rain",
"enabledInForge": false,
"trackCount": 0,
"volume": 0.5
}]
}
]
}
enabledInForgeindica si la categoría es visible y está habilitada en Forge.trackCountes el número de pistas reproducibles instaladas actualmente para esa categoría.volumees el volumen efectivo de la categoría en la escala0.0a1.0. Está presente para cada categoría, incluidas las categorías inactivas.
Para una categoría activa, el catálogo informa su volumen de ejecución actual. Para una
categoría inactiva, informa el volumen objetivo configurado, o 0.5 cuando no
existe un objetivo. Los ajustes de ejecución no reemplazan el objetivo configurado.
Cuando una categoría se reinicia, se utiliza un valor de comando explícito si está presente;
de lo contrario, se utiliza el objetivo configurado. El ajuste de ejecución anterior no se
reutiliza. Restaurar un Enlace de Estado aplica los volúmenes de ejecución registrados en ese
enlace.
GET /api/echoes/active
Devuelve una instantánea de cada sonido de un solo disparo Echo que se está reproduciendo actualmente. Los disparos simultáneos se devuelven como entradas separadas, incluso si utilizan la misma categoría o archivo de sonido.
{
"count": 1,
"sampledAt": "2026-07-24T12:00:02.500Z",
"echoes": [
{
"playbackId": "7b304347-410f-4eaf-bad7-4e8488778302",
"categoryUuid": "2e4d51f1-11ce-46af-a411-0c6bc2c420cb",
"categoryName": "Thunder",
"fileName": "thunder-01.wav",
"startedAt": "2026-07-24T12:00:00.000Z",
"durationMs": 10000,
"positionMs": 2500,
"remainingMs": 7500,
"progress": 0.25,
"progressPercent": 25.0,
"playing": true,
"processingState": "ready"
}
]
}
playbackIdidentifica de forma única este disparador específico. Dos reproducciones superpuestas del mismo categoría reciben diferentes ID.sampledAtes cuándo Audio Forge generó la instantánea. Los valores de posición no se transmiten continuamente, por lo que los clientes deben solicitar una nueva instantánea cuando necesiten el progreso actual.durationMs,remainingMs,progressyprogressPercentsonnullcuando la duración del sonido no está disponible.progressutiliza una escala0.0a1.0.progressPercentutiliza0.0a100.0.fileNamecontiene solo el nombre del archivo, nunca una ruta del sistema de archivos local.- Los sonidos Echo terminados o detenidos se eliminan de la lista.
Los Echo comparten el valor global echoesVolume devuelto por /api/state. No hay un volumen de Echo por reproducción o por categoría.
POST /api/command
Envía un comando JSON en el cuerpo de la solicitud. En caso de éxito:
{"ok": true, "message": "play ok"}
En caso de error:
{"ok": false, "error": "category not found"}
GET /api/icon/{categoryUuid}
Devuelve la imagen del icono de una categoría. Utiliza el UUID de categoría de
/api/catalog. La categoría debe pertenecer a una biblioteca activa. El parámetro
de consulta opcional size establece el tamaño solicitado para los iconos de fuente
y SVG, y utiliza 144 píxeles de forma predeterminada.
- Los iconos de fuente y SVG se renderizan como imágenes PNG y se tiñen con el color de la categoría.
- Si falta un archivo personalizado o no se puede rasterizar un SVG, la API utiliza el icono de fuente como alternativa.
- Los iconos PNG, JPG y JPEG personalizados se devuelven sin cambios; el parámetro
sizese ignora. - Las respuestas correctas utilizan
image/pngoimage/jpegy pueden almacenarse en caché durante una hora. - Si no se encuentra la categoría, la respuesta es
404con{"error":"category not found"}. - Si no se puede renderizar el icono, la respuesta es
500con{"error":"failed to render icon"}.
WebSocket
Para herramientas que desean actualizaciones en tiempo real (como un plugin de Stream Deck que necesita mostrar el estado actual), conéctate a un WebSocket en:
ws://localhost:8329/ws
Enviar comandos
Envía los mismos objetos de comando JSON que enviarías a /api/command:
{"command": "play", "section": "Music", "categoryName": "Battle"}
El servidor responde con un mensaje de resultado para cada comando.
Recibir actualizaciones
El servidor envía automáticamente actualizaciones cada vez que algo cambia. Cada mensaje tiene un campo type:
| type | Cuando se envía | Qué contiene |
|---|---|---|
state | Al conectar + cada vez que cambia la reproducción | Igual que GET /api/state |
catalog | Al conectar + cuando cambian las bibliotecas | Igual que GET /api/catalog |
result | Después de cada comando que envías | ok, message o error, requestId |
echo | Cuando se activa un sonido de eco | uuid, name, at |
hello | Al conectar, primer mensaje | apiVersion y features, ver Detecting features |
ai_director | Al conectar + cuando cambia el Director de IA | Igual que GET /api/ai_director/status |
ai_director_log | Al conectar + a medida que el Director de IA escucha y actúa | Entradas de actividad recientes |
Las actualizaciones de estado se rebotan (250 ms) para que no se te inunde durante los cambios rápidos, como los barridos de volumen.
Los mensajes son objetos JSON planos. La carga útil no está anidada debajo de un campo data o
payload. Ejemplos:
{"type": "state", "musicPlaying": true, "ambiancePlaying": false,
"musicVolume": 0.5, "ambianceVolume": 0.5,
"musicCategories": [], "ambianceCategories": [], "categoryVolume": {}}
{"type": "catalog", "activeLibraryUuid": "<uuid>", "libraries": []}
{"type": "result", "ok": true, "message": "play ok", "requestId": "request-1"}
{"type": "echo", "uuid": "<uuid>", "name": "Thunder",
"at": "2026-07-18T12:34:56Z"}
Comandos
Todos los comandos utilizan el mismo esquema JSON que la integración de MQTT. Cada comando acepta una cadena requestId opcional que puedes utilizar para hacer coincidir las respuestas.
play
Reproducir o reanudar una sección, o seleccionar una categoría específica.
{"command": "play", "section": "Music"}
{"command": "play", "section": "Music", "categoryName": "Battle"}
{"command": "play", "section": "Ambiance", "categoryUuid": "<uuid>"}
- Sin una categoría: reanuda toda la sección.
- Con una categoría: selecciona y reproduce.
- El Ambiente utiliza semántica de alternancia. Reproducir una categoría de Ambiente ya activa la desactiva.
pause
{"command": "pause", "section": "Music"}
stop
{"command": "stop", "section": "Ambiance"}
setActiveLibrary
Cambiar la biblioteca activa por UUID o nombre.
{"command": "setActiveLibrary", "libraryName": "My Library"}
{"command": "setActiveLibrary", "libraryUuid": "<uuid>"}
setVolume
Establecer el volumen para toda la sección, o para una categoría específica dentro de una sección. Utiliza value de 0.0 a 1.0, o de 0 a 100 con valueScale: percent.
{"command": "setVolume", "section": "Music", "value": 1.0}
{"command": "setVolume", "section": "Music", "value": 75, "valueScale": "percent"}
{"command": "setVolume", "section": "Echoes", "value": 0.5}
{"command": "setVolume", "section": "Ambiance", "value": 0.5,
"categoryName": "Rain", "transitionMs": 1000}
El transitionMs opcional controla la rapidez con la que el volumen se desvanece al nuevo nivel (por defecto: 500 ms).
La Música y el Ambiente utilizan la misma escala de visualización que la aplicación: 0.5 es el volumen
normal (unidad) y 1.0 es el máximo aumentado. Los Echo no tienen un rango aumentado, por lo que 1.0 es el volumen normal. La API convierte estos valores de visualización en la ganancia de reproducción interna automáticamente.
nextTrack
Saltar a la siguiente pista en una categoría de Música o Ambiente activa. La categoría debe estar reproduciéndose.
{"command": "nextTrack", "section": "Music", "categoryUuid": "<uuid>"}
{"command": "nextTrack", "section": "Ambiance", "categoryName": "Rain"}
playEcho
Activar un sonido Echo de un solo disparo.
{"command": "playEcho", "categoryName": "Thunder"}
{"command": "playEcho", "section": "Ambiance", "categoryUuid": "<uuid>"}
Si el comando se ejecuta correctamente, espera hasta que la reproducción de Echo esté registrada y devuelve sus campos de seguimiento y reproducción:
{
"ok": true,
"message": "echo played",
"requestId": "play-thunder",
"playbackId": "<playback-id>",
"categoryUuid": "<category-uuid>",
"categoryName": "Thunder",
"fileName": "thunder-01.wav",
"startedAt": "2026-08-09T12:00:00.000Z",
"durationMs": 4000,
"positionMs": 0,
"remainingMs": 4000,
"progress": 0.0,
"progressPercent": 0.0,
"playing": true,
"processingState": "ready"
}
Utiliza el playbackId devuelto con stopEcho para detener solo esta
instancia de reproducción. También puedes actualizar los valores actuales con
GET /api/echoes/active.
stopEcho
Detener la reproducción activa de Echo utilizando exactamente un selector:
{"command": "stopEcho", "playbackId": "<playback-id>"}
{"command": "stopEcho", "categoryUuid": "<category-uuid>"}
{"command": "stopEcho", "categoryName": "Thunder"}
playbackIddetiene solo esa instancia de reproducción. Obtén los ID de reproducción deGET /api/echoes/active.categoryUuiddetiene todos los Echo activos de esa categoría.categoryNamedetiene todos los Echo activos cuya categoría tenga exactamente ese nombre. Si las categorías en varias bibliotecas comparten el mismo nombre, se detendrán todas las coincidencias.- El resultado incluye
stoppedCount. Un selector sin coincidencias activas tiene éxito constoppedCount: 0. - Para detener todos los Echo activos independientemente de la categoría, utiliza
{"command": "stop", "section": "Echoes"}.
setCategoryEnabled
Habilitar o deshabilitar explícitamente una categoría en una sección.
{"command": "setCategoryEnabled", "section": "Ambiance",
"categoryName": "Rain", "enabled": true}
Puedes habilitar una categoría y establecer su volumen de forma atómica incluyendo value.
Si value se omite, se utiliza el volumen objetivo configurado de la categoría. Un
ajuste de ejecución anterior no se reutiliza.
{"command": "setCategoryEnabled", "section": "Ambiance",
"categoryName": "Rain", "enabled": true, "value": 0.5}
restoreState
Restaurar un estado guardado previamente desde un enlace de uso compartido creado por la aplicación.
{"command": "restoreState", "link": "slashpaf://..."}
setConfig
Pasar una configuración a la integración de MQTT (si está conectada). Útil para automatizaciones avanzadas.
{"command": "setConfig", "key": "someKey", "value": "someValue"}
Detección de funciones
Las versiones más recientes de Audio Forge añaden funciones a la API. Así que una herramienta puede determinar qué características admite la aplicación en ejecución, el servidor anuncia su versión. Es el primer mensaje WebSocket, y GET /api/info devuelve lo mismo:
{"type": "hello", "apiVersion": 3,
"features": {"aiDirector": {"available": true, "enabled": true},
"roomControl": {"commands": ["play", "pause", "stop", "..."]}}}
| Field | Meaning |
|---|---|
apiVersion | Comienza en 1. La versión 2 (Audio Forge 1.5.18) añadió el Director de IA. La versión 3 añadió el control de la sala. |
features.aiDirector.available | Esta plataforma admite el Director de IA. |
features.aiDirector.enabled | El Director de IA está activado en la configuración de esta aplicación. |
features.roomControl.commands | Los comandos que un invitado de la sala puede ejecutar. |
Las versiones más antiguas de Audio Forge no envían ningún mensaje hello y no tienen /api/info: trata eso como apiVersion 1 y no llames a nada más reciente. Solo muestra o llama a las funciones del Director de IA cuando available y enabled sean ambos true.
Room control
Cuando alojas una sala en línea, puedes permitir que los invitados controlen Audio Forge desde la página de invitados. Dos comandos establecen quién puede (solo funcionan mientras la sala está abierta):
{"command": "setRoomDefaultPermission", "permission": "control"}
{"command": "setRoomGuestPermission", "clientId": "<guest clientId>", "permission": "listen"}
permission es "listen" (solo tú controlas Audio Forge) o "control". El estado de la sala en GET /api/state (room) incluye entonces defaultGuestPermission y un permission para cada entrada de guests (el efectivo: con "control" como predeterminado, aún puedes establecer un solo invitado en "listen"). room.chatMessages también lista lo que los invitados que controlan han hecho, como entradas con kind: "activity", command y params resueltos; las entradas de chat tienen kind: "chat". Los invitados que se unen o abandonan aparecen como entradas de actividad con command guestJoined, guestLeft, guestRemoved o guestReconnected. Mientras los invitados pueden controlar, Audio Forge también sube los iconos de las categorías al servidor de la sala para que la página de invitados pueda mostrarlos. Los invitados con control solo pueden ejecutar los comandos que figuran en features.roomControl.commands; la captura, la eliminación de invitados, la configuración, el Director de IA y los permisos permanecen contigo.
Director de IA
El Director de IA escucha tu mesa y cambia la música y el ambiente por ti. A través de la API local, puedes iniciarlo y detenerlo, elegir de dónde obtiene su audio, proporcionarle texto y seguir lo que entendió y hizo. Necesita que el Director de IA esté habilitado en la aplicación y que sus modelos estén instalados.
Commands
| Command | Fields | What it does |
|---|---|---|
aiDirectorStart | inputSource (optional), fresh (optional), extraReasoning (optional), device (optional), gpuLayers (optional), threads (optional), probe (optional), whisperGpu (optional) | Empieza a escuchar. Cargar los modelos lleva un tiempo, así que la respuesta llega primero: observa cómo state pasa de activating a listening. fresh: true olvida la escena anterior. extraReasoning anula la configuración de Extra reasoning de la aplicación solo para esta sesión: true le pregunta al modelo una segunda pregunta corta para encontrar el efecto de sonido, lo que es más preciso y un poco más lento. device (solo en Android, para pruebas) es donde se ejecuta el modelo: gpu, cpu o auto; el modelo se vuelve a cargar cuando cambia. gpuLayers y threads (solo en Android, para pruebas, modelos GGUF solamente) establecen las capas de la GPU y el número de hilos de la CPU; 0, el valor predeterminado, mantiene el modelo en la CPU y permite que el motor elija los hilos. probe: true (para ajuste) registra las esperas del hilo principal y los fotogramas lentos, con el tiempo de compilación y rasterización separados, en el registro de depuración para esta sesión. whisperGpu (para pruebas) ejecuta el reconocimiento de voz en la GPU (true) o en la CPU (false) solo para esta sesión; está activado de forma predeterminada; en Android solo se utiliza en las GPU Adreno. Se rechaza con un error si la función está desactivada, no está desbloqueada o los modelos no están instalados. |
aiDirectorStop | Deja de escuchar y libera los modelos. | |
aiDirectorSetInput | inputSource | Cambia de dónde proviene el audio mientras se está ejecutando. |
aiDirectorSendText | text | Proporciona al Director de IA texto como si hubiera sido escuchado, sin micrófono y sin reconocimiento de voz. Consulta a continuación. |
inputSource es "device" (el dispositivo de entrada elegido en Audio Forge, el valor predeterminado) o "remote" (audio enviado por tu herramienta a través de WebSocket).
{"command": "aiDirectorStart", "inputSource": "remote", "fresh": true}
Enviar texto
aiDirectorSendText es “dispara y olvida”: la respuesta solo confirma que el texto se ha puesto en cola. Al igual que con el habla, el Director de IA recopila lo que escucha durante unos segundos y luego decide qué, si es que algo, cambiar. Se rechaza a menos que el Director de IA se esté ejecutando.
{"command": "aiDirectorSendText", "text": "Heavy rain starts to fall on the old market square."}
Esto es útil para herramientas que ya tienen una transcripción, para sesiones basadas en texto y para probar cómo reacciona el Director de IA a una escena.
Estado
GET /api/ai_director/status, y el mensaje WebSocket ai_director, que se envía cada vez que algo cambia:
{"type": "ai_director", "available": true, "enabled": true, "entitled": true,
"modelsReady": true, "state": "listening", "inputSource": "device",
"sceneDescription": "Heavy rain over a market square", "lastTranscript": "...", "error": null}
| Campo | Significado |
|---|---|
entitled | El Director de IA está desbloqueado en esta cuenta. |
modelsReady | Los modelos de voz y lenguaje están instalados. |
state | idle, activating, listening, processing o paused. |
inputSource | device o remote. |
extraReasoning | Si el Razonamiento Extra está activado para esta ejecución. |
backend | El backend de inferencia que el modelo de lenguaje carga (por ejemplo, Vulkan o CPU), o null mientras no está cargado. |
whisperGpu | Si el reconocimiento de voz se ejecuta en la GPU (Vulkan) cuando la compilación tiene una; vuelve a la CPU por sí solo cuando no hay una GPU utilizable. |
whisperBackend | Los dispositivos de cómputo que la biblioteca de reconocimiento de voz puede usar, por ejemplo, CPU; Vulkan0 Radeon 8060S Graphics (gpu), o null antes del primer inicio. Una compilación sin el backend de la GPU solo lista la CPU. |
sceneDescription, lastTranscript | Lo que el Director de IA cree actualmente, y lo último que escuchó. |
error | La razón por la que no pudo iniciarse, si es que hubo alguna. |
Registro de actividad
El mensaje WebSocket ai_director_log contiene lo que el Director de IA escuchó y hizo. Se envía completo cuando te conectas (reset: true, las últimas 100 entradas), y luego solo nuevas entradas:
{"type": "ai_director_log", "reset": false,
"entries": [{"id": 42, "at": "2026-10-27T15:20:48Z", "kind": "transcript", "text": "..."}]}
kind es transcript (lo que se escuchó), action (lo que cambió), error o info.
Para una visión más profunda, GET /api/ai_director/debug?since=<id> devuelve cada entrada después de id, incluyendo el prompt enviado al modelo de lenguaje y su respuesta sin procesar. Está destinado a la afinación, no a la visualización.
Enviar tu propio audio de micrófono
Con inputSource configurado en "remote", envía frames WebSocket binarios de audio sin procesar: 16 kHz, mono, firmado de 16 bits little-endian PCM. Audio Forge aplica su habitual detección de silencio, por lo que puedes transmitir continuamente. Los frames se ignoran mientras la fuente es "device". Solo un cliente WebSocket puede suministrar audio a la vez; cuando se desconecta, el Director de IA vuelve al dispositivo de entrada.
Manejo de errores
Si un comando no se puede ejecutar (por ejemplo, no existe un nombre de categoría o falta un campo requerido), la respuesta contendrá "ok": false y un mensaje error que describe lo que salió mal.
{"ok": false, "error": "category not found"}
{"ok": false, "error": "section required"}
{"ok": false, "error": "invalid json"}
Seguridad
De forma predeterminada, la API Local se vincula a 127.0.0.1 (solo localhost) y no es accesible desde otros dispositivos en tu red.
Si habilitas Escuchar en LAN, la API se vuelve accesible desde otros dispositivos. En ese caso, se requiere una clave de API para todas las solicitudes que no sean de localhost. La clave se genera automáticamente y se muestra en Configuración → Control externo → API Local; pásala con cada solicitud utilizando uno de:
- Encabezado:
Authorization: Bearer <your-api-key> - Parámetro de consulta:
?apiKey=<your-api-key>
Ejemplos:
# Using the Authorization header
curl http://192.168.0.10:8329/api/state ^
-H "Authorization: Bearer your-api-key-here"
# Using the query parameter
curl "http://192.168.0.10:8329/api/state?apiKey=your-api-key-here"
# Sending a command from another device
curl -X POST http://192.168.0.10:8329/api/command ^
-H "Authorization: Bearer your-api-key-here" ^
-H "Content-Type: application/json" ^
-d "{\"command\":\"play\",\"section\":\"Music\",\"categoryName\":\"Battle\"}"
# WebSocket with API key
wscat -c "ws://192.168.0.10:8329/ws?apiKey=your-api-key-here"
Las solicitudes de localhost nunca requieren una clave, incluso cuando el modo LAN está activado.
Puedes regenerar la clave de API en cualquier momento desde Configuración → Control externo → API Local. Todos los clientes conectados previamente necesitarán la nueva clave.
Comportamiento en segundo plano en dispositivos móviles
Los sistemas operativos móviles pueden suspender el manejo de HTTP y WebSocket entrantes cuando Audio Forge se ejecuta en segundo plano o cuando el dispositivo está bloqueado, incluso cuando la reproducción de audio nativa continúa. La API Local no se detiene deliberadamente, pero no puede garantizar la disponibilidad en segundo plano en iOS o Android.
Para un control remoto estable durante una sesión, mantén Audio Forge en primer plano y mantén la pantalla encendida. Esto evita depender de la ejecución en segundo plano que los sistemas móviles pueden detener en cualquier momento.