モデル概要
モデル特徴
モデル能力
使用事例
🚀 KB-Whisper Tiny
スウェーデン国立図書館は、50,000時間以上のスウェーデン語音声データで訓練された、全く新しいWhisperモデルを公開しました。FLEURS、CommonVoice、NSTなどのデータセットでの評価において、我々の最良のモデルは、OpenAIのwhisper-large-v3
と比較して、平均で単語誤り率(WER)を47%削減しました。小さいサイズのWhisperモデルでも、スウェーデン語音声に対する性能が大幅に向上しており、kb-whisper-small
は、規模が6倍のopenai/whisper-large-v3
を上回る性能を発揮しています。
🚀 クイックスタート
このプロジェクトでは、さまざまな推論シナリオに対応できるよう、異なる形式のチェックポイントを提供しています。以下は、さまざまなツールやライブラリを使用した推論の例です。
✨ 主な機能
- 高性能:スウェーデン語音声認識タスクにおいて、OpenAIの
whisper-large-v3
と比較して、単語誤り率(WER)を大幅に削減しました。 - 多形式対応:
Hugging Face
、whisper.cpp
(GGML)、onnx
、ctranslate2
など、さまざまな形式のチェックポイントを提供します。 - 多バージョン選択可能:
subtitle
(より簡潔)やstrict
(より詳細)など、さまざまな書き起こしスタイルのバージョンを選択できます。
📚 ドキュメント
モデル情報
属性 | 詳細 |
---|---|
ライブラリ名 | transformers |
ベースモデル | openai/whisper-tiny |
サポート言語 | スウェーデン語(sv) |
タスクタイプ | 自動音声認識 |
ライセンス | apache-2.0 |
訓練データセット | KBLab/rixvox-v2 |
タグ | ctranslate2 |
2025-05-13更新情報
Hugging Faceを通じてモデルを読み込む場合、デフォルトではStage 2バージョンが使用されます。2025年5月現在、デフォルトバージョンの他に、2つのStage 2バージョン、すなわちSubtitleとStrictがあり、それぞれ異なる書き起こしスタイルを表しています。
.from_pretrained()
でrevision="subtitle"
を指定すると、より簡潔な書き起こしスタイルのバージョンを使用できます。.from_pretrained()
でrevision="strict"
を指定すると、より詳細な書き起こしスタイルのバージョンを使用できます。
以下は、.from_pretrained()
関数でこのパラメータを渡す例です。
import torch
from datasets import load_dataset
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "KBLab/kb-whisper-tiny"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, use_safetensors=True, cache_dir="cache", revision="strict"
)
これら3つのモデルバージョンの書き起こしスタイルの詳細度は、低から高の順に、Subtitle、Stage 2(デフォルト)、Strictです。
使用方法
我々は、Hugging Face
、whisper.cpp
(GGML)、onnx
、ctranslate2
(faster-whisper
とWhisperX
用)など、さまざまな形式のチェックポイントを提供しています。
Hugging Face
KB-Whisper
をHugging Faceで推論する例を以下に示します。
import torch
from datasets import load_dataset
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "KBLab/kb-whisper-tiny"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, use_safetensors=True, cache_dir="cache"
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
torch_dtype=torch_dtype,
device=device,
)
generate_kwargs = {"task": "transcribe", "language": "sv"}
# return_timestamps=Trueを追加して、タイムスタンプ付きの結果を出力する
res = pipe("audio.mp3",
chunk_length_s=30,
generate_kwargs={"task": "transcribe", "language": "sv"})
print(res)
Faster-whisper
Faster-whisperは、ctranslate2
を使用してWhisperを再実装することで、高速かつ効率的な推論を提供します。
#### faster-whisperモデル ####
from faster_whisper import WhisperModel
model_id = "KBLab/kb-whisper-tiny"
model = WhisperModel(
model_id,
device="cuda",
compute_type="float16",
download_root="cache", # キャッシュディレクトリ
# condition_on_previous_text = False # プロンプトを使用しない場合は、幻聴を減らすことができる
)
# audio.wavを書き起こす(最初にffmpegを使って16khzのモノラルwavに変換する)
segments, info = model.transcribe("audio.wav", condition_on_previous_text=False)
print("検出された言語は '%s' で、確率は %f です" % (info.language, info.language_probability))
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
WhisperX
WhisperXは、正確な単語レベルのタイムスタンプを取得する便利な方法を提供します。このライブラリは、Whisperのテキスト出力とWav2vec2の正確なタイムスタンプを組み合わせます。以下は、KB-Whisper
をKBLab/wav2vec2-large-voxrex-swedishと一緒に使用する例です。
import whisperx
device = "cuda"
audio_file = "audio.wav"
batch_size = 16 # GPUメモリが不足する場合は、この値を小さくする
compute_type = "float16" # GPUメモリが不足する場合は、"int8"に変更する(精度が低下する可能性がある)
# 1. オリジナルのwhisperを使用して書き起こす(バッチ処理)
model = whisperx.load_model(
"KBLab/kb-whisper-tiny", device, compute_type=compute_type, download_root="cache" # キャッシュディレクトリ
)
audio = whisperx.load_audio(audio_file)
result = model.transcribe(audio, batch_size=batch_size)
print(result["segments"]) # アラインメント前の結果
# GPUリソースが不足する場合は、モデルを削除する
# import gc; gc.collect(); torch.cuda.empty_cache(); del model
# 2. whisperの出力をアラインメントする
model_a, metadata = whisperx.load_align_model(
language_code=result["language"],
device=device,
model_name="KBLab/wav2vec2-large-voxrex-swedish",
model_dir="cache", # キャッシュディレクトリ
)
result = whisperx.align(
result["segments"], model_a, metadata, audio, device, return_char_alignments=False
)
print(result["segments"]) # アラインメント後の単語レベルのタイムスタンプ
Whisper.cpp / GGML
我々は、whisper.cpp
とMacWhisper
アプリケーションで使用できるGGMLチェックポイントを提供しています。whisper.cpp
で我々のモデルを使用するには、まずリポジトリをクローンしてライブラリをビルドします。
git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp
cmake -B build
cmake --build build --config Release
モデルを使用するには、我々がアップロードしたGGMLチェックポイントの1つをダウンロードする必要があります。ここのダウンロードボタンをクリックするか、wget
を使用してダウンロードできます。
wget https://huggingface.co/KBLab/kb-whisper-tiny/resolve/main/ggml-model-q5_0.bin # 量子化バージョン
# wget https://huggingface.co/KBLab/kb-whisper-tiny/resolve/main/ggml-model.bin # 非量子化バージョン
パラメータ-m
の後にモデルのパスを指定し、最後の位置引数として音声ファイルのパスを指定して、推論を実行します。
./build/bin/whisper-cli -m ggml-model-q5_0.bin ../audio.wav
onnx (optimum)とtransformers.jsの使用
Hugging Faceのoptimum
ライブラリを使用して、onnx
チェックポイントを以下のように使用できます。
from optimum.onnxruntime import ORTModelForSpeechSeq2Seq
from transformers import AutoProcessor
model_id = "KBLab/kb-whisper-tiny"
processor = AutoProcessor.from_pretrained(model_id, cache_dir="cache")
model = ORTModelForSpeechSeq2Seq.from_pretrained(
model_id,
cache_dir="cache",
subfolder="onnx",
)
import soundfile as sf
audio = sf.read("audio.wav")
inputs = processor.feature_extractor(audio[0], sampling_rate=16000, return_tensors="pt")
gen_tokens = model.generate(**inputs, max_length=300)
processor.decode(gen_tokens[0], skip_special_tokens=True)
ブラウザでKB-Whisper
を使用したローカル推論のアプリケーションの例は、https://whisper.mesu.re/(Pierre Mesureによる作成)で見ることができます。JavaScriptでこのようなアプリケーションをセットアップするテンプレートは、https://github.com/xenova/whisper-webで見つけることができます。
訓練データ
我々のモデルは、50,000時間以上のテキスト書き起こし付きのスウェーデン語音声で訓練されています。モデルは2つの段階で訓練され、各段階では異なる品質フィルターとそれに対応する閾値が適用されます。
- 段階1では、低い閾値(データセットによって、BLEU値が0から0.30の間)が使用されます。
- 段階2では、より厳しい閾値(
BLEU >= 0.7
、加重ROUGE-N>= 0.7
、最初と最後の10文字のCER<= 0.2
)が使用されます。
データセット | 段階1 - 継続事前訓練(時間) | 段階2 - 微調整(時間) |
---|---|---|
字幕 | 34,261 | 3,110 |
スウェーデン議会 | 21,949 | 5,119 |
ISOF | 54 | 54 |
NST | 250 | 250 |
合計 | 56,514 | 8,533 |
Hugging Faceを通じてモデルを読み込む場合、デフォルトではStage 2バージョンが使用されます。ただし、我々は継続事前訓練のチェックポイントもアップロードし、ラベル付けしています。.from_pretrained()
でrevision
を指定することで、これらの他のチェックポイントを読み込むことができます。たとえば、事前訓練チェックポイントのラベルは、pretrained-checkpoint
で見つけることができます。段階2のデフォルトモデルのラベル名はstandard
です。我々は、2つの異なる段階2チェックポイントを提供しており、1つはより簡潔な書き起こしスタイルのsubtitle
、もう1つはより詳細なstrict
です。
評価
OpenAIモデルとのWER比較
モデルサイズ | FLEURS | CommonVoice | NST | |
---|---|---|---|---|
tiny | KBLab | 13.2 | 12.9 | 11.2 |
OpenAI | 59.2 | 67.8 | 85.2 | |
base | KBLab | 9.1 | 8.7 | 7.8 |
OpenAI | 39.6 | 52.1 | 53.4 | |
small | KBLab | 7.3 | 6.4 | 6.6 |
OpenAI | 20.6 | 26.4 | 26.4 | |
medium | KBLab | 6.6 | 5.4 | 5.8 |
OpenAI | 12.1 | 15.8 | 17.1 | |
large-v3 | KBLab | 5.4 | 4.1 | 5.2 |
OpenAI | 7.8 | 9.5 | 11.3 |
異なるKBLab Stage 2バージョンのWER
モデルサイズ | FLEURS | CommonVoice | NST | |
---|---|---|---|---|
tiny | standard | 13.2 | 12.9 | 11.2 |
strict | 14.1 | 13.4 | 11.0 | |
subtitle | 13.3 | 12.9 | 11.4 | |
base | standard | 9.1 | 8.7 | 7.8 |
strict | 10.4 | 9.6 | 8.4 | |
subtitle | 9.1 | 8.7 | 7.9 | |
small | standard | 7.3 | 6.4 | 6.6 |
strict | 8.2 | 7.0 | 6.7 | |
subtitle | 7.3 | 6.4 | 6.6 | |
medium | standard | 6.6 | 5.4 | 5.8 |
strict | 6.8 | 5.4 | 6.0 | |
large-v3 | standard | 5.4 | 4.1 | 5.2 |
strict | 5.3 | 4.0 | 5.1 | |
subtitle | 5.3 | 4.1 | 5.3 |
OpenAIモデルとのBLEUスコア比較
モデルサイズ | FLEURS | CommonVoice | NST | |
---|---|---|---|---|
tiny | KBLab | 76.6 | 73.7 | 74.3 |
OpenAI | 26.9 | 21.1 | 24.0 | |
base | KBLab | 83.2 | 79.9 | 78.3 |
OpenAI | 41.1 | 32.5 | 36.9 | |
small | KBLab | 86.6 | 83.5 | 79.6 |
OpenAI | 64.0 | 56.5 | 58.2 | |
medium | KBLab | 87.6 | 85.0 | 80.2 |
OpenAI | 77.1 | 70.1 | 68.9 | |
large-v3 | KBLab | 89.8 | 87.2 | 81.1 |
OpenAI | 84.9 | 79.1 | 75.1 |
異なるKBLab Stage 2バージョンのBLEUスコア
モデルサイズ | FLEURS | CommonVoice | NST | |
---|---|---|---|---|
tiny | standard | 76.6 | 73.7 | 74.3 |
strict | 75.3 | 72.9 | 74.6 | |
subtitle | 76.6 | 73.7 | 74.1 | |
base | standard | 83.2 | 79.9 | 78.3 |
strict | 81.0 | 78.4 | 77.5 | |
subtitle | 83.2 | 79.8 | 78.2 | |
small | standard | 86.6 | 83.5 | 79.6 |
strict | 84.9 | 82.4 | 79.3 | |
subtitle | 86.6 | 83.5 | 79.6 | |
medium | standard | 87.6 | 85.0 | 80.2 |
strict | 87.3 | 84.9 | 80.1 | |
large-v3 | standard | 89.8 | 87.2 | 81.1 |
strict | 90.0 | 87.4 | 81.2 | |
subtitle | 89.8 | 87.3 | 81.0 |
🔧 謝辞
このプロジェクトにおいて、我々は、欧州高性能コンピューティング人工知能およびデータ集中型アプリケーションアクセス計画を通じて、CINECA(イタリア)が管理する欧州高性能コンピュータLEONARDOおよびLEONARDO連合リソースへのアクセスを提供してくれた欧州高性能コンピューティング共同事業(EuroHPC Joint Undertaking)に感謝します。
📄 引用
KB-Whisperは、スウェーデン国立図書館KBLabの製品です。主な貢献者には、Faton Rekathati、Justyna Sikora、Robin Kurtz、Agnes Toftgård、Leonora Vesterbackaが含まれ、Love Börjesonによる指導のもと開発されました。
KB-Whisperを使用した我々の研究を引用する場合は、以下の論文を参照してください。 Swedish Whispers; Leveraging a Massive Speech Corpus for Swedish Speech Recognition
Interspeech 2025に受理された論文の更新引用は、近日公開予定です...



