画像から音楽を生成する「img2music」を手探ってみる

この記事は[Akatsuki Games Advent Calendar 2022](https://adventar.org/calendars/7459) 17日目の記事です。

昨日のエントリーはFluffy Mossくんの[Unityからブラウザまで！　ロジックの切り出しに WASI を使ってみる](https://zenn.dev/flfymoss/articles/2022-12-16-unity-meets-wasi)でした。
ゲーム開発でのロジック共通化でしばしば使われるLua言語の代替手段としてWASI（WebAssembly System Interface）を取り上げ、実際にゲームエンジンに組み込んで性能測定を行うというとても読み応えのある内容になっています。

他にもバラエティ豊かな記事がたくさんあるので他のエントリーもぜひ読んでみてください。

## はじめに
Stable DiffusionやMidjourneyなどの影響でAIによるイラスト生成が少し前から大流行していますね。直近だとChatGPTを用いた会話botの精度の高さが話題となり、さまざまな無理難題をAIに押し付ける人たちをtwitter等で多く見かけるようになりました。
このように
- ある程度の精度・クオリティの高さが担保される
- 使いやすいサービスとしてリリースされる
- アーリーアダプターが発信し、アーリーマジョリティに見つかる

などの条件が満たされると世間で流行し始めるのかなと思います。

画像・会話の自動生成がくると他に思いつくのは「音楽の自動生成」でしょうか。これも分野としては随分と前から存在していますが、世間一般で話題になっているのはあまりみたことがないですね。
共有のしやすさ、作品としての評価のしやすさなどの観点もあるとは思いますが、一定のクオリティに達する作品が容易に生み出せるようになればまた流行が（権利問題と一緒に）発生するでしょう。

そこで今回は音楽の自動生成、特に「画像を元に音楽を生成する」という分野に焦点を当てて、生成の手順や出力結果に関してみていこうと思います。

## img2musicとは
　ユーザから入力として与えられた一枚の画像を元に、その画像を連想させるような音楽を自動的に生成することをimg2music(image to music)と呼びます。
画像を直接音楽に対するインプットとするのではなく、まず画像からその画像の特徴を説明するような単語のコーパスを作成し、そのコーパスを入力とすることで音楽を生成するという二段階の構成になっていることが多いです。
海の画像が与えられれば夏っぽい爽やかな音楽を、不気味な魔王城の画像であれば物々しい音楽を、といった具合に画像によってさまざまなパターンの音楽を生成して楽しむことができます。

## 実際に触ってみる
では実際に音楽の自動生成を試すことのできるサービスを触ってみましょう。
今回取り上げるのは[Img To Music](https://huggingface.co/spaces/fffiloni/img-to-music)というレポジトリで、Hugging Faceというオープンソースのプラットフォーム上で提供されているものです。好きな画像を貼ることで30秒の音楽を作ることができます。

試しに2つの画像の音楽を聴き比べてみましょう
まず一つ目がクリスマスの画像。華やかな感じのBGMは割とイメージに近いのではないでしょうか？
<blockquote class="twitter-tweet"><p lang="qme" dir="ltr"><a href="https://twitter.com/null?ref_src=twsrc%5Etfw">@null</a> <a href="https://t.co/P8RALnA37u">pic.twitter.com/P8RALnA37u</a></p>&mdash; すぎやん (@yuji9511_compro) <a href="https://twitter.com/yuji9511_compro/status/1602463536915312641?ref_src=twsrc%5Etfw">December 13, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

もう一つはこちらの神秘的な洞窟をチョイスしてみました。思ったよりノリノリな感じのがきましたが、途中に挟まっているソナー音みたいなやつがいい味出してますね。
<blockquote class="twitter-tweet"><p lang="qme" dir="ltr"><a href="https://twitter.com/null?ref_src=twsrc%5Etfw">@null</a> <a href="https://t.co/42LuZrG4ba">pic.twitter.com/42LuZrG4ba</a></p>&mdash; すぎやん (@yuji9511_compro) <a href="https://twitter.com/yuji9511_compro/status/1602463663247732737?ref_src=twsrc%5Etfw">December 13, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 実装を覗いてみる
先ほどのサービスの中身を覗いてみましょう。hugging faceのプロジェクトの実体はgithubのレポジトリで、UIとして表示するパーツをソースコード内に記述するような仕組みになっています。
https://huggingface.co/spaces/fffiloni/img-to-music/blob/main/app.py

### Image → Text(prompt)
入力として得られた画像をプロンプト（画像の特徴を説明する単語の集合）に変換するために[CLIP-Interrogator](https://huggingface.co/spaces/pharma/CLIP-Interrogator)が使われています。このプロンプトをStabel Diffusionなどに入力することで与えた画像と似たような画像を得ることができることから、類似した画像を大量に得たい場合などに使用されます。
例えば先ほど挙げたクリスマスの画像であれば以下のようなプロンプトに変換されます。
```
a red chair sitting in front of a christmas tree, decorations, glittering multiversal ornaments, festive atmosphere, christmas, red flags holiday, emitting light ornaments, istockphoto, well - decorated, istock, santa inside a rustic barn, cozy home background, glittering silver ornaments, cozy living room background, decorative ornaments, intrincate ornaments, ad image
```
どのようなプロンプトを与えれば自分の理想としている画像を生成できるかのあくなき探求を続けている人たちもたくさん存在します。もし興味を持った方は「Prompt Engineering」などで調べてみてください。

### Text(prompt) → Music
単語区切りのプロンプトが得られたらその文字情報を音楽に変換する処理を行います。
この部分の処理は[Mubert Text to Music](https://huggingface.co/spaces/Mubert/Text-to-Music)を使用しており、Sentence Transformerを用いてプロンプトを文章ベクトルに変換したのち、mubertが提供している音声生成のAPIにリクエストを投げることで音声を得ています。
Mubertのページからも自分好みなBGMが作成できるツールが色々と提供されているのでもし興味があれば触ってみてください。
https://mubert.com/

## Mubert API + Stable Diffusionによる動画生成
先ほどのImg To Musicのレポジトリのように、Mubert APIを利用すればベクトル化したプロンプト、再生時間、モード（ループ再生するか）などを指定するだけで簡単な実装で生成された音声を得ることができます。
Mubertのプロジェクトではこれに加えて、Stable Diffusionの動画作成のスクリプトにこの音楽生成を組み込むことで音声つきの動画を生成するスクリプトを公開していました。
[Deforum Stable Diffusion v0.5 + Mubert generative music](https://github.com/MubertAI/Mubert-Text-to-Music/blob/main/Deforum_Stable_Diffusion_Mubert.ipynb)
Stable Diffusionの基本的な実装はdeforum氏のStable Diffusionを踏襲し、いくつかパラメータの変更と音声生成部分の繋ぎ込みを行うことで実現していました。手元にクローンしてきたColaboratoryで問題なく動作したので試してみてください。



## おまけ1: Riffusion(riff + stable diffusion)
ちょうどこの記事を公開しようとしていた前日に面白いものがTLに流れてきたのでこちらのサービスも少し触れてみたいと思います。

先ほどのMubertを使用した音声生成では文字情報から直接音声データを作成していましたが、Riffusionでは画像を生成するStable Diffusionの画像生成モデルをそのまま流用し、fine-tuningをすることでスペクトログラムが生成されるようにしたものです。
スペクトログラムとは画像中に時間軸と周波数軸を持ち、色の濃淡を用いて音声情報を保持するような形式を指します。
このスペクトログラムはそのまま音声データに変換が可能なため、簡単にいうと「プロンプトから画像を生成するという処理自体がそのまま音声データを生成することと同義」となっています。

以下の画像に示すようなデモページでは、現在設定されているプロンプトを表現したBGMが流れ続けており、新しいプロンプトを設定すると徐々に新しいものへとシフトしていくような面白い曲調の変化を感じることができます。
（世に出たばかりのタイミングだからか、現時点で新しいプロンプトを入力しようとすると「サーバ足りないからちょっと待ってな」と言われるかもしれません）

![スクリーンショット 2022-12-16 9.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252597/99c17028-e3ce-ae83-b300-63e3a0250e27.png)

## おまけ2: 生成された音楽の音源に関して
ちなみに、この音声を生成するのに用いたAPIの提供元によるMubertによると、音楽に用いられている楽器などの音色の元となっている音源は実際のアーティストやサウンドクリエイターによって手掛けられたものだそうです。
ニューラルネットワークを用いてスクラッチで音色を生成するのではなく、収録されたベースとなる音源を組み合わせることである程度曲としての自然さとクオリティを担保していると思われます。
また、音楽作りに関して"from creators to creators"を掲げているようで、AIアートの際に起こっていたようなクリエイターの権利問題に関しても配慮していくような姿勢が感じられました。

## おわりに
img2musicの概要は理解していただけたでしょうか？
もう少し技術的詳細を深ぼろうとしていたのですが、（タイムリミットが迫っていたのもありますが）読みやすさを重視して全体的に概要を軽くなぞるような記事になりました。
近い未来にまたいくつか大きな技術的ブレイクスルーが起こりそうな分野だと思っているので、今後のアップデートにも注目していきたいと思います。






## 参考
http://cedro3.com/ai/img2music/

https://huggingface.co/spaces/fffiloni/img-to-music

https://www.riffusion.com/about

https://github.com/MubertAI/Mubert-Text-to-Music

https://github.com/deforum/stable-diffusion