การสร้างเพลงโดยใช้ Lyria RealTime

Gemini API ที่ใช้ Lyria RealTime จะให้สิทธิ์เข้าถึงโมเดลการสร้างเพลงแบบสตรีมมิงแบบเรียลไทม์ที่ล้ำสมัย ซึ่งช่วยให้นักพัฒนาแอปสามารถสร้างแอปพลิเคชันที่ผู้ใช้สามารถโต้ตอบ ควบคุม และเล่นดนตรีด้วยเครื่องดนตรีได้อย่างต่อเนื่อง

หากต้องการสัมผัสประสบการณ์การสร้างเพลงด้วย Lyria RealTime ให้ลองใช้ AI Studio โดยใช้แอป Prompt DJ หรือ MIDI DJ

วิธีการทำงานของการสร้างเพลง

การสร้างเพลงแบบเรียลไทม์ของ Lyria ใช้การเชื่อมต่อสตรีมมิงแบบ 2 ทิศทางแบบถาวรที่มีเวลาในการตอบสนองต่ำโดยใช้ WebSocket

สร้างและควบคุมเพลง

Lyria RealTime ทำงานคล้ายกับ Live API ตรงที่ใช้ WebSocket เพื่อสื่อสารกับโมเดลแบบเรียลไทม์ แต่ก็ยังไม่ใช่แบบเดีย��กันทั้งหมด เนื่องจากคุณไม่สามารถพูดคุยกับโมเดลได้ และต้องใช้รูปแบบที่เฉพาะเจาะจงเพื่อแสดงผล

โค้ดต่อไปนี้แสดงวิธีสร้างเพลง

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() และตั้งค่าการเรียกกลับ 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 ทำได้มากกว่านี้ ลองใช้พรอมต์ของคุณเอง

แนวทางปฏิบัติแนะนำ

  • แอปพลิเคชันไคลเอ็นต์ต้องใช้การบัฟเฟอร์เสียงที่มีประสิทธิภาพเพื่อให้การเล่นราบรื่น ซึ่งจะช่วยพิจารณาความผันผวนของเครือข่ายและความล่าช้าเล็กน้อยในการสร้าง
  • พรอมต์ที่มีประสิทธิภาพ
    • สื่อความหมาย ใช้คำคุณศัพท์ที่อธิบายถึงอารมณ์ แนวเพลง และเครื่องดนตรี
    • ปรับปรุงและปรับเปลี่ยนทีละน้อย แทนที่จะเปลี่ยนพรอมต์ทั้งหมด ให้ลองเพิ่มหรือแก้ไของค์ประกอบเพื่อเปลี่ยนรูปแบบเพลงให้ราบรื่นขึ้น
    • ทดสอบน้ำหนักของ WeightedPrompt เพื่อกำหนดว่าพรอมต์ใหม่ส่งผลต่อการสร้างข้อความอย่างต่อเนื่องมากน้อยเพียงใด

รายละเอียดทางเทคนิค

ส่วนนี้จะอธิบายรายละเอียดเกี่ยวกับวิธีใช้การสร้างเพลงแบบเร��ย������������อง Lyria

ข้อกำหนดเฉพาะ

  • รูปแบบเอาต์พุต: เสียง PCM 16 บิตดิบ
  • อัตราการสุ่มตัวอย่าง: 48 kHz
  • ช่องสัญญาณ: 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) ตั้งค่าสเกลเพลง (คีย์และโห��ด) สำหรับการสร้างขึ้น ใช้ Scale ค่า enum ที่ SDK มีให้ คุณต้องหยุด/เล่นหรือรีเซ็ตบริบทของโมเดลเพื่อให้พิจารณามาตราส่วนใหม่
    • mute_bass: (bool) ค่าเริ่มต้น: False ควบคุมว่าจะให้โมเดลลดเสียงเบสของเอาต์พุตหรือไม่
    • mute_drums: (bool) ค่าเริ่มต้น: False ควบคุมว่าเอาต์พุตของโมเดลจะลดดรัมของเอาต์พุตหรือไม่
    • only_bass_and_drums: (bool) ค่าเริ่มต้น: False ควบคุมโมเดลให้พยายามส่งออกเฉพาะเสียงเบสและเสียงกลอง
  • 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♭ เมเจอร์ / B♭ ไมเนอร์
D_MAJOR_B_MINOR ดีเมเจอร์ / บีไมเนอร์
E_FLAT_MAJOR_C_MINOR ไมเนอร์ E♭ / ไมเนอร์ C
E_MAJOR_D_FLAT_MINOR ไมเนอร์ E หลัก / C♯/D♭
F_MAJOR_D_MINOR ฟา เมเจอร์ / ดีไมเนอร์
G_FLAT_MAJOR_E_FLAT_MINOR จี♭ เมเจอร์ / อี♭ ไมเนอร์
G_MAJOR_E_MINOR จีเมเจอร์ / อีไมเนอร์
A_FLAT_MAJOR_F_MINOR A♭ เมเจอร์ / F ไมเนอร์
A_MAJOR_G_FLAT_MINOR ไมเนอร์ A / F♯/G♭
B_FLAT_MAJOR_G_MINOR บันไดเสียง B♭ ใหญ่ / จี ไมเนอร์
B_MAJOR_A_FLAT_MINOR บันไดเสียงเมเจอร์ บี / บันไดเสียงไมเนอร์ จีชาร์ป/เอบแฟลต
SCALE_UNSPECIFIED ค่าเริ่มต้น / โมเดลเป็นผู้ตัดสินใจ

โมเดลนี้สามารถแนะนำโน้ตที่เล่นได้ แต่จะแยกแยะระหว่างคีย์สัมพัทธ์ไม่ได้ ดังนั้น แต่ละ enum จึงสอดคล้องกับทั้งระดับหลักแ��ะรองที่เกี่ยวข้อง เช่น C_MAJOR_A_MINOR จะสอดคล้องกับแป้นสีขาวทั้งหมดของเปียโน และ F_MAJOR_D_MINOR จะสอดคล้องกับแป้นสีขาวทั้งหมดยกเว้น B แฟลต

ข้อจำกัด

  • เฉพาะเพลงบรรเลง: โมเดลจะสร้างเฉพาะเพลงบรรเลง
  • ความปลอดภัย: ตัวกรองความปลอดภัยจะตรวจสอบพรอมต์ ระบบจะไม่สนใจพรอมต์ที่ทริกเกอร์ตัวกรอง ซึ่งในกรณีนี้ ระบบจะเขียนคำอธิบายในช่องfiltered_promptของเอาต์พุต
  • ลายน้ำ: ระบบจะใส่ลายน้ำในเสียงเอาต์พุตเสมอเพื่อระบุตัวตนตามหลักการAI อย่างมีความรับผิดชอบ

ขั้นตอนถัดไป

ดูตัวอย่างโค้ดและบทแนะนำเพิ่มเติมในตำรา