onw-music
Intel Core Ultra の NPU で、手元の PC だけで音楽を作るアプリです(ACE-Step 1.5 turbo、OpenVINO)。 「こんな音楽が聴きたい」と入れるだけで、曲を作りつづけて流しつづける エンドレス BGM モード があります。
NPU 全部盛り: テキストエンコーダ(Qwen3-Embedding-0.6B)・歌詞エンコーダ・DiT(24 層)・VAE デコーダを、 すべて NPU で動かします。CPU がするのはトークン化・小さな埋め込み・サンプラーの足し算・ノイズ・WAV の書き出しだけです。 同じアプリの AMD Ryzen AI 版は onwx-music です(画面と機能は同じ、NPU の中身だけ違います)。
| 曲の長さ | Lunar Lake(NPU 4000) | Panther Lake(NPU 5010) | Arrow Lake HX(NPU 3720) |
|---|---|---|---|
| 30 秒 | 約 6.5 秒 | 約 7 秒 | 約 15 秒 |
| 120 秒 | 約 25 秒(エンコード 0.4 / 拡散 14.3 / デコード 10.5) | 約 24 秒(1.0 / 10.0 / 12.7) | 約 62 秒(0.8 / 35 / 26) |
(2 曲目以降の時間。1 曲目はコンパイルの分が加わります)
NPU 用のコンパイルは PC の上で行います。最初の 1 曲はその分が加わり、30 秒の曲で Lunar Lake 約 30 秒・NPU 3720 約 40 秒・ Panther Lake 約 80 秒かかります。初めての長さの曲では DiT の分だけ(数秒〜40 秒)かかります。 コンパイル結果は
%LOCALAPPDATA%\onw-music\npu_cacheに残り、2 回目からは読み込むだけです。動作環境: Intel Core Ultra(NPU 3720 = Meteor Lake / Arrow Lake、NPU 4000 = Lunar Lake、NPU 5010 = Panther Lake)と Intel の NPU ドライバ、Windows 11。メモリ 16 GB 以上(モデル約 4.3 GB)。 Ubuntu でもエンジンは動きますが(Lunar Lake で確認)、アプリのセットアップはまだ試していません。
曲の長さは 10〜600 秒。同じシード・同じ設定なら同じ曲になります。
まだないもの: 曲を計画する言語モデル(公式の「think」)、参照音声(音色の指定)、前の曲からの続き。
画面
アプリ全体が 1 台の機械のパネルです。値はすべてつまみとスイッチで変え、ドット表示の液晶に出ます。 ウィンドウには枠がありません。パネルの地(つまみ・キー・液晶以外のところ)をドラッグすると動き、右下の角で大きさを変えます。 右上は SETUP・最小化(MIN)・閉じる(CLOSE)。ヘッダーをダブルクリックすると最大化します。 上のキーでモードを切り替えます。赤いランプが今のモードで、BGM の再生中は BGM のランプが緑に点滅します。
つまみはドラッグ(上下・左右)、マウスホイール、矢印キーで回せます。Shift で細かく、ダブルクリックで初期値に戻ります。 回している(またはマウスを乗せた)つまみの名前と値は、右上の大きな液晶に出ます。
GEN — 1 曲つくる
- 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: 押すと作り始め、液晶に段階と進み具合が出ます。作っている間にもう一度押すとキャンセル。 できた曲はそのまま再生され、液晶をクリックすると止まります(もう一度クリックでまた再生)。
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 — 作った曲
- 作った曲はパラメータつき(JSON)で保存されます。ジョグ(SELECT)で選びます。リストのクリック・ホイールでも選べ、ダブルクリックで再生します。
- SHOW: SAVED(保存した曲)/ ALL(BGM の一時キャッシュも)。リストの印は
*が保存済み、Bが BGM の曲です。 - reuse: その曲の設定を GEN に戻します。save: キャッシュの曲を履歴に保存。wav / flac: ダウンロード。 delete: 削除(2 回押します)。purge: BGM の一時キャッシュを空にします(ALL のとき。2 回押します)。
- play / stop: 選んだ曲の再生。下の液晶にプロンプト・日時・シード・BPM・キーなどが出ます。
MODELS — モデル
- 初回はここで ACE-STEP 1.5 TURBO を選んで download を押します(約 4.3 GB)。
- STATE:
--未ダウンロード、DL45ダウンロード中(45%)、OK/USE使える、UPD更新あり(もう一度 download)、PART途中まで。 - cancel: ダウンロードをやめる。delete: 削除(2 回押します)。folder: 手元のモデルフォルダを指定(ダウンロードしたモデルより優先されます)。 load: エンジンを読み込み直します。下の液晶に説明・ディスクの空き・保存先が出ます。
SETUP — 設定
- PANEL: STYLE(HARD / FLAT)・COLOR(BLUE / RED / YELLOW / SILVER)・THEME(AUTO / LIGHT / DARK)。
- SYSTEM: UI LANG(日本語 / English / 简体中文)・ENGINE(NPU / CPU / DUMMY)・KEEP ENC(AMD 版 onwx-music 用。Intel 版のエンコーダはいつも載せたままなので、効きません)・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 キーが出ます。
プロンプトのコツ
ACE-Step 1.5 はキャプション(プロンプト)を英語で学習しています。日本語の長い文章だと意図が伝わらず、思っていない曲になりがちです。
STYLE のつまみは英語の言葉を並べるので、まずつまみで決めて、足りないところを PROMPT に英語で書くのがおすすめです。
英語で、ジャンル・楽器・雰囲気・声を並べます。例: Smooth R&B ballad, warm Rhodes, soft female vocal, late night。
R&B・英語のポップ・ジャズ・ローファイなどは得意で、苦手なジャンルもあります。
(公式は「5Hz LM」という言語モデルでプロンプトを書き直してから使いますが、onw-music はまだそれをしていません。)
そのほか
- 日本語 / English / 简体中文、トレイ(状態バッジつき)、更新の確認、ログイン時の起動。
使いかた
Windows
PowerShell で:
irm https://huggingface.co/ryugyosoft/onw-music/resolve/main/install.ps1 | iex
%LOCALAPPDATA%\onw-music に入れて、セットアップ(Python・パッケージ・スタートメニュー・トレイ)まで進みます。もう一度実行すると更新します。
起動したら MODELS で ACE-Step 1.5 turbo (onw-music) をダウンロードします(約 4.3 GB)。
手で入れるときは、このリポジトリのファイルを置いたフォルダで:
setup.batを実行します(Python 3.10 以上を探し、なければ winget で入れるか聞きます。.venvを作り、パッケージを入れ、スタートメニューに登録して、タスクトレイで起動します)。- トレイのアイコン(青いチップに音符)をクリックすると、ウィンドウが開きます。
- GEN か BGM から使います。
コンソールで一度だけ動かすなら start.bat(ブラウザで開きます)。start.bat --engine dummy のようにオプションを渡せます。
削除は uninstall.bat。
インストール先は %LOCALAPPDATA%\onw-music(ワンライナー版 install.ps1 を使う場合)、設定・履歴・ダウンロードしたモデルは %APPDATA%\onw-music です。
Ubuntu
./setup.sh(apt で AppIndicator・WebKit を入れ、.venv を作り、アプリ一覧に登録して、トップバーで起動します)、または ./start.sh。
インストール先は ~/.local/share/onw-music、設定などは ~/.config/onw-music です。
ワンライナー: curl -fsSL https://huggingface.co/ryugyosoft/onw-music/resolve/main/install.sh | bash
開発用に直接動かす
python -m venv .venv
.venv\Scripts\python -m pip install -e ".[tray,flac]"
.venv\Scripts\python -m onw_music serve --engine dummy --open # http://127.0.0.1:8110/
ONW_MUSIC_HOME で設定フォルダを変えられます(テスト用)。
エンジン
SETUP の ENGINE つまみで選びます(既定は npu。読み込めなければ、画面に注意を出して dummy で動きます)。
| エンジン | 中身 |
|---|---|
npu |
Intel NPU 上の ACE-Step 1.5 turbo(エンコーダ・DiT・VAE、OpenVINO)。モデル(ryugyosoft/ACE-Step-1.5-onw-music)は OpenVINO のグラフと INT8 / fp16 の重みで、NPU 用のコンパイルは PC の上で 1 度だけ行います |
cpu |
公式の ACE-Step 1.5 の Python コードを使う遅い参照実装(DiT のみ、LM なし=「考える」は無視)。torch と公式ソースが要ります。SETUP の paths キーで公式 ACE-Step 1.5 のソースフォルダを、MODELS の folder キーでモデルフォルダを指定します。アプリ本体は torch なしで動きます |
dummy |
和音・アルペジオ・ドラムのような合成音(シード・長さ・BPM・キーで決まります)。モデル不要、数秒で作って、全段階の進み具合を出します。画面と BGM のテスト用 |
エンジンのインターフェース(固定)
onw_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 になったらonw_music.engine.Cancelledを投げます。continue_fromの曲の音は、サーバーがengine.track_audio(track_id) -> (audio, sample_rate)で渡せます(対応するエンジンだけが使います)。get_engine(kind)がnpu(onw_music.ov_engine.OvEngineを遅延 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 曲を用意したところで待ちます(「ここで再生」で戻れます)。
ファイル
onw_music/ engine.py(インターフェース・dummy) cpu_engine.py ov_engine.py(NPU エンジン) core.py(エンジンホスト・ジョブキュー・BGM)
ov/(OpenVINO のグラフと実行: ov_dit.py / ov_enc.py / ov_vae.py)
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 で)
python tests/npu_server_test.py MODEL_DIR [秒] # npu エンジンでサーバーを起動し、2 曲作る(Intel NPU の PC で)
ライセンス
Apache-2.0。ACE-Step 1.5 は MIT ライセンスです。







