Moonshineを使った完全ローカル・高速音声入力ツールの作り方

2026.03.27

ローカルで動く超高速・高精度な音声認識AI「Moonshine」を使って、思考のスピードでテキストを自動入力するツールのセットアップガイドです。

CursorやVS Codeなどでの音声コーディング(バイブコーディング)はもちろん、チャットツールやドキュメント作成など、「文字が打てるあらゆるアプリケーション」で即座に活用できます。

動作確認はWindows11で行いました。(Macでは動作確認していません。)

構成概要と特長

  • 使用AIモデルUsefulSensors/moonshine-base-ja(日本語特化の高精度モデル)
  • バックエンド: Hugging Face transformers + PyTorch
  • クロスプラットフォーム対応: Windows環境(Ctrl+V)とMac環境(Cmd+V)を自動で判別し、適切なペースト操作を実行します。
  • 仕組み:
    • 指定のショートカットキー(デフォルト: Ctrl + Shift + Space)で録音の開始・停止をトグル。
    • マイク音量を自動で最大に引き上げ(正規化)、無音やノイズ落ちを防止。
    • Moonshineで爆速文字起こしを行い、クリップボード経由で現在アクティブなウィンドウにペースト(自動入力)。

確実な環境構築手順(依存関係の罠を避ける)

最新のPython(3.13など)を使うと、PyTorchやTokenizersのコンパイルで確実にエラー(Rustの要求など)が発生します。必ずPython 3.11(または3.12)の仮想環境を使用してください。

Windowsの場合、インストール時に Add python.exe to PATH にチェックを入れてください。

ターミナル(Windowsの場合はPowerShell、Macの場合はターミナル.app)を開き、以下の手順を実行します。

① 仮想環境の作成と有効化

【Windows の場合】

py -3.11 -m venv moonshine_env
.\moonshine_env\Scripts\activate

【Mac の場合】

python3.11 -m venv moonshine_env
source moonshine_env/bin/activate

Windowsでエラーになった場合

Windowsの初期設定では、悪意のあるスクリプトが勝手に実行されないよう、実行ポリシーが Restricted(すべてのスクリプト実行を禁止)に設定されている場合が多いからです。仮想環境の有効化スクリプト(activate.ps1)を動かすには、ローカルで作られたスクリプトの実行を許可する設定に変更する必要があります。

以下の手順で設定を変更してください。

  • 管理者としてPowerShellを開く
  • スタートメニューで「PowerShell」を検索し、右クリックして「管理者として実行」を選択します。
  • ポリシーの状態を確認する
Get-ExecutionPolicy

※ここで Restricted と表示されたら、以下のコマンドで変更が必要です。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  • 実行時に確認メッセージが出たら、Y(はい)を入力してEnterを押します。
  • 再度、仮想環境を有効化する
  • 元のターミナル(または新しく開いたターミナル)に戻り、再度コマンドを実行してください。
.\moonshine_env\Scripts\activate

② 必要なライブラリを一括インストール

環境が有効化された状態(プロンプトの左端に (moonshine_env) と表示されている状態)で、以下を実行します。

pip install torch transformers sounddevice numpy pyautogui pynput pyperclip

スクリプト (moonshine_bridge.py)

AIの標準規格である transformers で直接モデルを駆動させるコードです。以下のコードを moonshine_bridge.py として保存してください。

import os
import queue
import numpy as np
import sounddevice as sd
import pyautogui
import pyperclip
import time
import platform
from pynput import keyboard

# PyTorchのフリーズ対策(特にWindows環境向け)
os.environ["OMP_NUM_THREADS"] = "1" 

import torch
from transformers import MoonshineForConditionalGeneration, AutoProcessor

# --- 設定 ---
SAMPLE_RATE = 16000
CHANNELS = 1
BLOCK_SIZE = 8000
# Macユーザーで Cmd+Shift+Space にしたい場合は '<cmd>+<shift>+<space>' に変更可能
HOTKEY = '<ctrl>+<shift>+<space>'
MODEL_NAME = "UsefulSensors/moonshine-base-ja" # 精度重視の日本語モデル

is_recording = False
audio_buffer = []
task_queue = queue.Queue()

def audio_callback(indata, frames, time_info, status):
    global is_recording, audio_buffer
    if is_recording:
        audio_buffer.append(indata.copy().flatten())

def toggle_recording():
    global is_recording, audio_buffer
    if not is_recording:
        print("\n🔴 録音を開始しました... (話し終わったら再度ショートカットキーを押してください)")
        audio_buffer = []
        is_recording = True
    else:
        is_recording = False
        if audio_buffer:
            full_audio = np.concatenate(audio_buffer)
            
            # 【自動ブースト】どんな声の大きさでも最大音量(1.0)に正規化
            max_vol = np.max(np.abs(full_audio))
            if max_vol > 0:
                full_audio = full_audio / max_vol
            
            # 0.5秒未満の誤作動(ショートカットキーの連打等)を防止
            if len(full_audio) > SAMPLE_RATE * 0.5:
                print("\n⏹ 録音を停止しました。日本語モデルで文字起こしを実行中...")
                task_queue.put(full_audio)
            else:
                print("\n⏹ 録音時間が短すぎました。キャンセルします。")
        else:
            print("\n⏹ 音声データが取得できませんでした。")

def main():
    print(f"日本語モデル ({MODEL_NAME}) を準備中...")
    
    processor = AutoProcessor.from_pretrained(MODEL_NAME)
    model = MoonshineForConditionalGeneration.from_pretrained(MODEL_NAME)
    
    device = "cuda:0" if torch.cuda.is_available() else ("mps" if torch.backends.mps.is_available() else "cpu")
    model.to(device)
    print(f"\n✅ ロード完了(使用デバイス: {device})。ショートカットキー [{HOTKEY}] で録音を操作できます。")

    os_name = platform.system()
    stream = sd.InputStream(samplerate=SAMPLE_RATE, channels=CHANNELS, callback=audio_callback, blocksize=BLOCK_SIZE)
    stream.start()

    hotkey_listener = keyboard.GlobalHotKeys({HOTKEY: toggle_recording})
    hotkey_listener.start()

    try:
        while True:
            try:
                # Ctrl+Cで安全に終了できるよう、0.5秒のタイムアウトを設けて待機
                audio_data = task_queue.get(timeout=0.5)
            except queue.Empty:
                continue
            
            # 推論処理(メインスレッドで実行)
            try:
                inputs = processor(audio_data, sampling_rate=SAMPLE_RATE, return_tensors="pt").to(device)
                with torch.no_grad():
                    generated_ids = model.generate(**inputs)
                text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
            except Exception as e:
                print(f"音声認識エラー: {e}")
                text = ""
            
            if text and text.strip():
                print(f"📝 認識結果: {text}")
                
                # クリップボード経由でアクティブウィンドウに自動入力
                pyperclip.copy(text)
                time.sleep(0.1) # UI反応待ち
                
                # OSに合わせてペーストのショートカットキーを自動切り替え
                if os_name == "Darwin": # Macの場合
                    pyautogui.hotkey('command', 'v')
                else: # Windows / Linuxの場合
                    pyautogui.hotkey('ctrl', 'v')
                
                print("✨ 対象アプリへの入力が完了しました。次の指示を待機しています。\n")
            else:
                print("⚠️ 音声を文字に変換できませんでした。\n")
                
    except KeyboardInterrupt:
        print("\nスクリプトを終了します。")
        stream.stop()
        stream.close()

if __name__ == "__main__":
    main()

moonshine_bridge.pyを保存したディレクトリに移動して実行

python moonshine_bridge.py

初回起動のみデータをダウンロードするため、起動までしばらくかかります。

起動後は入力したい箇所にカーソルを移動して、ctrl+shift+space を押すと録音が開始され、もう一度 ctrl+shift+space を押すと、録音された音声データが文字起こしされてカーソルの部分に表示されます。

私は5年以上前のPC(Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz)を利用していますが、それなりのスピードで話した言葉が文字として表示されます。

マイクに向かってはっきり話すと、それなりの精度で文字起こしされます。

一発起動ファイル(.bat)を作る

毎回コマンドプロンプトを開いて、仮想環境を有効化して…という手順を踏むのは面倒なのでバッチファイルを作成します。

  1. moonshine_bridge.py が保存されているのと同じフォルダを開きます。
  2. フォルダ内の何もないところで右クリックし、「新規作成」>「テキスト ドキュメント」を選びます。
  3. ファイル名を start_moonshine.bat に変更します。(※ .txt が消えて .bat になるようにしてください。「拡張子を変更すると…」という警告が出たら「はい」を押します)
  4. 作成した start_moonshine.bat を右クリックして「メモ帳で編集(またはプログラムから開く > メモ帳)」を選び、以下のコードを貼り付けて保存します。
@echo off
echo Moonshine 音声入力ツールを起動しています...
cd /d "%~dp0"
call .\moonshine_env_311\Scripts\activate
python moonshine_bridge.py
pause

作成した start_moonshine.bat を右クリックからショートカットを作成します。

  1. ショートカットを右クリックし、「プロパティ」を開きます。
  2. 「ショートカット」タブの中にある「実行時の大きさ」という項目を見つけます。
  3. デフォルトの「通常のウィンドウ」から「最小化」に変更して、「OK」を押します。

以上で完成です。ぜひ試してみてください。


🏢 株式会社ハジメクリエイトについて

この記事は、 株式会社ハジメクリエイト のエンジニアが執筆しました。


💻 Webシステム開発のプロフェッショナル

私たちは、ビジネスの成長をサポートするため、 PHPを用いたオーダーメイドのシステム開発 を提供しています。
お客様一人ひとりのニーズに応じたカスタムシステムを、 企画から開発・運用まで一貫してサポート
さらに、 React Nativeを活用したiOS/Android対応のアプリ開発 も得意としています。

単に「作る」だけでなく、
課題の本質に向き合い、最適な解決策を提案する のがハジメクリエイトのスタイルです。


🧑‍💻 一緒に働く仲間を探しています!

株式会社ハジメクリエイトでは、 自ら考え行動できるエンジニア を募集しています。
「私はこれがしたい!」という想いを持つあなた、一緒にモノづくりを楽しみませんか?

  • 技術で人の役に立ちたい
  • 意見が通る小さなチームで働きたい
  • フロントエンドもバックエンドも、いろいろ挑戦してみたい
  • お客さんと一緒にプロジェクトを育てたい

そんな気持ちがある方なら、きっと居心地のいい環境だと思います。
正社員はもちろん、パートタイムでの参加も歓迎中! 柔軟な関わり方で、あなたらしく働いてください。

👉 採用情報を見る
👉 お問い合わせはこちら


ちょっとでも「この会社、気になるな」と思ったら、ぜひお気軽にご連絡ください📩
最後まで読んでいただきありがとうございました!

  • Web技術
  • ソフト

この記事を書いた人

キューロ小坂

シニアエンジニア キューロ小坂

PhpStormのAIコード補間に「そうそう、今からそのコードを書こうと思ってたんよ。おまえ賢いな~。」とつぶやきながらコードを書いているプログラマーです。

キューロ小坂の書いた記事一覧へ

ハジメクリエイトでは一緒に働く仲間を募集しています!

関連記事