יצירת מוזיקה באמצעות Lyria RealTime

באמצעות Gemini API, שמשתמש ב-Lyria RealTime, אפשר לגשת למודל מתקדם ליצירת מוזיקה בסטרימינג בזמן אמת. היא מאפשרת למפתחים ליצור אפליקציות שבהן המשתמשים יכולים ליצור מוזיקה אינסטרומנטלית באופן אינטראקטיבי, לנהל אותה באופן רציף ולבצע אותה.

כדי לראות מה אפשר ליצור באמצעות Lyria RealTime, נסו את האפשרויות ב-AI Studio באמצעות האפליקציות Prompt DJ או MIDI DJ.

איך פועלת היצירה של מוזיקה

יצירת המוזיקה ב-Lyria RealTime מתבצעת באמצעות חיבור סטרימינג עקבי ����-כ��וו��י ע�� ��מן אחזור קצר באמצעות WebSocket.

יצירת מוזיקה ושליטה בה

Lyria RealTime פועלת באופן דומה ל-Live API, במובן שהיא משתמשת ב-websockets כדי לשמור על תקשורת בזמן אמת עם המודל. עדיין לא מדובר באותו דבר, כי אי אפשר לדבר עם המודל וצריך להשתמש בפורמט ספציפי כדי להנחות אותו.

הקוד הבא ממחיש איך ליצור מוזיקה:

Python

בדוגמה הזו מתבצע אתחול של הסשן של Lyria RealTime באמצעות client.aio.live.music.connect(), ולאחר מכן נשלחת הנחיה ראשונית באמצעות session.set_weighted_prompts() יחד עם הגדרה ראשונית באמצעות session.set_music_generation_config, מתחילה היצירה של המוזיקה באמצעות session.play() ומוגדר receive_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

בדוגמה הזו מתבצעת אתחול של הסשן של Lyria RealTime באמצעות client.live.music.connect(), ולאחר מכן נשלחת הנחיה ראשונית באמצעות session.setWeightedPrompts() יחד עם הגדרה ראשונית באמצעות session.setMusicGenerationConfig, מתחילה היצירה של המוזיקה באמצעות session.play() ומוגדר קריאה חוזרת (callback) מסוג onMessage כדי לעבד את קטעי האודיו שהיא מקבלת.

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

לאחר מכן תוכלו להשתמש ב-session.play(), ב-session.pause(), ב-session.stop() וב-session.reset_context() כדי להפעיל, להשהות, לעצור או לאפס את הסשן.

שליטה במוזיקה בזמן אמת

Prompt Lyria RealTime

בזמן שהשידור הפעיל, אפשר לשלוח הודעות WeightedPrompt חדשות בכל שלב כדי לשנות את המוזיקה שנוצרת. המודל יתבצע בצורה חלקה על סמך הקלט החדש.

ההנחיות צריכות להיות בפורמט הנכון עם text (ההנחיה בפועל) ו-weight. הערך של weight יכול להיות כל ערך מלבד 0. 1.0 בדרך כלל היא נקודת התחלה טובה.

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

חשוב לזכור שהמעבר בין המודלים יכול להיות קצת חד כשמשנים באופן משמעותי את ההנחיות, לכן מומלץ להטמיע סוג כלשהו של מעבר הדרגתי על ידי שליחת ערכי משקל ביניים למודל.

עדכון ההגדרות

אפשר גם לעדכן את הפרמטרים ליצירת מוזיקה בזמן אמת. אי אפשר רק לעדכן פרמטר, צריך להגדיר את כל התצורה. אחרת, השדות האחרים יאפסו לערכי ברירת המחדל שלהם.

מכיוון שעדכון ה-BPM או הסולם הוא שינוי דרסטי במודל, צריך גם להורות לו לאפס את ההקשר באמצעות reset_context() כדי להביא בחשבון את ההגדרה החדשה. השידור לא יופסק, אבל המעבר יהיה קשה. אין צורך לעשות זאת לגבי הפרמטרים האחרים.

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

מדריך להנחיות ב-Lyria RealTime

זו רשימה חלקית של הנחיות שאפשר להשתמש בהן כדי להפעיל את Lyria RealTime:

  • מכשירים: 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, ...
  • ז'אנר המוזיקה: 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, ...
  • מצב רוח/תיאור: 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, ...

אלה רק כמה דוגמאות, אבל אפשר לעשות הרבה יותר עם Lyria RealTime. נסו להשתמש בהנחיות משלכם.

שיטות מומלצות

  • אפליקציות לקוח חייבות ליישם אגירת נתונים (buffering) חזקה של אודיו כדי להבטיח הפעלה חלקה. כך אפשר להביא בחשבון את התנודות ברשת ואת השינויים הקלים בזמן האחזור ליצירה.
  • הנחיות אפקטיביות:
    • השתמשו בתיאורים בחוכמה. השתמשו בשמות תואר שמתארים את האווירה, הז'אנר והכלים המוזיקליים.
    • חזרה על התהליך והתאמה בהדרגה. במקום לשנות את ההנחיה לגמרי, כדאי לנסות להוסיף או לשנות רכיבים כדי שהמוזיקה תשתנה בצורה חלקה יותר.
    • אפשר להתנסות במשקל של WeightedPrompt כדי להשפיע על מידת ההשפעה של הנחיה חדשה על היצירה המתמשכת.

פרטים טכניים

בקטע הזה מוסבר בפירוט איך משתמשים ביציר�� מוזיקה בזמן אמת של Lyria.

מפרטים

  • פורמט פלט: אודיו PCM גולמי 16 ביט
  • תדירות הדגימה: 48kHz
  • ערוצים: 2 (סטריאו)

פקדים

אתם יכולים להשפיע על יצירת המוזיקה בזמן אמת על ידי שליחת הודעות שמכילות:

  • WeightedPrompt: מחרוזת טקסט שמתארת רעיון מוזיקלי, ז'אנר, כלי, מצב רוח או מאפיין. אפשר לספק כמה הנחיות כדי לשלב את ההשפעות. למעלה מוסבר איך להפעיל את Lyra RealTime בצורה הטובה ביותר.
  • MusicGenerationConfig: הגדרה של תהליך יצירת המוזיקה, שמשפיעה על המאפיינים של אודיו הפלט. הפרמטרים כוללים:
    • guidance: (float) טווח: [0.0, 6.0]. ברירת המחדל: 4.0. קובעת את מידת הקפדה של המודל על ההנחיות. ככל שההנחיה תהיה ברורה יותר, כך המשתמש יתמיד יותר בהנחיה, אבל המעברים יהיו חדים יותר.
    • bpm: (int) טווח: [60, 200]. הגדרת מספר הפעימות לדקה שרוצים במוזיקה שנוצרת. צריך להפסיק או להפעיל את המודל או לאפס את ההקשר שלו כדי להביא בחשבון את ה-BPM החדש.
    • density: (float) טווח: [0.0, 1.0]. שליטה בצפיפות של תווים/צלילים מוזיקליים. ערכים נמוכים יותר יוצרים מוזיקה דלילה יותר, וערכים גבוהים יותר יוצרים מוזיקה 'עמוסה' יותר.
    • brightness: (float) טווח: [0.0, 1.0]. התאמת איכות הטון. ערכים גבוהים יותר יוצרים אודיו עם צליל "בהיר" יותר, שבדרך כלל מדגיש תדרים גבוהים יותר.
    • scale: (Enum) מגדיר את הסולם המוזיקלי (Key ו-Mode) ליצירה. משתמשים בערכי enum של Scale שסופקו על ידי ה-SDK. צריך להפסיק או להפעיל את המודל או לאפס את ההקשר שלו כדי להביא בחשבון את הסולם החדש.
    • mute_bass: (bool) ברירת מחדל: False. בעזרת האפשרות הזו קובעים אם הדגם יפחית את הבאס של הפלט.
    • mute_drums: (bool) ברירת מחדל: False. קובע אם הפלט של המודל יפחית את תוכן ה-drums של הפלט.
    • only_bass_and_drums: (bool) ברירת מחדל: False. מנחים את המודל לנסות להפיק רק בס ותופים.
  • PlaybackControl: פקודות לשליטה בהיבטים של ההפעלה, כמו הפעלה, השהיה, עצירת או איפוס ההקשר.

אם לא תספקו ערך לשדות bpm, density, brightness ו-scale, המודל יחליט מה הכי מתאים בהתאם להנחיות הראשוניות שלכם.

אפשר גם להתא��ם א��ש��ת ��רמטרים קלאסיים יותר ב-MusicGenerationConfig, כמו temperature (0.0 עד 3.0, ברירת המחדל היא 1.1), top_k (1 עד 1,000, ברירת המחדל היא 40) ו-seed (0 עד 2,147,483,647, נבחר באופן אקראי כברירת מחדל).

ערכי enum של קנה מידה

אלה כל ערכי הסולם שהמודל יכול לקבל:

הערך של הטיפוס בן המנייה (enum) קנה מידה / מפתח
C_MAJOR_A_MINOR דו מז'ור / לה מינור
D_FLAT_MAJOR_B_FLAT_MINOR פה במול מז'ור / רה במול קטין
D_MAJOR_B_MINOR D major / B minor
E_FLAT_MAJOR_C_MINOR סול במול מז'ור / דו קטין
E_MAJOR_D_FLAT_MINOR סול מז'ור / דו♯/פה במול מינור
F_MAJOR_D_MINOR פה מז'ור / רה מינור
G_FLAT_MAJOR_E_FLAT_MINOR סול במול מז'ור / סול במול מינור
G_MAJOR_E_MINOR G major / E minor
A_FLAT_MAJOR_F_MINOR דו במול מז'ור / פה קטין
A_MAJOR_G_FLAT_MINOR לה מז'ור / פה♯/סול♭ קטין
B_FLAT_MAJOR_G_MINOR רה במול מז'ור / רה במול קטין
B_MAJOR_A_FLAT_MINOR רה מז'ור / סול♯/דו במול קטין
SCALE_UNSPECIFIED ברירת מחדל / המודל מחליט

המודל מסוגל להנחות את התווים שיינגנו, אבל הוא לא מבדיל בין מפתחות יחסיים. כך כל enum תואם גם למספר הגרסה הראשי וגם למספר הגרסה המשני. לדוגמה, הערך C_MAJOR_A_MINOR יתאים לכל המקשים הלבנים בפסנתר, והערך F_MAJOR_D_MINOR יתאים לכל המקשים הלבנים מלבד 'סי קט'.

מגבלות

  • אינסטרומנטלי בלבד: המודל יוצר מוזיקה אינסטרומנטלית בלבד.
  • בטיחות: ההנחיות נבדקות על ידי מסנני בטיחות. המערכת תתעלם מהנחיות שמפעילות את המסננים, ובמקרה כזה ייכתב הסבר בשדה filtered_prompt של הפלט.
  • הוספת סימן מים: אודיו של פלט תמיד מתווסף סימן מים לצורך זיהוי, בהתאם לעקרונות של Responsible AI.

המאמרים הבאים

בספר המתכונים תוכלו למצוא דוגמאות נוספות לקוד ומדריכים.