Lyria RealTime을 사용한 음악 생성

Lyria RealTime을 사용하는 Gemini API는 최첨단 실시간 스트리밍 음악 생성 모델에 대한 액세스를 제공합니다. 이를 통해 개발자는 사용자가 대화형으로 만들고, 지속적으로 조종하고, 기악 음악을 연주할 수 있는 애플리케이션을 빌드할 수 있습니다.

Lyria RealTime을 사용하여 빌드할 수 있는 항목을 체험하려면 AI Studio에서 프롬프트 DJ 또는 MIDI DJ 앱을 사용해 보세요.

음악 생성 작동 방식

Lyria RealTime 음악 생성은 WebSocket을 사용하여 영구적이고 양방향이며 짧은 지연 시간의 스트리밍 연결을 사용합니다.

음악 생성 및 제어

Lyria RealTime은 웹소켓을 사용하여 모델과의 실시간 통신을 유지한다는 점에서 Live API와 약간 비슷하게 작동합니다. 모델과 대화할 수 없고 프롬프트를 표시하려면 특정 형식을 사용해야 하므로 완전히 동일하지는 않습니다.

다음 코드는 음악을 생성하는 방법을 보여줍니다.

Python

이 예시에서는 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': '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())

자바스크립트

이 예에서는 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: "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()를 사용하여 세션을 시작, 일시중지, 중지 또는 재설정할 수 있습니다.

실시간으로 음악 조정

Lyria RealTime 프롬프트

스트림이 활성 상태인 동안 언제든지 새 WeightedPrompt 메시지를 보내 생성된 음악을 변경할 수 있습니다. 모델이 새 입력을 기반으로 원활하게 전환됩니다.

프롬프트는 text (실제 프롬프트) 및 weight을 사용하여 올바른 형식을 따라야 합니다. weight0을 제외한 모든 값을 사용할 수 있습니다. 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),
    ]
  )

자바스크립트

  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,
      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 실시간 음악 생성 사용 방법을 구체적으로 설명합니다.

사양

  • 출력 형식: 원시 16비트 PCM 오디오
  • 샘플링 레이트: 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: (열거형) 생성을 위한 음악적 스케일 (키 및 모드)을 설정합니다. SDK에서 제공하는 Scale enum 값을 사용합니다. 새 스케일을 고려하도록 모델의 컨텍스트를 중지/재생하거나 재설정해야 합니다.
    • 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~2147483647, 기본적으로 무작위 선택)과 같은 더 클래식한 매개변수도 MusicGenerationConfig에서 맞춤설정할 수 있습니다.

열거형 값 확장

모델에서 허용할 수 있는 모든 스케일 값은 다음과 같습니다.

enum 값 스케일 / 키
C_MAJOR_A_MINOR C장조 / A단조
D_FLAT_MAJOR_B_FLAT_MINOR D♭장조 / B♭단조
D_MAJOR_B_MINOR D장조 / B단조
E_FLAT_MAJOR_C_MINOR E♭ 장조 / C 단조
E_MAJOR_D_FLAT_MINOR E장조 / C♯/D♭단조
F_MAJOR_D_MINOR F장조 / D단조
G_FLAT_MAJOR_E_FLAT_MINOR G♭장조 / E♭단조
G_MAJOR_E_MINOR G장조 / E단조
A_FLAT_MAJOR_F_MINOR A♭ 장조 / F 단조
A_MAJOR_G_FLAT_MINOR A장조 / F♯/G♭단조
B_FLAT_MAJOR_G_MINOR B♭장조 / G단조
B_MAJOR_A_FLAT_MINOR B장조 / G♯/A♭단조
SCALE_UNSPECIFIED 기본값 / 모델 결정

이 모델은 연주되는 음을 안내할 수 있지만 상대 키는 구분하지 않습니다. 따라서 각 enum은 상대적 메이저 버전과 마이너 버전에 모두 해당합니다. 예를 들어 C_MAJOR_A_MINOR은 피아노의 모든 흰색 건반에 해당하고 F_MAJOR_D_MINOR은 B 플랫을 제외한 모든 흰색 건반에 해당합니다.

제한사항

  • 인스트루멘탈만 해당: 모델이 인스트루멘탈 음악만 생성합니다.
  • 안전: 프롬프트는 안전 필터에 의해 검사됩니다. 필터를 트리거하는 프롬프트는 무시되며, 이 경우 출력의 filtered_prompt 필드에 설명이 작성됩니다.
  • 워터마크: 출력 오디오에는 Google의 책임감 있는 AI 원칙에 따라 식별을 위한 워터마크가 항상 지정됩니다.

다음 단계

  • 음악 대신 TTS 모델을 사용하여 다중 화자 대화를 생성하는 방법을 알아보세요.
  • 이미지 또는 동영상을 생성하는 방법을 알아보고,
  • 음악이나 오디오를 생성하는 대신 Gemini가 오디오 파일을 이해하는 방법을 알아보세요.
  • Live API를 사용하여 Gemini와 실시간으로 대화합니다.

Cookbook에서 더 많은 코드 예시와 튜토리얼을 살펴보세요.