Geração de música usando o Lyria RealTime

A API Gemini, que usa o Lyria RealTime, oferece acesso a um modelo de geração de música em streaming em tempo real de última geração. Ele permite que os desenvolvedores criem aplicativos em que os usuários possam criar, direcionar e tocar música instrumental interativamente.

Para conferir o que pode ser criado com o Lyria RealTime, teste no AI Studio usando os apps Prompt DJ ou MIDI DJ.

Como a geração de música funciona

A geração de música em tempo real do Lyria usa uma conexão de streaming persistente, bidirecional e de baixa latência usando o WebSocket.

Gerar e controlar músicas

O Lyria RealTime funciona um pouco como a API Live, no sentido de usar websockets para manter uma comunicação em tempo real com o modelo. Ainda não é exatamente igual, porque não é possível conversar com o modelo, e é necessário usar um formato específico para incentivá-lo.

O código abaixo demonstra como gerar músicas:

Python

Este exemplo inicializa a sessão do Lyria RealTime usando client.aio.live.music.connect() e, em seguida, envia um prompt inicial com session.set_weighted_prompts() junto com uma configuração inicial usando session.set_music_generation_config, inicia a geração de música usando session.play() e configura receive_audio() para processar os fragmentos de áudio recebidos.

  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

Este exemplo inicializa a sessão do Lyria RealTime usando client.live.music.connect() e, em seguida, envia um prompt inicial com session.setWeightedPrompts() junto com uma configuração inicial usando session.setMusicGenerationConfig, inicia a geração de música usando session.play() e configura um callback onMessage para processar os fragmentos de áudio recebidos.

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();

Em seguida, use session.play(), session.pause(), session.stop() e session.reset_context() para iniciar, pausar, parar ou redefinir a sessão.

Controlar a música em tempo real

Prompt Lyria RealTime

Enquanto a transmissão estiver ativa, você poderá enviar novas mensagens WeightedPrompt a qualquer momento para alterar a música gerada. O modelo vai fazer a transição de forma suave com base na nova entrada.

As instruções precisam seguir o formato correto com um text (a instrução real) e um weight. O weight pode ter qualquer valor, exceto 0. 1.0 geralmente é um bom ponto 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 }
    ],
  });

As transições do modelo podem ser um pouco abruptas quando mudam drasticamente as instruções. Por isso, é recomendável implementar algum tipo de transição cruzada enviando valores de peso intermediários para o modelo.

Atualizar a configuração

Também é possível atualizar os parâmetros de geração de música em tempo real. Não é possível atualizar apenas um parâmetro. É necessário definir toda a configuração. Caso contrário, os outros campos serão redefinidos para os valores padrão.

Como a atualização do bpm ou da escala é uma mudança drástica para o modelo, você também precisa dizer a ele para redefinir o contexto usando reset_context() para considerar a nova configuração. A transmissão não será interrompida, mas a transição será difícil. Não é necessário fazer isso para os outros 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();

Guia de comandos para o Lyria RealTime

Confira uma lista não exaustiva de comandos que podem ser usados para acionar o 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, ...
  • Humor/descrição: 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, ...

Esses são apenas alguns exemplos, o Lyria RealTime pode fazer muito mais. Teste seus próprios comandos.

Práticas recomendadas

  • Os aplicativos clientes precisam implementar um buffer de áudio robusto para garantir uma reprodução tranquila. Isso ajuda a explicar o jitter de rede e pequenas variações na latência de geração.
  • Comandos eficazes:
    • Utilize descrições. Use adjetivos que descrevam o clima, o gênero e a instrumentação.
    • Faça iterações e direcione gradualmente. Em vez de mudar completamente a instrução, tente adicionar ou modificar elementos para transformar a música de maneira mais suave.
    • Experimente o peso em WeightedPrompt para influenciar a intensidade com que um novo comando afeta a geração em andamento.

Detalhes técnicos

Esta seção descreve as especificidades de como usar a geração de música do Lyria RealTime.

Especificações

  • Formato de saída: áudio PCM bruto de 16 bits
  • Taxa de amostragem: 48 kHz
  • Canais: 2 (estéreo)

Controles

A geração de músicas pode ser influenciada em tempo real com o envio de mensagens contendo:

  • WeightedPrompt: uma string de texto que descreve uma ideia, gênero, instrumento, clima ou característica musical. Vários comandos podem ser fornecidos para misturar influências. Consulte acima para mais detalhes sobre como solicitar melhor o Lyria RealTime.
  • MusicGenerationConfig: configuração para o processo de geração de música, influenciando as características do áudio de saída. Os parâmetros incluem:
    • guidance: (ponto flutuante) Intervalo: [0.0, 6.0]. Padrão: 4.0. Controla o quanto o modelo segue as instruções. Uma orientação mais alta melhora a adesão ao comando, mas torna as transições mais abruptas.
    • bpm: (int) Intervalo: [60, 200]. Define a quantidade de BPM que você quer para a música gerada. É necessário parar/reproduzir ou redefinir o contexto para que o modelo leve em consideração o novo bpm.
    • density: (ponto flutuante) Intervalo: [0.0, 1.0]. Controla a densidade das notas/sons musicais. Valores mais baixos produzem músicas mais espaçadas, e valores mais altos produzem músicas mais "agitadas".
    • brightness: (ponto flutuante) Intervalo: [0.0, 1.0]. Ajusta a qualidade tonal. Valores mais altos produzem áudio com som "mais brilhante", geralmente enfatizando frequências mais altas.
    • scale: (tipo enumerado) define a escala musical (chave e modo) para a geração. Use os valores de tipo enumerado Scale fornecidos pelo SDK. É necessário parar/reproduzir ou redefinir o contexto do modelo para que ele leve em conta a nova escala.
    • mute_bass: (bool) Padrão: False. Controla se o modelo reduz os graves das saídas.
    • mute_drums: (bool) Padrão: False. Controla se as saídas do modelo reduzem os tambores das saídas.
    • only_bass_and_drums: (bool) Padrão: False. Direcione o modelo para tentar gerar apenas baixo e bateria.
  • PlaybackControl: comandos para controlar aspectos da reprodução, como tocar, pausar, parar ou redefinir o contexto.

Para bpm, density, brightness e scale, se nenhum valor for fornecido, o modelo vai decidir o que é melhor de acordo com suas solicitações iniciais.

Parâmetros mais clássicos, como temperature (0,0 a 3,0, padrão 1,1), top_k (1 a 1.000, padrão 40) e seed (0 a 2.147.483.647, selecionado aleatoriamente por padrão) também podem ser personalizados no MusicGenerationConfig.

Escalar valores de tipo enumerado

Confira todos os valores de escala que o modelo pode aceitar:

Valor de tipo enumerado Escala / Chave
C_MAJOR_A_MINOR C maior / A menor
D_FLAT_MAJOR_B_FLAT_MINOR D♭ maior / B♭ menor
D_MAJOR_B_MINOR D maior / B menor
E_FLAT_MAJOR_C_MINOR E♭ maior / C menor
E_MAJOR_D_FLAT_MINOR E maior / C♯/D♭ menor
F_MAJOR_D_MINOR F maior / D menor
G_FLAT_MAJOR_E_FLAT_MINOR G♭ maior / E♭ menor
G_MAJOR_E_MINOR G maior / E menor
A_FLAT_MAJOR_F_MINOR A♭ maior / F menor
A_MAJOR_G_FLAT_MINOR A maior / F♯/G♭ menor
B_FLAT_MAJOR_G_MINOR B♭ maior / G menor
B_MAJOR_A_FLAT_MINOR B maior / G♯/A♭ menor
SCALE_UNSPECIFIED Padrão / O modelo decide

O modelo é capaz de orientar as notas que são tocadas, mas não distingue entre as teclas relativas. Assim, cada tipo enumerado corresponde ao principal e secundário relativo. Por exemplo, C_MAJOR_A_MINOR corresponde a todas as teclas brancas de um piano, e F_MAJOR_D_MINOR corresponde a todas as teclas brancas menos si bemol.

Limitações

  • Somente instrumental: o modelo gera apenas músicas instrumentais.
  • Segurança: os comandos são verificados por filtros de segurança. As solicitações que acionarem os filtros serão ignoradas. Nesse caso, uma explicação será gravada no campo filtered_prompt da saída.
  • Marca d'água: o áudio de saída sempre tem uma marca d'água para identificação, seguindo os princípios da IA responsável.

A seguir

Consulte o livro de receitas para mais exemplos de código e tutoriais.