【SynthPresetGenerator】シンセサイザーのプリセットを自然言語から作り出す
この記事はLLM・LLM活用 Advent Calendar 2025の19日目の記事です。
初めに
気が付いたら今年もアドベントカレンダーの時期になってまいりました。毎度のごとくのがばがばスケジュール管理により始めたプロジェクトが軒並み失敗してしまったので、前回の生成AIなんでも展示会で展示したSynthPresetGeneratorの解説記事とさせていただきます。
SynthPresetGeneratorとは
ボカロやEDMなどの音楽制作に使用されるシンセサイザーという楽器は、膨大なパラメータの組み合わせによって多種多様な音を作り出すことができます。このパラメータの組み合わせはプリセットとして保存されています。本記事では、自然言語からシンセサイザーのプリセットを生成し、理想とする音色を作り出すことを目的としています。
※筆者はシンセサイザーについてはよくわかっていません。データの前処理やシンセサイザーの選定はうちのチームのmaluyuuがやってくれました。
シンセサイザー選定
プリセットファイルができる限り単純なファイル構成であり再現しやすいものである必要があります。
- json形式でパラメータを保持
- 音声データの埋め込みがない
上記2点からvitalを対象としてモデルの開発を行います。
モデルアーキテクチャ(v1)
展示会時点ではアーキテクチャは下記のような単純な構造で制作しました
x (意味ベクトル)
│
▼
ŷ = F(x) ← 単一MLP(Direct Predictor)
│
▼
L(ŷ, y*) ← 損失
言語情報のかかわる部分から学習を行うにはデータ量や計算資源が足りないため、promptをcl-nagoya/ruri-v3-310mを用いて意味ベクトルに変換しそのままMLPに流すような設計にすることで学習の対象をMLPに絞ることができました。
またチームメイト曰く、単純なファイル構造をしているvitalにもバイナリやよくわからないパラメータがあるらしいです。これらの部分については生成することが困難であるため、プロンプトと類似度の高いキャプションを持つ既存のプリセットのパラメータを使いまわすことで安定させています。
モデルアーキテクチャ(v2)
アドベントカレンダーへ向けてリポジトリの内容をLLMと確認する中で、プリセット自体にある程度の関係性があることを改めて認識しました。そこで全てのパラメータに対して一つのMLPで予測するv1のモデル構造を発展させ、パラメータの大まかなグループごとに内部でモデルを分けて統合する形のモデルを考えました。また同時に必要以上のパラメータを予測対象としているのではないかという指摘から、予測対象のパラメータ数を大幅に制限しました。
x (意味ベクトル)
│
▼
h = T(x) ← Shared Trunk
│
├─ y₁ = H₁(h) ← 専門Head 1
├─ y₂ = H₂(h) ← 専門Head 2
├─ ...
└─ y_K = H_K(h) ← 専門Head K
│
▼
y_raw = concat(y₁, y₂, ..., y_K)
│
▼
ŷ = C(y_raw) ← Coordinator(任意)
│
▼
L(ŷ, y*) ← 損失
予測対象パラメータの選定にはもう少しこだわり実験を行うべきですが、アーキテクチャ自体の動作確認は成功しモデルの学習及び推論を実現することができました。
合成データづくり
モデルのアーキテクチャは確定しましたが、肝心の自然言語とプリセットをペアとしたデータが存在しません。幸いなことにフリーで公開されているプリセットが豊富なためどうにか自然言語でのキャプションがあればデータとしては成立します。
そこで大分ごり押しではありますが
- プリセット名
- プリセットタイプ(ジャンルみたいなの)
- 主要ないくつかのパラメータの値
という三つの要素をプロンプトに組み込み、ローカルLLMを用いてデータの自然言語部分となるキャプションを合成することを考えました。
またキャプションが同じようなものばかりになってしまうという問題があったため、ランダムに指定されたジャンルでの比喩表現を強制することで気休め程度にデータに多様性を作りました。
プロンプト
あなたはシンセサイザー音楽の専門家です。以下のVitalプリセット情報から、そのサウンドの特徴を説明する日本語キャプションを生成してください。
プリセット名: {name}
ジャンル/スタイル: {preset_style}
キャプションテーマ: {random_seed}。
このプリセットがどのような音色や雰囲気を持つかを想像してエフェクト、音の質感、用途(例: ベースリード、パッド、アルペジオ、SFX など)も含め、簡潔に記述してください。
シンセサイザーのパラメーターの数字は音色の想像のための参考に留め、出力の中でその具体的数値やパラメーター名には言及せず、その音から想起される情景など抽象的な表現を心がけてください。
またキャプション生成にはキャプションテーマを反映させてください。
出力は日本語。引用符は使わず、プレーンテキストのみを100文字で出力してください。
今後の展望
アーキテクチャについてはアドベントカレンダーに向けて急遽改修を行いましたが、データの品質の低さについては未だ改善できていません。改善のために以下を計画しています。
-
プロンプト形式の改善
現在はLLMに適当に作らせた文書を基に学習をしているため、要求されるプロンプトは100文字程度の軽い文章となります。この形式では歌詞に紐づけて音作りを行うこともできますが、一方データの品質の管理や評価面で問題が発生してしまいます。
これを改善するために画像生成のようなタグを複数並べる形式のプロンプトでモデルを制作することやネガティブプロンプトの概念を作ることを考えています。 -
データと音を直接的に紐づける
こちらについてはmaluyuuが進めているものになりますが、キャプション生成過程で実際のシンセサイザーの音が結び付けられていないという問題に対して、スペクトル解析などの手法を用いて既存の音声と言語をつなぐようなモデルをパイプラインに組み込むことで言語データとシンセサイザーの音の結びつきを強化します。
最後に
展示会という締め切りへ何とか間に合わせた本プロジェクトでしたが、この機会に改めて改善点や問題点に向き合うことができました。アドベントカレンダーとか展示会後のレポートとか、作った作品を後から見直す時間はちゃんと作った方がいいなと感じました。(実はもう一個最低限の実装から放置しちゃってるプロジェクトがあったり...)
供養(宣伝)
個人的に気に入ってたけどあんまり見てもらえなかったやつ
Discussion