Generación de música con Lyria RealTime

La API de Gemini, que usa Lyria RealTime, proporciona acceso a un modelo de generación de música en tiempo real y en transmisión de última generación. Permite a los desarrolladores compilar aplicaciones en las que los usuarios pueden crear, dirigir y ejecutar música instrumental de forma interactiva y continua.

Para experimentar lo que se puede compilar con Lyria RealTime, pruébala en AI Studio con las apps Prompt DJ o MIDI DJ.

Cómo funciona la generación de música

La generación de música en tiempo real de Lyria usa una conexión de transmisión persistente, bidireccional y de baja latencia con WebSocket.

Genera y controla música

Lyria RealTime funciona un poco como la API en vivo en el sentido de que usa websockets para mantener una comunicación en tiempo real con el modelo. Aún no es exactamente lo mismo, ya que no puedes hablar con el modelo y debes usar un formato específico para solicitarlo.

En el siguiente código, se muestra cómo generar música:

Python

En este ejemplo, se inicializa la sesión de Lyria RealTime con client.aio.live.music.connect(), luego se envía una instrucción inicial con session.set_weighted_prompts() junto con una configuración inicial con session.set_music_generation_config, se inicia la generación de música con session.play() y se configura receive_audio() para procesar los fragmentos de audio que recibe.

  import asyncio
  from google import genai
  from google.genai import types

  client = genai.Client(api_key=API_KEY, http_options={'api_version': 'v1alpha'})

  async def main():
      async def receive_audio(session):
        """Example background task to process incoming audio."""
        while True:
          async for message in session.receive():
            audio_data = message.server_content.audio_chunks[0].data
            # Process audio...
            await asyncio.sleep(10**-12)

      async with (
        client.aio.live.music.connect(model='models/lyria-realtime-exp') as session,
        asyncio.TaskGroup() as tg,
      ):
        # Set up task to receive server messages.
        tg.create_task(receive_audio(session))

        # Send initial prompts and config
        await session.set_weighted_prompts(
          prompts=[
            types.WeightedPrompt(text='minimal techno', weight=1.0),
          ]
        )
        await session.set_music_generation_config(
          config=types.LiveMusicGenerationConfig(bpm=90, temperature=1.0)
        )

        # Start streaming music
        await session.play()
  if __name__ == "__main__":
      asyncio.run(main())

JavaScript

En este ejemplo, se inicializa la sesión de Lyria RealTime con client.live.music.connect() y, luego, se envía una instrucción inicial con session.setWeightedPrompts() junto con una configuración inicial con session.setMusicGenerationConfig, se inicia la generación de música con session.play() y se configura una devolución de llamada onMessage para procesar los fragmentos de audio que recibe.

import { GoogleGenAI } from '@google/genai';

const ai = new GoogleGenAI({
  apiKey: API_KEY, // Do not store your API client-side!
  apiVersion: 'v1alpha',
});

// Create session object to control music generation.
const session: MusicSession = client.live.music.connect({
  model: 'models/lyria-realtime-exp',
  callbacks: {
    onMessage: (message) => {
      // Application logic: buffer and play using Web Audio API etc.
    },
    onError: (error) => {
      console.error('music session error:', error);
    },
    onClose: () => {
      console.log('Lyria RealTime stream closed.');
    }
  }
}); 

// Send initial prompts and config
await session.setWeightedPrompts({
  weightedPrompts: [{ text: 'minimal techno', weight: 1.0 }],
});
await session.setMusicGenerationConfig({
  musicGenerationConfig: { bpm: 90, temperature: 1.0 },
});

// Start generation
await session.play();

Luego, puedes usar session.play(), session.pause(), session.stop() y session.reset_context() para iniciar, pausar, detener o restablecer la sesión.

Dirige la música en tiempo real

Prompt Lyria RealTime

Mientras la transmisión esté activa, puedes enviar mensajes WeightedPrompt nuevos en cualquier momento para alterar la música generada. El modelo realizará la transición de forma fluida según la entrada nueva.

Las instrucciones deben seguir el formato correcto con un text (la instrucción real) y un weight. weight puede tener cualquier valor, excepto 0. 1.0 suele ser un buen punto de partida.

Python

  await session.set_weighted_prompts(
    prompts=[
      {"text": "Piano", "weight": 2.0},
      types.WeightedPrompt(text="Meditation", weight=0.5),
      types.WeightedPrompt(text="Live Performance", weight=1.0),
    ]
  )

JavaScript

  await session.setMusicGenerationConfig({
    weightedPrompts: [
      { text: 'Harmonica', weight: 0.3 },
      { text: 'Afrobeat', weight: 0.7 }
    ],
  });

Ten en cuenta que las transiciones del modelo pueden ser un poco abruptas cuando se cambian de forma drástica las instrucciones, por lo que se recomienda implementar algún tipo de atenuación cruzada enviando valores de peso intermedios al modelo.

Actualiza la configuración

También puedes actualizar los parámetros de generación de música en tiempo real. No puedes actualizar un parámetro, debes configurar toda la configuración. De lo contrario, los otros campos se restablecerán a sus valores predeterminados.

Dado que actualizar la escala o los bpm es un cambio drástico para el modelo, también deberás indicarle que restablezca su contexto con reset_context() para tener en cuenta la nueva configuración. No se detendrá la transmisión, pero será una transición difícil. No es necesario que lo hagas para los otros parámetros.

Python

  await session.set_music_generation_config(
    config=types.LiveMusicGenerationConfig(
      bpm=128,
      scale=types.Scale.D_MAJOR_B_MINOR,
    )
  )
  await session.reset_context();

JavaScript

  await session.setMusicGenerationConfig({
    musicGenerationConfig: { bpm: 120, density: 0.75 },
  });
  await session.reset_context();

Guía de instrucciones para Lyria RealTime

Esta es una lista no exhaustiva de instrucciones que puedes usar para solicitar Lyria RealTime:

  • Instrumentos: 303 Acid Bass, 808 Hip Hop Beat, Accordion, Alto Saxophone, Bagpipes, Balalaika Ensemble, Banjo, Bass Clarinet, Bongos, Boomy Bass, Bouzouki, Buchla Synths, Cello, Charango, Clavichord, Conga Drums, Didgeridoo, Dirty Synths, Djembe, Drumline, Dulcimer, Fiddle, Flamenco Guitar, Funk Drums, Glockenspiel, Guitar, Hang Drum, Harmonica, Harp, Harpsichord, Hurdy-gurdy, Kalimba, Koto, Lyre, Mandolin, Maracas, Marimba, Mbira, Mellotron, Metallic Twang, Moog Oscillations, Ocarina, Persian Tar, Pipa, Precision Bass, Ragtime Piano, Rhodes Piano, Shamisen, Shredding Guitar, Sitar, Slide Guitar, Smooth Pianos, Spacey Synths, Steel Drum, Synth Pads, Tabla, TR-909 Drum Machine, Trumpet, Tuba, Vibraphone, Viola Ensemble, Warm Acoustic Guitar, Woodwinds, ...
  • Género musical: Acid Jazz, Afrobeat, Alternative Country, Baroque, Bengal Baul, Bhangra, Bluegrass, Blues Rock, Bossa Nova, Breakbeat, Celtic Folk, Chillout, Chiptune, Classic Rock, Contemporary R&B, Cumbia, Deep House, Disco Funk, Drum & Bass, Dubstep, EDM, Electro Swing, Funk Metal, G-funk, Garage Rock, Glitch Hop, Grime, Hyperpop, Indian Classical, Indie Electronic, Indie Folk, Indie Pop, Irish Folk, Jam Band, Jamaican Dub, Jazz Fusion, Latin Jazz, Lo-Fi Hip Hop, Marching Band, Merengue, New Jack Swing, Minimal Techno, Moombahton, Neo-Soul, Orchestral Score, Piano Ballad, Polka, Post-Punk, 60s Psychedelic Rock, Psytrance, R&B, Reggae, Reggaeton, Renaissance Music, Salsa, Shoegaze, Ska, Surf Rock, Synthpop, Techno, Trance, Trap Beat, Trip Hop, Vaporwave, Witch house, ...
  • Estado de ánimo/descripción: Acoustic Instruments, Ambient, Bright Tones, Chill, Crunchy Distortion, Danceable, Dreamy, Echo, Emotional, Ethereal Ambience, Experimental, Fat Beats, Funky, Glitchy Effects, Huge Drop, Live Performance, Lo-fi, Ominous Drone, Psychedelic, Rich Orchestration, Saturated Tones, Subdued Melody, Sustained Chords, Swirling Phasers, Tight Groove, Unsettling, Upbeat, Virtuoso, Weird Noises, ...

Estos son solo algunos ejemplos, Lyria RealTime puede hacer mucho más. Experimenta con tus propias instrucciones.

Prácticas recomendadas

  • Las aplicaciones cliente deben implementar un almacenamiento en búfer de audio sólido para garantizar una reproducción fluida. Esto ayuda a tener en cuenta el jitter de la red y las ligeras variaciones en la latencia de generación.
  • Instrucciones eficaces:
    • Sea descriptivo. Usa adjetivos que describan el estado de ánimo, el género y la instrumentación.
    • Itera y dirige gradualmente. En lugar de cambiar completamente la consigna, intenta agregar o modificar elementos para transformar la música de forma más fluida.
    • Experimenta con el peso en WeightedPrompt para influir en la intensidad con la que una instrucción nueva afecta la generación en curso.

Detalles técnicos

En esta sección, se describen los detalles para usar la generación de música en tiempo real de Lyria.

Especificaciones

  • Formato de salida: Audio PCM sin procesar de 16 bits
  • Tasa de muestreo: 48 kHz
  • Canales: 2 (estéreo)

Controles

Para influir en la generación de música en tiempo real, envía mensajes que contengan lo siguiente:

  • WeightedPrompt: Es una cadena de texto que describe una idea musical, un género, un instrumento, un estado de ánimo o una característica. Se pueden proporcionar varias instrucciones para combinar las influencias. Consulta más arriba para obtener más detalles sobre cómo solicitar mejor a Lyra RealTime.
  • MusicGenerationConfig: Configuración para el proceso de generación de música, que influye en las características del audio de salida. Los parámetros incluyen lo siguiente:
    • guidance: (número de punto flotante) Rango: [0.0, 6.0]. Valor predeterminado: 4.0. Controla la rigurosidad con la que el modelo sigue las instrucciones. Una guía más detallada mejora el cumplimiento de la instrucción, pero hace que las transiciones sean más abruptas.
    • bpm: (int) Rango: [60, 200]. Establece las pulsaciones por minuto que deseas para la música generada. Debes detener o reproducir, o restablecer el contexto del modelo para que tenga en cuenta el nuevo bpm.
    • density: (número de punto flotante) Rango: [0.0, 1.0]. Controla la densidad de las notas o los sonidos musicales. Los valores más bajos producen música más escasa, mientras que los valores más altos producen música “más cargada”.
    • brightness: (número de punto flotante) Rango: [0.0, 1.0]. Ajusta la calidad tonal. Los valores más altos producen un audio con un sonido más “brillante”, que suele enfatizar las frecuencias más altas.
    • scale: (enum) Establece la escala musical (clave y modo) para la generación. Usa los valores de enumeración Scale que proporciona el SDK. Debes detener o reproducir, o restablecer el contexto del modelo para que tenga en cuenta la nueva escala.
    • mute_bass: (booleano) Valor predeterminado: False. Controla si el modelo reduce los graves de las salidas.
    • mute_drums: (booleano) Valor predeterminado: False. Controla si los resultados del modelo reducen los tambores de los resultados.
    • only_bass_and_drums: (booleano) Valor predeterminado: False. Orienta el modelo para que intente producir solo graves y batería.
  • PlaybackControl: Comandos para controlar aspectos de la reproducción, como reproducir, pausar, detener o restablecer el contexto.

Para bpm, density, brightness y scale, si no se proporciona ningún valor, el modelo decidirá lo que es mejor según tus instrucciones iniciales.

Los parámetros más clásicos, como temperature (de 0.0 a 3.0, predeterminado 1.1), top_k (de 1 a 1,000, predeterminado 40) y seed (de 0 a 2,147,483,647, seleccionado de forma aleatoria de forma predeterminada), también se pueden personalizar en MusicGenerationConfig.

Escala los valores de enum

Estos son todos los valores de escala que puede aceptar el modelo:

Valor de enum Escala o clave
C_MAJOR_A_MINOR Do mayor / La menor
D_FLAT_MAJOR_B_FLAT_MINOR Re♭ mayor / Si♭ menor
D_MAJOR_B_MINOR D mayor / B menor
E_FLAT_MAJOR_C_MINOR E♭ mayor / C menor
E_MAJOR_D_FLAT_MINOR E mayor / C♯/D♭ menor
F_MAJOR_D_MINOR Fa mayor / re menor
G_FLAT_MAJOR_E_FLAT_MINOR G♭ mayor / E♭ menor
G_MAJOR_E_MINOR G mayor / E menor
A_FLAT_MAJOR_F_MINOR La♭ mayor / Fa menor
A_MAJOR_G_FLAT_MINOR A mayor / F♯/G♭ menor
B_FLAT_MAJOR_G_MINOR Si bemol mayor / Sol menor
B_MAJOR_A_FLAT_MINOR Si mayor / Sol♯/La♭ menor
SCALE_UNSPECIFIED Predeterminado / El modelo decide

El modelo es capaz de guiar las notas que se tocan, pero no distingue entre las claves relativas. Por lo tanto, cada enum corresponde a la versión principal y secundaria relativa. Por ejemplo, C_MAJOR_A_MINOR correspondería a todas las teclas blancas de un piano, y F_MAJOR_D_MINOR serían todas las teclas blancas excepto B bemol.

Limitaciones

  • Solo instrumental: El modelo solo genera música instrumental.
  • Seguridad: Los filtros de seguridad verifican las instrucciones. Se ignorarán las instrucciones que activen los filtros, en cuyo caso se escribirá una explicación en el campo filtered_prompt del resultado.
  • Marca de agua: El audio de salida siempre tiene una marca de agua para su identificación de acuerdo con nuestros principios de IA responsable.

¿Qué sigue?

Explora el libro de recetas para obtener más instructivos y ejemplos de código.