تولید موسیقی با استفاده از Lyria RealTime

رابط برنامه‌نویسی نرم‌افزار Gemini، با استفاده از Lyria RealTime ، دسترسی به یک مدل تولید موسیقی پیشرفته و در لحظه را فراهم می‌کند. این مدل به توسعه‌دهندگان اجازه می‌دهد تا برنامه‌هایی بسازند که در آن‌ها کاربران می‌توانند به صورت تعاملی موسیقی بی‌کلام خلق، هدایت و اجرا کنند.

برای اینکه ببینید با Lyria RealTime چه چیزهایی می‌توان ساخت، آن را در AI Studio با استفاده از Prompt DJ یا اپلیکیشن‌های MIDI DJ امتحان کنید!

نحوه کار تولید موسیقی

تولید موسیقی Lyria RealTime از یک اتصال استریمینگ پایدار، دو طرفه و با تأخیر کم با استفاده از WebSocket استفاده می‌کند.

تولید و کنترل موسیقی

Lyria RealTime کمی شبیه Live API عمل می‌کند، به این معنا که از websockets برای حفظ ارتباط بلادرنگ با مدل استفاده می‌کند. اما هنوز دقیقاً مثل آن نیست، زیرا نمی‌توانید با مدل صحبت کنید و باید از یک فرمت خاص برای فراخوانی آن استفاده کنید.

کد زیر نحوه تولید موسیقی را نشان می‌دهد:

پایتون

این مثال، جلسه 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': '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())

جاوا اسکریپت

این مثال، جلسه Lyria RealTime را با استفاده از client.live.music.connect() مقداردهی اولیه می‌کند، سپس یک اعلان اولیه با session.setWeightedPrompts() به همراه یک پیکربندی اولیه با استفاده از session.setMusicGenerationConfig ارسال می‌کند، تولید موسیقی را با استفاده از session.play() آغاز می‌کند و یک فراخوانی onMessage را برای پردازش قطعات صوتی دریافتی تنظیم می‌کند.

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

سپس می‌توانید از session.play() ، session.pause() ، session.stop() و session.reset_context() برای شروع، مکث، توقف یا تنظیم مجدد جلسه استفاده کنید.

موسیقی را به صورت زنده پخش کنید

سریع لیریا، زمان واقعی

در حالی که پخش زنده فعال است، می‌توانید در هر زمانی پیام‌های WeightedPrompt جدید ارسال کنید تا موسیقی تولید شده را تغییر دهید. مدل بر اساس ورودی جدید به راحتی تغییر خواهد کرد.

دستورالعمل‌ها باید از قالب صحیح شامل یک text (دستور اصلی) و یک weight پیروی کنند. weight می‌تواند هر مقداری به جز 0 را بپذیرد. معمولاً 1.0 نقطه شروع خوبی است.

پایتون

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

جاوا اسکریپت

  await session.setMusicGenerationConfig({
    weightedPrompts: [
      { text: 'Harmonica', weight: 0.3 },
      { text: 'Afrobeat', weight: 0.7 }
    ],
  });

توجه داشته باشید که هنگام تغییر شدید اعلان‌ها، انتقال مدل می‌تواند کمی ناگهانی باشد، بنابراین توصیه می‌شود با ارسال مقادیر وزن میانی به مدل، نوعی محوشدگی متقاطع را پیاده‌سازی کنید.

پیکربندی را به‌روزرسانی کنید

شما همچنین می‌توانید پارامترهای تولید موسیقی را به صورت آنی به‌روزرسانی کنید. نمی‌توانید فقط یک پارامتر را به‌روزرسانی کنید، باید کل پیکربندی را تنظیم کنید، در غیر این صورت سایر فیلدها به مقادیر پیش‌فرض خود بازنشانی می‌شوند.

از آنجایی که به‌روزرسانی bpm یا scale یک تغییر اساسی برای مدل است، باید به آن بگویید که با استفاده از reset_context() context خود را ریست کند تا پیکربندی جدید را در نظر بگیرد. این کار stream را متوقف نمی‌کند، اما یک انتقال سخت خواهد بود. لازم نیست این کار را برای پارامترهای دیگر انجام دهید.

پایتون

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

جاوا اسکریپت

  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 بیتی
  • نرخ نمونه‌برداری: ۴۸ کیلوهرتز
  • کانال‌ها: ۲ (استریو)

کنترل‌ها

تولید موسیقی می‌تواند به صورت آنی و با ارسال پیام‌هایی حاوی موارد زیر تحت تأثیر قرار گیرد:

  • WeightedPrompt : رشته‌ای متنی که یک ایده، ژانر، ساز، حال و هوا یا ویژگی موسیقی را توصیف می‌کند. می‌توان چندین اعلان را برای ترکیب تأثیرات ارائه داد. برای جزئیات بیشتر در مورد بهترین روش برای اعلان Lyria RealTime به بالا مراجعه کنید.
  • MusicGenerationConfig : پیکربندی فرآیند تولید موسیقی که بر ویژگی‌های صدای خروجی تأثیر می‌گذارد.) پارامترها عبارتند از:
    • guidance : (اعشاری) محدوده: [0.0, 6.0] . پیش‌فرض: 4.0 . کنترل می‌کند که مدل چقدر دقیق از دستورالعمل‌ها پیروی کند. راهنمایی بالاتر، پایبندی به دستورالعمل را بهبود می‌بخشد، اما انتقال‌ها را ناگهانی‌تر می‌کند.
    • bpm : (int) محدوده: [60, 200] . تعداد ضربان در دقیقه مورد نظر برای موسیقی تولید شده را تنظیم می‌کند. شما باید با در نظر گرفتن bpm جدید، زمینه را برای مدل متوقف/پخش یا تنظیم مجدد کنید.
    • density : (شناور) محدوده: [0.0, 1.0] . چگالی نت‌ها/صداهای موسیقی را کنترل می‌کند. مقادیر پایین‌تر موسیقی کم‌حجم‌تر و مقادیر بالاتر موسیقی «شلوغ‌تر» تولید می‌کنند.
    • brightness : (شناور) محدوده: [0.0, 1.0] . کیفیت تُن صدا را تنظیم می‌کند. مقادیر بالاتر، صدای "روشن‌تر" تولید می‌کنند و عموماً بر فرکانس‌های بالاتر تأکید دارند.
    • scale : (Enum) گام موسیقی (کلید و مد) را برای تولید تنظیم می‌کند. از مقادیر Scale enum ارائه شده توسط SDK استفاده کنید. شما باید با در نظر گرفتن گام جدید، زمینه را برای مدل متوقف/پخش یا تنظیم مجدد کنید.
    • mute_bass : (bool) مقدار پیش‌فرض: False . کنترل می‌کند که آیا مدل، صدای بم خروجی‌ها را کاهش دهد یا خیر.
    • mute_drums : (bool) مقدار پیش‌فرض: False . کنترل می‌کند که آیا خروجی مدل، درام‌های خروجی را کاهش می‌دهد یا خیر.
    • only_bass_and_drums : (bool) پیش‌فرض: False . مدل را طوری هدایت کنید که فقط صدای بیس و درام را خروجی دهد.
    • music_generation_mode : (شمارشی) به مدل نشان می‌دهد که آیا باید روی QUALITY (مقدار پیش‌فرض) یا DIVERSITY موسیقی تمرکز کند. همچنین می‌توان آن را روی VOCALIZATION تنظیم کرد تا به مدل اجازه دهد صداها را به عنوان ساز دیگری تولید کند (آنها را به عنوان پمپ‌های جدید اضافه کند).
  • PlaybackControl ): دستوراتی برای کنترل جنبه‌های پخش، مانند پخش، مکث، توقف یا تنظیم مجدد زمینه.

برای bpm ، density ، brightness و scale ، اگر هیچ مقداری ارائه نشود، مدل بر اساس درخواست‌های اولیه شما تصمیم می‌گیرد که بهترین مقدار کدام است.

پارامترهای کلاسیک‌تر مانند temperature (0.0 تا 3.0، پیش‌فرض 1.1)، top_k (1 تا 1000، پیش‌فرض 40) و seed (0 تا 2 147 483 647، که به طور تصادفی به طور پیش‌فرض انتخاب می‌شوند) نیز در MusicGenerationConfig قابل تنظیم هستند.

مقادیر شمارشی مقیاس‌پذیر

در اینجا تمام مقادیر مقیاسی که مدل می‌تواند بپذیرد، آورده شده است:

مقدار شمارشی مقیاس / کلید
C_MAJOR_A_MINOR دو ماژور / لا مینور
D_FLAT_MAJOR_B_FLAT_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 سل ماژور / می مینور
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 تمام کلیدهای سفید به جز B بمل هستند.

محدودیت‌ها

  • فقط بی‌کلام: این مدل فقط موسیقی بی‌کلام تولید می‌کند.
  • ایمنی: اعلان‌ها توسط فیلترهای ایمنی بررسی می‌شوند. اعلان‌هایی که فیلترها را فعال می‌کنند نادیده گرفته می‌شوند که در این صورت توضیحی در فیلد filtered_prompt خروجی نوشته خواهد شد.
  • واترمارک: صدای خروجی همیشه برای شناسایی، طبق اصول هوش مصنوعی مسئولانه ما، واترمارک می‌شود.

قدم بعدی چیست؟

  • به جای موسیقی، یاد بگیرید که چگونه با استفاده از مدل‌های TTS ، مکالمه چند گوینده ایجاد کنید.
  • کشف کنید که چگونه تصاویر یا ویدیوها را تولید کنید،
  • به جای تولید موسیقی یا صدا، دریابید که چگونه Gemini می‌تواند فایل‌های صوتی را درک کند ،
  • با استفاده از Live API با Gemini مکالمه‌ای بلادرنگ داشته باشید.

برای مثال‌ها و آموزش‌های بیشتر در مورد کد، به Cookbook مراجعه کنید.