AI

音声認識比較:Whisper.cpp vs Faster-Whisper vs MMS でローカル文字起こしを実現する

オープンソースラボ編集部2026年6月14日

音声認識比較:Whisper.cpp vs Faster-Whisper vs MMS でローカル文字起こしを実現する

会議録・動画の字幕生成・音声コマンド認識において、**ローカルで高精度に動作するOSS音声認識(STT)**が必要です。Whisper.cpp(C++・CPUで高速)・Faster-Whisper(CTranslate2・GPU最適化)・MMS(Meta製・1100言語対応)の3つがOSSローカル音声認識のデファクトスタンダードです。

ローカルOSS音声認識を選ぶ理由

  • コスト: OpenAI Whisper API($0.006/分)→1000時間/月 = $360→ローカル実行で$0
  • プライバシー: 機密会議・医療音声・法廷録音を外部サーバーに送信しない
  • レイテンシ: ネットワーク通信なしでリアルタイム・バッチ処理を実現
  • オフライン: ネット接続なしで工場・病院・航空機内でも動作

主要ツールの概要

Whisper.cpp

2022年公開(ggerganov)、C++製のOSSです。GitHubスター38k+。OpenAIのWhisperモデルをC++で再実装してCPUで高速動作させるツールです。GGML量子化モデル(Q4・Q5・Q8)でRaspberry Piでも動作し、macOS・Windows・Linux・Androidをサポートします。

# Whisper.cpp のビルドとインストール
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp
make -j4

# Core ML 対応(macOS Apple Silicon 高速化)
make -j4 WHISPER_COREML=1

# モデルをダウンロード(large-v3が最高精度)
bash ./models/download-ggml-model.sh large-v3
bash ./models/download-ggml-model.sh small    # 軽量版
bash ./models/download-ggml-model.sh base.en  # 英語専用最小

# 音声ファイルの文字起こし(日本語)
./main -m models/ggml-large-v3.bin   -f meeting.wav   -l ja   -osrt meeting.srt   --output-json-full   --word-timestamps true

# リアルタイム文字起こし(マイク入力)
./stream -m models/ggml-base.bin -l ja --step 3000 --length 10000

# 字幕生成(SRT・VTT形式)
./main -m models/ggml-large-v3.bin   -f video_audio.wav   -l ja   -osrt -ovtt   --max-len 50   --split-on-word
# Python バインディング (whispercpp) でAPIから呼び出す
from whispercpp import Whisper
import numpy as np
import soundfile as sf

# モデルを読み込む
w = Whisper.from_pretrained('large-v3', basedir='./models')

# 音声ファイルを読み込んでNumPy配列に変換
audio, sample_rate = sf.read('meeting.wav', dtype='float32')
if sample_rate != 16000:
    import librosa
    audio = librosa.resample(audio, orig_sr=sample_rate, target_sr=16000)

# 文字起こし実行
result = w.transcribe(audio)
text = w.extract_text(result)
print(text)

# セグメント(タイムスタンプ付き)を取得
segments = w.extract_segments(result)
for seg in segments:
    print(f'[{seg.t0/100:.1f}s - {seg.t1/100:.1f}s] {seg.text}')

Faster-Whisper

2023年公開、Python製のOSSです。GitHubスター15k+。CTranslate2(量子化・最適化推論エンジン)を使ってWhisperを4倍高速化したライブラリです。NVIDIA GPU(CUDA)とCPUの両方をサポートし、動詞認識精度を維持しながらWhisper.cppより柔軟なPython APIを提供します。

# Faster-Whisper: バッチ文字起こし + 話者分離
from faster_whisper import WhisperModel
import time

# モデルをロード(GPU使用: device='cuda', CPU使用: device='cpu')
model = WhisperModel(
    'large-v3',
    device='cuda',         # または 'cpu'
    compute_type='float16', # GPU: float16, CPU: int8
    num_workers=4,
    cpu_threads=8,
)

def transcribe_audio(audio_path: str, language: str = 'ja') -> dict:
    start_time = time.time()

    segments, info = model.transcribe(
        audio_path,
        language=language,
        beam_size=5,
        vad_filter=True,          # 無音区間を自動スキップ(VAD)
        vad_parameters={'min_silence_duration_ms': 500},
        word_timestamps=True,
        condition_on_previous_text=False,  # 長時間音声での誤り蓄積を防止
    )

    transcript = []
    full_text = []

    for segment in segments:
        segment_data = {
            'start': round(segment.start, 2),
            'end': round(segment.end, 2),
            'text': segment.text.strip(),
            'words': [
                {'word': w.word, 'start': round(w.start, 2), 'end': round(w.end, 2), 'probability': round(w.probability, 3)}
                for w in (segment.words or [])
            ],
        }
        transcript.append(segment_data)
        full_text.append(segment.text.strip())

    elapsed = time.time() - start_time
    audio_duration = info.duration

    return {
        'language': info.language,
        'language_probability': round(info.language_probability, 3),
        'duration': audio_duration,
        'processing_time': round(elapsed, 2),
        'real_time_factor': round(elapsed / audio_duration, 2),
        'transcript': transcript,
        'full_text': ' '.join(full_text),
    }

# FastAPI エンドポイントとして提供
from fastapi import FastAPI, UploadFile, File
import tempfile
import os

app = FastAPI()

@app.post('/transcribe')
async def transcribe_endpoint(file: UploadFile = File(...), language: str = 'ja'):
    with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as tmp:
        tmp.write(await file.read())
        tmp_path = tmp.name

    try:
        result = transcribe_audio(tmp_path, language=language)
        return result
    finally:
        os.unlink(tmp_path)

MMS (Massively Multilingual Speech)

2023年公開(Meta AI)、Python製のOSSです。GitHubスター(transformers統合)。1100以上の言語をサポートするMeta AIの音声認識モデルで、少数言語・方言の認識に強みがあります。HuggingFace Transformersから直接使えます。

# MMS: HuggingFace Transformersで少数言語を認識
from transformers import pipeline
import torch

# MMS-300M モデルをロード(1100言語対応)
asr = pipeline(
    'automatic-speech-recognition',
    model='facebook/mms-300m',
    device=0 if torch.cuda.is_available() else -1,
)

# 音声ファイルを文字起こし(言語コードを指定)
result = asr(
    'audio.wav',
    generate_kwargs={'language': 'jpn'},  # ISO 639-3コード
)
print(result['text'])

# 言語自動検出(MMS-LID: 1162言語分類)
from transformers import Wav2Vec2ForSequenceClassification, AutoFeatureExtractor
import librosa

lid_model = Wav2Vec2ForSequenceClassification.from_pretrained('facebook/mms-lid-1024')
lid_processor = AutoFeatureExtractor.from_pretrained('facebook/mms-lid-1024')

audio, sr = librosa.load('unknown_language.wav', sr=16000)
inputs = lid_processor(audio, sampling_rate=16000, return_tensors='pt')
with torch.no_grad():
    logits = lid_model(**inputs).logits
predicted_id = torch.argmax(logits, dim=-1).item()
detected_lang = lid_model.config.id2label[predicted_id]
print(f'検出言語: {detected_lang}')

機能比較表

比較項目Whisper.cppFaster-WhisperMMS
CPU最適化✅ 最強
GPU最適化
対応言語数99言語99言語1100言語
Python API✅(HF)
リアルタイム

音声認識はLLM Toolsカテゴリ/categories/llm-toolsのClaude API・GPT-4oと組み合わせて「音声文字起こし→LLMで要約・アクションアイテム抽出」のパイプラインを構築します。DevOpsカテゴリ/categories/devopsのAirflow・n8nで「会議録音ファイルをS3に保存→Faster-Whisperで文字起こし→Claudeで議事録→Notionに保存」を全自動化できます。

FAQ

Q. Whisper.cppとFaster-Whisperのどちらを選べばいいですか?

A. CPUのみのサーバー・組み込みデバイス・C++統合ならWhisper.cppNVIDIA GPU・Python環境・高精度VADが必要ならFaster-Whisperが向いています。速度目安(1時間の音声を文字起こし): Whisper.cpp(large-v3・M2 Mac)→約4分、Faster-Whisper(large-v3・A100 GPU)→約45秒、Faster-Whisper(large-v3・RTX 3090)→約90秒、Faster-Whisper(large-v3・CPU int8)→約15分。日本語精度: large-v3モデルでWER(Word Error Rate)3〜8%(音声品質に大きく依存)。

Q. リアルタイム文字起こし(ストリーミング)を実装するには?

A. Whisper.cppのstreamコマンドまたはFaster-Whisperのチャンク処理で実装できます。Whisper.cpp stream: ./stream -m models/ggml-base.bin -l ja --step 3000 --length 10000(3秒ごとに文字起こし)。Python(Faster-Whisper)でのストリーミング実装: PyAudioでマイク入力をバッファリング→3〜5秒ごとにFaster-Whisperでバッチ文字起こし→WebSocketでフロントエンドに送信。注意: Whisperはリアルタイム専用設計ではなく短いチャンクで精度が低下するため、実用的には最低2〜3秒のバッファが必要です。真のリアルタイムSTT(レイテンシ<500ms)にはWhisperより軽量なモデル(Silero VAD + conformer系)が適しています。

Q. 話者分離(話者ダイアリゼーション)を追加するには?

A. pyannote.audio(OSS・HuggingFace)とFaster-Whisperを組み合わせます。①pip install pyannote.audio②HuggingFaceトークンでpyannote/speaker-diarization-3.1をダウンロード③pyannoteで話者区間を検出(話者A: 0〜30s、話者B: 30〜65s)④Faster-Whisperで各区間の文字起こしを実行⑤話者ラベルと文字起こしを結合して「話者A: テキスト」形式で出力。whisperx(OSS): Faster-Whisper + pyannoteの統合パッケージでwhisperx meeting.wav --diarize --hf_token YOUR_HF_TOKENのように1コマンドで話者分離付き文字起こしが実行できます。

Q. Faster-WhisperをDockerで本番運用するには?

A. NVIDIA Docker Runtimeを使ったGPUコンテナで本番運用します。Dockerfile: FROM nvidia/cuda:12.3.1-cudnn9-runtime-ubuntu22.04をベースにpip install faster-whisper fastapi uvicornをインストール。docker-compose.yml: deploy: resources: reservations: devices: [{capabilities: [gpu]}]でGPUを割り当て。モデルの永続化: volumes: - ./models:/app/modelsでコンテナ再起動時もモデルの再ダウンロードを防止。スケーリング: 複数GPUを持つ場合はCUDA_VISIBLE_DEVICES環境変数でGPUを分割してFastAPIワーカーを複数起動します。

まとめ

ユースケース推奨ツール
CPU専用・組み込み・リアルタイムWhisper.cpp
GPU・Python・高速バッチ処理Faster-Whisper
1100言語・少数言語・方言MMS

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。