aria-utils

Activity, over time

Daily observations from the public event archive.

Attention

Daily stars & forks

Loading attention chart

Star accumulation

Cumulative stars

Loading star accumulation chart

Pull requests

Daily opens & merges

Loading pull requests chart

Conversations

Daily issues & comments

Loading conversations chart

Community

Daily accounts & reviews

Loading community chart

Releases

Daily releases

Loading releases chart

Mentions

1post · 30d
Nov 30 posts
  1. Zenn · · @myan_1

    【Windows 11】AIでクラシックピアノMIDIを生成|Ariaローカル環境構築 この記事を書いた理由 Ariaを使ってクラシックピアノのMIDIをAI生成したい 公開されている構築はLinux環境が中心で、Windowsでの構築手順が見つけにくかった クラウドサービスを使わず、手元のPCでローカル実行したい NVIDIA RTX4060 VRAM 8GBで動作確認  2026年10月26日 前知識 Ariaについて Ariaは、EleutherAI が公開している、ピアノ演奏の MIDI を生成する音楽生成モデルです。 LLaMA 3.2(1B)アーキテクチャをベースとしており、約60,000時間のフィルタリングされたソロピアノ録音をMIDIに書き起こしたデータで学習しています。 このデータは実際の演奏を書き起こしたものなので、実際の演奏に由来するタイミングや強弱などの情報を学習しています。 データセットも公開されています。 上記の通りAriaは既存のデータセットに比べて非常に大規模なものとなっています。 データセット/モデル 公開年 データ規模 MAESTRO 2018〜2019年 約200時間 GiantMIDI-Piano 2022年 約1,237時間 Aria(事前学習データ) 2025年 約60,000時間 ※ データセットとモデルの学習データを比較しているため、厳密に同じ条件での比較ではありません。 得意なことと注意点 Ariaはゼロからの生成よりも既存のピアノMIDIの続きを作ることが得意とされています。 また、入力はピアノ1トラックが最適とされています。 Ariaは入力の質に敏感です。 主に大量の演奏データから音楽のパターンを学習するモデルで、文章生成AIで使われるRLHF(人間のフィードバックによる強化学習)のような指示追従の追加学習は行われていないとGitHub公式にも記載されています。 また、「明るい曲調で」「ソナタ形式で」といったテキストでの指定はできません。 できることはプロンプトの選び方と温度などのサンプリング設定となります。 曲全体の構成を計画して作るわけではなく、次の音を連続して予測するモデルのため、曲全体の構成が常に保証されるわけではありません。(とはいえ通常はほとんど気になりません) Music Transformerとの違い 音楽生成AIの原点はMusic Transformer(2018年)と考えられます。 Music TransformerはYouTubeのピアノ録音を書き起こした約10,000時間で学習されています。 こちらは2020年の記事ですが、ぜひ読んでみてください。 qiita.com Music TransformerはTensorFlow系のライブラリやその他設定が必要であるため、今回は環境構築のしやすさからPyTorch系で実装できるAriaを用いています。 実装(仮想環境) 実行環境 OS:Windows 11 GPU:NVIDIA GeForce RTX 4060(VRAM 8GB) Git Anaconda(もしくはMiniforgeなど Condaが動く環境) 仮想環境はこの後手順を記載しているので事前の用意は不要です。 仮想環境:Conda Python:3.11 PyTorch:2.6.0(CUDA 12.4対応) CUDA Toolkit:12.4(V12.4.131) Transformers:4.57.6 1. アナコンダプロンプトを開く Condaを使用するため、Anaconda Promptを開きます。Miniforgeを使用している場合は、Miniforge Promptを開きます。 見当たらない場合はWindowsのアプリ検索から探してください。 Anaconda、もしくはMiniforgeが入っていない場合は各自入れてください。 他に用途がない場合は軽量のMiniforgeがおすすめです。 2. 仮想環境を作成 今回はpiano-aiという仮想環境を作成します。 Pythonのバージョンは3.11です。 conda create -n piano-ai python=3.11 -y conda activate piano-ai 3. PyTorchとCUDAをインストール 本記事では、動作確認済みのPyTorch(CUDA 12.4対応)を使用します。別のCUDA対応バージョンでも動作する可能性はありますが、本記事では検証していません。 pip install torch --index-url download.pytorch.org GPUの動作確認 python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))" 以下のように表示されればOKです。 True NVIDIA GeForce RTX 4060 4. Transformersをインストール "transformers<5"と記載するようにしてください。 最新バージョンの5.x系(5.20.2)ではエラーを確認しています。 pip install "transformers<5" バージョンを確認します。 pip show transformers 今回の環境では 4.57.6 を使用しています。 5. Aria関連ライブラリをインストール Gitをインストールしておく必要があります。 pip install git+EleutherAI/aria-utils これで仮想環境の構築は完了です。 実装(コード、入力MIDIデータ) 作業フォルダの中身 作業フォルダを作ります。(piano-ai フォルダを作成) ここに入力するMIDIと出力されるMIDI、pythonを設置します。 どこでも良いですが、私はユーザーディレクトリ直下に作りました。 フォルダ名も何でも良いです。 C:\Users\ユーザー名\piano-ai 作成したフォルダの中を以下の構造にしてください。 generate_piano.pyのコードは後述します。 piano-ai/ ├── generate_piano.py ├── input_midi/ │  └── 入力用.mid ※ └── output_midi/ input_midi...入力するMIDIを入れる output_midi...出力されるMIDIが生成される ※ input_midiの中に入力するMIDIを入れておいてください。ファイル名の指定はありません。 ここに入れるMIDIのデータを前奏として使いその後の続きを生成するため、前述の通り質の良いMIDIデータが理想とされています。 MIDIをお持ちでない方は、公式GitHubのリポジトリにexample-promptsというフォルダがあり、その中にMIDIがありますのでそちらを用いてください。 generate_piano.py(167行)AI加筆ですが内容精査済みです。ご確認なさってください。 """ Aria(ピアノMIDI続き生成)を transformers 経由で動かすスクリプト。 使い方: 1. このファイルの隣にある input_midi フォルダにピアノMIDI(.mid / .midi)を入れる 2. python generate_piano.py 3. 番号で入力MIDIを選び、作る本数を入力 4. 結果は output_midi フォルダに保存される 公式CLI(aria generate)との対応は、下の「設定」のコメントを参照。 """ import time from datetime import datetime from pathlib import Path import torch from huggingface_hub import hf_hub_download from safetensors.torch import load_file from transformers import AutoModelForCausalLM, AutoTokenizer ============================================================ 設定 ============================================================ BASE_DIR = Path(file).resolve().parent INPUT_DIR = BASE_DIR / "input_midi" # 続きを作りたい元のMIDIを置く場所 OUTPUT_DIR = BASE_DIR / "output_midi" # 生成結果の保存先 公式CLIの --checkpoint_path に相当(こちらはHugging Faceから自動取得) MODEL_NAME = "loubb/aria-medium-base" どの重みを使うか。 "base": from_pretrained が標準で読む model.safetensors(事前学習モデル) "gen" : 同じリポジトリ内の model-gen.safetensors(生成品質向けに追加学習したもの)で上書きする WEIGHTS = "gen" 公式CLIの --prompt_duration(秒指定)に相当する部分。 こちらは秒ではなくトークン数で切る。512トークンは、HFページのクイックスタートの値。 PROMPT_TOKENS = 512 公式CLIの --length 2048 に近い長さ。 HFの max_length は「プロンプト込みの総長」なので、プロンプト分を引いた新規トークン数で指定する。 TOTAL_TOKENS = 2048 NEW_TOKENS = TOTAL_TOKENS - PROMPT_TOKENS 公式CLIの --temp 0.98 に相当 TEMPERATURE = 0.98 公式CLIの --min_p 0.035 に相当。 「最も確率の高い候補の3.5%未満の確率しかない候補は捨てる」という足切り。 MIN_P = 0.035 ============================================================ def load_gen_weights(model) -> None: """model-gen.safetensors を読み込み、モデルの重みを gen に差し替える。 キー名がモデルと一致しないと、差し替えが黙って失敗して base のままになる。 それを防ぐため、読み込み結果を必ず表示し、不一致があれば止める。 """ path = hf_hub_download(MODEL_NAME, "model-gen.safetensors") state_dict = load_file(path) result = model.load_state_dict(state_dict, strict=False) print(f"gen重み: {len(state_dict)} 個のテンソルを読み込み") print(f" unexpected_keys(重み側にあるのにモデルに無い): {len(result.unexpected_keys)} 個 {result.unexpected_keys[:5]}") print(f" missing_keys(モデルにあるのに重み側に無い): {len(result.missing_keys)} 個 {result.missing_keys[:5]}") if result.unexpected_keys: print("キー名が一致しないため、genの重みは正しく適用されていません。") print("この表示をそのまま共有してください。") raise SystemExit(1) if result.missing_keys: print("注意: missing_keys が lm_head など共有される重みだけなら問題ありません。") def pick_prompt_file() -> Path: """input_midi 内のMIDIを一覧表示して、番号で選ばせる。""" midi_files = sorted( set(INPUT_DIR.glob(".mid")) | set(INPUT_DIR.glob(".midi")) ) if not midi_files: print(f"入力MIDIがありません: {INPUT_DIR}") print("input_midi フォルダにMIDIファイルを入れてください。") raise SystemExit(1) print("\n入力するMIDIを選択してください:") for i, path in enumerate(midi_files, start=1): print(f"{i}. {path.name}") while True: choice = input("\n番号を入力: ").strip() try: index = int(choice) - 1 if 0 <= index < len(midi_files): return midi_files[index] except ValueError: pass print("一覧にある番号を入力してください。") def ask_variations() -> int: """公式CLIの --variations に相当。一度に作る本数を聞く。""" while True: text = input("作る本数(Enterで1): ").strip() if text == "": return 1 if text.isdigit() and int(text) >= 1: return int(text) print("1以上の整数を入力してください。") def main() -> None: INPUT_DIR.mkdir(exist_ok=True) OUTPUT_DIR.mkdir(exist_ok=True) if not torch.cuda.is_available(): print("CUDAが使えません。PyTorchのCUDA版が入っているか確認してください。") raise SystemExit(1) prompt_path = pick_prompt_file() variations = ask_variations() print(f"\n入力: {prompt_path.name}") print("モデルを読み込んでいます...") fp16で読み込む(8GB VRAM向け) model = AutoModelForCausalLM.from_pretrained( MODEL_NAME, trust_remote_code=True, dtype=torch.float16, ).cuda().eval() tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True) if WEIGHTS == "gen": load_gen_weights(model) print(f"使用する重み: {WEIGHTS}") prompt = tokenizer.encode_from_file(str(prompt_path), return_tensors="pt") input_ids = prompt.input_ids[..., :PROMPT_TOKENS].cuda() print(f"プロンプト: {input_ids.shape[-1]} トークン") for n in range(1, variations + 1): print(f"\nMIDIを生成しています... ({n}/{variations})") start = time.time() with torch.no_grad(): output = model.generate( input_ids, max_new_tokens=NEW_TOKENS, do_sample=True, # 確率に従ってランダムに選ぶ(これがないと毎回同じ結果になる) temperature=TEMPERATURE, min_p=MIN_P, top_p=1.0, # 1.0 = 無効。足切りは min_p だけにする top_k=0, # 0 = 無効。HFは何も指定しないと top_k=50 が働くことがあるため明示的に切る use_cache=True, ) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") output_path = OUTPUT_DIR / f"{prompt_path.stem}_{timestamp}_{n:02d}.mid" tokenizer.decode(output[0].tolist()).to_midi().save(str(output_path)) print(f"生成完了 ({time.time() - start:.0f}秒): {output_path}") if name == "main": main() 入力側のMIDIの名称は自由で、複数配置可能です。 コードを実行した際にどの入力を使うかを選択可能です。 選択した入力で何個出力するかを指定可能です。 モデル等の記載がありますが、基本触らなくて大丈夫です。 トークン数や温度などはコードの中身から変更してください。 これで準備完了です。あとは実行するだけで生成可能です。 モデルや環境はローカルに保存されるため次回からは以下の実行手順を行なうだけで生成が可能です。 実行手順 Anaconda Prompt(Miniforgeの場合はMiniforge Prompt)を開く 仮想環境を有効化する conda activate piano-ai 作業フォルダに移動(それぞれの作業フォルダへ) cd C:\Users\ユーザー名\piano-ai スクリプトを実行 python generate_piano.py 画面の案内に従って、入力するMIDIファイルと生成する本数を選択する。 生成されたMIDIファイルは output_midi フォルダに保存されます。 参考 EleutherAI/aria huggingface.co arxiv.org Music Transformer magenta.tensorflow.org

Latest stargazers

The last 10 distinct accounts we observed this year.

Most active participants

PR, issue, comment & review events in the past year.

Packages

1
PackageVersionDownloads · 30dTrend · 30d
———

README badges

Embed a badge in your README or website.

Live mentions · last 30 days
EleutherAI/aria-utils mentions in the last 30 days