modernbert-ja-130m-homophone-scorer
文の中で、書かれた語と同音の候補のどちらが自然かを採点するためのモデルです。sbintuitions/modernbert-ja-130m(SB Intuitions、MIT)を、音声入力の聞き違い(「好意」→「行為」、「意志」→「意思」など)で、話された語が書かれた語より高い点になるようにファインチューニングしました。Apple Silicon の Neural Engine で動く Core ML 版も同梱しています。英語の要約は末尾にあります。
モデルの詳細
モデルの説明
- 開発: umiyosh(校正アプリ Kotobae の端末上の誤変換チェックの採点役として)
- 種類: マスク言語モデル(ModernBERT、約 1.3 億パラメーター)。穴埋めの log P を擬似対数尤度の採点に使う
- 言語: 日本語
- ライセンス: MIT
- 元のモデル: sbintuitions/modernbert-ja-130m(MIT)
版
| 版 | リビジョン | 変えたこと |
|---|---|---|
| 2026-10-26 版(今の版) | 0abe0ed |
難しい負例を足して学ばせ直した重みと前の版を平均し、採点の前後の文脈を 3 トークンに広げた |
| 前の版 | 93b58a0 |
音声入力の聞き違いの組で学ばせた |
前の版は、リビジョンを指定すれば使えます。入出力は umiyosh/modernbert-ja-130m-coreml(重みは元のまま)と同じで、重みだけが違います。
出どころ
- 学習・評価のコード: umiyosh/modernbert-ja-ondevice の
asr/(組の作り方はscorer_pairs.py、学習はtrain_scorer.py) - 評価の取り決め:
asr/PROTOCOL.md - 学習の推移と最終評価のページ: https://umiyosh.github.io/modernbert-ja-ondevice/
使い道
そのまま使う
書かれた語と、その同音の候補(例: 「好意」と「行為」)を、文の中で比べます。候補の点から書かれた語の点を引いた差が大きいほど、候補の方が自然です。
組み込んで使う
Kotobae は、誤変換の検出器 umiyosh/modernbert-ja-130m-typo-detector で怪しい語を絞り、その語の候補をこのモデルで採点して、差が 7.0 以上の箇所に印を付けます。
向かない使い方
- 文を生成すること、一般の穴埋め(学習で、聞き違えやすい組の採点に寄せている)
- 同音ではない誤り(脱字・文法の崩れ)の判定
- 音声がないと決められない取り違え(どちらの語でも文が通るもの)
偏り・リスク・限界
- 文字だけで判定する: どちらの語でも文が通る取り違えは、原理的に見分けられません。
- 点の差は全体に広い: 聞き違えた組で話された語を 6.0 以上上に置くよう学ばせたので、元のモデルより差が大きく出ます。元のモデルの閾値はそのまま使えません。
- 音声認識と文体が変わると下がる: ReazonSpeech で書き起こした FLEURS(Wikipedia の翻訳文)では、組み合わせの再現率が 42.9% でした(Common Voice の test は 66.3%)。
- 学習データの偏り: 学習の組は、Whisper が Common Voice と Kokoro の読み上げで聞き違えたものです。ほかの音声認識の聞き違いの傾向は学んでいません。
勧めること
候補の順位づけの補助として使い、直すかどうかは人が決めてください。ほかの音声認識に使うときは、その書き起こしで閾値を選び直してください。
始め方
語の候補ごとに、文を語の周りの 32 トークンに切り、語のトークンと前後 3 トークン(前の版は 2 トークン)を 1 つずつ <mask> にして log P を足します(擬似対数尤度)。候補の値から書かれた語の値を引いた差が、候補のもっともらしさです。
Core ML
coreml/homophone-scorer-b32-l32.mlpackage(float16、バッチ 32 × 長さ 32 の固定)
| 名前 | 形 | 内容 |
|---|---|---|
input_ids |
32 × 32、int32 | トークン列。足りない分は <pad> で埋め、伏せる位置には自分で <mask> を置く |
attention_mask |
32 × 32、int32 | トークンのある位置が 1 |
position |
32、int32 | 各行の伏せた位置 |
target |
32、int32 | 各行で確率を知りたいトークン |
logp(出力) |
32、float | 各行の log P(target | 文脈) |
Python(coremltools 9.0)から呼ぶときは PYTHONMALLOC=malloc を付けてください。
学習
学習データ
| 出典 | 使い方 | ライセンス |
|---|---|---|
| Mozilla Common Voice 日本語 27.0 の train | 音声を whisper-large-v3-turbo(MIT)で書き起こし、同音の別の語を書いた箇所を取り出した。評価に使う話者・文は除いた | CC0 |
| JWTD v2 train の直した文の読み上げと、正しい文 | Kokoro-82M(Apache-2.0)で読み上げ、同じく書き起こした。正しい文は下の「難しい負例」に使った。評価に使う文は除いた | CC BY-SA 3.0(京都大学 言語メディア研究室) |
重みに Common Voice・JWTD の文や音声は含まれず、それらの再配布もしていません。
学習の手順
- 組:
- 聞き違えた箇所で、話された語を書かれた語より上に置く組 41,798 件(余白 6.0)
- 聞き違えやすい語が正しく使われている箇所で、その語を聞き違いの相手より上に置く組 20,106 件(余白 1.0)
- 難しい負例 2,716 件(余白 1.0、2 回ずつ)。前の版が、学習側の正しい文で、書かれた語より候補を 3 以上高く採点した箇所
- 損失: 上の採点のしかたそのままの差に、組ごとの余白の softplus をかけたものと、正しい文の穴埋め(各文 3 トークン)の損失の和。穴埋めは、採点役が日本語のモデルであることを保つため(Masked-FT、arXiv 2305.17721)。聞き違えた箇所の余白を、アプリの印の基準より大きい 6.0 にした
- AdamW(学習率 2e-5、weight decay 0.01)、バッチ 8 組、6,000 ステップ(線形減衰)の最後のチェックポイント
- 2026-10-26 版: 上の作り方に、前の版が学習側の文で書かれた語より候補を高く採点した箇所を、広い条件で掘り直した難しい負例 4,283 件(2 回ずつ)を足した重み(A)と、さらにその重みで掘った 772 件を足した重み(B)を作り、前の版・A・B を 0.15 : 0.35 : 0.5 で平均した(重みの平均)
- 精度: float32 で学習(Apple Silicon の MPS)。Core ML 版は float16
評価
試験データ・条件・物差し
umiyosh/modernbert-ja-130m-typo-detector の 2026-10-26 版で怪しい語を絞り、このモデルで候補を採点し、候補を入れた文を検出器で確かめ直す組み合わせ(Kotobae と同じ処理、Core ML)で測りました。試験データ、外部データ、物差しは、検出器のカードの「評価」と同じです。Common Voice 27.0 日本語の test(学習・検証と話者・文が重ならない 6,563 件、2,091 話者、同音の取り違え 523 件)は、版と閾値をすべて決めた後に一度だけ開けました。
結果
Common Voice の test(報告):
再現率は、本物の誤りのうち印が重なった割合です。適合率は、誤りのある書き起こしに付けた印のうち、本物の誤りに重なった割合です。正しい書き起こしに付けた印は、適合率とは別に 1,000 字あたりで示します。
| 採点役 | 同音の取り違えの再現率 | すべての誤りの再現率 | 適合率 | 誤った印 / 1,000 字 |
|---|---|---|---|---|
| この版(検出器 2026-10-26 版と組み合わせ) | 66.3%(61.9〜70.6) | 21.5% | 93.5% | 1.05(0.80〜1.32) |
| 同じ候補を学習なしの東北大 BERT で採点(藤井・新納 2021 の方式) | 41.3% | 19.2% | 95.0% | 0.98 |
| 元のモデル(modernbert-ja-130m-coreml、検出器は最初の版) | 22.0% | 8.8% | 81.0% | 0.88 |
学習なしの東北大 BERT との差は、同音の取り違えの再現率で +25.1 ポイント(p < 0.001)。適合率は学習なしの東北大 BERT の方が少し高い値でした(95.0% と 93.5%)。FLEURS(報告)では、同音の取り違えの再現率がこの版の組み合わせで 42.9%、学習なしの東北大 BERT で 30.3% でした。
まとめ
同じ候補を学習なしのマスク言語モデルで採点するより、音声入力の聞き違いで学ばせたこの採点役の方が、同音の取り違えの再現率が 25 ポイント高くなります。誤った印は 1,000 字に 1.05 個で、試験の前に書いた上限 1.00 を 0.05 超えています。
選択に使った値(参考)
検証用の話者を 2 つに分け、片方で選んだ閾値をもう片方に当てた値です。版を選ぶのに両方の半分を使ったので、少し良く見えている可能性があります。
| 測ったもの | 前の版(93b58a0) |
この版 |
|---|---|---|
| 本物の音声入力の同音の聞き違いの再現率(2 つの半分を合わせて 566 件) | — | 62.7%(355 件) |
| 同じく、選択に使っていない半分 | 51.1% | 60.7% |
| Common Voice の正しい書き起こしへの印(1,000 字あたり、2 つの半分) | — | 0.98 / 0.99 個 |
| JWTD test の正しい文 150,007 字への印 | 164 個 | 170 個 |
| JWTD test のかな漢字変換の同音の取り違えの再現率(1,660 件、閾値の選択に使っていない) | — | 77.9% |
環境への影響
- ハードウェア: Apple MacBook Pro(Apple M4 Pro、メモリー 48 GB)。学習は MPS、評価は Core ML
- 時間: 学習 1 回は 6,000 ステップ。学習の時間は記録していない
- クラウド: 使っていない(手元の Mac だけ)
- 排出量: 測っていない
技術仕様
- 構造と目的: ModernBERT(modernbert-ja-130m)のマスク言語モデル。組ごとの順位の損失(余白付き softplus)と、穴埋めの損失で学ばせた
- ソフトウェア: PyTorch 2.14、transformers 5.19、coremltools 9.0
ライセンス
MIT。元のモデル(Copyright (c) 2025 SB Intuitions)と同じです。
モデルカードの作者・連絡先
umiyosh。質問や不具合は GitHub の Issue へ。
English
sbintuitions/modernbert-ja-130m (MIT) fine-tuned to score which of a written word and its homophones fits the sentence, by the pseudo-log-likelihood of the word and three tokens on each side (two before the 2026-10-26 version). MIT. A Core ML package (batch 32 × length 32, float16) with the same inputs and outputs as umiyosh/modernbert-ja-130m-coreml is included. Training progress and final evaluation: page. Code and evaluation protocol: umiyosh/modernbert-ja-ondevice (asr/).
- Training: pairs from voice-input homophone errors in Whisper large-v3-turbo transcripts of Mozilla Common Voice Japanese 27.0 train clips (CC0) and of Kokoro-82M readings of JWTD v2 sentences, plus hard negatives mined from correct training-side text, with a pairwise margin loss (6.0 for misheard pairs, 1.0 otherwise) and a masked-LM loss. The 2026-10-26 version (
0abe0ed, current) averages the previous weights (93b58a0) with two retrainings that add hard negatives mined more widely (0.15 : 0.35 : 0.5). - Use: Kotobae screens words with umiyosh/modernbert-ja-130m-typo-detector, scores their homophones with this model and marks at a lead of 7.0. Its leads are wider than the base model's, so the base model's thresholds do not carry over.
- Evaluation: measured once on Common Voice test (6,563 clips of 2,091 speakers kept apart from training, 523 homophone errors) after every choice was fixed: with the 2026-10-26 detector, 66.3% of homophone errors (95% CI 61.9–70.6) at 1.05 false marks per 1,000 characters, against 41.3% when an untrained Tohoku BERT scores the same candidates (Fujii and Shinnou 2021; p < 0.001) and 22.0% for the check before this work. On FLEURS ja transcribed with ReazonSpeech, 42.9%.
- Limits: text only, so a wrong word that also fits the sentence cannot be told apart; trained on Whisper's mishearings, so another recognizer may need new thresholds.