onwx-music

AMD Ryzen AI の NPU で、手元の PC だけで音楽を作るアプリです(ACE-Step 1.5 turbo)。 「こんな音楽が聴きたい」と入れるだけで、曲を作りつづけて流しつづける エンドレス BGM モード があります。

English

NPU 全部盛り: テキストエンコーダ(Qwen3-Embedding-0.6B)・歌詞エンコーダ・DiT(24 層、8 ステップのサンプラーまで)・VAE デコーダを、 すべて NPU で動かします。CPU がするのはトークン化・ノイズ・WAV の書き出しだけです。

曲の長さ 生成時間(Ryzen AI Max+ 395)
30 秒 約 15 秒(エンコード 3.3 / 拡散 7.7 / デコード 3.8)
120 秒 約 30 秒(エンコード 3.5 / 拡散 12.2 / デコード 14.5)
180 秒 約 41 秒

SETUP の KEEP ENC をオンにすると、さらに 1 曲あたり約 1 秒速くなります(メモリは約 2 GB 増えます)。

メモリは生成中の最大で約 4 GB、待機中は約 2 GB です(重みは使う間だけ NPU に載せます)。

  • 動作環境: AMD Ryzen AI 300 / Max(XDNA2 NPU)と NPU ドライバ、Windows 11。メモリ 16 GB 以上(モデル約 4.3 GB)。 Ubuntu(amdxdna + XRT)は動くように作ってありますが、まだ試していません。
  • 曲の長さは 10〜600 秒。同じシード・同じ設定なら同じ曲になります。
  • まだないもの: 曲を計画する言語モデル(公式の「think」)、参照音声(音色の指定)、前の曲からの続き。

画面

アプリ全体が 1 台の機械のパネルです。値はすべてつまみとスイッチで変え、ドット表示の液晶に出ます。 ウィンドウには枠がありません。パネルの地(つまみ・キー・液晶以外のところ)をドラッグすると動き、右下の角で大きさを変えます。 右上は SETUP・最小化(MIN)・閉じる(CLOSE)。ヘッダーをダブルクリックすると最大化します。 上のキーでモードを切り替えます。赤いランプが今のモードで、BGM の再生中は BGM のランプが緑に点滅します。

つまみはドラッグ(上下・左右)、マウスホイール、矢印キーで回せます。Shift で細かく、ダブルクリックで初期値に戻ります。 回している(またはマウスを乗せた)つまみの名前と値は、右上の大きな液晶に出ます。

GEN — 1 曲つくる

GEN

  • TEMPO: BPM(左いっぱいで AUTO)・LENGTH(10 秒〜10 分)・TIME SIG(拍子)。BPM の横のランプがそのテンポで点滅します(小節の頭は赤。曲の再生中はその曲のテンポ)。
  • VOCAL: LANGUAGE(歌の言語)・VOICE(声の種類。NONE で歌なしの指定)。
  • KEY / SCALE: キー(AUTO なら曲に任せます)と MAJOR / MINOR のスイッチ。
  • STYLE: GENRE・MOOD・LEAD(主役の楽器)・TEXTURE・ERA(年代)・PRODUCTION(音作り)・GROOVE。 つまみの位置が英語のキャプションの言葉になり、PROMPT に書いた文はその後ろにつきます。つまみだけでも曲を作れます(AUTO の項目は入れません)。
  • SEED: エンコーダ。回すとその番号に固定(MODE が LOCK)になり、速く回すほど大きく進みます(Shift で 1 ずつ)。 ダブルクリックで新しい番号を選びます。MODE スイッチを RANDOM に戻すと毎回ランダムです。同じシード・同じ設定なら同じ曲になります。
  • prompt / lyrics: 押すと入力ウィンドウが開きます。プロンプトは英語がおすすめです(プロンプトのコツ)。 歌詞のウィンドウには [Instrumental](歌なし)を入れるキーがあります。
  • generate: 押すと作り始め、液晶に段階と進み具合が出ます。作っている間にもう一度押すとキャンセル。 できた曲はそのまま再生され、液晶をクリックすると止まります(もう一度クリックでまた再生)。

PROMPT

BGM — エンドレス BGM

BGM

STYLE のつまみや PROMPT で「こんな音楽」を決めて play を押すと、曲を作りつづけて、曲間をつないで流しつづけます。

  • つまみの段は GEN と同じです。OUT: VOLUME のフェーダー。左右のメーターが再生中の音の大きさ(L / R)です。 曲間のつなぎ(CROSSFADE)と何曲で止めるか(STOP AFTER)は SETUP にあります。
  • play / pause / skip / stop / prompt / lyrics。液晶の 2 行目には、再生位置 → 次の曲の準備 → 曲数 を順に出します。
  • 再生中に次の曲を作ります(1 曲先まで。エンジンが実時間より速いので間に合います)。曲ごとに新しいシードで作ります。
  • 再生中につまみやプロンプトを変えると、次の曲から新しい設定で作ります。作りかけの曲と、できて待っている曲はそのまま流します。
  • クロスフェードはブラウザの Web Audio で 2 本のバッファを等電力カーブでつなぎます。
  • 止まる条件: 曲数(STOP AFTER)・時間・ディスクの空き(SETUP で設定。既定は空き 2 GB 未満で止まります)。

HISTORY — 作った曲

HISTORY

  • 作った曲はパラメータつき(JSON)で保存されます。ジョグ(SELECT)で選びます。リストのクリック・ホイールでも選べ、ダブルクリックで再生します。
  • SHOW: SAVED(保存した曲)/ ALL(BGM の一時キャッシュも)。リストの印は * が保存済み、B が BGM の曲です。
  • reuse: その曲の設定を GEN に戻します。save: キャッシュの曲を履歴に保存。wav / flac: ダウンロード。 delete: 削除(2 回押します)。purge: BGM の一時キャッシュを空にします(ALL のとき。2 回押します)。
  • play / stop: 選んだ曲の再生。下の液晶にプロンプト・日時・シード・BPM・キーなどが出ます。

MODELS — モデル

MODELS

  • 初回はここで ACE-STEP 1.5 TURBO を選んで download を押します(約 4.3 GB)。
  • STATE: -- 未ダウンロード、DL45 ダウンロード中(45%)、OK / USE 使える、UPD 更新あり(もう一度 download)、PART 途中まで。
  • cancel: ダウンロードをやめる。delete: 削除(2 回押します)。folder: 手元のモデルフォルダを指定(ダウンロードしたモデルより優先されます)。 load: エンジンを読み込み直します。下の液晶に説明・ディスクの空き・保存先が出ます。

SETUP — 設定

SETUP

  • PANEL: STYLE(HARD / FLAT)・COLOR(BLUE / RED / YELLOW / SILVER)・THEME(AUTO / LIGHT / DARK)。
  • SYSTEM: UI LANG(日本語 / English / 简体中文)・ENGINE(NPU / CPU / DUMMY)・KEEP ENC(エンコーダを曲の間も NPU に載せたままにする。 1 曲あたり約 1 秒速く、メモリは約 2 GB 増えます。既定はオフ)・STEPS(拡散のステップ数。turbo は 8)。
  • BGM: CONTINUE(前の曲の終わりから続ける)・SAVE(BGM の曲を履歴に保存)・CROSSFADE(曲間のつなぎ 0〜12 秒)・ KEEP(一時キャッシュに残す曲数)・STOP AFTER(何曲で止めるか)・STOP HRS(何時間で止めるか)・MIN FREE(ディスクの空きがこれを切ったら止める)。
  • 下のキーは押すと点灯(オン)/ 消灯(オフ): preload(起動時にエンジンを読み込む)・login(ログイン時に起動)・ update(更新の確認)・lan(同じネットワークの他の PC から使う。再起動で反映。認証はないので信頼できるネットワークだけで)。 paths: モデルの保存先・公式 ACE-Step 1.5 のソースフォルダ(cpu エンジン用)・ポート。
  • 新しい版があると、ヘッダーの下に液晶のお知らせと install キーが出ます。
ダーク・赤 FLAT・シルバー
dark red flat silver

プロンプトのコツ

ACE-Step 1.5 はキャプション(プロンプト)を英語で学習しています。日本語の長い文章だと意図が伝わらず、思っていない曲になりがちです。 STYLE のつまみは英語の言葉を並べるので、まずつまみで決めて、足りないところを PROMPT に英語で書くのがおすすめです。 英語で、ジャンル・楽器・雰囲気・声を並べます。例: Smooth R&B ballad, warm Rhodes, soft female vocal, late night。 R&B・英語のポップ・ジャズ・ローファイなどは得意で、苦手なジャンルもあります。 (公式は「5Hz LM」という言語モデルでプロンプトを書き直してから使いますが、onwx-music はまだそれをしていません。)

そのほか

  • 日本語 / English / 简体中文、トレイ(状態バッジつき)、更新の確認、ログイン時の起動。

使いかた

Windows

PowerShell で:

irm https://huggingface.co/ryugyosoft/onwx-music/resolve/main/install.ps1 | iex

%LOCALAPPDATA%\onwx-music に入れて、セットアップ(Python・パッケージ・スタートメニュー・トレイ)まで進みます。もう一度実行すると更新します。 起動したら MODELS で ACE-Step 1.5 turbo (onwx-music) をダウンロードします(約 4.3 GB)。

手で入れるときは、このリポジトリのファイルを置いたフォルダで:

  1. setup.bat を実行します(Python 3.10 以上を探し、なければ winget で入れるか聞きます。.venv を作り、パッケージを入れ、スタートメニューに登録して、タスクトレイで起動します)。
  2. トレイのアイコン(赤いチップに音符)をクリックすると、ウィンドウが開きます。
  3. GEN か BGM から使います。

コンソールで一度だけ動かすなら start.bat(ブラウザで開きます)。start.bat --engine dummy のようにオプションを渡せます。 削除は uninstall.bat。

インストール先は %LOCALAPPDATA%\onwx-music(ワンライナー版 install.ps1 を使う場合)、設定・履歴・ダウンロードしたモデルは %APPDATA%\onwx-music です。

Ubuntu

./setup.sh(apt で AppIndicator・WebKit を入れ、.venv を作り、アプリ一覧に登録して、トップバーで起動します)、または ./start.sh。 インストール先は ~/.local/share/onwx-music、設定などは ~/.config/onwx-music です。

ワンライナー: curl -fsSL https://huggingface.co/ryugyosoft/onwx-music/resolve/main/install.sh | bash

開発用に直接動かす

python -m venv .venv
.venv\Scripts\python -m pip install -e ".[tray,flac]"
.venv\Scripts\python -m onwx_music serve --engine dummy --open     # http://127.0.0.1:8110/

ONWX_MUSIC_HOME で設定フォルダを変えられます(テスト用)。

エンジン

SETUP の ENGINE つまみで選びます(既定は npu。読み込めなければ、画面に注意を出して dummy で動きます)。

エンジン 中身
npu AMD Ryzen AI NPU 上の ACE-Step 1.5 turbo(エンコーダ・DiT・VAE)。NPU 用に作ってあるプログラムとモデル(ryugyosoft/ACE-Step-1.5-onwx-music)を使います。PC でのコンパイルはありません
cpu 公式の ACE-Step 1.5 の Python コードを使う遅い参照実装(DiT のみ、LM なし=「考える」は無視)。torch と公式ソースが要ります。SETUP の paths キーで公式 ACE-Step 1.5 のソースフォルダを、MODELS の folder キーでモデルフォルダを指定します。アプリ本体は torch なしで動きます
dummy 和音・アルペジオ・ドラムのような合成音(シード・長さ・BPM・キーで決まります)。モデル不要、数秒で作って、全段階の進み具合を出します。画面と BGM のテスト用

エンジンのインターフェース(固定)

onwx_music/engine.py が決めています。NPU エンジンはこの形に合わせます。

@dataclass
class GenParams:
    caption: str; lyrics: str = "[Instrumental]"; language: str = "unknown"; duration: float = 60.0
    bpm: int | None = None; keyscale: str = ""; timesignature: str = ""; seed: int = -1
    think: bool = True; steps: int = 8; continue_from: str | None = None   # 前の曲の ID

@dataclass
class Progress:                      # 進み具合のコールバックに渡す
    stage: str                       # "planning" | "encoding" | "diffusion" | "decoding" | "done"
    step: int; total: int            # 段の中での位置
    message: str = ""

class Engine:
    name: str
    def load(self, model_dir: str) -> None: ...        # 時間がかかってよい。失敗は読める文の RuntimeError で
    def generate(self, p: GenParams, progress=lambda pr: None, cancel=lambda: False) -> Result: ...
    def unload(self) -> None: ...

@dataclass
class Result:                        # audio は float32 [フレーム][2]、-1..1、サンプルレート 48000
    audio; sample_rate: int; meta: dict   # meta: 決まったパラメータ(使ったシード、LM が決めた bpm / キー、所要時間 ...)
  • generate() は 1 度に 1 スレッドからだけ呼ばれます(サーバーのジョブキューが NPU を 1 本の装置として扱います)。
  • cancel() が True になったら onwx_music.engine.Cancelled を投げます。
  • continue_from の曲の音は、サーバーが engine.track_audio(track_id) -> (audio, sample_rate) で渡せます(対応するエンジンだけが使います)。
  • get_engine(kind) が npu(onwx_music.npu_engine.NpuEngine を遅延 import)/ cpu / dummy を返します。

サーバー API(JSON、既定のポート 8110)

NPU は 1 つなので、生成は 1 度に 1 つ。ジョブキューで順番に処理します(BGM も同じキューを使い、手動の生成が先に走ります)。

GET /api/status バージョン・エンジンの状態(注意メッセージつき)・キュー・BGM・ディスクの空き
POST /api/generate {caption, lyrics, language, duration, bpm, keyscale, timesignature, seed, think, steps, continue_from} → {job_id}
GET /api/jobs/<id> status(queued / running / done / error / cancelled)、stage、step/total、progress、elapsed、rtf、result_url、track
POST /api/jobs/<id>/cancel キャンセル
GET /api/tracks[?all=1] 履歴(all=1 は BGM の一時キャッシュも)。GET /api/tracks/<id>
GET /audio/<id>.wav(.flac、?download=1) 音声
DELETE /api/tracks/<id> 削除。POST /api/tracks/<id>/save はキャッシュの曲を履歴へ
POST /api/bgm/start {prompt, lyrics, language, duration, bpm, keyscale, think, save, continuous, crossfade, keep, stop_tracks, stop_hours, min_free_gb}
POST /api/bgm/stop / POST /api/bgm/skip / GET /api/bgm/state 停止 / スキップ / 状態(ready・generating・now_playing・stop_reason ...)
POST /api/bgm/next プレイヤーが次の曲を受け取る(なければ track: null)
GET /api/models、POST /api/models/download cancel delete モデル管理
GET/POST /api/config、POST /api/engine/reload、GET /api/update、POST /api/update/apply 設定・エンジンの再読み込み・更新

別のサイトのページからの書き込み(POST / DELETE)は、Origin を見て断ります。lan を有効にしても認証はありません。

BGM の仕組み

サーバーは「再生側が取り出していない完成済みの曲」を 1 曲に保つように、次の曲を作ります。再生は画面(ウィンドウ)の Web Audio が行い、 /api/bgm/next で曲を受け取ってデコードし、残りが「クロスフェード + 12 秒」になったら次の曲を受け取って、等電力カーブでつなぎます。 ウィンドウを閉じると音は止まり、サーバーは次の 1 曲を用意したところで待ちます(「ここで再生」で戻れます)。

ファイル

onwx_music/   engine.py(インターフェース・dummy)  cpu_engine.py  npu_engine.py(NPU エンジン)  core.py(エンジンホスト・ジョブキュー・BGM)
              npu/(NPU のホスト側: mx_dit / mx_enc / mx_vae / mxhost / dev.py、bin/win/xdna_shim.dll)
              server.py  store.py  models.py  app.py  tray.py  update.py  deps.py  uninstall.py  logo.py  i18n.py / i18n.json  web/index.html
tests/        smoke_test.py(サーバーを起動して API 全部と BGM を試す)  test_engines.py  check_i18n.py  cpu_smoke.py
setup.bat / setup.sh / start.bat / start.sh / uninstall.* / install.ps1 / install.sh / find_python.bat

テスト

python tests/smoke_test.py        # dummy エンジンでサーバーを起動し、全エンドポイント・2 曲の生成・BGM 3 曲を確かめる
python tests/test_engines.py      # エンジンのインターフェース・dummy・フォールバック
python tests/check_i18n.py        # 訳が抜けていないか
python tests/cpu_smoke.py MODEL_DIR ACESTEP_SRC [秒]    # cpu エンジンで 1 曲(torch とモデルのある PC で)

ライセンス

Apache-2.0。ACE-Step 1.5 は MIT ライセンスです。

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support