distilhubert-hiragana-ctc

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

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

🚀 元モデルからの変更点

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

  1. ベースモデルを DistilHubert に変更 よりコンパクトで軽量な DistilHuBERT をエンコーダに採用しました。
  2. Head位置の変更とMLP化 DistilHuBERTに合わせて、音素CTCとかなCTCの両方を3層目に配置し、音素はノーマライズ->ドロップアウト->線形層に、かなはノーマライズ->線形層->アクティベーション->ドロップアウト->線形層としました。
  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版)に関する詳細は、以下をご参照ください。

エンコーダーモデル違いで、モデルサイズが少し大きく、ノイズ耐性の良好な wavlm-base-plus-hiragana-ctc もあります。

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

Model tree for TylorShine/distilhubert-hiragana-ctc

Finetuned
(552)
this model