Die Gemini API mit Lyria RealTime bietet Zugriff auf ein hochmodernes Modell für die Musikgenerierung in Echtzeit per Streaming. Damit können Entwickler Anwendungen erstellen, in denen Nutzer interaktiv instrumentale Musik erstellen, kontinuierlich steuern und ausführen können.
Bei der Musikgenerierung mit Lyria RealTime wird eine persistente, bidirektionale Streamingverbindung mit niedriger Latenz über WebSocket verwendet.
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.
Musik generieren und steuern
Lyria RealTime funktioniert ähnlich wie die Live API, da Websockets verwendet werden, um die Echtzeitkommunikation mit dem Modell aufrechtzuerhalten.
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': 'v1beta'})
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: "v1beta" ,
});
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
Sie können die Musikgenerierung in Echtzeit steuern, indem Sie Prompts senden und die Generierungsparameter in Echtzeit aktualisieren.
Lyria RealTime per Prompt steuern
Während des Streams kannst du jederzeit neue WeightedPrompt-Nachrichten senden, um die generierte Musik zu ändern. Das Modell wird basierend auf der neuen Eingabe sanft umgestellt.
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
from google.genai import types
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.setWeightedPrompts({
weightedPrompts: [
{ text: 'Harmonica', weight: 0.3 },
{ text: 'Afrobeat', weight: 0.7 }
],
});
Die Übergänge zwischen den Modellen können etwas abrupt sein, wenn die Prompts drastisch geändert werden. Es wird daher empfohlen, eine Art Überblendung zu implementieren, indem Sie Zwischengewichtungswerte an das Modell senden.
Konfiguration aktualisieren
Sie können die Musikgenerierung steuern, indem Sie die Parameter für die Musikgenerierung in Echtzeit aktualisieren. Sie können nicht nur einen Parameter aktualisieren, sondern müssen die gesamte Konfiguration festlegen. Andernfalls werden die anderen Felder auf ihre Standardwerte zurückgesetzt.
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 kommt zu einem harten Übergang. Für die anderen Parameter ist das nicht erforderlich.
Python
from google.genai import types
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();
Lyria RealTime-Prompts
Bei Lyria RealTime werden gewichtete Prompts verwendet, um Musikgenres, Instrumente und Stimmungen dynamisch zu kombinieren. Strategien für das Steuern von Prompts, Vokabeln für Keyword-Tags und vollständige Prompt-Beispiele finden Sie im Lyria-Prompt-Leitfaden.
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 Latenz berücksichtigt.
- Effektive Prompts:
- Verwenden Sie anschauliche Worte. Verwenden Sie Adjektive, die Stimmung, Genre und 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 verändern.
- Mit dem Gewicht auf
WeightedPromptkö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 Ausgabesignals beeinflusst. Parameter: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 Übergänge aber 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 bereitgestelltenScale-Enum-Werte. Sie müssen den Kontext für das Modell anhalten/wiedergeben oder zurücksetzen, damit die neue Skala berücksichtigt wird.mute_bass: (bool) Standard:False. Steuert, ob der Bass der Ausgaben reduziert wird.mute_drums: (bool) Standard:False. Steuert, 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 aufQUALITY(Standardwert) oderDIVERSITYvon Musik konzentrieren soll. Sie kann auch aufVOCALIZATIONgesetzt werden, damit das Modell Gesang als weiteres Instrument generiert (fügen Sie sie als neue Prompts hinzu).
PlaybackControl: Befehle zum Steuern von Wiedergabeaspekten wie „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 ist.
Klassische 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 | Tonleiter / 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 / 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 |
B-Dur / Gis-/As-Moll |
SCALE_UNSPECIFIED |
Standard / Das Modell entscheidet |
Das Modell kann die gespielten Noten leiten, unterscheidet aber nicht zwischen relativen Tonarten. Jeder Enum-Wert 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 im Feld
filtered_promptder Ausgabe eine Erklärung angegeben. - 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
- Mit Lyria 3.5 lassen sich komplette Songs und Gesangstracks erstellen.
- Anstelle von Musik können Sie mit TTS-Modellen Unterhaltungen mit mehreren Sprechern generieren.
- Bilder oder Videos generieren
- Wenn Sie nicht Musik oder Audio generieren möchten, können Sie Audiodateien von Gemini analysieren lassen.
- Mit der Live API können Sie sich in Echtzeit mit Gemini unterhalten.
Weitere Codebeispiele und Anleitungen finden Sie im Cookbook.