Musikgenerierung mit Lyria RealTime

Die Gemini API mit Lyria RealTime bietet Zugriff auf ein hochmodernes Modell zur Musikgenerierung in Echtzeit. Damit können Entwickler Anwendungen erstellen, in denen Nutzer interaktiv instrumentale Musik erstellen, kontinuierlich steuern und ausführen 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

Bei der Echtzeit-Musikgenerierung mit 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 Websockets verwendet werden, um eine Echtzeitkommunikation mit dem Modell aufrechtzuerhalten. Es ist immer noch nicht genau dasselbe, da Sie nicht mit dem Modell sprechen können und einen bestimmten Prompt verwenden müssen.

Der folgende Code zeigt, 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 gesendet, zusammen mit einer ersten Konfiguration mit session.set_music_generation_config. 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(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 mit session.play() gestartet und ein onMessage-Callback eingerichtet, um die empfangenen Audio-Chunks zu verarbeiten.

import { GoogleGenAI } from "@google/genai";
import Speaker from "speaker";
import { Buffer } from "buffer";

const client = new GoogleGenAI({
  apiKey: GEMINI_API_KEY,
    apiVersion: "v1alpha" ,
});

async function main() {
  const speaker = new Speaker({
    channels: 2,       // stereo
    bitDepth: 16,      // 16-bit PCM
    sampleRate: 44100, // 44.1 kHz
  });

  const session = await client.live.music.connect({
    model: "models/lyria-realtime-exp",
    callbacks: {
      onmessage: (message) => {
        if (message.serverContent?.audioChunks) {
          for (const chunk of message.serverContent.audioChunks) {
            const audioBuffer = Buffer.from(chunk.data, "base64");
            speaker.write(audioBuffer);
          }
        }
      },
      onerror: (error) => console.error("music session error:", error),
      onclose: () => console.log("Lyria RealTime stream closed."),
    },
  });

  await session.setWeightedPrompts({
    weightedPrompts: [
      { text: "Minimal techno with deep bass, sparse percussion, and atmospheric synths", weight: 1.0 },
    ],
  });

  await session.setMusicGenerationConfig({
    musicGenerationConfig: {
      bpm: 90,
      temperature: 1.0,
      audioFormat: "pcm16",  // important so we know format
      sampleRateHz: 44100,
    },
  });

  await session.play();
}

main().catch(console.error);

Anschließend können Sie session.play(), session.pause(), session.stop() und session.reset_context() verwenden, um die Sitzung zu starten, zu pausieren, zu beenden oder zurückzusetzen.

Musik in Echtzeit steuern

Prompt an Lyria RealTime senden

Während des Streams kannst du jederzeit neue WeightedPrompt-Nachrichten senden, um die generierte Musik zu ändern. Das Modell reagiert fließend auf die neue Eingabe.

Die Prompts müssen das richtige Format haben, mit einem text (dem eigentlichen Prompt) und einem weight. weight kann jeden Wert außer 0 annehmen. 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 }
    ],
  });

Die Modellübergänge können etwas abrupt sein, wenn Sie die Prompts drastisch ändern. Es wird daher empfohlen, eine Art Überblendung zu implementieren, indem Sie Zwischengewichtungswerte an das Modell senden.

Konfiguration aktualisieren

Sie können die Parameter für die Musikgenerierung auch in Echtzeit aktualisieren. Sie können nicht nur einen Parameter aktualisieren, sondern müssen die gesamte Konfiguration festlegen, da die anderen Felder sonst auf ihre Standardwerte zurückgesetzt werden.

Da das Aktualisieren des BPM oder des Maßstabs eine drastische Änderung für das Modell darstellt, müssen Sie ihm auch mitteilen, dass es seinen Kontext mit reset_context() zurücksetzen soll, damit die neue Konfiguration berücksichtigt wird. Der Stream wird dadurch nicht beendet, aber es wird einen harten Übergang geben. Für die anderen Parameter ist das nicht erforderlich.

Python

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

JavaScript

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

Anleitung für Prompts für Lyria RealTime

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

  • Zahlungsmittel: 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 eigene Prompts aus.

Best Practices

  • Clientanwendungen müssen ein robustes Audio-Buffering implementieren, um eine reibungslose Wiedergabe zu gewährleisten. So werden Netzwerk-Jitter und geringfügige Schwankungen bei der Generierungslatenz berücksichtigt.
  • Effektive Prompts:
    • Verwenden Sie anschauliche Worte. Verwende Adjektive, die die Stimmung, das Genre und die Instrumentierung beschreiben.
    • Schrittweise iterieren und steuern. Anstatt den Prompt komplett zu ändern, können Sie Elemente hinzufügen oder ändern, um die Musik sanfter zu morphen.
    • Mit dem Gewicht auf WeightedPrompt können Sie beeinflussen, wie stark sich ein neuer Prompt auf die laufende Generierung auswirkt.

Technische Details

In diesem Abschnitt wird beschrieben, wie Sie die Musikgenerierung in Echtzeit mit Lyria verwenden.

Spezifikationen

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

Steuerelemente

Die Musikgenerierung kann in Echtzeit beeinflusst werden, indem Nachrichten mit folgenden Inhalten gesendet werden:

  • WeightedPrompt: Ein Textstring, der eine musikalische Idee, ein Genre, ein Instrument, eine Stimmung oder eine Eigenschaft beschreibt. Es können mehrere Prompts angegeben werden, um Einflüsse zu kombinieren. Oben finden Sie weitere Informationen dazu, wie Sie Lyria RealTime am besten auffordern.
  • MusicGenerationConfig: Konfiguration für die Musikgenerierung, die die Eigenschaften des Ausgabes beeinflusst. Folgende Parameter sind verfügbar:
    • guidance: (float) Bereich: [0.0, 6.0]. Standard: 4.0. Steuert, wie streng sich das Modell an die Prompts hält. Bei einer höheren Gewichtung wird der Prompt besser eingehalten, aber die Übergänge sind abrupter.
    • bpm: (int) Bereich: [60, 200]. Legt die Anzahl der Beats pro Minute für die generierte Musik fest. Sie müssen den Kontext für das Modell stoppen/wiedergeben oder zurücksetzen, damit die neuen BPM berücksichtigt werden.
    • density: (float) Bereich: [0.0, 1.0]. Steuert die Dichte von Noten/Klängen. Niedrigere Werte führen zu spärlicherer Musik, höhere Werte zu „geschäftigerer“ Musik.
    • brightness: (float) Bereich: [0.0, 1.0]. Passt die tonale Qualität an. Höhere Werte führen zu einem „helleren“ Klang, bei dem in der Regel höhere Frequenzen betont werden.
    • scale: (Enum) Legt die Tonleiter (Tonart und Modus) für die Generierung fest. Verwenden Sie die vom SDK bereitgestellten Scale-Enum-Werte. Sie müssen den Kontext für das Modell beenden/wiedergeben oder zurücksetzen, damit die neue Skalierung berücksichtigt wird.
    • mute_bass: (bool) Standard: False. Steuert, ob das Modell den Bass der Ausgaben reduziert.
    • mute_drums: (bool) Standard: False. Legt fest, ob das Modell die Schlagzeugspuren in der Ausgabe reduziert.
    • only_bass_and_drums: (bool) Standard: False. Weisen Sie das Modell an, nur Bass und Schlagzeug auszugeben.
    • music_generation_mode: (Enum) Gibt an, ob sich das Modell auf QUALITY (Standardwert) oder DIVERSITY von Musik konzentrieren soll. Sie kann auch auf VOCALIZATION gesetzt werden, damit das Modell Gesang als weiteres Instrument generiert (fügen Sie ihn als neuen Prompt hinzu).
  • PlaybackControl: Befehle zum Steuern der Wiedergabe, z. B. zum Abspielen, Pausieren, Stoppen oder Zurücksetzen des Kontexts.

Für bpm, density, brightness und scale wird, wenn kein Wert angegeben ist, vom Modell entschieden, was gemäß Ihren ursprünglichen Prompts am besten ist.

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 ebenfalls in der MusicGenerationConfig angepasst werden.

Enum-Werte skalieren

Hier sind alle Skalenwerte, die das Modell akzeptieren kann:

Enum-Wert Maßstab / Legende
C_MAJOR_A_MINOR C-Dur / A-Moll
D_FLAT_MAJOR_B_FLAT_MINOR Des-Dur / B-Moll
D_MAJOR_B_MINOR D-Dur / H-Moll
E_FLAT_MAJOR_C_MINOR Es-Dur / C-Moll
E_MAJOR_D_FLAT_MINOR E-Dur / Cis-/Des-Moll
F_MAJOR_D_MINOR F-Dur / D-Moll
G_FLAT_MAJOR_E_FLAT_MINOR Ges-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 / Fis-Moll/Ges-Moll
B_FLAT_MAJOR_G_MINOR B-Dur / G-Moll
B_MAJOR_A_FLAT_MINOR H-Dur / Gis-/As-Moll
SCALE_UNSPECIFIED Standard / Das Modell entscheidet

Das Modell kann die gespielten Noten leiten, unterscheidet aber nicht zwischen relativen Tonarten. Jedes Enum entspricht also sowohl dem relativen Dur als auch dem relativen Moll. C_MAJOR_A_MINOR würde beispielsweise allen weißen Tasten eines Klaviers entsprechen und F_MAJOR_D_MINOR allen weißen Tasten außer B.

Beschränkungen

  • Nur Instrumental: Das Modell generiert nur Instrumentalmusik.
  • Sicherheit: Prompts werden von Sicherheitsfiltern 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: Die Audioausgabe wird immer mit einem Wasserzeichen versehen, um sie gemäß unseren Grundsätzen für verantwortungsbewusste KI identifizieren zu können.

Nächste Schritte

Weitere Codebeispiele und Anleitungen finden Sie im Cookbook.