Moonshine Voiceは、Moonshine AI(旧Useful Sensors)が公開しているオンデバイスの音声ツールキットです。音声認識(STT)・音声合成(TTS)・音声エージェント(AgentFlow)を1つのライブラリで扱え、アカウントもAPIキーも要りません。
2026年8月24日のv0.1.5で、日本語がストリーミングモデルに切り替わり、ほぼ全モデルがMITライセンスになりました。「日本語はBaseモデル」「非英語は非商用ライセンス」という発表当初の説明は、もう当てはまりません。この記事では公式のドキュメント・LICENSE・CHANGELOGとHugging Faceのモデルカードで現行版の仕様を整理し、日本語の文字起こしをDocker上で動かした結果も載せます。
まとめ
- 位置づけ:話し終わってから結果が返るまでの遅延を縮めることに特化した、CPU専用のライブラリ。GPUで大量の録音を一括処理するならWhisperやParakeetのほうが向きます。
- Whisperとの差:英語Medium Streaming(2.45億パラメータ)のWERは6.65%で、Whisper Large v3(15億・7.44%)を下回ります。MacBook Proでの応答遅延は59ms対11,286ms。
- 日本語:v0.1.5からSmall Streaming(CER 17.2%)が既定。朗読音声のFLEURSではCER 7.99%、自発話のReazonSpeechでは26.31%。音声コマンドやライブ字幕の下書き向きで、議事録の清書には足りません。
- 日本語で効く設定:
max_tokens_per_secondを13.0にする(公式の指示)。今回の検証では、製品名はkeytermsにカタカナで渡すと直り、漢字の社名「一創」は直りませんでした。 - ファイル処理の注意:一括処理の
transcribe_without_streaming()は、今回の検証では録音の末尾に無音が無いと最後の語が欠け、1秒の無音を足すと欠落した語が出力されました。 - STT以外:TTSは
ja-jpを含む20の言語タグに対応。LLMは同梱されず、AgentFlowが自前のLLMの返答を逐次読み上げます。 - ライセンス:コードとSTTモデルはMITが既定。Communityライセンス(非商用が原則)が残るのは旧型の非英語モデルだけで、日本語ではBaseとTiny(非ストリーミング)が該当します。
Moonshine Voiceの構成:STT・TTS・AgentFlowと対応環境
開発チームのPete Wardenは2026年2月13日の発表記事で、18か月かけて作ったと説明しています。ストリーミング方式の設計は論文Moonshine v2: Ergodic Streaming Encoder ASRにまとめられています。ライブラリの中核はC++で、ONNX Runtimeで推論します。その上にPython・JavaScript(WASM)・Swift・Java・C++のバインディングが載り、どの言語でも「生成→設定→load()」という同じ形でAPIを呼びます。
音声認識(STT)の英語モデル5種とWER
英語の現行モデルはストリーミング型の3サイズと、非ストリーミングのBase・Tinyです。WERはHugging FaceのOpen ASR Leaderboardの8データセット平均で、公式のAvailable Modelsに載っている浮動小数点版の値です(配布される量子化版はわずかに高く出ます)。
| モデル | パラメータ数 | WER | ライセンス |
|---|---|---|---|
| Medium Streaming | 2.45億 | 6.65% | MIT |
| Small Streaming | 1.23億 | 7.84% | MIT |
| Tiny Streaming | 3,400万 | 12.00% | MIT |
| Base(非ストリーミング) | 5,800万 | 10.07% | MIT |
| Tiny(非ストリーミング) | 2,600万 | 12.66% | MIT |
言語を "en" とだけ指定するとMedium Streamingが入ります。さらに小さい構成として、1個約80セントのマイコンRP2350で動く「Moonshine Micro」があり、音声区間検出・コマンド認識・音声合成をRAM約470KBで回します。
推論はCPU専用:GPU・CoreML・NNAPIを使わない理由
MoonshineはどのプラットフォームでもONNX RuntimeのCPU実行プロバイダーで動きます。オプションの ort_providers は CoreML と NNAPI を受け付けますが、配布ライブラリにはどちらも含まれず、指定するとエラーになります。公式のExecution providersによると、配布モデルはCPU向けに演算を融合した .ort 形式のため、CoreMLに渡してもグラフが細切れになり、モデル別に算出した1区画あたりの平均ノード数は、最大でも6.8でした(Piperの音声モデルは141〜220区画)。区画の境目ごとに同期が入り、かえって遅くなるという判断です。
なお現行版が読み込むのは .ort だけで、.onnx を直接渡すとエラーになります。
音声合成(TTS)と日本語の読み上げ
TTSはKokoro(8,200万パラメータ)とPiperの音声を使い(音声は初回指定時に自動でダウンロード)、声を真似るボイスクローンにはZipVoiceを使います。Text to Speechのドキュメントでは、list_tts_languages() が返す20の言語タグに ja-jp が含まれます。ただし同じページの了解度評価(合成音声をWhisper large-v3で書き起こして測るCER)では、日本語は38.1%で、PyPI版のKokoro・Piperを使う参照実装の16.8%より悪く出ています。製品に入れる前に、自分の文面で聞き比べてください。
KokoroとPiperが本来使うGPLのespeak-ngを避けるため、Moonshineは文字を発音記号に変える処理(G2P)を自前で書き直しています。公式はこのG2Pがまだ新しく言語ごとの調整が要ると説明していますが、日本語のCER差の原因を切り分けた結果は示していません。v0.1.5では、文章を受け取りながら読み上げを始める stream() が加わりました。
AgentFlowとLLMの関係
Moonshine VoiceはLLMを同梱せず、AgentFlowを通じて外部のLLMと接続します。AgentFlowは、ユーザーの発話を登録済みのフレーズと意味で照合し、該当する関数を呼ぶ仕組みです。照合には埋め込みモデルのembeddinggemma-300mを使い、「What is my IP address?」を登録すれば「Tell me your IP address」にも反応します。日本語フレーズでの照合精度は公式に示されていません。
LLMの返答を話させる場合は、手元のLLMのトークン列を say_stream() に渡します。公式サンプルには、ローカルLLMのOllamaと音声でやり取りする ollama_voice.py があります。返答が全部できる前に最初の文から読み上げが始まるので、毎秒50トークンで生成する4文の返答では、最初の音が出るまでが全生成を待つ場合の2秒強から1秒未満に縮む、と公式は説明しています。
対応プラットフォームとパッケージ
| 環境 | 入手方法 |
|---|---|
| Python | pip install moonshine-voice |
| JavaScript・ブラウザ | @moonshine-ai/moonshine-wasm |
| iOS・macOS | Swift Package(moonshine-swift) |
| Android | ai.moonshine:moonshine-voice:0.1.5 |
| Linux・Windows | ビルド済み共有ライブラリ |
| Raspberry Pi | pipパッケージ(Pi向け最適化済み) |
PyPIの0.1.5が配布するwheelは、macOSはarm64(macOS 15以降)だけです。Linuxはx86_64とaarch64、Windowsはamd64があります。Intel Macではpipで入らないため、Apple Silicon機か、Linuxのコンテナで試してください(次章の実測はこの方法で行いました)。
Whisperとの比較:精度・遅延・向き不向き
公式のMoonshine vs Whisperの表から、WERの近いモデル同士を並べます。遅延は「話し終わったと判定されてから確定テキストが返るまで」の時間で、WhisperはCPU上のfaster-whisperで測られています。
| モデル | WER | パラメータ数 | MacBook Pro | Linux x86 | Raspberry Pi 5 |
|---|---|---|---|---|---|
| Moonshine Medium Streaming | 6.65% | 2.45億 | 59ms | 269ms | 802ms |
| Whisper Large v3 | 7.44% | 15億 | 11,286ms | 16,919ms | 計測なし |
| Moonshine Small Streaming | 7.84% | 1.23億 | 38ms | 165ms | 527ms |
| Whisper Small | 8.59% | 2.44億 | 1,940ms | 3,425ms | 10,397ms |
| Moonshine Tiny Streaming | 12.00% | 3,400万 | 18ms | 69ms | 237ms |
| Whisper Tiny | 12.81% | 3,900万 | 277ms | 1,141ms | 5,863ms |
スマートフォンとタブレットでも同じ指標が公開されています。Pixel 10aではMedium Streaming 420ms・Small 234ms・Tiny 92ms、iPad(A16)では174ms・95ms・37msで、Whisper側の計測はありません。発表直後の解説記事に出回る「Medium Streaming 107ms」は、投機的デコードが入る前の旧い値です。
遅延の差が生まれる3つの設計
Whisperは入力を常に30秒の窓として扱います。5秒の発話でも残り25秒分の無音を符号化するため、短い発話ほど無駄な計算が増えます。Moonshineは入力長に応じて計算量が変わるので、この無駄がありません。この可変長の入力は、第1世代の論文Moonshine: Speech Recognition for Live Transcription and Voice Commandsで導入されました。
次にキャッシュです。話している途中で文字を表示するには、伸びていく音声を何度も認識し直す必要があります。Whisperは毎回ゼロから計算しますが、Moonshineのストリーミングモデルはエンコード済みの部分と、デコーダの状態の一部を保持して再利用します。
3つ目は、発話中に計算を前倒ししている点です。Moonshineは話し終わった時点で大半の処理を終えています。v0.1.1で入った投機的デコードにより、Medium StreamingのMacBook Proでの遅延は約103msから約74msに下がったとCHANGELOGにあります。
ベンチマーク数値の読み方
MoonshineのWERには測り方の違う3系統があります。上の表はOpen ASR Leaderboardの8データセット平均で、朗読音声のLibriSpeech test-cleanだけならMedium Streamingは2.17%まで下がります。日本語などの非英語は400クリップの抽出評価で、英語の2系統とは比べられません。配布版は8bit量子化の .ort ですが、2026年7月30日以降のモデルでは、LibriSpeech test-cleanでの量子化によるWERの増加が、再現した浮動小数点版に対し英語Mediumで0.01ポイント、Tinyで0.31ポイントに収まっています。MoonshineのMacBook Pro・Pixel 10a・iPad向けストリーミングモデルの公開遅延は3回計測の中央値で、MacのMedium Streamingは56〜83msの幅がありました。
Whisperを選ぶべき場面
公式ドキュメント自身が、スループットが重要なクラウドGPUでの大量処理ならWhisperやNVIDIAのParakeetに利があると書いています。公式のベンチマークはCPU上で1発話ずつの遅延を測る設計で、大量処理のスループットは評価の対象外です。数時間分の録音をまとめて文字起こしする用途や、1つのモデルで多言語と翻訳を処理したい用途は、Whisper系を選んだほうが素直です。Whisperの実装はWhisperをPyTorchで動かす手順、NVIDIA系の選択肢はNeMo ASRの解説記事で扱っています。
日本語モデルの精度と使いどころ
v0.1.5で日本語にSmall StreamingとTiny Streamingが加わり、"ja" を指定すると入るのはSmall Streamingになりました。以前の非ストリーミング版は非推奨扱いで、アーキテクチャを明示したときだけ読み込まれます。
| 日本語モデル | パラメータ数 | CER | 評価方法 | ライセンス |
|---|---|---|---|---|
| Small Streaming(既定) | 1.23億 | 17.2% | 400クリップ抽出 | MIT |
| Tiny Streaming | 3,400万 | 19.7% | 400クリップ抽出 | MIT |
| Base(非推奨) | 5,800万 | 13.62% | FLEURS全件 | Community |
| Tiny(非推奨) | 2,600万 | 未評価 | なし | Community |
CERはスペースを除いた文字誤り率です。Hugging FaceのSmall日本語版のカードは、パラメータ数を1.129億と記載しています(一覧表の1.23億は英語版と共通の値)。
旧Base 13.62%とSmall Streaming 17.2%の評価条件の違い
数字だけを見ると旧Baseのほうが高精度に見えますが、公式は「比較できない」と明記しています。Baseの13.62%は朗読音声FLEURSの全件評価で、Small Streamingの17.2%は朗読のFLEURSと自発話のReazonSpeechを混ぜた400クリップの評価です。
Small日本語版のモデルカードに内訳があり、FLEURS(朗読)ではCER 7.99%、ReazonSpeech(テレビ番組などの自発話)では26.31%です。これらは各評価データの文字誤り率であり、任意の朗読や会議で同じ割合になるとは限りません。CERには文字の置換だけでなく、削除と挿入も含まれます。
学習データはポッドキャスト約10万9,000時間とYouTube約5万時間で、書き起こしは人手ではなくWhisper系の教師モデルが付けた疑似ラベルです。固有名詞や数字の表記の癖は教師モデル譲りで、電話音声・子どもの声・強い方言・遠距離収音での評価はありません。短い発話では同じ語を繰り返す暴走が起きやすく、ReazonSpeechでは約0.75%の発話で発生したとカードは記載しています。
日本語の用途と判断基準
日本語で現実的なのは、発話が短く語彙が限られる用途です。家電や社内ツールの音声コマンド、ライブ字幕の下書き、ボタンの代わりの音声入力がこれに当たります。ReazonSpeechでのCERは26.31%のため、議事録や顧客対応ログには、人による確認を前提に、クラウドAPIや大型モデルを同じ業務音声で比較することを勧めます。候補の比較は文字起こしAPIの比較と選び方にまとめています。オンデバイスのまま精度を上げたいなら、日本語専用のLFM2.5-Audio-1.5B-JPも比較対象になります。
日本語で必要な設定:max_tokens_per_second と keyterms
Moonshineは同じ語を延々と繰り返す暴走を、「発話時間に対してトークンが多すぎる」ことで検出して打ち切ります。日本語はトークン化の都合で1秒あたりのトークン数が英語よりずっと多いため、既定値6.5のままでは正しい出力まで打ち切られるおそれがあります。オプション一覧は、非ラテン文字の多くの言語で max_tokens_per_second を約13.0にするよう指示しています。v0.1.5のPythonバインディングとC++コアには、言語に応じてこの値を自動で上げる処理はありません。
製品名や社内用語を認識させたいときは keyterms に語をカンマ区切りで並べ、効き具合を keyterm_boostで調整します。既定は2.0で、4.0に近づけるほど登録語が優先される代わりに周りの語の精度が落ち、4.0を超えると効かなくなる、とDomain Customizationとオプション一覧は説明しています。語のリストが無いときは、関連する文章を context に渡すと語を拾い出します。どれもストリーミングモデル専用で、非推奨の日本語Baseでは使えません。語彙ではなく話し方や収録環境が原因の誤りには、v0.1.3で加わったLoRAの再学習(moonshine-voice[finetune])が公式の選択肢です。
日本語の文字起こしを動かした結果(v0.1.5・Docker)
v0.1.5の日本語Small Streamingを、Linux x86_64向けwheelをDockerコンテナ(python:3.12-slim-bookworm、CPU 4コア割り当て、ホストはIntel Core i9-9880H)に入れて動かしました。音声はmacOS標準の日本語音声「Kyoko」で読み上げた16kHzの合成音声3本です(1.7秒の音声コマンド、7.1秒の1文、24.3秒の3文)。人の自発話ではないため誤り率は測っておらず、設定や書き方で結果が変わった点だけを載せます。
一括処理の検証結果:末尾の語の欠落と無音の追加
transcribe_without_streaming() にそのまま渡すと、「リビングの照明を消して」が「リビングの照明を」に、7.1秒の文も末尾の「します。」が欠けて返りました。max_tokens_per_second を6.5から13.0に変えても同じです。末尾に1秒の無音を足すと、どちらも文末まで正しく出ました。一方、add_audio() で0.1秒ずつ流し込んでから stop() する方式と、CLIの moonshine-voice transcribe は、無音を足さなくても「消して」まで返しました。今回確認した末尾欠落への回避策として、次章の一括処理コードには1秒の無音追加を入れています。別の録音でも欠落が解消するかは確認してください。
24.3秒の合成音声で生じた分割境界の文字重複
24.3秒の音声は、約9.6秒ごとに3行へ強制分割され、境界で「来年3月/月で終了」「3社から/社から取り寄せ」と文字が重複しました。行の長さの上限 vad_max_segment_duration(既定15秒・終わりに近づくと区切りやすくなる)を30に広げると最初の2か所は消えましたが、19.6秒の新しい境界で「取り寄れます/取り寄せ」が出ました。合成音声は息継ぎの間が短いため、VADが文の切れ目を見つけられず上限で切ったと考えられます(人の発話では試していません)。講演の録音に使う場合も、まず実音声で行の境界に重複が生じるかを確認し、発生する場合に後処理を検討してください。
keytermsの検証結果:カタカナの製品名と漢字の社名
| 設定 | 「ムーンシャインボイス」 | 「一創(いっそう)」 |
|---|---|---|
| 指定なし | ムーン社員ボイス | 一層 |
keyterms="一創,Moonshine Voice" |
ムーン社員ボイス | 一層 |
keyterms="ムーンシャインボイス,一創" |
ムーンシャインボイス | 一層 |
keyterms="ムーンシャイン" |
ムーンシャインボイス | 一層 |
keyterms="一創,Moonshine Voice"+keyterm_boost=4.0 |
ムーン社員ボイス | 一層 |
| context(語を含む1文) | ムーン社員ボイス | 一層 |
英字で渡した製品名は、モデルがカタカナで出す語には効きませんでした。モデルが実際に出す表記(ここではカタカナ)で登録すると、語の一部(「ムーンシャイン」)だけでも直りました。漢字の社名「一創」は、読みが同じ一般語の「一層」のまま、どの設定でも直りませんでした(試したのはこの1語です)。今回の「一層」を「一創」に直す用途では後処理も候補ですが、一般語としての「一層」まで置換しないよう、文脈や対象フィールドで適用範囲を限定します。
日本語Small Streamingの単語タイムスタンプ:words は空
英語では word_timestamps を有効にすると各行に単語ごとの開始・終了時刻が入ります(get_model_for_language(..., include_word_timestamps=True) で必要なデコーダも取得)。日本語のSmall Streamingで同じ設定にしたところ、行のテキストは返るものの words は空のままでした。日本語で字幕の時刻を合わせたいなら、行単位の start_time と duration を使います。
日本語Small・Tinyの処理時間と停止処理の実測
処理時間は、24.3秒の音声の一括処理がSmall Streamingで5.3秒(既定値)と5.7秒(max_tokens_per_second=13.0)、Tiny Streamingで2.5秒でした。末尾に1秒の無音を足した別の試行ではSmallが9.6秒かかっており、同じ条件を繰り返し測った値ではないので目安として見てください。流し込み方式では、stop() の呼び出し完了までが、末尾に1秒の無音を足した試行では7〜83ms、無音なしでは20〜393msでした。これは録音を待ち時間なしで流し込む検証で、実際の発話終了からの応答遅延を測った値ではありません。Tiny Streamingは「移行テスト」を「リコーテスト」と誤り、「3社から取り寄せ」を落としたため、日本語では既定のSmallを勧めます。
導入手順:Python・Raspberry Pi・モバイル
Pythonのインストールとコマンドラインでの動作確認
python -m pip install moonshine-voice==0.1.5
# 英語でマイク入力を文字起こし(Ctrl+Cで終了)
moonshine-voice mic --language en
# 日本語のWAVファイルを文字起こし
moonshine-voice transcribe --language ja --wav-path meeting.wav --options max_tokens_per_second=13.0 --quiet
# 日本語で読み上げ
moonshine-voice tts --language ja-jp --text "こんにちは"
サブコマンドは mic・transcribe・tts・agent・download・g2p・lora・finetune です。初回はモデルをダウンロードし、2回目以降はキャッシュを使ってオフラインで動きます。mic サブコマンドには --options 引数がないため、日本語をマイクで長く話す場合は、次のPythonコードで max_tokens_per_second を渡します。
Linuxの最小構成(Dockerのslimイメージなど)では、MicTranscriber と AgentFlow の読み込みが「PortAudio library not found」で失敗しました。apt-get install libportaudio2 で解消します。ファイルを処理する Transcriber と TextToSpeech はPortAudioが無くても読み込めました。
Pythonコードで日本語をリアルタイム文字起こし
from moonshine_voice import MicTranscriber
mic = (
MicTranscriber()
.language("ja") # Small Streamingが入る
.options({"max_tokens_per_second": 13.0, # 公式推奨(非ラテン文字の言語)
"keyterms": "ムーンシャインボイス"}) # モデルが出す表記で登録する
.on_text(lambda text: print("\r\033[K" + text, end="", flush=True))
.on_line(lambda line: print("\r\033[K" + line.text))
)
mic.load() # 初回はここでモデルを取得
with mic:
mic.start()
input("Enterで終了\n")
mic.stop()
on_text は認識途中の行が変わるたびに、on_line は発話の区切りごとに1回呼ばれます。録音済みのファイルを処理するなら、Transcriber を直接使います。
from moonshine_voice import Transcriber, get_model_for_language, load_wav_file
model_path, model_arch = get_model_for_language("ja")
transcriber = Transcriber(
model_path=model_path,
model_arch=model_arch,
options={"max_tokens_per_second": 13.0},
)
audio, sample_rate = load_wav_file("meeting.wav")
audio = list(audio) + [0.0] * sample_rate # 末尾に1秒の無音を足す(文末の欠落対策)
transcript = transcriber.transcribe_without_streaming(audio, sample_rate=sample_rate)
for line in transcript.lines:
print(round(line.start_time, 2), line.text)
transcriber.close()
話者分離が必要なら identify_speakers を true にします。v0.1.1以降、話者分離モデル(約8MB)はライブラリに同梱されなくなりました。MicTranscriber やCLIの --speaker-ids は初回利用時に自動でダウンロードしますが、上の例のように Transcriber を直接作る場合は、get_diarization_model() が返すパスを options の diarization_model_dir に渡します。渡さないとロードに失敗します。
Raspberry Pi 5での最小構成
USBマイクを挿し、次の2行で動きます(仮想環境を使う方法も公式サンプルのREADMEにあります)。
sudo pip install --break-system-packages moonshine-voice
moonshine-voice mic --language en
Pi 5での公開値(英語モデル)は、Small Streamingが527ms、Tiny Streamingが237msです。公式によれば、Linux x86とPi 5の列はビルド最適化の修正前に測った値で、実際より悪く出ています。200ms台を目標にするなら、使用する言語・音声・実機で遅延を確かめてください。Pi 4との性能差はRaspberry Pi 5 と Pi 4 の違いを参照してください。
iOS・Android・ブラウザへの組み込み
iOSとmacOSはXcodeでmoonshine-swiftをパッケージ依存に追加し、MicTranscriber を同じ形で呼びます。Androidは build.gradle.kts に ai.moonshine:moonshine-voice:0.1.5 を追加します。ブラウザはCDNから moonshine-wasm を読み込めば動きます。iOSだけで完結するならOS標準のSpeechAnalyzerも候補になります。
完成形を先に見たいなら、公式サイト(moonshine.ai)のブラウザデモが早道です。STT・TTS・音声エージェントに加え、口述した文章を編集してMarkdownやWordで書き出すDictationと、話者を分けて書き起こすMeeting Notesの2つのアプリがあり、どれもWebAssemblyで端末内だけで動きます。同じものがExamplesからtar.gzで入手でき、node serve.mjs で手元に立てられます。Claude CodeやCodexなどのコーディングエージェントで組むなら、READMEが案内する npx skills add moonshine-ai/moonshine --skill moonshine-voice で現行APIの書き方をエージェントに教えられます(旧名の DialogFlow やWhisperのコードを書かせないための仕組みです)。
旧版のコードが動かないときの確認点
2026年8月のv0.1.1で破壊的変更が入り、それ以前の解説記事のコードはそのままでは動きません。
DialogFlowはAgentFlowに改称されました。- モデルはONNX Runtimeのフラットバッファ形式(
.ort)だけを受け付けます。.onnxを渡すとエラーになり、変換スクリプトconvert-models-to-ort.pyが用意されています。 MicTranscriberとTextToSpeechはコンストラクタでモデルを取得しなくなりました。load()を明示的に呼びます。- モデルの配布元が
download.moonshine.aiに移りました。Hugging Faceの組織名もUsefulSensorsからmoonshine-aiに変わり、旧名のリンクは開けません。
Transformersから浮動小数点版を使う場合は、Transformers 5.x(公式の評価手順では5.13以上)が要り、日本語版は attention_mask を渡さないとスライディングウィンドウが効かないとカードが注意しています。
ライセンス:MIT化とCommunityライセンスが残るモデル
v0.1.5でライセンスが整理されました。公式のLicenseページによると、リポジトリのコード(core/third-party を除く)と、全ストリーミングモデル・英語のTinyとBaseはMITです。Moonshine AI Community Licenseが残るのは、次の旧型非英語モデルだけで、公式はこの一覧で全部だと明記しています。
| 言語 | Communityライセンスのモデル |
|---|---|
| 日本語・アラビア語・韓国語・中国語 | Base、Tiny |
| ウクライナ語・ベトナム語 | Base、Tiny |
| スペイン語 | Base |
日本語は既定のSmall Streamingを使えばMITで、商用利用に登録は要りません。ただし、配布時にはMITライセンスの著作権表示と許諾文を含める必要があります。また、v0.1.5のPythonパッケージは英語以外のモデルを取得するたびに「非商用のCommunity Licenseのモデルを使っている」という警告を出します。上のDocker検証でも、MITのSmall Streamingを読み込むたびにこの警告が表示されました。英語かどうかだけで出し分けている文言で、ストリーミングモデルはLicenseページのとおりMITです。韓国語とウクライナ語はストリーミング版がまだないため、既定のモデル自体がCommunityライセンスです。
Communityライセンスは研究・非商用なら無料です。商用は、関連会社を合わせた年間売上が100万ドル以下なら登録したうえで使えます。売上がこれを超えた時点でライセンスは終了し、エンタープライズ契約の申請が必要になります。第三者へ配布するときは「Powered by Moonshine AI」の表示などが求められます。
TTSの音声モデルとG2Pのデータは、このMITの既定の対象外です。KokoroやPiperなど元のプロジェクトのライセンスに従うので、読み上げを製品に入れるときは core/moonshine-tts/data/README.md で使う音声ごとに確認します。
Moonshine Voiceの採用を見送るべきケース
次の条件に当てはまるなら、別の選択肢を先に検討してください。
- 日本語の会議録を全文残したい:公式モデルカードのReazonSpeech評価ではCERが26.31%で、今回の24.3秒の合成音声では行の境界に文字の重複が出ました。クラウドAPIや大型モデルと、同じ業務音声で比べてから決めます。
- 社名や人名を漢字で正しく出したい:今回の検証では
keytermsで社名「一創」を直せませんでした。文脈を限定した後処理が前提になります。 - GPUサーバーで大量の音声を一括処理する:CPU専用の設計で、公式自身がスループット重視の処理ではWhisper・Parakeetに利があるとしています。
- 韓国語・ウクライナ語を商用製品に入れる:既定モデルがCommunityライセンスで、売上100万ドル超の企業は個別契約になります。
- サーバー側で多数の同時接続を処理したい:同時接続数に対するCPU負荷と遅延を測り、必要な処理能力を満たせない場合は別方式を検討します。API型のGPT-Live-Transcribeのような選択肢と運用コストを比べます。
逆に、ネット接続なしで動く音声UI、音声をクラウドへ送れない業務端末、Raspberry Piクラスの機器での音声コマンドは、Moonshineが遅延とライセンスの両面で有利な用途です。オンデバイスとクラウドのどちらで組むか、精度の要件から決めたい場合はAI音声認識システム開発で相談を受けています。TTSまで含めた方式選定は音声合成AIの作り方で扱っています。
よくある質問
Moonshine Voiceは日本語に対応していますか?
対応しています。v0.1.5から language("ja") でSmall Streaming(CER 17.2%)が入ります。公式モデルカードではFLEURSのCERが7.99%、ReazonSpeechが26.31%ですが、短い発話での精度低下も報告されているため、コマンドや字幕への採用前に対象音声で評価してください。max_tokens_per_second を13.0にする設定と、ファイル処理では末尾に無音を足すことを忘れないでください。
Moonshine VoiceでTTS(音声合成)は使えますか?
使えます。KokoroとPiperの音声を初回にダウンロードして使い、ja-jp を含む20の言語タグで読み上げられます。日本語の了解度は参照実装より低いため、事前の聞き比べを勧めます。ZipVoiceによるボイスクローンにも対応しています。TTSの音声モデルはMITの対象外で、元プロジェクトのライセンスに従います。
Moonshine Voiceのインストール方法は?
Pythonなら pip install moonshine-voice で入り、moonshine-voice mic --language en ですぐに試せます。Raspberry Piも同じpipパッケージです。macOS向けwheelはApple Silicon用だけなので、Intel MacではLinuxのコンテナで動かします。Linuxでマイクを使うには libportaudio2 が要ります。
MoonshineはGPUで高速化できますか?
できません。配布ライブラリはONNX RuntimeのCPU実行だけを含み、CoreMLやNNAPIを指定するとエラーになります。CPU向けに最適化した .ort モデルを細切れにせず動かすための判断だと公式は説明しています。GPUで大量処理をしたいならWhisper系を選びます。
Moonshine Community Licenseで商用利用できますか?
関連会社を合わせた年間売上が100万ドル以下なら、登録すれば商用利用できます。超えるとライセンスが終了し、個別契約が必要です。ただし現行の既定モデルはほとんどMITなので、日本語ならSmall StreamingかTiny Streamingを使えばこのライセンスは関係しません。