L'API Gemini, che utilizza Lyria RealTime, fornisce l'accesso a un modello di generazione di musica in streaming in tempo reale allo stato dell'arte. Consente agli sviluppatori di creare applicazioni in cui gli utenti possono creare, dirigere e suonare musica strumentale in modo interattivo.
La generazione di musica Lyria RealTime utilizza una connessione di streaming persistente, bidirezionale e a bassa latenza tramite WebSocket.
Per provare cosa si può creare con Lyria RealTime, provalo su AI Studio utilizzando le app Prompt DJ o MIDI DJ.
Generare e controllare la musica
Lyria RealTime funziona in modo simile all'API Live, in quanto utilizza i websocket per mantenere la comunicazione in tempo reale con il modello.
Il seguente codice mostra come generare musica:
Python
Questo esempio inizializza la sessione Lyria RealTime utilizzando
client.aio.live.music.connect(), quindi invia un
prompt iniziale con session.set_weighted_prompts() insieme a una configurazione
iniziale utilizzando session.set_music_generation_config, avvia la generazione
di musica utilizzando session.play() e configura
receive_audio() per elaborare i blocchi audio che riceve.
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
Questo esempio inizializza la sessione Lyria RealTime utilizzando
client.live.music.connect(), quindi invia un
prompt iniziale con session.setWeightedPrompts() insieme a una configurazione
iniziale utilizzando session.setMusicGenerationConfig, avvia la generazione
di musica utilizzando session.play() e configura un
callback onMessage per elaborare i blocchi audio che riceve.
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);
Puoi quindi utilizzare session.play(), session.pause(), session.stop() e
session.reset_context() per avviare, mettere in pausa, interrompere o reimpostare la sessione.
Controllare la musica in tempo reale
Puoi guidare la generazione di musica in tempo reale inviando prompt e aggiornando i parametri di generazione in tempo reale.
Prompt di Lyria RealTime
Mentre lo stream è attivo, puoi inviare nuovi messaggi WeightedPrompt in qualsiasi momento per modificare la musica generata. Il modello passerà senza problemi in base
al nuovo input.
I prompt devono seguire il formato corretto con un text (il
prompt vero e proprio) e un weight. weight può assumere qualsiasi valore tranne 0. 1.0
è un buon punto di partenza.
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 }
],
});
Tieni presente che le transizioni del modello possono essere un po' brusche quando si modificano drasticamente i prompt, pertanto è consigliabile implementare una sorta di dissolvenza incrociata inviando al modello valori di peso intermedi.
Aggiorna la configurazione
Puoi guidare la generazione di musica aggiornando i parametri di generazione di musica in tempo reale. Non puoi semplicemente aggiornare un parametro, devi impostare l'intera configurazione, altrimenti gli altri campi verranno ripristinati ai valori predefiniti.
Poiché l'aggiornamento del bpm o della scala è una modifica drastica per il modello, devi anche indicare di reimpostare il contesto utilizzando reset_context() per tenere conto della nuova configurazione. Non interromperà lo stream, ma la transizione sarà
brusca. Non è necessario farlo per gli altri parametri.
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();
Prompt di Lyria RealTime
Lyria RealTime utilizza prompt ponderati per combinare generi musicali, strumenti e stati d'animo in modo dinamico. Per esplorare le strategie di guida dei prompt, i vocabolari dei tag delle parole chiave e gli esempi di prompt completi, consulta la guida ai prompt di Lyria.
Best practice
- Le applicazioni client devono implementare un buffering audio efficace per garantire una riproduzione fluida. Ciò consente di tenere conto del jitter di rete e delle lievi variazioni nella latenza di generazione.
- Prompt efficaci:
- Fornisci una descrizione dettagliata. Utilizza aggettivi che descrivano il mood, il genere e la strumentazione.
- Itera e sterza gradualmente. Anziché modificare completamente il prompt, prova ad aggiungere o modificare elementi per trasformare la musica in modo più fluido.
- Sperimenta con il peso su
WeightedPromptper influenzare l'intensità con cui un nuovo prompt influisce sulla generazione in corso.
Dettagli tecnici
Questa sezione descrive i dettagli su come utilizzare la generazione di musica in tempo reale di Lyria.
Specifiche
- Formato di output: audio PCM a 16 bit non elaborato
- Frequenza di campionamento: 48 kHz
- Canali: 2 (stereo)
Controlli
La generazione di musica può essere influenzata in tempo reale dall'invio di messaggi contenenti:
WeightedPrompt: una stringa di testo che descrive un'idea musicale, un genere, uno strumento, un'atmosfera o una caratteristica. È possibile fornire più prompt per combinare le influenze. Per maggiori dettagli su come creare prompt efficaci per Lyria RealTime, consulta la sezione precedente.MusicGenerationConfig: Configurazione per il processo di generazione di musica, che influenza le caratteristiche dell'audio di output. Parametri include:guidance: (float) Range:[0.0, 6.0]. Valore predefinito:4.0. Controlla il livello di aderenza del modello ai prompt. Una guida più elevata migliora l'aderenza al prompt, ma rende le transizioni più brusche.bpm: (int) Intervallo:[60, 200]. Imposta i battiti al minuto che vuoi per la musica generata. Devi interrompere/riprodurre o reimpostare il contesto del modello in modo che tenga conto del nuovo bpm.density: (float) Range:[0.0, 1.0]. Controlla la densità delle note/dei suoni musicali. Valori più bassi producono musica più rada, mentre valori più alti producono musica più "frenetica".brightness: (float) Range:[0.0, 1.0]. Regola la qualità tonale. I valori più alti producono un audio più "brillante", generalmente enfatizzando le frequenze più alte.scale: (Enum) Imposta la scala musicale (tonalità e modo) per la generazione. Utilizza ivalori di enumerazioneScaleforniti dall'SDK. Devi interrompere/riprodurre o reimpostare il contesto del modello per tenere conto della nuova scala.mute_bass: (booleano) Valore predefinito:False. Controlla se il modello riduce i bassi degli output.mute_drums: (booleano) Valore predefinito:False. Controlla se l'output del modello riduce le batterie degli output.only_bass_and_drums: (booleano) Valore predefinito:False. Guida il modello a cercare di generare solo basso e batteria.music_generation_mode: (enumerazione) Indica al modello se deve concentrarsi suQUALITY(valore predefinito) oDIVERSITYdella musica. Può anche essere impostato suVOCALIZATIONper consentire al modello di generare vocalizzazioni come un altro strumento (aggiungendole come nuovi prompt).
PlaybackControl: Comandi per controllare gli aspetti della riproduzione, ad esempio riproduci, metti in pausa, interrompi o reimposta il contesto.
Per bpm, density, brightness e scale, se non viene fornito alcun valore, il modello deciderà qual è la soluzione migliore in base ai prompt iniziali.
Anche i parametri più classici come temperature (da 0,0 a 3,0, valore predefinito 1,1), top_k (da 1 a 1000, valore predefinito 40) e seed (da 0 a 2.147.483.647, selezionato casualmente per impostazione predefinita) sono personalizzabili in MusicGenerationConfig.
Scala valori enum
Di seguito sono riportati tutti i valori di scala che il modello può accettare:
| Valore enum | Scala / Tonalità |
|---|---|
C_MAJOR_A_MINOR |
Do maggiore / La minore |
D_FLAT_MAJOR_B_FLAT_MINOR |
Re♭ maggiore / Si♭ minore |
D_MAJOR_B_MINOR |
Re maggiore / Si minore |
E_FLAT_MAJOR_C_MINOR |
Mi♭ maggiore / Do minore |
E_MAJOR_D_FLAT_MINOR |
Mi maggiore / Do#/Re♭ minore |
F_MAJOR_D_MINOR |
Fa maggiore / Re minore |
G_FLAT_MAJOR_E_FLAT_MINOR |
Sol♭ maggiore / Mi♭ minore |
G_MAJOR_E_MINOR |
Sol maggiore / Mi minore |
A_FLAT_MAJOR_F_MINOR |
La♭ maggiore / Fa minore |
A_MAJOR_G_FLAT_MINOR |
La maggiore / fa diesis minore/sol bemolle minore |
B_FLAT_MAJOR_G_MINOR |
Si♭ maggiore / Sol minore |
B_MAJOR_A_FLAT_MINOR |
Si maggiore / Sol#/La♭ minore |
SCALE_UNSPECIFIED |
Predefinito / Decide il modello |
Il modello è in grado di guidare le note riprodotte, ma non distingue tra tonalità relative. Pertanto, ogni enum corrisponde sia alla
relativa maggiore che minore. Ad esempio, C_MAJOR_A_MINOR corrisponderebbe a tutti i tasti bianchi di un pianoforte, mentre F_MAJOR_D_MINOR a tutti i tasti bianchi tranne il Si bemolle.
Limitazioni
- Solo strumentale: il modello genera solo musica strumentale.
- Sicurezza: i prompt vengono controllati dai filtri di sicurezza. I prompt che attivano i filtri
verranno ignorati e verrà scritta una spiegazione nel campo
filtered_promptdell'output. - Applicazione di filigrane: l'audio di output è sempre filigranato per l'identificazione in conformità ai nostri principi di AI responsabile.
Passaggi successivi
- Genera brani completi e tracce vocali con Lyria 3.5,
- Invece della musica, scopri come generare conversazioni con più interlocutori utilizzando i modelli TTS.
- Scopri come generare immagini o video,
- Invece di generare musica o audio, scopri come Gemini può comprendere i file audio,
- Avvia una conversazione in tempo reale con Gemini utilizzando l'API Live.
Esplora il Cookbook per altri esempi di codice e tutorial.