Musikgenerierung mit Lyria RealTime

Die Gemini API bietet mit Lyria RealTime Zugriff auf ein hochmodernes Modell zur Echtzeitgenerierung von Streamingmusik. Mit dieser Technologie können Entwickler Apps erstellen, mit denen Nutzer interaktiv Instrumentalmusik erstellen, kontinuierlich steuern und abspielen können.

Wenn Sie sehen möchten, was mit Lyria RealTime möglich ist, können Sie die Apps Prompt DJ oder MIDI DJ in AI Studio ausprobieren.

So funktioniert die Musikgenerierung

Für die Echtzeit-Musikgenerierung von Lyria wird eine persistente, bidirektionale Streamingverbindung mit niedriger Latenz über WebSocket verwendet.

Musik generieren und steuern

Lyria RealTime funktioniert ähnlich wie die Live API, da sie WebSockets verwendet, um eine Echtzeitkommunikation mit dem Modell aufrechtzuerhalten. Es ist aber noch nicht ganz dasselbe, da Sie nicht mit dem Modell sprechen können und ein bestimmtes Format verwenden müssen, um es zu fragen.

Im folgenden Code wird gezeigt, wie Musik generiert wird:

Python

In diesem Beispiel wird die Lyria RealTime-Sitzung mit client.aio.live.music.connect() initialisiert. Anschließend wird mit session.set_weighted_prompts() ein erster Prompt zusammen mit einer ersten Konfiguration mit session.set_music_generation_config gesendet. Die Musikgenerierung wird mit session.play() gestartet und receive_audio() wird eingerichtet, um die empfangenen Audio-Chunks zu verarbeiten.

  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

In diesem Beispiel wird die Lyria RealTime-Sitzung mit client.live.music.connect() initialisiert. Anschließend wird mit session.setWeightedPrompts() ein erster Prompt zusammen mit einer ersten Konfiguration mit session.setMusicGenerationConfig gesendet. Die Musikgenerierung wird mit session.play() gestartet und ein onMessage-Callback wird eingerichtet, um die empfangenen Audio-Chunks zu verarbeiten.

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

Mit session.play(), session.pause(), session.stop() und session.reset_context() können Sie die Sitzung dann starten, pausieren, beenden oder zurücksetzen.

Musik in Echtzeit steuern

Prompt Lyria RealTime

Solange der Stream aktiv ist, kannst du jederzeit neue WeightedPrompt-Nachrichten senden, um die generierte Musik zu ändern. Das Modell wechselt dann nahtlos auf die neue Eingabe.

Die Prompts müssen dem richtigen Format mit einer text (der tatsächliche Prompt) und einer weight entsprechen. weight kann jeden Wert außer 0 haben. 1.0 ist in der Regel ein guter Ausgangspunkt.

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 }
    ],
  });

Hinweis: Bei drastischen Änderungen der Prompts können die Modellübergänge etwas abrupt sein. Daher wird empfohlen, eine Art Cross-Fading zu implementieren, indem Zwischengewichtswerte an das Modell gesendet werden.

Konfiguration aktualisieren

Außerdem kannst du die Parameter für die Musikerzeugung in Echtzeit aktualisieren. Sie können nicht nur einen Parameter aktualisieren, sondern müssen die gesamte Konfiguration festlegen. Andernfalls werden die anderen Felder auf die Standardwerte zurückgesetzt.

Da das Aktualisieren der BPM oder der Tonleiter eine drastische Änderung für das Modell darstellt, musst du es auch mit reset_context() zum Zurücksetzen des Kontexts auffordern, damit die neue Konfiguration berücksichtigt wird. Der Stream wird dadurch nicht beendet, aber die Umstellung ist schwierig. Bei den anderen Parametern ist das nicht erforderlich.

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

Prompt-Leitfaden für Lyria RealTime

Im Folgenden finden Sie eine unvollständige Liste von Prompts, die Sie für Lyria RealTime verwenden können:

  • Instrumente: 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, ...
  • Musikgenre: 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, ...
  • Stimmung/Beschreibung: 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, ...

Das sind nur einige Beispiele. Lyria RealTime kann noch viel mehr. Probieren Sie es mit eigenen Prompts aus.

Best Practices

  • Clientanwendungen müssen eine robuste Audiopufferung implementieren, um eine flüssige Wiedergabe zu ermöglichen. So können Netzwerkjitter und geringfügige Abweichungen bei der Generierungslatenz berücksichtigt werden.
  • Effektive Prompts:
    • Verwenden Sie anschauliche Worte. Verwende Adjektive, die Stimmung, Genre und Instrumentierung beschreiben.
    • Optimieren Sie schrittweise. Anstatt den Prompt komplett zu ändern, kannst du Elemente hinzufügen oder ändern, um die Musik flüssiger zu verändern.
    • Mit dem Gewicht unter WeightedPrompt können Sie beeinflussen, wie stark sich ein neuer Prompt auf die aktuelle Generierung auswirkt.

Technische Details

In diesem Abschnitt wird die Verwendung der Echtzeit-Musikgenerierung von Lyria beschrieben.

Spezifikationen

  • Ausgabeformat: Rohes 16-Bit-PCM-Audio
  • Abtastrate: 48 kHz
  • Kanäle: 2 (Stereo)

Steuerelemente

Die Musikgenerierung kann in Echtzeit durch das Senden von Nachrichten beeinflusst werden, die Folgendes enthalten:

  • WeightedPrompt: Ein Textstring, der eine musikalische Idee, ein Genre, ein Instrument, eine Stimmung oder ein Merkmal beschreibt. Es können mehrere Prompts angegeben werden, um Einflüsse zu kombinieren. Weitere Informationen dazu, wie Sie Lyria RealTime am besten anregen, finden Sie oben.
  • MusicGenerationConfig: Konfiguration für den Musikgenerierungsprozess, die die Eigenschaften der Ausgabeaudio beeinflusst. Zu den Parametern gehören:
    • guidance: (float) Bereich: [0.0, 6.0]. Standard: 4.0. Steuert, wie genau das Modell den Prompts folgt. Eine höhere Anleitung verbessert die Einhaltung des Prompts, macht aber Übergänge abrupter.
    • bpm: (int) Bereich: [60, 200]. Hier legen Sie die gewünschten Schläge pro Minute für die generierte Musik fest. Du musst den Kontext für das Modell anhalten/wiedergeben oder zurücksetzen, damit die neue BPM berücksichtigt wird.
    • density: (float) Bereich: [0.0, 1.0]. Damit wird die Dichte der Noten/Töne gesteuert. Je niedriger der Wert, desto spärlicher ist die Musik. Je höher der Wert, desto „belebter“ ist die Musik.
    • brightness: (float) Bereich: [0.0, 1.0]. Passt die Tonqualität an. Höhere Werte sorgen für einen „höheren“ Klang, bei dem in der Regel höhere Frequenzen betont werden.
    • scale: (Enum) Mit dieser Option wird die Tonleiter (Tonart und Modus) für die Generierung festgelegt. Verwende die vom SDK bereitgestellten Scale-Enum-Werte. Sie müssen den Kontext für das Modell anhalten/wiedergeben oder zurücksetzen, damit die neue Skalierung berücksichtigt wird.
    • mute_bass: (bool) Standard: False. Hiermit wird festgelegt, ob das Modell den Bass der Ausgabe reduziert.
    • mute_drums: (bool) Standard: False. Hiermit wird festgelegt, ob die Trommeln der Ausgabe bei der Modellausgabe reduziert werden.
    • only_bass_and_drums: (bool) Standard: False. Legen Sie fest, dass das Modell nur Bass und Schlagzeug ausgeben soll.
  • PlaybackControl: Befehle zur Steuerung der Wiedergabe, z. B. Wiedergabe, Pause, Stopp oder Kontext zurücksetzen.

Wenn für bpm, density, brightness und scale kein Wert angegeben wird, entscheidet das Modell anhand Ihrer ursprünglichen Prompts, was am besten geeignet ist.

Auch klassischere Parameter wie temperature (0,0 bis 3,0, Standardwert 1,1), top_k (1 bis 1.000, Standardwert 40) und seed (0 bis 2.147.483.647, standardmäßig zufällig ausgewählt) können in MusicGenerationConfig angepasst werden.

Enum-Werte skalieren

Hier sind alle Skalenwerte, die vom Modell akzeptiert werden:

Enum-Wert Maßstab / Tonart
C_MAJOR_A_MINOR C-Dur / a-Moll
D_FLAT_MAJOR_B_FLAT_MINOR Des-Dur / B-Moll
D_MAJOR_B_MINOR D-Dur / B-Moll
E_FLAT_MAJOR_C_MINOR Es-Dur / C-Moll
E_MAJOR_D_FLAT_MINOR E-Dur / C♯-/Des-Moll
F_MAJOR_D_MINOR F-Dur / D-Moll
G_FLAT_MAJOR_E_FLAT_MINOR G♭-Dur / Es-Moll
G_MAJOR_E_MINOR G-Dur / E-Moll
A_FLAT_MAJOR_F_MINOR As-Dur / f-Moll
A_MAJOR_G_FLAT_MINOR A-Dur / F♯-/G♭-Moll
B_FLAT_MAJOR_G_MINOR B♭-Dur / G-Moll
B_MAJOR_A_FLAT_MINOR B-Dur / G♯/A♭-Moll
SCALE_UNSPECIFIED Standardeinstellung / Modell entscheidet

Das Modell kann die gespielten Noten anleiten, unterscheidet aber nicht zwischen relativen Tonarten. Jedes Enum entspricht also sowohl der relativen Haupt- als auch der relativen Nebenversion. C_MAJOR_A_MINOR würde beispielsweise allen weißen Tasten eines Klaviers entsprechen und F_MAJOR_D_MINOR allen weißen Tasten mit Ausnahme von B ♭.

Beschränkungen

  • Nur Instrumentalmusik: Das Modell generiert nur Instrumentalmusik.
  • Sicherheit: Prompts werden durch Sicherheitsfilter geprüft. Prompts, die die Filter auslösen, werden ignoriert. In diesem Fall wird eine Erklärung in das Feld filtered_prompt der Ausgabe geschrieben.
  • Wasserzeichen: Das Ausgabeaudio wird gemäß unseren Grundsätzen für verantwortungsbewusste KI immer mit einem Wasserzeichen versehen.

Nächste Schritte

  • Anstelle von Musik kannst du mit den TTS-Modellen Unterhaltungen mit mehreren Sprechern generieren.
  • Bilder oder Videos erstellen
  • Statt Musik oder Audio zu generieren, können Sie herausfinden, wie Gemini Audiodateien verstehen kann.
  • Mit der Live API können Sie in Echtzeit mit Gemini sprechen.

Weitere Codebeispiele und Anleitungen finden Sie im Rezeptbuch.