generowanie muzyki za pomocą narzędzia Lyria RealTime;

Gemini API korzysta z Lyria RealTime i zapewnia dostęp do najnowocześniejszego modelu generowania muzyki w czasie rzeczywistym. Umożliwia deweloperom tworzenie aplikacji, w których użytkownicy mogą interaktywnie tworzyć, nieustannie sterować i wykonywać muzykę instrumentalną.

Aby przekonać się, co można stworzyć za pomocą Lyria RealTime, wypróbuj ją w AI Studio, korzystając z aplikacji Prompt DJ lub MIDI DJ.

Jak działa generowanie muzyki

Generowanie muzyki w czasie rzeczywistym Lyria wykorzystuje trwałe, dwukierunkowe połączenie strumieniowe o niskim opóźnieniu za pomocą protokołu WebSocket.

Generowanie muzyki i zarządzanie nią

Lyria RealTime działa podobnie do interfejsu Live API, ponieważ wykorzystuje gniazda internetowe do utrzymywania komunikacji w czasie rzeczywistym z modelem. Nie jest to jednak dokładnie to samo, ponieważ nie możesz rozmawiać z modelem i musisz używać określonego formatu promptu.

Poniższy kod pokazuje, jak wygenerować muzykę:

Python

Ten przykład inicjuje sesję Lyria RealTime za pomocą client.aio.live.music.connect(), a następnie wysyła początkowy prompt z session.set_weighted_prompts() wraz z początkową konfiguracją za pomocą session.set_music_generation_config, rozpoczyna generowanie muzyki za pomocą session.play() i konfiguruje receive_audio() do przetwarzania otrzymywanych fragmentów audio.

  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

W tym przykładzie sesja Lyria RealTime jest inicjowana za pomocą funkcji client.live.music.connect(), a następnie wysyłany jest początkowy prompt z funkcją session.setWeightedPrompts() wraz z początkową konfiguracją za pomocą funkcji session.setMusicGenerationConfig. Generowanie muzyki rozpoczyna się za pomocą funkcji session.play(), a funkcja onMessage jest konfigurowana jako wywołanie zwrotne do przetwarzania otrzymywanych fragmentów dźwięku.

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

Następnie możesz użyć przycisków session.play(), session.pause(), session.stop()session.reset_context(), aby rozpocząć, wstrzymać, zatrzymać lub zresetować sesję.

Sterowanie muzyką w czasie rzeczywistym

Prompt Lyria RealTime

Podczas transmisji możesz w dowolnym momencie wysyłać nowe WeightedPrompt wiadomości, aby zmieniać generowaną muzykę. Model będzie płynnie przechodzić na podstawie nowych danych wejściowych.

Prompty muszą mieć odpowiedni format: text (rzeczywisty prompt) i weight. Symbol weight może przyjmować dowolną wartość z wyjątkiem 0. 1.0to zwykle dobry punkt wyjścia.

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

Pamiętaj, że przejścia między modelami mogą być nieco nagłe, gdy drastycznie zmieniasz prompty, dlatego zalecamy wprowadzenie pewnego rodzaju przenikania przez wysyłanie do modelu pośrednich wartości wagi.

Aktualizowanie konfiguracji

Możesz też aktualizować parametry generowania muzyki w czasie rzeczywistym. Nie możesz tylko zaktualizować parametru. Musisz ustawić całą konfigurację, w przeciwnym razie pozostałe pola zostaną zresetowane do wartości domyślnych.

Aktualizacja liczby uderzeń na minutę lub skali to drastyczna zmiana dla modelu, dlatego musisz też poinformować go, aby zresetował swój kontekst za pomocą reset_context(), aby uwzględnić nową konfigurację. Nie spowoduje to zatrzymania transmisji, ale będzie to trudne przejście. Nie musisz tego robić w przypadku pozostałych parametrów.

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

Przewodnik po promptach w przypadku Lyria RealTime

Oto niepełna lista promptów, których możesz użyć w przypadku Lyrii RealTime:

  • Instrumenty: 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, ...
  • Gatunek muzyczny: 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, ...
  • Nastrój/opis: 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, ...

To tylko kilka przykładów. Lyria RealTime ma znacznie więcej możliwości. Eksperymentuj z własnymi promptami.

Sprawdzone metody

  • Aplikacje klienckie muszą implementować niezawodne buforowanie dźwięku, aby zapewnić płynne odtwarzanie. Pomaga to uwzględnić wahania sieci i niewielkie różnice w czasie oczekiwania na wygenerowanie odpowiedzi.
  • Skuteczne prompty:
    • Stosuj styl opisowy. Używaj przymiotników opisujących nastrój, gatunek i instrumentację.
    • Iteruj i stopniowo zmieniaj kierunek. Zamiast całkowicie zmieniać prompta, spróbuj dodać lub zmodyfikować elementy, aby płynniej przekształcić muzykę.
    • Eksperymentuj z wagą na WeightedPrompt, aby wpływać na to, jak bardzo nowy prompt wpływa na trwające generowanie.

Szczegóły techniczne

W tej sekcji opisujemy szczegóły korzystania z generowania muzyki w czasie rzeczywistym za pomocą Lyrii.

Specyfikacja

  • Format wyjściowy: surowy 16-bitowy dźwięk PCM
  • Częstotliwość próbkowania: 48 kHz
  • Kanały: 2 (stereo)

Opcje

Na generowanie muzyki można wpływać w czasie rzeczywistym, wysyłając wiadomości zawierające:

  • WeightedPrompt: ciąg tekstowy opisujący pomysł muzyczny, gatunek, instrument, nastrój lub cechę. Można podać wiele promptów, aby połączyć wpływy. Więcej informacji o tym, jak najlepiej tworzyć prompty dla Lyrii RealTime, znajdziesz powyżej.
  • MusicGenerationConfig: konfiguracja procesu generowania muzyki, która wpływa na charakterystykę wyjściowego dźwięku. Parametry obejmują:
    • guidance: (float) Zakres: [0.0, 6.0]. Domyślnie: 4.0. Określa, jak ściśle model ma się trzymać promptów. Wyższe wartości parametru guidance poprawiają zgodność z promptem, ale sprawiają, że przejścia są bardziej nagłe.
    • bpm: (int) Zakres: [60, 200]. Ustawia liczbę uderzeń na minutę, którą chcesz uzyskać w wygenerowanej muzyce. Musisz zatrzymać/odtworzyć lub zresetować kontekst modelu, aby uwzględnić nowe BPM.
    • density: (float) Zakres: [0.0, 1.0]. Określa gęstość nut i dźwięków. Niższe wartości dają rzadszą muzykę, a wyższe – „gęstszą”.
    • brightness: (float) Zakres: [0.0, 1.0]. Dostosowuje jakość tonalną. Wyższe wartości dają „jaśniejszy” dźwięk, zwykle z większym naciskiem na wyższe częstotliwości.
    • scale: (Enum) Ustawia skalę muzyczną (tonację i tryb) na potrzeby generowania. Użyj wartości wyliczeniowych Scale udostępnianych przez pakiet SDK. Musisz zatrzymać/odtworzyć lub zresetować kontekst modelu, aby uwzględnić nową skalę.
    • mute_bass: (bool) Domyślnie: False. Określa, czy model ma redukować basy w danych wyjściowych.
    • mute_drums: (bool) Domyślnie: False. Określa, czy dane wyjściowe modelu mają zmniejszać głośność perkusji.
    • only_bass_and_drums: (bool) Domyślnie: False. Skieruj model tak, aby próbował generować tylko bas i perkusję.
    • music_generation_mode: (Enum) Informuje model, czy ma się skupić na QUALITY (wartość domyślna) czy DIVERSITY muzyki. Można też ustawić wartość VOCALIZATION, aby model generował wokalizacje jako kolejny instrument (dodaj je jako nowe prompty).
  • PlaybackControl: polecenia sterujące odtwarzaniem, takie jak odtwarzanie, wstrzymywanie, zatrzymywanie lub resetowanie kontekstu.

W przypadku parametrów bpm, density, brightnessscale, jeśli nie podasz żadnej wartości, model sam zdecyduje, co będzie najlepsze w odpowiedzi na Twoje początkowe prompty.

MusicGenerationConfig można też dostosować bardziej klasyczne parametry, takie jak temperature (od 0,0 do 3,0, domyślnie 1,1), top_k (od 1 do 1000, domyślnie 40) i seed (od 0 do 2 147 483 647, domyślnie wybierany losowo).

Skalowanie wartości typu wyliczeniowego

Oto wszystkie wartości skali, które może zaakceptować model:

Wartość typu wyliczeniowego Skala / tonacja
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-moll/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-moll/as-moll
SCALE_UNSPECIFIED Domyślne / Model decyduje

Model może kierować odtwarzanymi nutami, ale nie rozróżnia tonacji względnych. Każdy typ wyliczeniowy odpowiada więc zarówno względnej wersji głównej, jak i wersji pomocniczej. Na przykład C_MAJOR_A_MINOR odpowiadałoby wszystkim białym klawiszom pianina, a F_MAJOR_D_MINOR – wszystkim białym klawiszom z wyjątkiem B-dur.

Ograniczenia

  • Tylko muzyka instrumentalna: model generuje tylko muzykę instrumentalną.
  • Bezpieczeństwo: prompty są sprawdzane przez filtry bezpieczeństwa. Prompty wywołujące filtry zostaną zignorowane, a w polu filtered_prompt danych wyjściowych pojawi się wyjaśnienie.
  • Oznaczanie znakami wodnymi: wyjściowy dźwięk jest zawsze oznaczony znakiem wodnym w celu identyfikacji zgodnie z naszymi zasadami odpowiedzialnej AI.

Co dalej?

  • Zamiast muzyki dowiedz się, jak generować rozmowy z udziałem wielu osób za pomocą modeli TTS.
  • Dowiedz się, jak generować obrazyfilmy.
  • Zamiast generować muzykę lub dźwięk, dowiedz się, jak Gemini może rozumieć pliki audio.
  • Prowadź rozmowy w czasie rzeczywistym z Gemini za pomocą interfejsu Live API.

Więcej przykładów kodu i samouczków znajdziesz w Cookbooku.