Tạo nhạc theo thời gian thực bằng Lyria RealTime

Gemini API sử dụng Lyria RealTime, để cung cấp quyền truy cập vào một mô hình tạo nhạc trực tuyến, theo thời gian thực và hiện đại. API này cho phép nhà phát triển xây dựng các ứng dụng mà người dùng có thể tương tác để tạo, liên tục điều chỉnh và chơi nhạc cụ.

Tính năng tạo nhạc Lyria RealTime sử dụng kết nối trực tuyến hai chiều, liên tục, có độ trễ thấp bằng WebSocket.

Để trải nghiệm những tính năng có thể xây dựng bằng Lyria RealTime, hãy dùng thử trên AI Studio bằng ứng dụng Prompt DJ hoặc MIDI DJ.

Tạo và điều khiển nhạc

Lyria RealTime hoạt động tương tự như Live API ở chỗ sử dụng Websocket để duy trì giao tiếp theo thời gian thực với mô hình.

Đoạn mã sau đây minh hoạ cách tạo nhạc:

Python

Ví dụ này khởi chạy phiên Lyria RealTime bằng client.aio.live.music.connect(), sau đó gửi một câu lệnh ban đầu bằng session.set_weighted_prompts() cùng với một cấu hình ban đầu bằng session.set_music_generation_config, bắt đầu tạo nhạc bằng session.play() và thiết lập receive_audio() để xử lý các đoạn âm thanh mà ứng dụng nhận được.

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

JavaScript

Ví dụ này khởi chạy phiên Lyria RealTime bằng client.live.music.connect(), sau đó gửi một câu lệnh ban đầu bằng session.setWeightedPrompts() cùng với một cấu hình ban đầu bằng session.setMusicGenerationConfig, bắt đầu tạo nhạc bằng session.play() và thiết lập lệnh gọi lại onMessage để xử lý các đoạn âm thanh mà ứng dụng nhận được.

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

Sau đó, bạn có thể sử dụng session.play(), session.pause(), session.stop()session.reset_context() để bắt đầu, tạm dừng, dừng hoặc đặt lại phiên.

Điều chỉnh nhạc theo thời gian thực

Bạn có thể điều chỉnh quá trình tạo nhạc theo thời gian thực bằng cách gửi câu lệnh và cập nhật các tham số tạo theo thời gian thực.

Câu lệnh Lyria RealTime

Khi luồng đang hoạt động, bạn có thể gửi thông báo WeightedPrompt mới bất cứ lúc nào để thay đổi nhạc được tạo. Mô hình sẽ chuyển đổi mượt mà dựa trên dữ liệu đầu vào mới.

Các câu lệnh cần tuân theo đúng định dạng với text (câu lệnh thực tế) và weight. weight có thể nhận bất kỳ giá trị nào ngoại trừ 0. 1.0 thường là điểm xuất phát tốt.

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

Xin lưu ý rằng quá trình chuyển đổi mô hình có thể hơi đột ngột khi bạn thay đổi câu lệnh một cách đáng kể. Vì vậy, bạn nên triển khai một số loại hiệu ứng chuyển tiếp bằng cách gửi các giá trị trọng số trung gian đến mô hình.

Cập nhật cấu hình

Bạn có thể điều chỉnh quá trình tạo nhạc bằng cách cập nhật các tham số tạo nhạc theo thời gian thực. Bạn không thể chỉ cập nhật một tham số mà cần phải đặt toàn bộ cấu hình. Nếu không, các trường khác sẽ được đặt lại về giá trị mặc định.

Vì việc cập nhật nhịp mỗi phút (bpm) hoặc âm giai là một thay đổi đáng kể đối với mô hình, nên bạn cũng cần cho mô hình biết để đặt lại ngữ cảnh bằng reset_context() nhằm tính đến cấu hình mới. Việc này sẽ không dừng luồng, nhưng sẽ là một quá trình chuyển đổi khó khăn. Bạn không cần thực hiện việc này cho các tham số khác.

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

Hướng dẫn về câu lệnh cho Lyria RealTime

Sau đây là danh sách không đầy đủ các câu lệnh mà bạn có thể sử dụng để đưa ra câu lệnh cho Lyria RealTime:

  • Nhạc cụ: 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, ...
  • Thể loại nhạc: 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, ...
  • Tâm trạng/Mô tả: 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, ...

Đây chỉ là một số ví dụ, Lyria RealTime có thể làm được nhiều hơn thế. Thử nghiệm với các câu lệnh của riêng bạn!

Các phương pháp hay nhất

  • Các ứng dụng máy khách phải triển khai tính năng đệm âm thanh mạnh mẽ để đảm bảo phát mượt mà. Điều này giúp tính đến độ trễ mạng và các biến thể nhỏ về độ trễ tạo.
  • Đưa ra câu lệnh hiệu quả:
    • Hãy cung cấp thông tin mô tả. Sử dụng tính từ mô tả tâm trạng, thể loại và nhạc cụ.
    • Lặp lại và điều chỉnh dần dần. Thay vì thay đổi hoàn toàn câu lệnh, hãy thử thêm hoặc sửa đổi các thành phần để biến đổi nhạc một cách mượt mà hơn.
    • Thử nghiệm với trọng số trên WeightedPrompt để ảnh hưởng đến mức độ ảnh hưởng của một câu lệnh mới đến quá trình tạo đang diễn ra.

Chi tiết kỹ thuật

Phần này mô tả thông tin cụ thể về cách sử dụng tính năng tạo nhạc Lyria RealTime.

Thông số kỹ thuật

  • Định dạng đầu ra: Âm thanh PCM 16 bit thô
  • Tốc độ lấy mẫu: 48 kHz
  • Kênh: 2 (âm thanh nổi)

Các chế độ kiểm soát

Bạn có thể ảnh hưởng đến quá trình tạo nhạc theo thời gian thực bằng cách gửi thông báo chứa:

  • WeightedPrompt: Một chuỗi văn bản mô tả ý tưởng âm nhạc, thể loại, nhạc cụ, tâm trạng hoặc đặc điểm. Bạn có thể cung cấp nhiều câu lệnh để kết hợp các ảnh hưởng. Hãy xem phần trên để biết thêm thông tin về cách đưa ra câu lệnh hiệu quả nhất cho Lyria RealTime.
  • MusicGenerationConfig: Cấu hình cho quá trình tạo nhạc, ảnh hưởng đến các đặc điểm của âm thanh đầu ra.). Các tham số bao gồm:
    • guidance: (float) Phạm vi: [0.0, 6.0]. Mặc định: 4.0. Kiểm soát mức độ tuân thủ câu lệnh của mô hình. Hướng dẫn cao hơn giúp cải thiện khả năng tuân thủ câu lệnh, nhưng khiến quá trình chuyển đổi trở nên đột ngột hơn.
    • bpm: (int) Phạm vi: [60, 200]. Đặt nhịp mỗi phút mà bạn muốn cho nhạc được tạo. Bạn cần dừng/phát hoặc đặt lại ngữ cảnh để mô hình tính đến nhịp mỗi phút mới.
    • density: (float) Phạm vi: [0.0, 1.0]. Kiểm soát mật độ của các nốt nhạc/âm thanh. Giá trị thấp hơn tạo ra nhạc thưa thớt hơn; giá trị cao hơn tạo ra nhạc "bận rộn" hơn.
    • brightness: (float) Phạm vi: [0.0, 1.0]. Điều chỉnh chất lượng âm sắc. Giá trị cao hơn tạo ra âm thanh "sáng hơn", thường nhấn mạnh tần số cao hơn.
    • scale: (Enum) Đặt âm giai (Khoá và Chế độ) cho quá trình tạo. Sử dụng các giá trị enum Scale do SDK cung cấp. Bạn cần dừng/phát hoặc đặt lại ngữ cảnh để mô hình tính đến âm giai mới.
    • mute_bass: (bool) Mặc định: False. Kiểm soát việc mô hình có giảm âm trầm của đầu ra hay không.
    • mute_drums: (bool) Mặc định: False. Kiểm soát việc mô hình có giảm âm trống của đầu ra hay không.
    • only_bass_and_drums: (bool) Mặc định: False. Điều chỉnh mô hình để chỉ cố gắng xuất âm trầm và trống.
    • music_generation_mode: (Enum) Cho biết mô hình có nên tập trung vào QUALITY (giá trị mặc định) hay DIVERSITY của nhạc hay không. Bạn cũng có thể đặt thành VOCALIZATION để cho phép mô hình tạo ra các âm thanh như một nhạc cụ khác (thêm các âm thanh đó làm câu lệnh mới).
  • PlaybackControl: Các lệnh để kiểm soát các khía cạnh phát lại, chẳng hạn như phát, tạm dừng, dừng hoặc đặt lại ngữ cảnh.

Đối với bpm, density, brightnessscale, nếu không có giá trị nào được cung cấp, mô hình sẽ quyết định giá trị nào là tốt nhất theo câu lệnh ban đầu của bạn.

Bạn cũng có thể tuỳ chỉnh các tham số cổ điển hơn như temperature (0.0 đến 3.0, mặc định là 1.1), top_k (1 đến 1000, mặc định là 40) và seed (0 đến 2 147 483 647, được chọn ngẫu nhiên theo mặc định) trong MusicGenerationConfig.

Giá trị enum âm giai

Sau đây là tất cả các giá trị âm giai mà mô hình có thể chấp nhận:

Giá trị enum Âm giai / Khoá
C_MAJOR_A_MINOR Đô trưởng / La thứ
D_FLAT_MAJOR_B_FLAT_MINOR Rê giáng trưởng / Si giáng thứ
D_MAJOR_B_MINOR Rê trưởng / Si thứ
E_FLAT_MAJOR_C_MINOR Mi giáng trưởng / Đô thứ
E_MAJOR_D_FLAT_MINOR Mi trưởng / Đô thăng/Rê giáng thứ
F_MAJOR_D_MINOR Fa trưởng / Rê thứ
G_FLAT_MAJOR_E_FLAT_MINOR Sol giáng trưởng / Mi giáng thứ
G_MAJOR_E_MINOR Sol trưởng / Mi thứ
A_FLAT_MAJOR_F_MINOR La giáng trưởng / Fa thứ
A_MAJOR_G_FLAT_MINOR La trưởng / Fa thăng/Sol giáng thứ
B_FLAT_MAJOR_G_MINOR Si giáng trưởng / Sol thứ
B_MAJOR_A_FLAT_MINOR Si trưởng / Sol thăng/La giáng thứ
SCALE_UNSPECIFIED Mặc định / Mô hình quyết định

Mô hình có khả năng hướng dẫn các nốt được phát, nhưng không phân biệt giữa các khoá tương đối. Do đó, mỗi enum tương ứng với cả trưởng và thứ tương đối. Ví dụ: C_MAJOR_A_MINOR sẽ tương ứng với tất cả các phím trắng của đàn piano và F_MAJOR_D_MINOR sẽ là tất cả các phím trắng ngoại trừ Si giáng.

Các điểm hạn chế

  • Chỉ nhạc cụ: Mô hình chỉ tạo nhạc cụ.
  • An toàn: Các câu lệnh được kiểm tra bằng bộ lọc an toàn. Các câu lệnh kích hoạt bộ lọc sẽ bị bỏ qua. Trong trường hợp đó, lời giải thích sẽ được viết trong trường filtered_prompt của đầu ra.
  • Tạo hình mờ: Âm thanh đầu ra luôn được tạo hình mờ để nhận dạng theo các nguyên tắc AI có trách nhiệm của chúng tôi.

Bước tiếp theo

  • Tạo bài hát hoàn chỉnh và bản nhạc có giọng hát bằng Lyria 3,
  • Thay vì nhạc, hãy tìm hiểu cách tạo cuộc trò chuyện nhiều người nói bằng các mô hình TTS,
  • Khám phá cách tạo hình ảnh hoặc video,
  • Thay vì tạo nhạc hoặc âm thanh, hãy tìm hiểu cách Gemini có thể hiểu các tệp âm thanh,
  • Trò chuyện theo thời gian thực với Gemini bằng Live API.

Khám phá Sổ tay hướng dẫn để xem thêm các ví dụ về mã và hướng dẫn.