Генерация музыки с использованием Lyria RealTime

API Gemini, использующий Lyria RealTime , предоставляет доступ к современной модели потоковой генерации музыки в режиме реального времени. Он позволяет разработчикам создавать приложения, в которых пользователи могут интерактивно создавать, непрерывно управлять и исполнять инструментальную музыку.

Чтобы увидеть, что можно создать с помощью Lyria RealTime, попробуйте использовать AI Studio с приложениями Prompt DJ или MIDI DJ !

Как работает генерация музыки

Генерация музыки Lyria RealTime использует постоянное, двунаправленное потоковое соединение с малой задержкой с использованием WebSocket .

Генерируйте и управляйте музыкой

Lyria RealTime работает примерно так же, как Live API, в том смысле, что использует веб-сокеты для поддержания связи с моделью в режиме реального времени. Однако это не совсем то же самое, поскольку вы не можете напрямую взаимодействовать с моделью и должны использовать определённый формат для отправки ей запросов.

Следующий код демонстрирует, как генерировать музыку:

Питон

В этом примере сеанс 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(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";
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() для запуска, приостановки, остановки или сброса сеанса.

Управляйте музыкой в ​​реальном времени

Prompt Lyria RealTime

Пока поток активен, вы можете в любой момент отправлять новые сообщения WeightedPrompt для изменения генерируемой музыки. Модель будет плавно переключаться в зависимости от новых входных данных.

Подсказки должны соответствовать правильному формату, включая text (саму подсказку) и weight . weight может принимать любое значение, кроме 0 1.0 обычно является хорошей отправной точкой.

Питон

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

Обратите внимание, что переходы модели могут быть немного резкими при резком изменении подсказок, поэтому рекомендуется реализовать своего рода плавный переход, отправив модели промежуточные значения веса.

Обновить конфигурацию

Вы также можете обновлять параметры генерации музыки в режиме реального времени. Нельзя просто обновить параметр, необходимо настроить всю конфигурацию, иначе остальные поля будут сброшены к значениям по умолчанию.

Поскольку обновление частоты ударов в минуту или масштаба — это радикальное изменение для модели, вам также потребуется указать ей сбросить контекст с помощью reset_context() чтобы учесть новую конфигурацию. Это не остановит поток, но будет сложным переходом. Для других параметров это делать не нужно.

Питон

  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.

Технические характеристики

  • Формат вывода: Raw 16-битный PCM Audio
  • Частота дискретизации: 48 кГц
  • Каналы: 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 : (перечисление) Задаёт музыкальную гамму (тональность и лад) для генерации. Используйте значения перечисления Scale , предоставляемые SDK. Вам необходимо остановить/воспроизвести или сбросить контекст модели, чтобы учесть новую гамму.
    • 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 до 2 147 483 647, по умолчанию выбирается случайным образом), также настраиваются в MusicGenerationConfig .

Масштабировать значения перечисления

Вот все значения шкалы, которые может принять модель:

Значение перечисления Шкала / Ключ
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♭ мажор / соль минор
B_MAJOR_A_FLAT_MINOR Си мажор / соль♯/ля♭ минор
SCALE_UNSPECIFIED По умолчанию / Модель решает

Модель способна управлять исполняемыми нотами, но не различает относительные тональности. Таким образом, каждое перечисление соответствует как относительному мажору, так и относительному минору. Например, C_MAJOR_A_MINOR будет соответствовать всем белым клавишам фортепиано, а F_MAJOR_D_MINOR — всем белым клавишам, кроме си-бемоль.

Ограничения

  • Только инструментальная музыка: модель генерирует только инструментальную музыку.
  • Безопасность: запросы проверяются фильтрами безопасности. Запросы, вызывающие срабатывание фильтров, будут игнорироваться, и в этом случае в поле filtered_prompt вывода будет записано пояснение.
  • Водяные знаки: Выходной аудиофайл всегда маркируется водяными знаками для идентификации в соответствии с нашими принципами ответственного ИИ .

Что дальше?

  • Вместо музыки научитесь генерировать многоговорящую беседу, используя модели TTS .
  • Узнайте, как создавать изображения или видео ,
  • Вместо того, чтобы генерировать музыку или аудио, узнайте, как Gemini может понимать аудиофайлы ,
  • Общайтесь с Gemini в режиме реального времени, используя Live API .

Дополнительные примеры кода и учебные пособия можно найти в « Кулинарной книге» .