windowsでLFM2.5-Audio-1.5B-JPのspeech-to-speechを動かす

初めに

以下で軽量な日本語speech to speechのモデルが公開されたので、触ってみます

開発環境

項目 内容
OS Windows 11
GPU NVIDIA GPU
uv 0.11.8
Python 3.12

環境構築

以下の pyproject.toml を作成します

[project]
name = "lfm2-audio-jp"
version = "0.1.0"
description = "LiquidAI/LFM2.5-Audio-1.5B-JP を動かすための環境"
readme = "README.md"
requires-python = ">=3.12,<3.13"
dependencies = [
    "liquid-audio[demo]>=1.0.0",
    "torch>=2.8.0",
    "torchaudio>=2.8.0",
    "soundfile>=0.12.1",
]

# torch / torchaudio は CUDA 12.8 ビルドを PyTorch 公式インデックスから取得する。
# RTX 4070 + CUDA 13.2 ドライバなら cu128 ビルドで動作する(CUDA は前方互換)。
[tool.uv.sources]
torch = [{ index = "pytorch-cu128" }]
torchaudio = [{ index = "pytorch-cu128" }]

[[tool.uv.index]]
name = "pytorch-cu128"
url = "https://download.pytorch.org/whl/cu128"
explicit = true

以下を実行します

uv sync

デモスクリプトは以下で定義をします

"""JP モデルでの speech-to-speech ライブ対話デモ (Gradio + WebRTC マイク)。

liquid-audio 同梱のデモ UI / ロジックをそのまま使い、ロードするモデルだけを
LiquidAI/LFM2.5-Audio-1.5B-JP に差し替えて起動します。

同梱デモ (liquid_audio.demo.chat) は `from .model import lfm2_audio, mimi, proc`
により import 時に英語版モデルをロードしてしまうため、JP モデルをロード済みの
偽 model モジュールを sys.modules に注入してから import します。

使い方:
    uv run demo_jp.py
    # 起動後、ブラウザで http://127.0.0.1:7860 を開き、マイクで話しかける
"""

import os

# Windows には Triton の公式ビルドが無いため、torch.compile / CUDA グラフを無効化する。
# 未設定だと Mimi のデコードで torch._inductor.exc.TritonMissing が発生する。
# liquid_audio の import より前に設定する必要がある(デコレータ適用時に読まれるため)。
os.environ.setdefault("NO_TORCH_COMPILE", "1")
os.environ.setdefault("NO_CUDA_GRAPH", "1")

import sys
import types

import torch

import liquid_audio.demo  # 親パッケージ (空の __init__) を先に import
from liquid_audio import LFM2AudioModel, LFM2AudioProcessor

HF_REPO = "LiquidAI/LFM2.5-Audio-1.5B-JP"
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"

print(f"モデルを読み込み中: {HF_REPO} (device={DEVICE}) ...")
proc = LFM2AudioProcessor.from_pretrained(HF_REPO, device=DEVICE).eval()
lfm2_audio = LFM2AudioModel.from_pretrained(HF_REPO, device=DEVICE).eval()
mimi = proc.mimi.eval()

# Mimi デトークナイザのウォームアップ
with mimi.streaming(1), torch.no_grad():
    for _ in range(5):
        x = torch.randint(2048, (1, 8, 1), device=DEVICE)
        mimi.decode(x)

# JP モデルをロード済みの偽 model モジュールを注入(英語版の再ダウンロードを回避)
fake_model = types.ModuleType("liquid_audio.demo.model")
fake_model.lfm2_audio = lfm2_audio
fake_model.mimi = mimi
fake_model.proc = proc
sys.modules["liquid_audio.demo.model"] = fake_model
liquid_audio.demo.model = fake_model

from liquid_audio.demo import chat as demo_chat  # noqa: E402  (注入後に import する必要がある)

if __name__ == "__main__":
    print("起動中... ブラウザで http://127.0.0.1:7860 を開いてください。")
    demo_chat.demo.launch(server_name="127.0.0.1", server_port=7860)

実行

以下で実行します

uv run demo_jp.py

起動後は以下で動かせます

  1. 起動後、ブラウザで http://127.0.0.1:7860 を開く
  2. マイクの使用を許可する(localhost なので許可される)
  3. 話しかける → テキスト+音声で応答が返る
  4. Ctrl+C で停止