Lyria Studio
Una herramienta musical que genera una pista a partir de un prompt en un chat con el modelo Lyria RealTime de Google, y luego la abre en un estudio para dividirla en secciones y regenerar cualquiera de ellas. La construí durante mi pasantía en DevFortress, primero como un solo prototipo en Streamlit y luego en tres partes: un chat en Next.js, un backend en FastAPI y un estudio en Streamlit.
Arquitectura
El chat es una página en Next.js que envía el prompt, la duración, el BPM y la densidad a un endpoint de FastAPI. El backend abre un WebSocket hacia Lyria RealTime a través de la API de Gemini, escribe el audio que llega en streaming en un archivo WAV y le devuelve el archivo al chat para reproducirlo. Un enlace Open in Studio pasa el nombre del archivo y el prompt original al estudio en Streamlit, que divide la pista en secciones iguales y regenera la que elijo con su propio prompt, BPM y densidad. Pydub empalma cada sección nueva en una copia de trabajo, y al exportar el resultado se guarda como un nuevo archivo WAV para descargar.
Decisiones clave
Un chat para las ideas, un estudio para editar
El prototipo era una sola app de Streamlit que cambiaba entre una vista simple y un editor. En la V2 la separé: un chat en Next.js le pide las pistas a un backend en FastAPI, y el estudio en Streamlit mantiene la edición en Python, junto al código de audio. Eso me permitió publicar el chat por sí solo en Vercel, mientras el estudio corre en local.
Cada sección tiene su propio prompt
El estudio divide la pista en secciones iguales, de 1 a 10. Una sección se regenera con su propio prompt de in-painting, su BPM y su densidad, así que el puente puede volverse más denso o más lento mientras el resto de la pista queda igual. El prompt arranca como el original, así que un cambio pequeño es un retoque pequeño.
Las ediciones nunca tocan el original
Una sección regenerada es primero una candidata que puedo escuchar junto a la pista. Solo Commit Change la inserta, y solo en una copia de trabajo. Exportar escribe un WAV nuevo, así que el original generado siempre está ahí para volver a él.
La parte difícil
Convertir un modelo de jam en vivo en un archivo editable
Lyria RealTime está hecho para tocar en vivo, como un jam: mando un prompt y PLAY por WebSocket, y el audio sigue llegando sin fin, porque nada en la petición fija una duración. Para tener una pista de duración exacta, cuento bytes: 24,000 muestras por segundo, dos canales, 2 bytes cada una, o sea 96,000 bytes por segundo. Los fragmentos se escriben en un WAV conforme llegan, y STOP sale en cuanto se alcanza la cuenta. Regenerar una sección del medio sumó las uniones: un clip nuevo empieza y termina en frío, así que le pido a Lyria la sección más la mitad del fundido y la mezclo en ambos extremos con un fundido cruzado de 1 a 5 segundos.
Seguridad y rendimiento
- La clave de API de Google vive solo en una variable de entorno del backend. El navegador habla con mi endpoint de FastAPI y nunca ve la clave ni la conexión con Lyria.
- La API no tiene cuentas y solo acepta un prompt y tres ajustes numéricos. Por ahora el CORS está abierto a cualquier origen, y el README indica que en producción debe limitarse al dominio del chat.