Lyria RealTime を使用したリアルタイムの音楽生成

Gemini API は、Lyria RealTime を使用して、最先端のリアルタイム ストリーミング音楽生成モデルへのアクセスを提供します。ユーザーがインタラクティブに作成し、継続的に操作して、インストゥルメンタル音楽を演奏できるアプリケーションをデベロッパーが構築できるようにします。

Lyria RealTime の音楽生成では、WebSocket を使用した永続的な双方向低レイテンシ ストリーミング接続が使用されます。

Lyria RealTime を使用して構築できるものを体験するには、AI Studio で Prompt DJ アプリまたは MIDI 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': 'v1beta'})

  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: "v1beta" ,
});

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 を含む正しい形式に従う必要があります。weight には、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.setWeightedPrompts({
    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 は、重み付けされたプロンプトを使用して、音楽ジャンル、楽器、ムードを動的にブレンドします。プロンプト ステアリング戦略、キーワード タグの語彙、完全なプロンプトの例については、Lyria プロンプト ガイドをご覧ください。

ベスト プラクティス

  • クライアント アプリケーションは、スムーズな再生を保証するために、堅牢な音声バッファリングを実装する必要があります。これにより、ネットワーク ジッターと生成レイテンシのわずかな変動を考慮できます。
  • 効果的なプロンプト:
    • わかりやすいラベルを付けます。ムード、ジャンル、楽器を説明する形容詞を使用します。
    • 反復して徐々に舵を切ります。プロンプトを完全に変更するのではなく、要素を追加または変更して、音楽をよりスムーズに変化させてみてください。
    • WeightedPrompt の重みを調整して、新しいプロンプトが進行中の生成にどの程度影響するかを調整します。

詳細な技術情報

このセクションでは、Lyria RealTime の音楽生成機能の使用方法について詳しく説明します。

仕様

  • 出力形式: RAW 16 ビット PCM 音声
  • サンプルレート: 48 kHz
  • チャンネル: 2(ステレオ)

コントロール

音楽生成は、次の情報を含むメッセージを送信することでリアルタイムに影響を受ける可能性があります。

  • WeightedPrompt: 音楽のアイデア、ジャンル、楽器、ムード、特徴を説明するテキスト文字列。複数のプロンプトを指定して、影響をブレンドすることもできます。Lyria RealTime を最適にプロンプトする方法について詳しくは、上記をご覧ください。
  • MusicGenerationConfig: 音楽生成プロセスの構成。出力音声の特性に影響します。パラメータには次のものがあります。
    • guidance:(浮動小数点数)範囲: [0.0, 6.0]。デフォルト: 4.0。モデルがプロンプトにどの程度厳密に従うかを制御します。ガイダンスが高いほど、プロンプトへの準拠度は高くなりますが、トランジションがより急になります。
    • bpm:(int)範囲: [60, 200]。生成する音楽の BPM を設定します。新しい BPM を考慮するには、モデルのコンテキストを停止/再生するか、リセットする必要があります。
    • density:(浮動小数点数)範囲: [0.0, 1.0]。音符や音の密度を制御します。値が小さいほど音楽はまばらになり、値が大きいほど音楽は「忙しく」なります。
    • brightness:(浮動小数点数)範囲: [0.0, 1.0]。音質を調整します。値が大きいほど、音声が「明るく」なり、一般的に高周波が強調されます。
    • scale:(列挙型)生成の音階(キーとモード)を設定します。SDK で提供される Scale 列挙型値を使用します。モデルが新しいスケールを考慮するように、モデルのコンテキストを停止/再生するか、リセットする必要があります。
    • mute_bass:(bool)デフォルト: False。モデルが出力の低音を減らすかどうかを制御します。
    • mute_drums:(bool)デフォルト: False。モデルの出力で出力のドラムを減らすかどうかを制御します。
    • only_bass_and_drums:(bool)デフォルト: False。ベースとドラムのみを出力するようにモデルを誘導します。
    • music_generation_mode:(列挙型) 音楽の QUALITY(デフォルト値)または DIVERSITY のどちらに焦点を当てるかをモデルに指示します。また、VOCALIZATION に設定して、モデルが発声を別の楽器として生成できるようにすることもできます(新しいプロンプトとして追加します)。
  • PlaybackControl: 再生アスペクトを制御するコマンド(再生、一時停止、停止、コンテキストのリセットなど)。

bpmdensitybrightnessscale に値を指定しない場合、モデルは最初のプロンプトに基づいて最適な値を決定します。

temperature(0.0 ~ 3.0、デフォルト 1.1)、top_k(1 ~ 1,000、デフォルト 40)、seed(0 ~ 2,147,483,647、デフォルトでランダムに選択)などのより古典的なパラメータも、MusicGenerationConfig でカスタマイズできます。

Scale 列挙値

モデルで使用できるスケール値は次のとおりです。

列挙値 スケール / キー
C_MAJOR_A_MINOR ハ長調 / イ短調
D_FLAT_MAJOR_B_FLAT_MINOR D♭ メジャー / B♭ マイナー
D_MAJOR_B_MINOR D major / B minor
E_FLAT_MAJOR_C_MINOR E♭ major / C minor
E_MAJOR_D_FLAT_MINOR E メジャー / C♯/D♭ マイナー
F_MAJOR_D_MINOR ヘ長調 / ニ短調
G_FLAT_MAJOR_E_FLAT_MINOR G♭ major / E♭ minor
G_MAJOR_E_MINOR ト長調 / ホ短調
A_FLAT_MAJOR_F_MINOR A♭ major / F minor
A_MAJOR_G_FLAT_MINOR A major / F♯/G♭ minor
B_FLAT_MAJOR_G_MINOR 変ロ長調 / ト短調
B_MAJOR_A_FLAT_MINOR B メジャー / G♯/A♭ マイナー
SCALE_UNSPECIFIED デフォルト / モデルにより判断

このモデルは演奏される音符をガイドできますが、相対キーを区別することはできません。したがって、各列挙型は相対的なメジャーとマイナーの両方に対応します。たとえば、C_MAJOR_A_MINOR はピアノのすべての白鍵に対応し、F_MAJOR_D_MINOR は B フラット以外のすべての白鍵に対応します。

制限事項

  • インストゥルメンタルのみ: モデルはインストゥルメンタル音楽のみを生成します。
  • 安全性: プロンプトは安全フィルタによってチェックされます。フィルタをトリガーするプロンプトは無視されます。その場合、出力の filtered_prompt フィールドに説明が書き込まれます。
  • 透かし: 出力音声には、責任ある AI の原則に従って、識別用の透かしが常に付加されます。

次のステップ

  • Lyria 3.5 を使用して、フルソングとボーカル トラックを生成します。
  • 音楽ではなく、TTS モデルを使用して複数話者の会話を生成する方法を学習します。
  • 画像動画を生成する方法について説明します。
  • 音楽や音声の生成ではなく、Gemini が音声ファイルを理解する方法について説明します。
  • Live API を使用して、Gemini とリアルタイムで会話できます。

コード例とチュートリアルについては、クックブックをご覧ください。