音楽生成AIをM1 MBAで動かす話
どうもえいやです
(こちらの記事は 2024年05月18日に Note に投稿したものを改変・転載したものです)
なんのお話?
今回は音楽生成AIとして有名な Facebook の MusicGen を非対応環境であるApple Silicon マシン(M1 Macbook Air)で動くようにしてみた話です
早い話が、Intel マシンエミュレータのLLVMを介してビルドしたら動きますよという話ですので、どうやってか知りたいだけの方はここまで読めば結構です
どうして音楽生成を?
先ごろ作ったサービスの一部として投稿している Youtube の動画に音楽を使いたいからです
なぜ M1 MBA で?
最近のテーマで、M1 MBA 上で動く生成AIを使ったサービスを運用してみよう。というのをやっているからです
NVIDIA の GPU が載っているマシンも持っているので、手持ちの MBAで動かす必要はないのですが
上記のテーマの発想として、生成AIを Apple Silicon マシン で動かしたい人もたくさんいて、記事を書くと読まれそう(ひいてはサービスも見てくれそう)というのがあります
なので、サービスに関わる色々な生成AIを手持ちの M1 MBA で動かすところまでやってみています
マシンパワーの不足や時間がかかりすぎるなどの場合は、実際のサービスにはクラウドや別のマシンで生成したものを使ったりすることもあります(基本的には、MBAで生成しています)
投稿している動画とは?
英文の読み上げ動画です
動画の内容の説明のため、開発中のサービスを紹介しておきましょう
毎日英語の短いストーリーを生成し、それに関する読解力を問う選択式クイズを5問出題する。というシンプルなサービスです
このサービスはリーディングの勉強のために使えますが、生成した文章をこれまたAIに読み上げさせることで、リスニングの勉強にも使えるというわけで、その機能を追加しました
作成した読み上げの音声は、ストーリーのテーマをもとに生成した一枚絵の画像を背景とした動画にしてYoutubeにアップロードしています
当初は単に読み上げるだけでしたが、それだと味気がないので、Youtube Music で配信できる Podcast としての体裁を整えてみました
Podcast にするためにホスト役のボイスに、それっぽいことを言わせてみたら
音楽のないラジオみたいでかえって味気なさが目立ったので音楽をつけたくなったというわけです
LLVMで動かすとは?
Appleからの突然の発表で、彗星の如く現れたスターの原石 M1 チップの登場のあとでも、全てのプログラムが Apple Silicon に対応しているわけではなかったので、当時は Intel CPU のエミュレータ環境を使ってプログラムを動かすことが多かったです
そのエミュレータが LLVM です(いまでも一部はIntelのみ対応なので現役のはず)
M1 非対応のプログラムでも、 Intel CPU に対応していれば動かせる可能性があるわけなので、MusicGen も LLVM で動かせば動く可能性があるわけですね
動かしてみて?
以下のようにして LLVM の C環境を使って MusicGen に対応している audiocraft を pipインストールします(Python環境は自分で作ってください)
conda create -n gen_music python=3.10.14
conda activate gen_music
pip install torch
brew install ffmpeg
git submodule update
# xformers が M1 で動かないので llvm のコンパイラでビルドする
brew install llvm
MACOSX_DEPLOYMENT_TARGET=10.9 CC=/opt/homebrew/opt/llvm/bin/clang CXX=/opt/homebrew/opt/llvm/bin/clang++ pip install git+https://github.com/facebookresearch/audiocraft.git
pythonスクリプトは以下のような感じです
from audiocraft.models import MusicGen
from audiocraft.data.audio import audio_write
model = MusicGen.get_pretrained("facebook/musicgen-small")
model.set_generation_params(duration=10) # seconds
descriptions = [",".join(["night club music", "sad", "piano", "trumpet", "moody", "jazz", "slow beat"])] * 3
wav = model.generate(descriptions, progress=True)
for idx, one_wav in enumerate(wav):
# Will save under {idx}.wav, with loudness normalization at -14 db LUFS.
audio_write(f'{idx}', one_wav.cpu(), model.sample_rate, strategy="loudness")
これを、sample.py として
python sample.py
とすれば3分くらいかかりますが、3つの音声ファイルが生成されるはずです
30秒尺でメタルロックを作ってもらったら以下の感じです
音楽の出来悪くない?
出来栄えは相当ランダムなので、頑張ってプロンプトをいじりつつ何度も生成してみるしかないです
時間を短くして、いい感じになるプロンプトに調整できたら1分くらいの曲を生成してみると良いでしょう
珍しい楽器の知識もあるので、和楽器鳴らさせることもできます
で、動画には音楽ついたの?
M1 MBAで音楽生成はできますが、何度も試す必要があるのにある程度の長さの曲を作ろうとすると時間がかかりすぎるので
とりあえず、似たような方法で作った生成AIの音楽をつけています
時間に余裕があればMBAでも結構遊べるので、試してみてください
Discussion