generowanie muzyki za pomocą narzędzia Lyria RealTime;

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

Aby zobaczyć, co można tworzyć za pomocą Lyria RealTime, wypróbuj tę funkcję w AI Studio, korzystając z aplikacji Prompt DJ lub MIDI DJ.

Jak działa generowanie muzyki

Generowanie muzyki w czasie rzeczywistym przez Lyria korzysta z trwałego, dwukierunkowego połączenia strumieniowego o niskiej latencji za pomocą WebSocket.

Generowanie muzyki i zarządzanie nią

Lyria RealTime działa trochę jak Live API, ponieważ do komunikacji z modelem w czasie rzeczywistym używa WebSocket. Nie jest to jednak jeszcze dokładnie to samo, ponieważ nie możesz rozmawiać z modelem i musisz używać określonego formatu, aby go wywołać.

Ten kod pokazuje, jak wygenerować muzykę:

Python

W tym przykładzie inicjujemy sesję Lyria RealTime za pomocą funkcji client.aio.live.music.connect(), a następnie wysyłamy początkowe prompty za pomocą funkcji session.set_weighted_prompts() wraz z pierwotną konfiguracją za pomocą funkcji session.set_music_generation_config. Następnie uruchamiamy generowanie muzyki za pomocą funkcji session.play() i konfigurujemy funkcję receive_audio(), aby przetwarzała otrzymane fragmenty audio.

  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

W tym przykładzie inicjujemy sesję Lyria RealTime za pomocą funkcji client.live.music.connect(), a następnie wysyłamy pierwsze prompt za pomocą funkcji session.setWeightedPrompts() wraz z pierwszą konfiguracją za pomocą funkcji session.setMusicGenerationConfig, uruchamiamy generowanie muzyki za pomocą funkcji session.play() i konfigurujemy funkcję onMessage callback, aby przetworzyć otrzymane fragmenty audio.

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

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

sterować muzyką w czasie rzeczywistym,

Prompt Lyria RealTime

Podczas aktywnej transmisji możesz w dowolnym momencie wysyłać nowe wiadomości WeightedPrompt, aby zmienić wygenerowaną muzykę. Model płynnie przejdzie na nowe dane wejściowe.

Prompty muszą mieć odpowiedni format z text (rzeczywisty prompt) i weight. Parametr 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 modelu mogą być nieco gwałtowne, gdy w sposób znaczący zmieniasz prompty. Dlatego zalecamy wdrożenie pewnego rodzaju przejścia płynnego, wysyłając do modelu pośrednie wartości wag.

Aktualizowanie konfiguracji

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

Zmiana bpm lub skali to duża zmiana dla modelu, dlatego musisz też poprosić go o zresetowanie kontekstu za pomocą funkcji reset_context(), aby uwzględnić nową konfigurację. Nie spowoduje to przerwania strumienia, ale będzie to ostra zmiana. Nie musisz tego robić w przypadku innych parametrów.

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

Przewodnik po promptach w Lyria RealTime

Oto niepełna lista promptów, których możesz używać do wywoływania Lyria 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 może znacznie więcej. Eksperymentuj z własnymi promptami.

Sprawdzone metody

  • Aplikacje klienckie muszą stosować niezawodne buforowanie dźwięku, aby zapewnić płynne odtwarzanie. Pomaga to uwzględnić jitter sieci i niewielkie różnice w czasie generowania.
  • Skuteczne prompty:
    • Stosuj styl opisowy. Używaj przymiotników opisujących nastrój, gatunek i instrumentację.
    • stopniowo wprowadzać zmiany i kierować się w ich kierunku. Zamiast całkowicie zmieniać prompt, spróbuj dodać lub zmodyfikować elementy, aby płynnie przejść do muzyki.
    • Eksperymentuj z wagą parametru WeightedPrompt, aby wpływać na to, jak mocno nowy prompt wpływa na bieżące generowanie.

Szczegóły techniczne

W tej sekcji opisaliśmy szczegółowo, jak korzystać z generowania muzyki w czasie rzeczywistym w Lyria.

Specyfikacja

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

Elementy sterujące

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ę. Aby zmieszać wpływy, można podać kilka promptów. Więcej informacji o tym, jak najlepiej promptować Lyrica RealTime, znajdziesz powyżej.
  • MusicGenerationConfig: konfiguracja procesu generowania muzyki, która wpływa na cechy wyjściowego dźwięku. Parametry:
    • guidance: (float) Zakres: [0.0, 6.0]. Domyślnie: 4.0. Określa, jak ściśle model ma przestrzegać promptów. Większa pomoc w śledzeniu promptu zwiększa zgodność z promptem, ale powoduje też bardziej gwałtowne przejścia.
    • bpm: (int) Zakres: [60, 200]. Ustawia liczbę uderzeń na minutę, które mają być zawarte w wygenerowanej muzyce. Musisz zatrzymać lub odtworzyć model albo zresetować kontekst, aby uwzględnić nową wartość bpm.
    • density: (float) Zakres: [0.0, 1.0]. Umożliwia kontrolowanie gęstości nut/dźwięków. Niższe wartości powodują, że muzyka jest rzadsza; wyższe wartości powodują, że muzyka jest „bardziej gęsta”.
    • brightness: (float) Zakres: [0.0, 1.0]. Dostosowuje jakość tonalną. Wyższe wartości powodują, że dźwięk brzmi „jaśniej”, ponieważ podkreślają wyższe częstotliwości.
    • scale: (enumeracja) Określa skalę muzyczną (tonację i tryb) do wygenerowania. Użyj Scalewartości wyliczenia udostępnionych przez pakiet SDK. Musisz wstrzymać lub odtworzyć model albo zresetować kontekst, aby uwzględnić nową skalę.
    • mute_bass: (bool) domyślnie False. Określa, czy model ma zmniejszać bas w wyjściach.
    • mute_drums: (bool) domyślnie False. Określa, czy model zmniejsza ilość bębnów w wyjściach.
    • only_bass_and_drums: (bool) domyślnie False. Kieruj modelem, aby próbował wygenerować tylko bas i perkusję.
  • PlaybackControl: polecenia do sterowania odtwarzaniem, takie jak odtwarzanie, wstrzymywanie, zatrzymywanie i resetowanie kontekstu.

Jeśli nie podasz wartości dla parametrów bpm, density, brightnessscale, model sam zdecyduje, co będzie najlepsze na podstawie Twoich początkowych promptów.

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

Skalowanie wartości typu wyliczeniowego

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

Wartość typu wyliczeniowego Skala / klucz
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♯/D♭-moll
F_MAJOR_D_MINOR F-dur / D-moll
G_FLAT_MAJOR_E_FLAT_MINOR G-moll / E-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 Domyślnie / model decyduje

Model może kierować odtwarzanymi nutami, ale nie rozróżnia klawiszy względnych. W ten sposób każda enumeracja odpowiada zarówno względnej wersji głównej, jak i pomocniczej. Na przykład C_MAJOR_A_MINOR odpowiadałoby wszystkim białym klawiszom na pianinie, a F_MAJOR_D_MINOR wszystkim białym klawiszom z wyjątkiem B-flat.

Ograniczenia

  • Tylko instrumentalnie: model generuje tylko muzykę instrumentalną.
  • Bezpieczeństwo: prompty są sprawdzane przez filtry bezpieczeństwa. Komunikaty wywołujące filtry zostaną zignorowane, a w polu filtered_prompt w wyniku zostanie zapisane wyjaśnienie.
  • Znak wodny: dźwięk wyjściowy jest zawsze oznaczany znakiem wodnym w celu identyfikacji zgodnie z naszymi zasadami dotyczącymi odpowiedzialnej AI.

Co dalej?

  • Zamiast muzyki dowiedz się, jak generować rozmowy z udziałem wielu głośników za pomocą modeli TTS.
  • Dowiedz się, jak generować obrazy lub filmy,
  • Zamiast generowania muzyki lub dźwięku dowiedz się, jak Gemini może rozumieć pliki audio.
  • Prowadź rozmowę w czasie rzeczywistym z Gemini za pomocą interfejsu Live API.

Więcej przykładów kodu i samouczków znajdziesz w książce kucharskiej.