Amanity
2台のロボットが音声波形を挟んで向き合うイラスト
ブログ›エンジニア向け2026-10-15約10分

Moonshine と Whisper を日本語で比較:自前のテスト文で CER と応答速度を測った

対象読者: Whisperで議事録・音声入力を実装している、またはWhisperに代わるローカル音声認識を探しているエンジニア

はじめに

筆者は、オンライン会議の音声をローカルで文字起こしして議事録にするツールを作っています。文字起こしには Whisper を使っています。

2026 年 2〜3 月に、Moonshine Voice というオープンソースの音声認識について、日本語の紹介記事が相次ぎました。多くは「Whisper を超える精度」と紹介していて、日本語にも対応したとされています。

気になったのは、その数値の出どころです。紹介記事を読むと、精度の数値は英語のもの、速度の数値は開発元の測定でした。日本語で、筆者が自分で測った数値を載せた記事は、調べた範囲では見つかりませんでした。

そこで、Whisper の精度検証に使っていた日本語のテスト文で、Moonshine の日本語モデルを測ってみました。結果を先に書きます。

  • 日本語でも、Moonshine は文字誤り率(CER)で Whisper small と同等でした。Whisper base よりは良い結果でした
  • 人の読み上げ(公開データセット)では、Whisper large-v3-turbo の方が良い結果でした
  • 発話の終わりから文字が確定するまでの時間は、Moonshine が 0.2〜0.3 秒、Whisper small が 1.3〜2.3 秒(約 5〜11 倍)、large-v3-turbo が 4.9〜7.9 秒でした
  • サンプル数が少ないので、「Moonshine が勝った」とは言えません。言えるのは、「この条件では、Whisper small 並みの精度が、5〜11 倍の応答速度で出た」ことです

この記事では、測り方、結果、開発元の数値との食い違い、使い分けの考え方を紹介します。


開発元の数値を読むときの注意

Moonshine の公式ドキュメントと、それを引用した紹介記事には、数値が複数あります。比べる前に、条件を整理します。

数値何の数値か
WER 6.65%(Whisper Large v3 は 7.44%)英語。Medium Streaming モデルの Open ASR Leaderboard 平均
応答 59 ms 対 11,286 msMacBook Pro で、発話の終わりから最終テキストまでの時間。Whisper は CPU 上の faster-whisper
日本語 CER 17.2%現行の Small Streaming。400 クリップの抜き取り
日本語 CER 13.62%旧 Base モデル。FLEURS の全件

最後の 2 つは、モデルも評価データも違うので、比べられません。さらに、現行モデルのモデルカード(Hugging Face)には、400 件の抜き取りでの内訳があり、CER は、読み上げ音声(FLEURS)が 7.99%、自然な発話(ReazonSpeech)が 26.31% でした(学習時のチェックポイントの値。公開された重みでは 7.90% と 26.69%)。話し方で 3 倍以上の差があります。

ここから分かるのは、「日本語の精度」は、何を読ませるかで大きく変わるということです。自分の用途に近い音声で測る必要があります。

ライセンス

日本語モデルは非商用だという記述を見かけたので、公式リポジトリの LICENSE を読みました。

  • コードと、すべてのストリーミングモデルは MIT です。日本語の現行モデル(Small Streaming、Tiny Streaming)も含みます
  • 非商用の Moonshine Community License が残っているのは、旧型(非ストリーミング)の非英語モデルだけです。日本語では Base と Tiny が該当します

ただし、ライブラリは非英語のモデルを読み込むたびに「非商用ライセンスのモデルを使っています」と表示します。現行の日本語モデルでも表示されました。LICENSE の記述と表示が食い違っているので、業務で使う前に、公式に確認することをお勧めします。


どう測ったか

比較対象

名前中身
Moonshinemoonshine-voice 0.1.5。日本語の既定モデル Small Streaming。ストリーミングで処理
Whisper basefaster-whisper 1.2.1(CTranslate2、int8、CPU)。日本語を指定
Whisper small同上
Whisper large-v3-turbo同上

筆者の議事録ツールは whisper.cpp を使っています。今回は、Linux と Mac で同じ実装を使うために、faster-whisper に揃えました。そのため、数値は手元のツールの実測とは一致しません。

測った環境は 2 つです。

  • Linux サーバー(16 コア CPU。GPU は使っていません)
  • MacBook Pro(Apple M3 Pro。GPU は使っていません。Whisper large-v3-turbo は、メモリの都合で測っていません)

3 種類の音声

  1. 合成音声(8 文)。macOS の say コマンドで読み上げた音声です。以前の Whisper 精度検証で使ったものを、そのまま使いました。通常速度と早口の 2 種類があります。同音異義語(体制、意思、機会)、カタカナ語、数字、固有名詞が入っています
  2. 人の読み上げ(FLEURS、20 件)。Google が公開している多言語音声データセット(CC BY 4.0)の日本語 test から、乱数(seed 0)で 20 件を選びました。1 件は平均 14 秒です。選び直しはしていません
  3. 筆者自身の声(8 文)。1 の 8 文を、筆者が MacBook Pro のマイクで読み上げて録音しました。1 人分、8 文だけの小さなデータです

何を測ったか

CER(文字誤り率)は、正解文との編集距離を、正解文の文字数で割った値です。句読点と空白は除き、全角と半角は揃えました。以前の記事と同じ計算を使っています。

応答速度は、測り方が両者で違います。

  • Moonshine は、実時間の速さで音声を少しずつ流し込み、最後の行が確定した時刻から、その行の発話が終わった時刻を引いた値です
  • Whisper は、クリップ全体を渡して結果が出るまでの処理時間です。ストリーミングには対応していないためです

開発元の「発話の終わりから最終テキストまで」という定義に近づけたつもりですが、完全に同じ条件ではありません。

速度の測り方の違い

結果 1:精度(CER)

数値は低いほど良い結果です。Linux サーバーでの測定です。

音声MoonshineWhisper baseWhisper smallWhisper large-v3-turbo
合成音声・通常(8 文)0.0920.1540.1040.122
合成音声・早口(8 文)0.0990.1890.1180.112
FLEURS・人の読み上げ(20 件)0.1100.2220.1550.056
筆者の声(8 文)0.1040.1430.1060.125

Mac での測定(Whisper large-v3-turbo を除く)も、ほぼ同じ値でした。

音声MoonshineWhisper baseWhisper small
合成音声・通常0.0920.1540.104
FLEURS0.1120.2260.155
筆者の声0.1040.1400.110
日本語の文字誤り率(CER)の比較

読み取れることは次のとおりです。

  • Moonshine は、4 種類の音声のすべてで、Whisper base より良い結果でした
  • Whisper small とは、ほぼ同等から、やや良い結果でした
  • Whisper large-v3-turbo は、FLEURS で 0.056 と最も良い結果でしたが、合成音声と筆者の声では、Moonshine より悪い結果でした。サンプル数が少なく、ばらつきの範囲だと思います

文ごとに見る(筆者の声)

文の番号種類Moonshinebasesmallturbo
文 1同音異義語(火曜日)0.000.000.000.00
文 2同音異義語(体制)+カタカナ語0.130.060.000.06
文 3カタカナ語+日時の数字0.060.150.090.06
文 4カタカナ語 2 つ+固有名詞0.030.030.030.03
文 5同音異義語(医師/意思)+固有名詞0.000.160.120.08
文 6社名+ Claude Code0.270.320.270.46
文 7金額(三百二十八万五千円)0.310.380.310.31
文 8同音異義語(機械/機会)0.030.030.030.00

文 5 の「意思決定」は、Moonshine だけが正しく認識しました。Whisper は 3 つとも「医師決定」と書きました。同音異義語の判断は、文脈をどこまで見るかで変わります。ただし、1 文だけの結果なので、傾向とは言えません。

直らない誤りと、表記ゆれ

文 6 は、全システムが「クロードコード」と書きました。Claude Code という綴りは、どのモデルにも出せませんでした。固有名詞は、今回の 4 つのどれでも直りませんでした。単語リストなど、別の仕組みを試す価値があります。

文 7 は、「三百二十八万五千円」を、Moonshine、Whisper small、large-v3-turbo の 3 つが「328万5000円」と書きました。base は「328,000円」と、数字そのものを誤りました。3 つは意味が合っているのに、CER は 0.31 になります。数字の表記を揃える後処理を入れてから測らないと、この種の誤りは精度の比較を歪めます。以前の Whisper 精度検証で書いたことが、そのまま当てはまりました。


結果 2:応答速度

発話の終わりから、文字が確定するまでの中央値です(秒)。

音声MoonshineWhisper baseWhisper smallWhisper large-v3-turbo
合成音声・通常(Linux)0.180.471.314.91
FLEURS・平均 14 秒(Linux)0.300.541.555.30
筆者の声(Linux)0.210.772.257.92
FLEURS(Mac)0.320.551.59—
発話の終わりから文字が確定するまでの時間

注意点が 2 つあります。

  1. Whisper の速度は、実行のたびに変わりました。large-v3-turbo は、同じ Linux サーバーで 4.9 秒と 7.9 秒でした。他の処理が動いていた影響だと考えています。同じ条件で繰り返して、ばらつきを測ることはしていません
  2. Moonshine の値は、音声を実時間で流した場合の値です。流し込みの間にも、認識は進んでいます。Whisper は、全体を受け取ってから処理を始めます。ライブ文字起こしでは、この違いが体感の差になります。録音済みのファイルをまとめて処理する用途では、この速度の差はほとんど問題になりません

開発元の数値(59 ms 対 11,286 ms)ほどの差は出ませんでした。Moonshine は 0.2〜0.3 秒で、数十ミリ秒ではありません。ただし、開発元が Linux で測った値(Small Streaming で 165 ms、Medium Streaming で 269 ms)とは近い値でした。59 ms との差は、MacBook Pro と今回のサーバーの、ハードウェアの違いが原因だと考えています。それでも、Moonshine との差は、Whisper small で 5〜11 倍、large-v3-turbo で 18〜38 倍ありました。


測定で見つけた落とし穴

同じプロセスで連続して処理すると、空の結果が返ることがある

20 件の FLEURS を 1 つのプロセスで続けて処理したところ、3 件で、Moonshine が空の結果を返しました。同じクリップを単独で処理すると、正しく認識されました。クリップごとに別のプロセスで処理すると、空の結果は出ませんでした。

原因は特定していません。ストリームを閉じずに使い続けたことが関係しているかもしれません。長時間動かすアプリに組み込むときは、連続処理で問題が出ないかを確認してください。

日本語では、結果が細かい行に分かれる

Moonshine は、息継ぎや間で行を区切ります。日本語の文章をそのまま読み上げさせると、短い行が並びます。議事録のように文単位で扱いたい場合は、後処理が要ります。


どう使い分けるか

今回の測定から言えるのは、次のことです。

用途向いているもの理由
ライブの字幕、音声での操作、会話の応答Moonshine応答が 0.2〜0.3 秒で、精度も Whisper small 並み
会議の録音ファイルをあとでまとめて文字起こしWhisper large-v3-turbo など速度が問題にならず、人の読み上げでは最も精度が良かった
小さな機器や、CPU のみの環境Moonshine小さいモデルでも、Whisper base 以上の精度が出た
録音をあとで処理し、軽さを重視するどちらでも精度は Whisper small と同等。速度が問題にならなければ、どちらを選んでも大きな差は出なかった
用途で選ぶ目安

筆者の議事録ツールは、会議のあとで処理する用途なので、Whisper のままにします。ただ、会議中にリアルタイムで文字を出す機能を足すなら、Moonshine が有力な候補です。


自分で再現する

必要なものは、Python と、ffmpeg だけです。API キーも、有料のサービスも要りません。

bash
python3 -m venv venv
./venv/bin/pip install moonshine-voice faster-whisper

Moonshine で、WAV(16 kHz、モノラル)をストリーミングで認識する最小のコードです。

python
import wave, numpy as np
from moonshine_voice import Transcriber, TranscriptEventListener
from moonshine_voice.download import get_model_for_language

model_path, arch = get_model_for_language("ja")  # 初回にモデルをダウンロード
moon = Transcriber(model_path, arch)

w = wave.open("sample.wav")
audio = np.frombuffer(w.readframes(w.getnframes()), dtype=np.int16).astype(np.float32) / 32768

lines = []
class Listener(TranscriptEventListener):
    def on_line_completed(self, e):
        lines.append(e.line.text)

stream = moon.create_stream(update_interval=0.2)
stream.add_listener(Listener())
stream.start()
for i in range(0, len(audio), 1600):  # 100 ms ずつ流し込む
    stream.add_audio(audio[i:i + 1600].tolist(), 16000)
stream.stop()
print("".join(lines))

Whisper 側は、faster-whisper の WhisperModel("small", device="cpu", compute_type="int8") に、transcribe(audio, language="ja") を呼ぶだけです。CER は、正解文と認識結果から句読点と空白を除き、編集距離を正解文の文字数で割れば出ます。


限界

最後に、この記事の限界を書きます。

  • サンプル数が少ないです。合成音声が 8 文、筆者の声が 8 文(1 人)、FLEURS が 20 件です。差が 0.01 程度なら、ばらつきの範囲です
  • 自然な会話、雑音、複数人の発話では測っていません。開発元の内訳では、自然な発話の CER は読み上げの 3 倍以上でした。会議の実用精度は、今回の数値より悪くなる可能性が高いです
  • Whisper の実装が faster-whisper です。whisper.cpp や GPU を使った場合は、応答速度が大きく変わる可能性があります
  • 速度の測り方が両者で異なります。比較の目安としてご覧ください

まとめ

  • 日本語でも、Moonshine は、この条件で Whisper small と同等の精度でした
  • 応答速度は、Whisper small の 5〜11 倍でした。ライブの文字起こしに向いています
  • 録音ファイルをあとで処理するなら、Whisper large-v3-turbo の方が精度の面で有利でした
  • 開発元の数値は、条件を確認してから読んでください。日本語の数値は、旧モデルと現行モデルで評価データが違います
  • 自分の用途に近い音声で、一度測ってみることをお勧めします。テスト文 8 文を読み上げるだけでも、判断の材料になります

この検証を行ったのは 株式会社Amanity です。 自社で手を動かして技術を確かめたうえで、モバイルアプリ・LINEアプリ・Webアプリの受託開発を行っています。

開発について相談する
Amanity

株式会社Amanity

福岡を拠点に、AIを活用したモバイル・Web・LINEアプリの受託開発を行っています。