使用 Lyria RealTime 实时生成音乐

Gemini API 使用 Lyria RealTime, 提供对最先进的实时流式音乐 生成模型的访问权限。它允许开发者构建应用,让用户可以互动式地创作、持续引导和演奏器乐。

Lyria RealTime 音乐生成使用 WebSocket 建立持久性双向 低延迟流式连接。

如需体验使用 Lyria RealTime 可以构建哪些内容,请在 AI Studio 上使用 Prompt DJMIDI DJ 应用进行尝试。

生成和控制音乐

Lyria RealTime 的工作方式与 Live API 类似,它使用 WebSocket 与模型保持实时通信。

以下代码演示了如何生成音乐:

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

JavaScript

此示例使用 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(实际提示)和 weightweight 可以采用除 0 之外的任何值。1.0 通常是一个不错的起点。

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

请注意,大幅更改提示时,模型过渡可能会有些突然,因此建议通过向模型发送中间权重值来实现某种交叉淡入淡出效果。

更新配置

您可以通过实时更新音乐生成参数来引导音乐生成。您不能只更新一个参数,而是需要设置整个配置,否则其他字段将重置回其默认值。

由于更新 bpm 或音阶对模型来说是一项重大更改,因此您还需要告知模型使用 reset_context() 重置其上下文,以考虑新配置。它不会停止信息流,但会进行硬过渡。您无需对其他参数执行此操作。

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

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 音乐生成的具体细节。

规格

  • 输出格式:原始 16 位 PCM 音频
  • 采样率:48kHz
  • 声道:2(立体声)

控件

您可以通过发送包含以下内容的消息来实时影响音乐生成:

  • WeightedPrompt:描述音乐创意、类型、乐器、情绪或特征的文本字符串。您可以提供多个提示来融合影响。如需详细了解如何以最佳方式提示 Lyria RealTime,请参阅上文
  • MusicGenerationConfig:音乐生成过程的配置,影响输出音频的特征。参数包括:
    • guidance:(浮点数)范围:[0.0, 6.0]。默认值:4.0。 控制模型遵循提示的严格程度。指导值越高,对提示的遵循程度越高,但过渡越突然。
    • bpm:(整数)范围:[60, 200]。 设置您希望生成的音乐的每分钟节拍数。您需要停止/播放或重置模型的上下文,以便模型考虑新的 bpm。
    • density:(浮点数)范围:[0.0, 1.0]。 控制音符/声音的密度。值越低,音乐越稀疏;值越高,音乐越“繁忙”。
    • brightness:(浮点数)范围:[0.0, 1.0]。 调整音调质量。值越高,音频听起来越“明亮”,通常强调较高的频率。
    • scale:(枚举)设置生成的音乐音阶(调和模式)。使用 SDK 提供的 Scale 枚举值。您需要停止/播放或重置模型的上下文,以便模型考虑新的音阶。
    • mute_bass:(布尔值)默认值:False。 控制模型是否减少输出的低音。
    • mute_drums:(布尔值)默认值:False。 控制模型是否减少输出的鼓声。
    • only_bass_and_drums:(布尔值)默认值:False。 引导模型尝试仅输出低音和鼓声。
    • music_generation_mode:(枚举)向模型指示它应侧重于音乐的 QUALITY(默认值)还是 DIVERSITY。您还可以将其设置为 VOCALIZATION,让模型将发声作为另一种乐器生成(将其添加为新提示)。
  • PlaybackControl:用于控制播放方面的命令,例如播放、暂停、停止或重置上下文。

对于 bpmdensitybrightnessscale,如果未提供任何值,模型将根据您的初始提示决定最佳值。

您还可以在 MusicGenerationConfig 中自定义更多经典参数,例如 temperature(0.0 到 3.0,默认值为 1.1)、top_k(1 到 1000,默认值为 40)和 seed(0 到 2147483647,默认情况下随机选择)。

音阶枚举值

以下是模型可以接受的所有音阶值:

枚举值 音阶 / 调
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 默认值 / 模型决定

模型能够引导演奏的音符,但不会区分相对调。因此,每个枚举都对应于相对的大调和小调。例如,C_MAJOR_A_MINOR 对应于钢琴的所有白键,而 F_MAJOR_D_MINOR 对应于除 B♭ 之外的所有白键。

限制

  • 仅限器乐:模型仅生成器乐。
  • 安全性:提示由安全过滤器检查。触发过滤器的提示将被忽略,在这种情况下,系统会在输出的 filtered_prompt 字段中写入说明。
  • 水印:输出音频始终会添加水印,以便根据我们的 Responsible AI 原则进行识别。

后续步骤

  • 使用 Lyria 3 生成完整歌曲和人声曲目,
  • 了解如何使用 TTS 模型生成多说话人对话,而不是生成音乐,
  • 了解如何生成 图片视频
  • 了解 Gemini 如何 理解音频文件,而不是生成音乐或音频,
  • 使用 Live API与 Gemini 进行实时对话。

如需查看更多 代码示例和教程,请探索 Cookbook