Qwen3-ASR サーバ:環境と使い方
最終更新: 2026-10-03
構成
項目 |
設定 |
|---|---|
サーバ |
|
OS |
AlmaLinux 9.8 |
GPU |
NVIDIA RTX PRO 6000 Blackwell, 96 GB |
ASR モデル |
|
API |
|
文字起こし API |
|
サービス |
Flask + Waitress ( |
GPU の使い方 |
リクエストごとにモデルをロードし、処理後に解放 |
firewall |
|
Flask は API の受付だけを担う。音声を受け取ると qwen_asr_once.py を別プロセスで起動し、そのプロセスが Transformers バックエンドの Qwen3-ASR を GPU にロードして文字起こしする。推論プロセスは処理後に終了するため、待機中にモデルは GPU 常駐しない。
この方式は GPU メモリを他の用途へ空けられる一方、各要求でモデル読込時間が加わる。複数要求は同時にモデルをロードしないよう、Flask 側で直列化する。
サーバ側の配置と依存関係
パス |
内容 |
|---|---|
|
Python 仮想環境 |
|
OpenAI 互換 Flask API |
|
リクエストごとの ASR runner |
|
Hugging Face モデルキャッシュ |
|
systemd サービス定義 |
仮想環境には qwen-asr、CUDA 対応 PyTorch、Flask、Waitress が入っている。
cd /opt/qwen-asr
source venv/bin/activate
uv pip install -U qwen-asr Flask waitress
systemd サービス
サービス定義 /etc/systemd/system/qwen-asr.service:
[Unit]
Description=Qwen3-ASR Flask API (load model per request)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=tkamiya
Group=tkamiya
WorkingDirectory=/opt/qwen-asr
Environment=HOME=/home/tkamiya
Environment=HF_HOME=/opt/qwen-asr/hf-cache
Environment=CUDA_VISIBLE_DEVICES=0
Environment=QWEN_ASR_RUNNER=/opt/qwen-asr/qwen_asr_once.py
Environment=QWEN_ASR_UPLOAD_DIR=/var/tmp/qwen-asr-upload
ExecStart=/opt/qwen-asr/venv/bin/waitress-serve --host=0.0.0.0 --port=8001 --threads=1 --call qwen_asr_flask:create_app
Restart=on-failure
RestartSec=5
TimeoutStopSec=60
[Install]
WantedBy=multi-user.target
管理コマンド:
sudo systemctl status qwen-asr
sudo systemctl restart qwen-asr
sudo systemctl stop qwen-asr
sudo systemctl start qwen-asr
journalctl -u qwen-asr -f
API の稼働確認:
curl http://127.0.0.1:8001/health
curl http://127.0.0.1:8001/v1/models
/health は HTTP 200 でも本文を返さない。/v1/models が Qwen/Qwen3-ASR-1.7B を含む JSON を返せば、Flask API が稼働している。
GPU 使用状況
待機中は、GPU 使用メモリがほぼ 0 である。
nvidia-smi
Windows から文字起こしを実行している間だけ、python の runner プロセスが現れ、モデルと推論用メモリが GPU にロードされる。終了後はプロセスが消え、メモリも解放される。
watch -n 1 nvidia-smi
以前の vLLM 常駐方式では --gpu-memory-utilization に応じて大きな KV cache を予約したが、現在の Flask + runner 方式では不要である。
Windows からの通常の文字起こし
transcribe_qwen_asr_api.py を入力ファイルと同じフォルダ、または PATH の通った場所に置く。
cd /d G:\
python transcribe_qwen_asr_api.py "part1_jp-talk.mp4"
対応形式は WAV、MP3、MP4。動画ファイルは FFmpeg で音声を抽出し、16 kHz mono WAV に変換してから API へ送る。
既定では 240 秒ごとに分割し、隣接区間を 10 秒重ねる。長時間の動画でも、各区間を終えるごとに途中結果が保存される。
出力ファイル
入力が part1_jp-talk.mp4 の場合:
ファイル |
内容 |
|---|---|
|
最終文字起こし本文 |
|
区間の時刻、区間ごとの認識文、API 応答 |
|
途中保存・再開用チェックポイント |
よく使うオプション:
:: 出力名を指定
python transcribe_qwen_asr_api.py "lecture.mp4" --output "lecture_transcript.txt"
:: 停止した処理を再開
python transcribe_qwen_asr_api.py "lecture.mp4" --resume
:: 一時的な分割 WAV も確認用に残す
python transcribe_qwen_asr_api.py "lecture.mp4" --keep-wav
--resume は同じ入力ファイル・同じ分割条件で使う。最初からやり直す場合は --resume を付けずに実行する。
Windows の FFmpeg 設定
FFmpeg 8.0 の bin ディレクトリを、Windows のユーザー PATH で古い Python 3.11 の Scripts より上に置く。
C:\Users\tkami\AppData\Local\Microsoft\WinGet\Packages\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\ffmpeg-8.0-full_build\bin
確認:
where ffprobe
ffprobe -version
先頭が上記の ffmpeg-8.0-full_build\bin\ffprobe.exe であればよい。Python 3.11 の Scripts\ffprobe.exe は、存在しない Python 環境を参照する壊れた launcher なので、これより後ろに置くか、不要なら PATH から外す。
API を直接呼ぶ場合
OpenAI Python SDK を使う例:
from openai import OpenAI
client = OpenAI(
base_url="http://192.168.27.18:8001/v1",
api_key="EMPTY",
)
with open("lecture.mp3", "rb") as audio:
result = client.audio.transcriptions.create(
model="Qwen/Qwen3-ASR-1.7B",
file=audio,
)
print(result.text)
短い音声なら curl でも確認できる。
curl -sS http://192.168.27.18:8001/v1/audio/transcriptions \
-F 'model=Qwen/Qwen3-ASR-1.7B' \
-F 'file=@sample.wav'
長時間の動画には、分割・途中保存・再開を行う transcribe_qwen_asr_api.py を使う。
障害時の確認順
Windows から API を確認する。
curl.exe http://192.168.27.18:8001/v1/models
接続できなければ、サーバでサービス状態とログを確認する。
sudo systemctl status qwen-asr journalctl -u qwen-asr -n 100 --no-pager
文字起こし中の GPU 使用量は
watch -n 1 nvidia-smiで確認する。待機中に GPU メモリが小さいことは正常である。動画変換で止まれば、Windows で
where ffprobeとffprobe -versionを確認する。途中で通信やサーバが止まっても、
--resumeを付けて同じ入力を再実行する。