全二重音声対話モデル Haru-4B を Windows + uv で動かしてみる

初めに

聞きながら話せる音声対話モデル Haru-4B を、Windows と uv で動かしてみました。RTX 4070 Ti SUPER でブラウザから会話を始められたので、環境構築の手順と、動かして分かったことをまとめます。

Haru-4B とは

Haru-4B は日本語を含む9言語に対応した全二重の音声対話モデルで、音声を受け取りながら自分の音声とテキストを生成します。

人物設定はテキスト、声は短い参照音声で指定でき、追加学習なしで試せる仕組みです。モデルの詳しい構成は公式の日本語解説を参照してください。

開発環境

項目 環境
OS Windows 11 Education 23H2
GPU RTX 4070 Ti SUPER、16 GB
メモリ 約64 GiB
Python / uv 3.12.13 / 0.12.20
PyTorch 2.11.0+cu128
Transformers 5.23.0
haru-speech 0.1.1

環境構築

Git、uv、NVIDIA ドライバーを用意し、PowerShell から公式リポジトリを取得します。

git clone https://github.com/higurashi-ai/Haru.git
cd Haru
git checkout 7fe6b7665f8bf035998f401f8cb779fbe53f2751

uv init --bare --name haru-local --python 3.12 --no-workspace
uv python pin 3.12

リポジトリ直下にできた pyproject.toml を次の内容に変更し、Windows x64 と CUDA 12.8 の環境を指定します。

[project]
name = "haru-local"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = []

[tool.uv]
package = false
environments = ["sys_platform == 'win32' and platform_machine == 'AMD64'"]

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

続けて Haru と CUDA 版 PyTorch を登録します。--no-sync で依存関係の登録を先に済ませ、最後にまとめてインストールしています。

uv add --no-sync --no-workspace ./haru
uv add --no-sync "torch==2.11.0+cu128" --index pytorch-cu128=https://download.pytorch.org/whl/cu128
uv add --no-sync "transformers==5.23.0"
uv sync --locked

explicit = true により、指定した PyTorch だけが CUDA 用のインデックスを参照する形になります。生成された uv.lock を残しておけば、次回からも uv sync --locked で環境を復元できます。

CUDA の確認は次のコマンドで行いました。

uv run python -c "import torch; assert torch.cuda.is_available(); print(torch.__version__); print(torch.cuda.get_device_name(0))"

起動して会話する

同じ PC のブラウザから使うので、通信は WebSocket、コーデックは PyTorch の実装にして起動します。

uv run haru-server --device cuda --language ja --network-profile local --codec-backend torch --webrtc off

初回は約10.5 GBのモデルを取得するため、手元ではダウンロードを含む読み込みに203.2秒かかりました。ログに haru.server: ready が出たら http://localhost:8998 を開きます。

  1. 「キャラクター」で言語を日本語にし、人物設定を選ぶ
  2. 下へスクロールし、「声」→「ファイル」→「ファイルを選択…」から音声を入れる
  3. 「会話を始める」を押し、マイクの使用を許可する

声は同梱されていないので、利用する権利のある3秒〜3分の WAV/FLAC を用意します。1人の話者で雑音が少なく、無音を除いて3秒以上あるものが必要です。

実行結果

起動時のウォームアップでは、16フレームの処理時間の中央値が135.7 msでした。音声1フレームの約133.3 msを少し上回っており、会話中の推定遅延も次のように増えていきました。

会話開始から 中央値(p50) p95
約10秒 746 ms 1,174 ms
約60秒 3,217 ms 5,612 ms
約100秒 5,260 ms 10,848 ms

この表はブラウザの平滑化された遅延表示の累積統計で、質問ごとの応答時間を直接測ったものではありません。起動と会話開始はできたものの、今回の構成では遅れが蓄積する状態でした。

causal_conv1d と flash-linear-attention がなく、言語モデル側が PyTorch の参照実装へフォールバックする警告も出ていました

ハマったところ

環境構築と音声の読み込みで確認した点をまとめます。

起きたこと 対応
編集可能インストールで import に失敗 --editable を使わず、通常のローカルパス依存で登録
録音の読み込み処理で Permission denied Windows の一時ファイル共有制限を、WAV/FLAC のアップロードで回避

録音の読み込み処理自体は未修正です。また、最初のモデル取得は Xet の転送で停滞したため、サーバーを止めてから同じ PowerShell で次を設定し、起動し直しています。

$env:HF_HUB_DISABLE_XET = "1"

これで Xet クライアントを使わない HTTPS ダウンロードが完了しました。設定は現在の PowerShell と、そこから起動するプロセスに適用されます。

参考