Lyria RealTime ব্যবহার করে রিয়েল-টাইমে সঙ্গীত তৈরি

লাইরিয়া রিয়েলটাইম ব্যবহার করে জেমিনি এপিআই একটি অত্যাধুনিক, রিয়েল-টাইম, স্ট্রিমিং মিউজিক জেনারেশন মডেলে অ্যাক্সেস প্রদান করে। এটি ডেভেলপারদের এমন অ্যাপ্লিকেশন তৈরি করতে দেয় যেখানে ব্যবহারকারীরা ইন্টারেক্টিভভাবে ইন্সট্রুমেন্টাল মিউজিক তৈরি করতে, ক্রমাগত পরিচালনা করতে এবং পরিবেশন করতে পারেন।

লাইরিয়া রিয়েলটাইম মিউজিক জেনারেশন ওয়েবসকেট ব্যবহার করে একটি স্থায়ী, দ্বিমুখী, স্বল্প-বিলম্বের স্ট্রিমিং সংযোগ স্থাপন করে।

Lyria RealTime ব্যবহার করে কী তৈরি করা যায় তা অভিজ্ঞতা করতে, AI Studio-তে Prompt DJ বা MIDI DJ অ্যাপ ব্যবহার করে দেখুন।

সঙ্গীত তৈরি এবং নিয়ন্ত্রণ করুন

Lyria RealTime, Live API- এর মতোই কাজ করে, কারণ এটি মডেলের সাথে রিয়েল-টাইম যোগাযোগ বজায় রাখতে ওয়েবসকেট ব্যবহার করে।

নিচের কোডটি দেখায় কীভাবে সঙ্গীত তৈরি করতে হয়:

পাইথন

এই উদাহরণটি client.aio.live.music.connect() ব্যবহার করে Lyria RealTime সেশন শুরু করে, তারপর 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())

জাভাস্ক্রিপ্ট

এই উদাহরণটি client.live.music.connect() ব্যবহার করে Lyria RealTime সেশন শুরু করে, তারপর 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: "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() ব্যবহার করতে পারেন।

রিয়েল-টাইমে মিউজিক নিয়ন্ত্রণ করুন

আপনি প্রম্পট পাঠিয়ে এবং জেনারেশন প্যারামিটার রিয়েল টাইমে আপডেট করার মাধ্যমে মিউজিক জেনারেশনকে নিয়ন্ত্রণ করতে পারেন।

প্রম্পট লিরিয়া রিয়েলটাইম

স্ট্রিমটি সক্রিয় থাকা অবস্থায়, আপনি তৈরি হওয়া সঙ্গীত পরিবর্তন করার জন্য যেকোনো সময় নতুন 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.setWeightedPrompts({
    weightedPrompts: [
      { text: 'Harmonica', weight: 0.3 },
      { text: 'Afrobeat', weight: 0.7 }
    ],
  });

মনে রাখবেন যে, প্রম্পটগুলিতে আকস্মিক পরিবর্তন করলে মডেলের ট্রানজিশনগুলো কিছুটা হঠাৎ হতে পারে, তাই মডেলে মধ্যবর্তী ওয়েট ভ্যালু পাঠিয়ে কোনো ধরনের ক্রস-ফেডিং প্রয়োগ করার পরামর্শ দেওয়া হয়।

কনফিগারেশন আপডেট করুন

আপনি রিয়েল টাইমে মিউজিক জেনারেশন প্যারামিটারগুলো আপডেট করার মাধ্যমে মিউজিক জেনারেশন নিয়ন্ত্রণ করতে পারেন। আপনি শুধু একটি প্যারামিটার আপডেট করতে পারবেন না, আপনাকে সম্পূর্ণ কনফিগারেশনটি সেট করতে হবে, অন্যথায় অন্যান্য ফিল্ডগুলো তাদের ডিফল্ট মানে রিসেট হয়ে যাবে।

যেহেতু bpm বা scale আপডেট করা মডেলের জন্য একটি বড় পরিবর্তন, তাই নতুন কনফিগারেশনটি কার্যকর করার জন্য আপনাকে reset_context() ব্যবহার করে এর কনটেক্সট রিসেট করতে বলতে হবে। এটি স্ট্রিম বন্ধ করবে না, কিন্তু এই পরিবর্তনটি বেশ কঠিন হবে। অন্যান্য প্যারামিটারগুলোর জন্য এটি করার প্রয়োজন নেই।

পাইথন

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

লিরিয়া রিয়েলটাইমকে প্রম্পট করা

লাইরিয়া রিয়েলটাইম ওয়েটেড প্রম্পট ব্যবহার করে গতিশীলভাবে সঙ্গীতের বিভিন্ন ধারা, বাদ্যযন্ত্র এবং মেজাজের মিশ্রণ ঘটায়। প্রম্পট পরিচালনার কৌশল, কীওয়ার্ড ট্যাগ শব্দভান্ডার এবং প্রম্পটের সম্পূর্ণ উদাহরণ জানতে লাইরিয়া প্রম্পট গাইড দেখুন।

সর্বোত্তম অনুশীলন

  • মসৃণ প্লেব্যাক নিশ্চিত করতে ক্লায়েন্ট অ্যাপ্লিকেশনগুলিতে অবশ্যই শক্তিশালী অডিও বাফারিং ব্যবস্থা প্রয়োগ করতে হবে। এটি নেটওয়ার্ক জিটার এবং জেনারেশন ল্যাটেন্সির সামান্য তারতম্য সামাল দিতে সাহায্য করে।
  • কার্যকরী প্ররোচনা:
    • বর্ণনামূলক হোন। মেজাজ, গানের ধরন এবং বাদ্যযন্ত্র বর্ণনা করতে বিশেষণ ব্যবহার করুন।
    • পুনরাবৃত্তি করুন এবং ধীরে ধীরে পরিবর্তন আনুন। নির্দেশনাটি পুরোপুরি পরিবর্তন না করে, সঙ্গীতকে আরও সাবলীলভাবে রূপান্তর করার জন্য উপাদান যোগ বা পরিবর্তন করার চেষ্টা করুন।
    • চলমান জেনারেশনকে একটি নতুন প্রম্পট কতটা জোরালোভাবে প্রভাবিত করবে, তা ঠিক করতে WeightedPrompt এর ওয়েট (weight) নিয়ে পরীক্ষা করুন।

প্রযুক্তিগত বিবরণ

এই অংশে লাইরিয়া রিয়েলটাইম মিউজিক জেনারেশন ব্যবহারের বিস্তারিত পদ্ধতি বর্ণনা করা হয়েছে।

স্পেসিফিকেশন

  • আউটপুট ফরম্যাট: র ১৬-বিট পিসিএম অডিও
  • স্যাম্পল রেট: ৪৮ কিলোহার্টজ
  • চ্যানেল: ২ (স্টেরিও)

নিয়ন্ত্রণ

নিম্নলিখিত বিষয়বস্তু সম্বলিত বার্তা পাঠানোর মাধ্যমে রিয়েল টাইমে সঙ্গীত তৈরিকে প্রভাবিত করা যেতে পারে:

  • WeightedPrompt : একটি টেক্সট স্ট্রিং যা কোনো মিউজিক্যাল আইডিয়া, জনরা, ইন্সট্রুমেন্ট, মুড বা বৈশিষ্ট্য বর্ণনা করে। বিভিন্ন প্রভাবকে একত্রিত করার জন্য একাধিক প্রম্পট সরবরাহ করা যেতে পারে। Lyria RealTime-কে কীভাবে সবচেয়ে ভালোভাবে প্রম্পট করা যায়, সে সম্পর্কে আরও বিস্তারিত জানতে উপরে দেখুন।
  • MusicGenerationConfig : সঙ্গীত তৈরির প্রক্রিয়ার কনফিগারেশন, যা আউটপুট অডিওর বৈশিষ্ট্যকে প্রভাবিত করে। প্যারামিটারগুলো হলো:
    • guidance : (ফ্লোট) পরিসর: [0.0, 6.0] । ডিফল্ট: 4.0 । মডেলটি কতটা কঠোরভাবে নির্দেশাবলী অনুসরণ করবে তা নিয়ন্ত্রণ করে। উচ্চতর গাইডেন্স নির্দেশাবলীর প্রতি আনুগত্য উন্নত করে, কিন্তু পরিবর্তনগুলিকে আরও আকস্মিক করে তোলে।
    • bpm : (পূর্ণসংখ্যা) পরিসর: [60, 200] । তৈরি হওয়া সঙ্গীতের জন্য আপনি যে বিটস পার মিনিট (BPM) চান তা নির্ধারণ করে। নতুন bpm কার্যকর করার জন্য আপনাকে মডেলটির কন্টেক্সট থামাতে/চালু করতে বা রিসেট করতে হবে।
    • density : (ফ্লোট) পরিসর: [0.0, 1.0] । এটি সঙ্গীতের স্বর/শব্দের ঘনত্ব নিয়ন্ত্রণ করে। কম মান কম ঘন সঙ্গীত তৈরি করে; বেশি মান আরও "ব্যস্ত" সঙ্গীত তৈরি করে।
    • brightness : (ফ্লোট) পরিসর: [0.0, 1.0] । এটি শব্দের মান সমন্বয় করে। উচ্চতর মান সাধারণত উচ্চ কম্পাঙ্ককে প্রাধান্য দিয়ে আরও "উজ্জ্বল" অডিও তৈরি করে।
    • scale : (Enum) জেনারেশনের জন্য মিউজিক্যাল স্কেল (কী এবং মোড) নির্ধারণ করে। SDK দ্বারা প্রদত্ত Scale enum ভ্যালুগুলো ব্যবহার করুন। নতুন স্কেলটি কার্যকর করার জন্য আপনাকে মডেলটির কনটেক্সট থামাতে/চালু করতে বা রিসেট করতে হবে।
    • mute_bass : (বুল) ডিফল্ট: False । মডেলটি আউটপুটের বেস কমাবে কিনা তা নিয়ন্ত্রণ করে।
    • mute_drums : (বুল) ডিফল্ট: False । মডেল আউটপুটগুলো ড্রামের আওয়াজ কমাবে কিনা তা নিয়ন্ত্রণ করে।
    • only_bass_and_drums : (বুল) ডিফল্ট: False । মডেলটিকে শুধুমাত্র বেস এবং ড্রামস আউটপুট করার জন্য নির্দেশ দিন।
    • music_generation_mode : (Enum) মডেলকে নির্দেশ করে যে এটি সঙ্গীতের QUALITY (ডিফল্ট মান) উপর মনোযোগ দেবে নাকি DIVERSITY । এটিকে VOCALIZATION এও সেট করা যেতে পারে, যাতে মডেলটি কণ্ঠস্বরকে আরেকটি বাদ্যযন্ত্র হিসেবে তৈরি করতে পারে (সেগুলোকে নতুন প্রম্পট হিসেবে যোগ করে)।
  • PlaybackControl : প্লেব্যাকের বিভিন্ন দিক, যেমন প্লে, পজ, স্টপ বা কনটেক্সট রিসেট করার জন্য ব্যবহৃত কমান্ড।

bpm , density , brightness এবং scale এর ক্ষেত্রে, যদি কোনো মান প্রদান করা না হয়, তবে মডেলটি আপনার প্রাথমিক নির্দেশনা অনুযায়ী সর্বোত্তম বিকল্পটি বেছে নেবে।

MusicGenerationConfig এ temperature (০.০ থেকে ৩.০, ডিফল্ট ১.১), top_k (১ থেকে ১০০০, ডিফল্ট ৪০), এবং seed (০ থেকে ২,১৪৭,৪৮৩,৬৪৭, যা ডিফল্টভাবে এলোমেলোভাবে নির্বাচিত হয়)-এর মতো আরও ক্লাসিক্যাল প্যারামিটারগুলোও কাস্টমাইজ করা যায়।

স্কেল এনাম মান

মডেলটি যে সকল স্কেল মান গ্রহণ করতে পারে, সেগুলি নিচে দেওয়া হলো:

এনাম মান স্কেল / চাবি
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 flat) ছাড়া বাকি সমস্ত সাদা কী-গুলো।

সীমাবদ্ধতা

  • শুধুমাত্র যন্ত্রসংগীত: মডেলটি কেবল যন্ত্রসংগীত তৈরি করে।
  • নিরাপত্তা: প্রম্পটগুলো নিরাপত্তা ফিল্টার দ্বারা যাচাই করা হয়। যে প্রম্পটগুলো ফিল্টার সক্রিয় করবে, সেগুলো উপেক্ষা করা হবে এবং সেক্ষেত্রে আউটপুটের ' filtered_prompt ফিল্ডে একটি ব্যাখ্যা লেখা হবে।
  • ওয়াটারমার্কিং: আমাদের দায়িত্বশীল এআই নীতিমালা অনুসরণ করে শনাক্তকরণের জন্য আউটপুট অডিওতে সর্বদা ওয়াটারমার্ক যুক্ত করা হয়।

এরপর কী?

  • Lyria 3.5 দিয়ে সম্পূর্ণ গান এবং ভোকাল ট্র্যাক তৈরি করুন।
  • সঙ্গীতের পরিবর্তে, টিটিএস মডেল ব্যবহার করে কীভাবে একাধিক বক্তার কথোপকথন তৈরি করা যায় তা শিখুন।
  • কীভাবে ছবি বা ভিডিও তৈরি করতে হয় তা জানুন।
  • সঙ্গীত বা অডিও তৈরি করার পরিবর্তে, জেনে নিন মিথুন রাশি কীভাবে অডিও ফাইল বুঝতে পারে।
  • লাইভ এপিআই ব্যবহার করে জেমিনির সাথে রিয়েল-টাইমে কথা বলুন।

আরও কোড উদাহরণ ও টিউটোরিয়ালের জন্য কুকবুকটি দেখুন।