WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing
Paper • 2110.13900 • Published • 3
WavLMをベースに、ひらがなと音素のデュアルCTC(Dual CTC)ヘッドを搭載した軽量な日本語音声認識(ASR)モデルです。
自己回帰デコーダを持たないため繰り返すハルシネーションを起こさず、ひらがな(および音素)のみを安定して出力します。
このモデルはカスタムアーキテクチャを採用しており、Hugging Faceの AutoModel (trust_remote_code=True) を使用して簡単に読み込むことができます。
オリジナルである japanese-wav2vec2-large-hiragana-ctc から以下の点を変更しています。
AutoModel ネイティブ対応
カスタムモジュール (modeling_dual_ctc.py) を同梱したため、ローカルのチェックポイントファイルを意識することなく、transformers から直接モデルをロードして推論できるようになりました。Audio (16kHz) → WavLM Encoder
├── Intermediate Layer 9 → Kana CTC Head (84 classes)
└── Intermediate Layer 11 → Phoneme CTC Head (44 classes)
本モデルはカスタムコード(DualCTCModel)を使用しているため、ロード時に trust_remote_code=True を指定する必要があります。
pip install torch torchaudio transformers
import torch
import torchaudio
from transformers import AutoFeatureExtractor, AutoModel, PreTrainedTokenizerFast
model_id = "TylorShine/wavlm-base-plus-hiragana-ctc"
# 特徴量抽出器とモデルのロード
processor = AutoFeatureExtractor.from_pretrained(model_id)
model = AutoModel.from_pretrained(model_id, trust_remote_code=True)
model.eval()
# トークナイザーのロード
kana_tokenizer = PreTrainedTokenizerFast.from_pretrained(model_id, subfolder="kana_tokenizer")
phoneme_tokenizer = PreTrainedTokenizerFast.from_pretrained(model_id, subfolder="phoneme_tokenizer")
# 音声ファイルの読み込み (16kHzにリサンプリング)
waveform, sample_rate = torchaudio.load("nihongo_no_onsei.wav")
if sample_rate != 16000:
resampler = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=16000)
waveform = resampler(waveform)
# 前処理
inputs = processor(waveform.squeeze().numpy(), sampling_rate=16000, return_tensors="pt")
# 推論
with torch.no_grad():
outputs = model(**inputs)
# ひらがなと音素のロジットを取得
kana_logits = outputs["kana_logits"]
phoneme_logits = outputs["phoneme_logits"]
# Greedy Decoding
kana_preds = torch.argmax(kana_logits, dim=-1).tolist()
phoneme_preds = torch.argmax(phoneme_logits, dim=-1).tolist()
# print("Kana Token IDs:", kana_preds[0])
# print("Phoneme Token IDs:", phoneme_preds[0])
# `model.ctc_decode()` でトークンをテキストに変換
kana_text = model.ctc_decode(kana_preds, kana_tokenizer, is_kana=True)
phoneme_text = model.ctc_decode(phoneme_preds, phoneme_tokenizer, is_kana=False)
print("Kana:", kana_text)
print("Phoneme:", phoneme_text)
| Property | Value |
|---|---|
| Architecture | WavLM + Dual CTC (Kana & Phoneme) |
| Precision | BF16 |
| Kana vocab | 84 tokens |
| Phoneme vocab | 44 tokens |
| Dataset | Condition | KER | PER |
|---|---|---|---|
| JSUT-BASIC5000 | スタジオ収録、単一話者 | 4.7% | 5.6% |
| JVS pallarel100 | 100話者 | 6.58% | 8.07% |
| JVS whisper10 | 100話者、ささやき声 | 12.3% | 11.0% |
ReazonSpeech (20k samples from medium subset) |
TV音声 | 19.2% | 16.7% |
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license. See LICENSE for details.
(CC BY-SA 3.0 ライセンスはWavLMから継承しています。)
本モデルのベースとさせていただいたプロジェクト(Wav2Vec 2.0版)に関する詳細は、以下をご参照ください。
Base model
microsoft/wavlm-base-plus