Cinco motores de música, un solo adaptador
Escuchar el artículo (experimental) · 09:29

Hace poco, un cliente potencial me pidió estimar el alcance de añadir generación de música con IA a su producto. Dos generadores, el usuario elige un estilo y sale una canción. En la superficie es una petición POST a un proveedor y un botón de reproducción. Acabé mapeando la mayor parte del mercado para responder a sus preguntas, y el panorama resultó lo bastante interesante como para construir la integración cinco veces, contra cinco motores distintos, para mostrar lo que de verdad hace falta. El resultado es una pequeña prueba de concepto funcional: una capa de adaptadores, cinco proveedores, una CLI y una interfaz de estudio dockerizada donde cambiar de motor es un desplegable.
Esto es lo que enseña ese ejercicio.
La llamada a la API es la parte fácil
La generación de música no es petición y respuesta. Una pista tarda entre 30 segundos y unos minutos en renderizarse, así que la ingeniería de verdad está en todo lo que rodea la llamada: un modelo de trabajos, webhooks o polling con backoff, reintentos que toleren un endpoint de estado inestable, timeouts que fallen haciendo ruido, y almacenamiento. Sobre todo almacenamiento. Las URLs de los proveedores caducan: uno borra los archivos a los 14 días, otro a la semana, un tercero mata el enlace a las 24 horas. Si tu producto guarda la URL del proveedor en lugar del audio, la biblioteca de tus usuarios se pudre en silencio. La primera regla al construir sobre estas APIs es descargar el archivo en el momento en que un trabajo termina con éxito y guardarlo en un almacenamiento que sea tuyo.
Cinco proveedores, cinco formas distintas
Los cinco motores que integré, y la forma que resultó tener cada uno:
- Suno, revendido. Suno no tiene API pública de primera mano, así que el sonido favorito del mercado llega a través de revendedores no oficiales. El que integré exige una URL de callback aunque hagas polling, responde al polling en camelCase y a los webhooks en snake_case para los mismos datos, y devuelve dos variaciones de la pista por petición.
- MiniMax. Con soporte oficial y, sorprendentemente, síncrono: la respuesta HTTP de la llamada de creación ya contiene la pista terminada. La integración más simple posible, y el enlace devuelto muere en 24 horas.
- ACE-Step. Un modelo de pesos abiertos con licencia Apache servido a través de una API de colas. La palabra del esquema de autenticación es literalmente "Key" en lugar de "Bearer", y no hay campo de prompt: quiere etiquetas de estilo y letra, donde "[inst]" significa instrumental.
- Treblo. Una API de primera mano cuyo endpoint de estado devuelve un string JSON a secas, cuyo formato de salida por defecto es ogg y que exige atribución visible en cualquier producto de cara al usuario. Además cambió de marca desde Sonauto y movió los endpoints a mitad de mi investigación, lo que pareció el universo subrayando la tesis de este artículo.
- Eleven Music. Síncrono como MiniMax, pero el cuerpo de la respuesta son los bytes de audio en crudo. Sin id de trabajo, sin URL, nada que consultar. Captura los bytes o piérdelos.
Cinco proveedores, cinco esquemas de autenticación, tres modelos asíncronos, dos convenciones de nomenclatura en las respuestas y un cambio de marca en una sola semana. Nada de esto debería acercarse siquiera al código de tu producto.
El adaptador es la decisión de producto
La solución es vieja, aburrida y funciona: pon cada motor detrás de un único contrato. El mío son dos funciones, crear un trabajo y refrescar un trabajo, ambas devolviendo la misma forma normalizada. La orquestación, el almacenamiento, la interfaz y la facturación nunca se enteran de qué motor se ejecutó. Añadir un proveedor es un archivo; cambiar de proveedor es un string de configuración; y cuando un revendedor muere de la noche a la mañana, cambia de marca o por fin aparece una API oficial, reconfiguras en lugar de reescribir.
Esa última frase no es hipotética. Los wrappers no oficiales se asientan sobre un terreno legalmente disputado mientras las demandas de las discográficas contra los creadores de los modelos siguen su curso, y el wrapper que integras hoy puede no existir con el mismo nombre el próximo trimestre. Lo vi ocurrir a mitad de proyecto. El adaptador no es una floritura de arquitectura, es la póliza de seguros.
Lo que preguntarán los abogados
Las preguntas que de verdad deciden qué motor puedes usar no tienen nada que ver con la calidad del sonido:
- Derechos comerciales. Un proveedor te cede la propiedad de los resultados en sus términos. Otro concede el uso comercial solo a través de textos de marketing, sin ninguna licencia contractual detrás. Un tercero guarda silencio total para los clientes de API. Son tres posiciones de riesgo muy distintas que se ven idénticas en una demo de la funcionalidad.
- Marcas de agua. Un motor se reserva el derecho de añadir marcas de agua a su discreción. Otro ofrece credenciales de contenido opcionales. El modelo de pesos abiertos no tiene ninguna. Si la marca de tu cliente no puede cargar con una marca de agua, esto es un filtro, no una preferencia.
- Atribución. Un motor exige un crédito "Powered by" visible en tu interfaz. Eso es una restricción de diseño de producto escondida dentro de una página de términos.
- Indemnización. Ninguno de los cinco te defenderá si una pista generada acaba demasiado cerca de la canción de alguien. Ese riesgo se queda contigo, lo que en la práctica significa que tus términos de servicio lo trasladan a tus usuarios. Merece una hora de abogado antes del lanzamiento, no después.
Guardo todo esto en una tabla comparativa en el repositorio, junto al código, porque esa tabla cambia qué adaptador activas mucho más a menudo que cualquier benchmark.
Escúchalo
Un prompt, directo a través del adaptador: una canción sobre un marido y su mujer en Banff, paseando por la orilla del lago Louise, nieve en las cumbres, enamorándose otra vez. Lo que sigue es exactamente lo que volvió, una sola generación, sin elegir la mejor de varias.
Treblo (Melodia v3), 2 minutos y 50:
Una nota de estas dos generaciones: el prompt pedía voces masculinas cálidas, y Treblo cantó la primera toma con voz de mujer. La segunda, abajo, puso la voz masculina en las primeras palabras del prompt, y también la cantó una mujer. Este motor no expone ningún parámetro de género vocal (Suno vía kie.ai tiene un vocalGender literal), lo que convierte un requisito de una palabra en una lotería. Es una lección que vale los créditos: cuando un control importa para tu producto, elige un motor que lo exponga como parámetro, no como sugerencia en el prompt.
Esta sección crece a medida que paso el mismo prompt por los demás motores; sus versiones quedarán aquí lado a lado. Cada salida está generada por IA, y los derechos sobre ella se rigen por los términos del proveedor.
Míralo en marcha

Lo que hay detrás de este artículo es real y está funcionando: una edición CLI en Node del adaptador, sin dependencias, y un estudio dockerizado con FastAPI y React donde los motores y sus modelos son desplegables, un motor simulado demuestra el pipeline completo sin claves de API, y cada pista terminada queda en almacenamiento local en cuanto se completa, porque a estas alturas ya sabes por qué. Lo guardo como un prototipo privado que funciona, y la ventaja de un prototipo es que el siguiente, el tuyo, se construye mucho más rápido.
Si estás dimensionando generación de música, o cualquier funcionalidad generativa que corra sobre el modelo de otro, la forma de la respuesta es la misma: el proveedor es un plugin, el contrato es tuyo, y las partes aburridas, la cola, el almacenamiento, los términos, son donde vive realmente el proyecto. Ese es también exactamente el tipo de proyecto que ayudo a los equipos a sacar adelante.
Preguntas que responde este artículo
¿Por qué montar un adaptador en vez de llamar directamente a la API del proveedor?
Porque el proveedor es la pieza que más probablemente cambie bajo tus pies. Suno no tiene API pública de primera mano, así que su sonido llega a través de revendedores no oficiales que se asientan sobre un terreno legalmente disputado mientras siguen su curso las demandas de las discográficas contra los creadores de los modelos, y Treblo cambió de marca desde Sonauto y movió sus endpoints a mitad de esta investigación. Detrás de un único contrato eso es un string de configuración; cableado directamente en el código del producto, es una reescritura.
¿Cuánto tiempo siguen disponibles las pistas generadas en la URL del proveedor?
No lo bastante como para montar una biblioteca encima. Un proveedor borra los archivos a los 14 días, otro a la semana y un tercero mata el enlace a las 24 horas, y Eleven Music devuelve los bytes de audio en crudo, sin URL alguna. Descarga el archivo en el momento en que un trabajo termina con éxito y guárdalo en un almacenamiento que sea tuyo, o la biblioteca de tus usuarios se pudre en silencio.
¿Puedo usar música generada con IA de forma comercial en mi producto?
Depende por completo del motor que hayas elegido, y los cinco se diferencian. Uno te cede la propiedad de los resultados en sus términos, otro concede el uso comercial solo a través de textos de marketing, sin ninguna licencia contractual detrás, y un tercero guarda silencio total para los clientes de API. Además, uno se reserva el derecho de añadir marcas de agua a su discreción y otro exige un crédito visible en tu interfaz, y ninguno de los cinco te defenderá si una pista generada acaba demasiado cerca de la canción de alguien.
¿Por qué el motor ignoró el prompt y cantó la canción con la voz equivocada?
Porque un prompt es una pista y no un control. El prompt de la canción de Banff pedía voces masculinas cálidas y Treblo cantó la primera toma con voz de mujer; poner la voz masculina en las primeras palabras del prompt dio una segunda toma cantada también por una mujer. Treblo no expone ningún parámetro de género vocal, mientras que Suno vía kie.ai tiene un vocalGender literal, así que cuando un control importa para tu producto elige un motor que lo exponga como parámetro.
Leer a continuación
AICuando la IA tiene que grabar su propia revisión
Cuando se abre una pull request, sea mía o una que me toca revisar, ahora le pido al agente que la ejecute en mi máquina, que intente romperla y que se grabe mientras lo hace. Un párrafo puede asegurar que se hizo una prueba. Una grabación tiene que enseñarla, y decidir qué significa sigue siendo cosa mía.
AIJev responde en probabilidades. La pregunta sigue siendo tuya.
Jev, de TypeSafe, no escribe ni una frase. Le entregas un estado y unas preguntas tipadas, y te devuelve una elección, una puntuación o una probabilidad de sí o no, a cuatro milésimas de céntimo por una decisión sobre mil tokens. La novedad es la forma, que devuelve la autoridad a tu código, y la trampa es que una probabilidad parece un recurso y no lo es. Ejecuté el piloto que pediría antes de creerme ningún número, sobre mis propios ensayos con el modelo abierto que sustituyó a Jev, y la respuesta fue no.