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

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

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

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

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

הפעולה של 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(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

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

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

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

בחירת מוזיקה בזמן אמת

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

פרומפט ל-Lyria RealTime

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

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

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.setMusicGenerationConfig({
    weightedPrompts: [
      { text: 'Harmonica', weight: 0.3 },
      { text: 'Afrobeat', weight: 0.7 }
    ],
  });

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

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

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

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

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

הנה רשימה של הנחיות שאפשר להשתמש בהן כדי להנחות את 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 יכול לעשות הרבה יותר. נסו לכתוב פרומפטים משלכם!

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

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

פרטים טכניים

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

מפרטים

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

פקדים

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

  • WeightedPrompt: מחרוזת טקסט שמתארת רעיון מוזיקלי, ז'אנר, כלי נגינה, מצב רוח או מאפיין. אפשר לספק כמה הנחיות כדי לשלב השפעות. למעלה מופיעים פרטים נוספים על הדרך הטובה ביותר לתת הנחיות ל-Lyria 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) הגדרה של הסולם המוזיקלי (מפתח ומצב) ליצירה. צריך להשתמש בערכי ה-enum‏ Scale שסופקו על ידי ה-SDK. צריך להפסיק/להפעיל או לאפס את ההקשר של המודל כדי שהוא יתחשב בסולם החדש.
    • mute_bass: (bool) ברירת מחדל: False. ההגדרה הזו קובעת אם המודל יפחית את הבאס בפלט.
    • mute_drums: (bool) ברירת מחדל: False. ההגדרה הזו קובעת אם המודל יפחית את התופים בפלט.
    • only_bass_and_drums: (bool) ברירת מחדל: False. מכוונים את המודל כך שינסה להפיק רק בס ותופים.
    • music_generation_mode: (Enum) מציין למודל אם להתמקד בQUALITY (ערך ברירת מחדל) או בDIVERSITY של מוזיקה. אפשר גם להגדיר את הערך VOCALIZATION כדי לאפשר למודל ליצור קולות ככלי נגינה נוסף (צריך להוסיף אותם כהנחיות חדשות).
  • PlaybackControl: פקודות לשליטה בהיבטים של ההפעלה, כמו הפעלה, השהיה, עצירה או איפוס ההקשר.

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

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

ערכי טיפוסים בני מנייה (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 F major / D minor
G_FLAT_MAJOR_E_FLAT_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 B major / G♯/A♭ minor
SCALE_UNSPECIFIED ברירת מחדל / המודל מחליט

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

מגבלות

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

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

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

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