wavlm-base-plus-hiragana-ctc

WavLMをベースに、ひらがなと音素のデュアルCTC(Dual CTC)ヘッドを搭載した軽量な日本語音声認識(ASR)モデルです。
自己回帰デコーダを持たないため繰り返すハルシネーションを起こさず、ひらがな(および音素)のみを安定して出力します。

このモデルはカスタムアーキテクチャを採用しており、Hugging Faceの AutoModel (trust_remote_code=True) を使用して簡単に読み込むことができます。

🚀 元モデルからの変更点

オリジナルである japanese-wav2vec2-large-hiragana-ctc から以下の点を変更しています。

  1. ベースモデルを WavLM に変更 よりノイズに強く、幅広い音声表現を獲得できる WavLM-Base-Plus をエンコーダに採用しました。
  2. Head位置の変更 WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing のデータを参考に、音素CTCとかなCTCのHead位置を変更しました。
  3. Hugging Face AutoModel ネイティブ対応 カスタムモジュール (modeling_dual_ctc.py) を同梱したため、ローカルのチェックポイントファイルを意識することなく、transformers から直接モデルをロードして推論できるようになりました。

🏗 Architecture

Audio (16kHz) → WavLM Encoder
                  ├── Intermediate Layer 9 → Kana CTC Head (84 classes)
                  └── Intermediate Layer 11 → Phoneme CTC Head (44 classes)

💻 Usage

本モデルはカスタムコード(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)

📊 Model Details & Evaluation

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%

📜 License

Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license. See LICENSE for details.
(CC BY-SA 3.0 ライセンスはWavLMから継承しています。)

🎓️ References / Acknowledgements

本モデルのベースとさせていただいたプロジェクト(Wav2Vec 2.0版)に関する詳細は、以下をご参照ください。

Downloads last month
13
Safetensors
Model size
94.5M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for TylorShine/wavlm-base-plus-hiragana-ctc

Finetuned
(29)
this model

Paper for TylorShine/wavlm-base-plus-hiragana-ctc