| ---
|
| 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)
|
|
|