distilhubert-hiragana-ctc
DistilHuBERTをベースに、ひらがなと音素のデュアルCTC(Dual CTC)ヘッドを搭載した軽量な日本語音声認識(ASR)モデルです。
自己回帰デコーダを持たないため繰り返すハルシネーションを起こさず、ひらがな(および音素)のみを安定して出力します。
このモデルはカスタムアーキテクチャを採用しており、Hugging Faceの AutoModel (trust_remote_code=True) を使用して簡単に読み込むことができます。
🚀 元モデルからの変更点
オリジナルである japanese-wav2vec2-large-hiragana-ctc から以下の点を変更しています。
- ベースモデルを DistilHubert に変更 よりコンパクトで軽量な DistilHuBERT をエンコーダに採用しました。
- Head位置の変更とMLP化
DistilHuBERTに合わせて、音素CTCとかなCTCの両方を3層目に配置し、音素は
ノーマライズ->ドロップアウト->線形層に、かなはノーマライズ->線形層->アクティベーション->ドロップアウト->線形層としました。 - Hugging Face
AutoModelネイティブ対応 カスタムモジュール (modeling_dual_ctc.py) を同梱したため、ローカルのチェックポイントファイルを意識することなく、transformersから直接モデルをロードして推論できるようになりました。
🏗 Architecture
Audio (16kHz) → DistilHuBERT Encoder
├── Intermediate Layer 2 → Kana CTC Head (84 classes)
└── Intermediate Layer 2 → 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/distilhubert-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 | DistilHuBERT + Dual CTC (Kana & Phoneme) |
| Precision | BF16 |
| Kana vocab | 84 tokens |
| Phoneme vocab | 44 tokens |
| Dataset | Condition | KER | PER |
|---|---|---|---|
| JSUT-BASIC5000 | スタジオ収録、単一話者 | 9.09% | 8.26% |
| JVS pallarel100 | 100話者 | 12.5% | 8.65% |
| JVS whisper10 | 100話者、ささやき声 | 39.4% | 28.6% |
ReazonSpeech (20k samples from medium subset) |
TV音声 | 30.5% | 25.3% |
📜 License
Apache 2.0 license. See LICENSE for details.
🎓️ References / Acknowledgements
本モデルのベースとさせていただいたプロジェクト(Wav2Vec 2.0版)に関する詳細は、以下をご参照ください。
- Sakasegawa. (2026). "hiragana-asr: Lightweight Japanese ASR with Dual CTC". github.com/nyosegawa/hiragana-asr
エンコーダーモデル違いで、モデルサイズが少し大きく、ノイズ耐性の良好な wavlm-base-plus-hiragana-ctc もあります。
- Downloads last month
- 39
Model tree for TylorShine/distilhubert-hiragana-ctc
Base model
ntu-spml/distilhubert