Windows WSL2環境におけるQwen3-ASRモデルのローカル推論実装

概要:軽量音声認識モデルのオンプレミス運用

多言語対応かつ低パラメータな音声認識モデル Qwen3-ASR-0.6B を、Windows ホスト OS 上で WSL2 (Windows Subsystem for Linux 2) を介して動作させる手法について解説します。本構成により、外部 API に依存せずにプライバシーを保持したまま、PC ローカルで高速な音声テキスト変換を実現できます。

1. WSL2 リンクシステムの基盤整備

Windows 環境において Linux ベースのツールチェーンを効率的に利用するため、WSL2 を導入します。

1.1 サブシステム有効化とディストリビューション設定

管理者権限付与された PowerShell 実行ウィンドウを開き、以下を実行して Linux 機能および Ubuntu デフォルトイメージを展開します。

wsl --install

完了後、システム再起動を行います。Ubuntu ターミナルが起動したら、初期設定(ユーザー名・パスワード)を完了させてください。

1.2 開発ツールのインストール

OS レベルのアップデートと必須パッケージの取得を行います。

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git python3-pip python3-venv
pip3 install --upgrade pip setuptools wheel

2. 機械学習ライブラリと GPU エンジン準備

推論速度向上のために NVIDIA 製アクセラレーションを利用する場合は、CUDA トークルと対応版の PyTorch の配置が必要です。

2.1 ハードウェア検出とドライバ確認

ホスト Windows 上の GPU ドライバが最新版であることを確認してください。次に WSL2 内部から CUDA バージョンを確認します。

nvidia-smi

2.2 Python 依存ライブラリの構築

仮想環境を作成し、必要最小限のパッケージを隔離してインストールします。これによりシステム全体の Python 破損リスクを低減できます。

python3 -m venv asr_venv
source asr_venv/bin/activate

# CPU 専用ビルドの場合
pip install torch torchvision torchaudio

# CUDA 12.1 以上が利用可能な場合
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# コア処理ライブラリ
pip install transformers gradio soundfile librosa accelerate bitsandbytes

3. 推論アプリケーションの実装

モデル読み込み、前処理、Web インターフェースを統合するスクリプトを作成します。今回はクラス構造を採用し、状態管理を明確にします。

3.1 メイン処理ロジック (app_core.py)

既存のグローバル変数中心の実装ではなく、エクスプローラーとして整理されたクラス形式に変更しています。変数名も意味的な役割に合わせて改称しました。

<span></span>import os
import torch
import gradio as gr
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from typing import Optional

class SpeechRecognitionEngine:
    def __init__(self, model_source: str, device_override: Optional[str] = None):
        self.repo_identifier = model_source
        self.target_device = device_override or ("cuda" if torch.cuda.is_available() else "cpu")
        self.weight_dtype = torch.float16 if "cuda" in self.target_device else torch.float32
        
        print(f"推理環境準備中:{self.target_device}")
        
        # モデルロード設定
        load_kwargs = {
            "pretrained_model_name_or_path": self.repo_identifier,
            "torch_dtype": self.weight_dtype,
            "low_cpu_mem_usage": True,
            "use_safetensors": True
        }
        
        self.model = AutoModelForSpeechSeq2Seq.from_pretrained(**load_kwargs)
        self.processor = AutoProcessor.from_pretrained(self.repo_identifier)
        
        if self.target_device != "cpu":
            self.model.to(self.target_device)
            
        # パイプライン生成
        self.inference_pipeline = pipeline(
            task="automatic-speech-recognition",
            model=self.model,
            tokenizer=self.processor.tokenizer,
            feature_extractor=self.processor.feature_extractor,
            torch_dtype=self.weight_dtype,
            device_map=self.target_device
        )
    
    def process_audio(self, audio_path: str) -> str:
        try:
            if not audio_path:
                return "入力メディアがありません"
            
            result = self.inference_pipeline(audio_path)
            return result.get("text", "")
        except Exception as e:
            return f"処理エラーが発生しました:{str(e)}"

def run_service():
    engine = SpeechRecognitionEngine(
        model_source="Qwen/Qwen3-ASR-0.6B"
    )
    
    with gr.Blocks(theme=gr.themes.Soft()) as web_app:
        gr.Markdown("# 🔊 ローカル音声認識インターフェース")
        
        input_audio = gr.Audio(label="音声入力 (録音またはアップロード)", type="filepath")
        output_text = gr.Textbox(label="変換結果", lines=4)
        
        btn_submit = gr.Button(value="解析実行", variant="primary")
        btn_submit.click(engine.process_audio, inputs=input_audio, outputs=output_text)
    
    # 全ネットワークインタフェース对外开放設定
    web_app.launch(server_name="0.0.0.0", server_port=7860)

4. 初期起動とサービス接続

上記のコードを保存後、アクティベーションした仮想環境内で実行します。初回時はモデルウェイトのダウンロードが行われるため時間がかかります。

python app_core.py

出力ログにて Running on local URL: http://0.0.0.0:7860 が表示されれば正常終了です。Windows 側のブラウザより該当アドレスへアクセスし、Gradio が提供する UI で機能をテストできます。

5. 高度な運用制御

5.1 メモリ圧縮による高速化 (Quantization)

VRAM 容量が制約される環境では、整数量子化を活用することでメモリ消費を削減可能です。BitsAndBytesConfig を導入し、モデルロード時に変数を追加します。

from transformers import BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(load_in_8bit=True)

# from_pretrained 呼び出し時に引数に含める
model = AutoModelForSpeechSeq2Seq.from_pretrained(
    ...,
    quantization_config=bnb_config
)

5.2 システムサービスとしての常時稼働

端末セッションを終了しても継続して利用できるように、systemd マネージャーに登録します。以下のユニットファイルを作成します。

[Unit]
Description=Qwen3 Voice Recognition Service
After=network-online.target

[Service]
User=${USER}
WorkingDirectory=/home/${USER}/project_dir
ExecStart=/home/${USER}/project_dir/asr_venv/bin/python app_core.py
Restart=on-failure
StandardOutput=journal

[Install]
WantedBy=multi-user.target

作成後に以下のコマンドを順次発行し、サービスのステータスを監視します。

sudo cp qwen3-asr.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable qwen3-asr.service
sudo systemctl start qwen3-asr.service
sudo systemctl status qwen3-asr.service

タグ: Qwen-ASR WSL2 Python transformers Gradio

8月24日 09:04 投稿