japanese-punctuation-onnx
句読点の無い日本語に、「、」「。」「?」を打つモデルです。 音声認識 ReazonSpeech の k2 版(reazonspeech-k2-v2)のように、句読点を出さない認識結果に後から句読点を付けます。 Android の日本語入力アプリ Nier Voice IME の口述のために作りました。
A Japanese punctuation restoration model (、。?) for unpunctuated ASR output such as ReazonSpeech (reazonspeech-k2-v2). ONNX (int8), runs on-device.
仕組み
- 土台は東北大学の文字単位 BERT(tohoku-nlp/bert-base-japanese-char-v3)です。
- 1文字ごとに、その文字の後ろに付く句読点を当てるトークン分類として学習しています。
- ファイルは ONNX の int8 版で、大きさは約92MBです。重みは出力チャンネルごとに量子化しています。
| ファイル | 中身 |
|---|---|
punct.int8.onnx |
モデル本体 |
vocab.txt |
語彙。1行が1つの語彙で、行番号(0始まり)が語彙番号 |
使い方
入力は1文字=1トークンです。トークナイザーは使わず、vocab.txt を1文字ずつ引きます。
input_ids[1, n](int64):[CLS]、文字…、[SEP]の語彙番号です。語彙に無い文字は[UNK]にします。attention_mask[1, n](int64):すべて1です。- 出力
logits[1, n, 4]:先頭([CLS])と末尾([SEP])を除いた各文字について、いちばん大きい番号を採ります。
| 番号 | 意味 |
|---|---|
| 0 | 句読点なし |
| 1 | 、 |
| 2 | 。 |
| 3 | ? |
一度に渡せるのは510文字までです。長い文章は、前の文脈を少し重ねながら区切って渡してください。
import numpy as np, onnxruntime as ort
vocab = {w: i for i, w in enumerate(open("vocab.txt", encoding="utf-8").read().split("\n"))}
sess = ort.InferenceSession("punct.int8.onnx")
text = "明日の会議は何時からですか資料は私が用意しておくので先に始めていてください"
ids = np.array([[vocab["[CLS]"]] + [vocab.get(c, vocab["[UNK]"]) for c in text] + [vocab["[SEP]"]]], dtype=np.int64)
labels = sess.run(None, {"input_ids": ids, "attention_mask": np.ones_like(ids)})[0][0, 1:-1].argmax(-1)
print("".join(c + ["", "、", "。", "?"][k] for c, k in zip(text, labels)))
# 明日の会議は何時からですか?資料は私が用意しておくので、先に始めていてください。
評価
検証用データ(学習素材から取り分けた約6,300件。素材と同じ種類の文章)
| 、 | 。 | ? | |
|---|---|---|---|
| F1 | 0.82 | 0.97 | 0.90 |
実際の口述(ReazonSpeech の k2 版の認識結果に句読点を打ち、同じ音声を Whisper で起こしたときの句読点と比べたもの・74本)
| 、 | 。 | ? | |
|---|---|---|---|
| 区切りの語尾で打つ規則(比較用) | 0.35 | 0.69 | 0.00 |
| このモデル | 0.70 | 0.88 | 0.79 |
口述の評価は話し手1人の録音で、正解の代わりに Whisper の句読点を使っています。 「、」は人によって打ち方が揺れるので、数字は目安としてご覧ください。 「〜でしょ?」「〜のかな?」のように語尾の上げ下げでしか区別できない疑問は、文字だけでは決めきれないことがあります。
学習データと出典
次の素材を、句読点を「、」「。」「?」の3種類にそろえて使いました。はっきりした疑問の文末に付いていた「。」は「?」に直しています。
- 国会会議録(国会会議録検索システム の API から取得)2025年2・3・5・6月の発言
- 防衛省ウェブサイト「防衛大臣記者会見」2024〜2025年(公共データ利用規約(第1.0版)に基づき、句読点の正規化などの加工をして使用)
- Tatoeba の日本語例文(CC BY 2.0 FR)
- 青空文庫の小説の会話文(globis-university/aozorabunko-clean、CC BY 4.0 を経由して取得)
ライセンス
Apache License 2.0(土台の BERT と同じ)。 上の学習データを使う場合は、それぞれの条件に従ってください。
Model tree for AstroNier/japanese-punctuation-onnx
Base model
tohoku-nlp/bert-base-japanese-char-v3