Engineering notes

ベンチマークだけで音声認識を選ぶと危ない。自分の用途の音声で測ると結果が変わる

2026 年 11 月 6 日 · Liner Notes · English

iPhone の日記アプリで使う音声認識モデルを選び直したとき、よく使われる読み上げ音声のベンチマークでは、Apple の音声認識が一番良く見えました。ところが、アプリが実際に扱う会話の音声で測り直すと、Apple の文字誤り率は今使っている Parakeet の約1.8倍でした。ベンチマークの数字だけで乗り換えていたら、文字起こしの品質が落ちるところでした。どう比べて、どこで間違えかけ、最終的に何を選んだかを、数字と一緒に書きます。

やりたかったこと

iPhone の中で会話を文字にする日記アプリ(Liner Notes)を作っています。文字起こしには NVIDIA の Parakeet の日本語モデルを、FluidAudio 経由の Core ML で使っていました。

2026年10月に、Apple の音声認識(iOS の SpeechTranscriber)、Mistral の Voxtral、IBM の Granite Speech がそろって日本語で使えるようになったので、乗り換える価値があるかを比べることにしました。条件は、iPhone の中で動くこと、録音後にバックグラウンドで処理できる速さであること、そして会話を正確に文字にできることです。

日本語の音声認識をどう評価するか

日本語は単語の区切りに空白がないので、英語で使う単語誤り率(WER)ではなく、文字単位の誤り率(CER)で比べるのが一般的です。正解の文と認識結果を文字単位で突き合わせ、置き換え、抜け、余計な文字の数を、正解の文字数で割ります。今回は両方を NFKC で正規化し、句読点、空白、記号を除いてから比べました。「三十分」と「30分」のような表記の違いも誤りに数えています。

公開されている日本語の評価データは、大きく読み上げ音声と、話し言葉や会話の音声に分かれます。

データ種類中身
FLEURS(Google)読み上げ同じ文を多言語で読み上げた音声。モデルの公表値によく使われる
Common Voice(Mozilla)読み上げボランティアが文を読み上げた音声
JSUT読み上げ1人の話者が文を読み上げた音声
CSJ(日本語話し言葉コーパス)話し言葉講演などの音声。有償
ReazonSpeech会話テレビ放送(ドラマ、バラエティ、ニュース)の音声と字幕

まず読み上げ音声で比べ、Apple に乗り換えるつもりになった

最初に使ったのは FLEURS の日本語(開発用セット266本、計56.5分)です。Voxtral の公表値も同じデータで出ているので、比べやすいと考えました。

各モデルは次のように動かしました。測ったのはすべて同じ Mac(Apple シリコン、メモリ24GB)です。

モデルCER56.5分の処理時間
Voxtral(遅延2400ms)3.61%2,067秒
Apple4.68%約69秒
Parakeet(使っていたもの)5.29%18.8秒
Voxtral(遅延480ms)7.02%3,003秒

読み上げ音声(FLEURS 日本語)の文字誤り率

%(低いほど正確)

Voxtral(遅延2400ms)
3.61%
Apple
4.68%
Parakeet
5.29%
Voxtral(遅延480ms)
7.02%
表で見る
項目値
Voxtral(遅延2400ms)3.61%
Apple4.68%
Parakeet5.29%
Voxtral(遅延480ms)7.02%

Voxtral は遅延2400msなら一番正確ですが、Parakeet の約110倍遅く、6bit でも3.6GBあるので、iPhone のバックグラウンドで動かすのは現実的ではありません。Apple は Parakeet より誤りが少なく、OS に入っている認識器なので、アプリにモデルを同梱する必要もありません。この時点では Apple に乗り換えるつもりでした。

会話の音声で測り直すと、Apple の誤りは約1.8倍だった

ただ、FLEURS は静かな場所でのはっきりした読み上げです。アプリが実際に扱うのは、言いよどみや相づちが入り、話が重なる会話です。そこで、テレビ放送の会話を集めた ReazonSpeech のテストセット(2,632本、計258分)でも、同じ条件で測りました。

モデルCER何も出力しなかった区間258分の処理時間
Parakeet12.74%0本118秒
Apple22.96%37本631秒

読み上げと会話で、Apple と Parakeet の順位が入れ替わる

文字誤り率(%、低いほど正確)

ParakeetApple
読み上げ(FLEURS)
5.29%
4.68%
会話(ReazonSpeech)
12.74%
22.96%
表で見る
ParakeetApple
読み上げ(FLEURS)5.29%4.68%
会話(ReazonSpeech)12.74%22.96%

読み上げとは順位が逆になりました。Apple の誤りを見ると、短い区間で何も出力しないことが37本あり、誰も言っていない「ありがとうございます」「よろしくお願いします」を足すことがありました。テスト版の利用者から「言っていない『こんにちは』が文字起こしに入る」と報告されていたのと同じ型の誤りです。日記に、誰も言っていない挨拶が残るのは困ります。

Apple の処理時間には1本ごとの起動が含まれているので、速さの差はこの表ほど大きくありません。ただ、会話の精度では Parakeet を選ぶべきだと分かりました。

Granite を加えたら、前後の無音で数字が3ポイント動いた

続いて、10月21日に日本語に対応した IBM の Granite Speech 5.0 TurboCTC(4.7億パラメータ)を加えました。最初の結果は、会話で Granite 9.79%、Parakeet 12.74% です。今度は Granite に乗り換えるべきに見えました。

ところが調べてみると、Parakeet にはアプリと同じく前後に0.5秒の無音を足していたのに、Granite には足していませんでした。条件をそろえて測り直したのが次の表です(Granite は iPhone 向けに Core ML に変換したもの)。

条件GraniteParakeet
会話(ReazonSpeech)、無音なし9.99%11.73%
会話(ReazonSpeech)、前後に0.5秒の無音13.03%12.74%
連続した音声(約4分×14本)、前後に0.5秒の無音4.36%4.39%

前後の無音の有無で、Granite と Parakeet の差が変わる

文字誤り率(%)

GraniteParakeet
会話、無音なし
9.99%
11.73%
会話、前後に0.5秒の無音
13.03%
12.74%
連続した音声、前後に0.5秒の無音
4.36%
4.39%
表で見る
GraniteParakeet
会話、無音なし9.99%11.73%
会話、前後に0.5秒の無音13.03%12.74%
連続した音声、前後に0.5秒の無音4.36%4.39%

ReazonSpeech の音声には、前後の発話の切れ端が入っていて、正解の字幕には含まれていません。Granite は入力の端にある切れ端を書かないので、無音を足すと切れ端が端でなくなり、書くようになります。その分、誤りが増えたように見えていました。アプリが実際に扱う、長い録音を区切った音声では、2つの差はありません。

最後は自分の録音で読み比べた

公開データで差がつかなかったので、手元の実際の録音6本(計2時間10分)で、2つの文字起こしを並べて読みました。

見たところGraniteParakeet
早口で発話が重なる所句を落とす落としにくい
相づちだけの区間(11か所)1か所も書かなかった書いた
日本語を英語の文にした区間3か所なし
数字と英字の固有名詞正確ときどき崩れる

相づちや重なった発話は、会話の記録では大事な部分です。数字と固有名詞は Granite が良いものの、全体では Parakeet の方が漏れが少ない結果でした。

結論: Parakeet のまま使う

モデル得意なこと苦手なこと速さ
Parakeet会話、相づち、重なった発話読み上げではわずかに Apple に劣る速い(258分を118秒)
Apple読み上げ、モデルの同梱が不要会話で無言を返す、言っていない挨拶を足す普通(258分を631秒)
Granite速さ、数字と英字の固有名詞相づち、重なった発話、英語への置き換え最も速い(iPhone 16 で10分を2.1秒)
Voxtral読み上げの正確さ(遅延2400ms)遅い、モデルが大きい(3.6GB)遅い(56.5分を2,067秒)

アプリは Parakeet のままにしました。会話の精度が最も良く、相づちも落とさないからです。Granite は Core ML に変換したものを残してあり、速さが足りなくなったときの候補にしています。

まとめ

ほかの開発ノート