TylorShine's picture
Upload folder using huggingface_hub
cb9ad2c verified
---
language:
- ja
license: cc-by-sa-3.0
library_name: transformers
tags:
- automatic-speech-recognition
- ctc
- wavlm
- japanese
- hiragana
- phoneme
- custom_code
pipeline_tag: automatic-speech-recognition
base_model: microsoft/wavlm-base-plus
---
# wavlm-base-plus-hiragana-ctc
WavLMをベースに、ひらがなと音素のデュアルCTC(Dual CTC)ヘッドを搭載した軽量な日本語音声認識(ASR)モデルです。
自己回帰デコーダを持たないため繰り返すハルシネーションを起こさず、ひらがな(および音素)のみを安定して出力します。
前バージョンの [`wavlm-base-plus-hiragana-ctc`](https://huggingface.co/TylorShine/wavlm-base-plus-hiragana-ctc) から、音素CTCとかなCTCのHead両方をMLPに変更しています。
このモデルはカスタムアーキテクチャを採用しており、Hugging Faceの `AutoModel` (`trust_remote_code=True`) を使用して簡単に読み込むことができます。
## 🚀 元モデルからの変更点
オリジナルである [`japanese-wav2vec2-large-hiragana-ctc`](https://huggingface.co/sakasegawa/japanese-wav2vec2-large-hiragana-ctc) から以下の点を変更しています。
1. **ベースモデルを WavLM に変更**
よりノイズに強く、幅広い音声表現を獲得できる [WavLM-Base-Plus](https://huggingface.co/microsoft/wavlm-base-plus) をエンコーダに採用しました。
2. **Head位置の変更**
[WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing](https://arxiv.org/abs/2110.13900) のデータを参考に、音素CTCとかなCTCのHead位置を変更しました。
3. **Hugging Face `AutoModel` ネイティブ対応**
カスタムモジュール (`modeling_dual_ctc.py`) を同梱したため、ローカルのチェックポイントファイルを意識することなく、`transformers` から直接モデルをロードして推論できるようになりました。
## 🏗 Architecture
```text
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` を指定する必要があります。
### インストール
```bash
pip install torch torchaudio transformers
```
### 推論コードの例
```python
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 | スタジオ収録、単一話者 | 3.97% | 3.33% |
| JVS pallarel100 | 100話者 | 5.46% | 4.35% |
| JVS whisper10 | 100話者、ささやき声 | 11.6% | 7.51% |
| ReazonSpeech (20k samples from `medium` subset) | TV音声 | 17.5% | 14.7% |
## 📜 License
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license. See [LICENSE](LICENSE) for details.
(CC BY-SA 3.0 ライセンスはWavLMから継承しています。)
## 🎓️ References / Acknowledgements
本モデルのベースとさせていただいたプロジェクト(Wav2Vec 2.0版)に関する詳細は、以下をご参照ください。
- Sakasegawa. (2026). "hiragana-asr: Lightweight Japanese ASR with Dual CTC". [github.com/nyosegawa/hiragana-asr](https://github.com/nyosegawa/hiragana-asr)