Voxtral Mini 4B Realtime 2602 を Transformersライブラリから使う① (音声ファイルの文字起こし)

はじめに

以前にvllmを使った方法を書きました。

touch-sp.hatenablog.com

vllmがWindowsに対応していないためWSL2を使う必要がありました。

今回はTransformersライブラリから使うためWindowsでも動作可能です。

今回はひとまず音声ファイルからの文字起こしを行いました。

リアルタイムの文字起こしはこちら。

touch-sp.hatenablog.com

環境構築

こちらから ffmpeg-8.0.1-full_build-shared.7z をダウンロードして解凍して作業フォルダに配置しました。

PATHはpythonコード内で指定しているので事前の設定は不要です。

通常のFFMPEGでは動作できませんでした。full-shared版 が必要のようです。

uvを使って環境構築しています。pyproject.tomlを載せておくので uv sync で再現出ると思います。

[project]
name = "voxtral-transformers"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
    "accelerate==1.12.0",
    "librosa==0.11.0",
    "mistral-common==1.9.1",
    "soundfile==0.13.1",
    "torch==2.10.0+cu126",
    "torchcodec==0.10.0",
    "transformers==5.2.0"
]

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

[tool.uv.sources]
torch = [{ index = "torch-cuda" }]

Pythonスクリプト

import os
ffmpeg_path = r"E:/voxtral-transformers/ffmpeg-8.0.1-full_build-shared/bin"

if os.path.exists(ffmpeg_path):
    # Windows版Python 3.8以降でDLLを読み込むための魔法の呪文
    os.add_dll_directory(ffmpeg_path)
    # 念のためPATHにも追加
    os.environ["PATH"] = ffmpeg_path + os.pathsep + os.environ["PATH"]

import librosa
from transformers import VoxtralRealtimeForConditionalGeneration, AutoProcessor

repo_id = "mistralai/Voxtral-Mini-4B-Realtime-2602"

processor = AutoProcessor.from_pretrained(
    repo_id,
    #revision="refs/pr/23"
)

model = VoxtralRealtimeForConditionalGeneration.from_pretrained(
    repo_id,
    device_map="auto",
    #revision="refs/pr/23"
)

# 1. 音声ファイルのパスを指定
audio_file_path = "g_22.mp3" 

# 2. 音声ファイルの読み込み
# sr=16000 は Voxtral などの音声モデルで一般的に使われるサンプリングレートです
audio, sampling_rate = librosa.load(audio_file_path, sr=16000)

inputs = processor(audio, sampling_rate=sampling_rate, return_tensors="pt")
inputs = inputs.to(model.device, dtype=model.dtype)

outputs = model.generate(**inputs)
decoded_outputs = processor.batch_decode(outputs, skip_special_tokens=True)

print(decoded_outputs[0])