Moonshine と Whisper を日本語で比較:自前のテスト文で CER と応答速度を測った
はじめに
筆者は、オンライン会議の音声をローカルで文字起こしして議事録にするツールを作っています。文字起こしには 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 ms | MacBook 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 の記述と表示が食い違っているので、業務で使う前に、公式に確認することをお勧めします。
どう測ったか
比較対象
| 名前 | 中身 |
|---|---|
| Moonshine | moonshine-voice 0.1.5。日本語の既定モデル Small Streaming。ストリーミングで処理 |
| Whisper base | faster-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 種類の音声
- 合成音声(8 文)。macOS の
sayコマンドで読み上げた音声です。以前の Whisper 精度検証で使ったものを、そのまま使いました。通常速度と早口の 2 種類があります。同音異義語(体制、意思、機会)、カタカナ語、数字、固有名詞が入っています - 人の読み上げ(FLEURS、20 件)。Google が公開している多言語音声データセット(CC BY 4.0)の日本語 test から、乱数(seed 0)で 20 件を選びました。1 件は平均 14 秒です。選び直しはしていません
- 筆者自身の声(8 文)。1 の 8 文を、筆者が MacBook Pro のマイクで読み上げて録音しました。1 人分、8 文だけの小さなデータです
何を測ったか
CER(文字誤り率)は、正解文との編集距離を、正解文の文字数で割った値です。句読点と空白は除き、全角と半角は揃えました。以前の記事と同じ計算を使っています。
応答速度は、測り方が両者で違います。
- Moonshine は、実時間の速さで音声を少しずつ流し込み、最後の行が確定した時刻から、その行の発話が終わった時刻を引いた値です
- Whisper は、クリップ全体を渡して結果が出るまでの処理時間です。ストリーミングには対応していないためです
開発元の「発話の終わりから最終テキストまで」という定義に近づけたつもりですが、完全に同じ条件ではありません。
結果 1:精度(CER)
数値は低いほど良い結果です。Linux サーバーでの測定です。
| 音声 | Moonshine | Whisper base | Whisper small | Whisper large-v3-turbo |
|---|---|---|---|---|
| 合成音声・通常(8 文) | 0.092 | 0.154 | 0.104 | 0.122 |
| 合成音声・早口(8 文) | 0.099 | 0.189 | 0.118 | 0.112 |
| FLEURS・人の読み上げ(20 件) | 0.110 | 0.222 | 0.155 | 0.056 |
| 筆者の声(8 文) | 0.104 | 0.143 | 0.106 | 0.125 |
Mac での測定(Whisper large-v3-turbo を除く)も、ほぼ同じ値でした。
| 音声 | Moonshine | Whisper base | Whisper small |
|---|---|---|---|
| 合成音声・通常 | 0.092 | 0.154 | 0.104 |
| FLEURS | 0.112 | 0.226 | 0.155 |
| 筆者の声 | 0.104 | 0.140 | 0.110 |
読み取れることは次のとおりです。
- Moonshine は、4 種類の音声のすべてで、Whisper base より良い結果でした
- Whisper small とは、ほぼ同等から、やや良い結果でした
- Whisper large-v3-turbo は、FLEURS で 0.056 と最も良い結果でしたが、合成音声と筆者の声では、Moonshine より悪い結果でした。サンプル数が少なく、ばらつきの範囲だと思います
文ごとに見る(筆者の声)
| 文の番号 | 種類 | Moonshine | base | small | turbo |
|---|---|---|---|---|---|
| 文 1 | 同音異義語(火曜日) | 0.00 | 0.00 | 0.00 | 0.00 |
| 文 2 | 同音異義語(体制)+カタカナ語 | 0.13 | 0.06 | 0.00 | 0.06 |
| 文 3 | カタカナ語+日時の数字 | 0.06 | 0.15 | 0.09 | 0.06 |
| 文 4 | カタカナ語 2 つ+固有名詞 | 0.03 | 0.03 | 0.03 | 0.03 |
| 文 5 | 同音異義語(医師/意思)+固有名詞 | 0.00 | 0.16 | 0.12 | 0.08 |
| 文 6 | 社名+ Claude Code | 0.27 | 0.32 | 0.27 | 0.46 |
| 文 7 | 金額(三百二十八万五千円) | 0.31 | 0.38 | 0.31 | 0.31 |
| 文 8 | 同音異義語(機械/機会) | 0.03 | 0.03 | 0.03 | 0.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:応答速度
発話の終わりから、文字が確定するまでの中央値です(秒)。
| 音声 | Moonshine | Whisper base | Whisper small | Whisper large-v3-turbo |
|---|---|---|---|---|
| 合成音声・通常(Linux) | 0.18 | 0.47 | 1.31 | 4.91 |
| FLEURS・平均 14 秒(Linux) | 0.30 | 0.54 | 1.55 | 5.30 |
| 筆者の声(Linux) | 0.21 | 0.77 | 2.25 | 7.92 |
| FLEURS(Mac) | 0.32 | 0.55 | 1.59 | — |
注意点が 2 つあります。
- Whisper の速度は、実行のたびに変わりました。large-v3-turbo は、同じ Linux サーバーで 4.9 秒と 7.9 秒でした。他の処理が動いていた影響だと考えています。同じ条件で繰り返して、ばらつきを測ることはしていません
- 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 キーも、有料のサービスも要りません。
python3 -m venv venv
./venv/bin/pip install moonshine-voice faster-whisperMoonshine で、WAV(16 kHz、モノラル)をストリーミングで認識する最小のコードです。
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
福岡を拠点に、AIを活用したモバイル・Web・LINEアプリの受託開発を行っています。
