oss

【Mac対応】完全オフラインで使える無料文字起こしアプリ「Local Whisper」を開発した話

Macで無料&オフラインで使える文字起こしアプリを探していませんか?

  • Web会議の相手の声も文字起こししたい
  • サブスク料金は払いたくない
  • データをクラウドに送信したくない
  • 完全ローカルで安全に使いたい

この記事では、**Mac上で完全オフライン動作する無料文字起こしアプリ「Local Whisper」**を開発したので、その仕組み・技術構成・リアルタイム化の工夫を解説します。


Local Whisperとは?

Local Whisperの画面例

Local Whisperは、Local 環境で Whisper(OpenAIが開発したSpeech To Textモデル)を動かすことから名づけました。Windows環境でも動かすことはできますが、CoreMLを使用できるMacOSの方が高速に動かすことができます。

特徴

  • ✅ 完全オフライン動作(データ外部送信なし)
  • ✅ サブスク不要・無料
  • ✅ マイク音声+システム音声対応
  • ✅ Web会議の相手の声も文字起こし可能
  • ✅ Whisperベースで高精度

GitHub: https://github.com/y-dai20/local-whisper


なぜMacでオフライン文字起こしアプリを作ったのか

世の中には文字起こしアプリがたくさんあります。

しかし多くは:

  • 月額課金(サブスク)
  • クラウド送信必須
  • Web会議ではBot参加が必要

正直、そこまで頻繁に使うわけでもないのに毎月課金するのは微妙。

また、音声データを外部に送ることに抵抗がある人も多いはず。

そこで、

ローカルで完結し、OSSベースで中身が分かる文字起こしアプリ

を作ることにしました。


Macで高速に動かす:whisper.cpp + CoreML

完全オフラインで高精度を実現するために採用したのが whisper.cpp です。

使用モデル

  • Whisper large-v3-turbo
  • Q5_0量子化
  • CoreML最適化(Apple Silicon)

AppleのNeural Engineを利用することで、

約7秒の音声を1秒程度で文字起こし

できました。

Mac(Mシリーズ)環境であれば、十分リアルタイム運用可能です。


リアルタイム文字起こしを実現する工夫(Silero VAD + audio_ctx最適化)

そのままWhisperに長時間音声を渡すと、推論時間が蓄積し、徐々に遅延が大きくなってしまいます。

そこで、以下の2つを中心に最適化しました。


1. Silero VADによる無音区間の削除

まず、Silero VAD(Voice Activity Detection) を使って無音区間を事前に除去しています。

Whisperは無音部分もそのまま処理してしまうため、

  • 無駄なEncoder処理が発生する
  • レイテンシが蓄積する
  • リアルタイム性が落ちる

という問題があります。

そこで、

  • 音声を小さなチャンクに分割
  • Silero VADで発話区間のみ抽出
  • 無音部分はWhisperに渡さない

という構成にしました。

さらに、1秒以上の無音が続いた場合はセッションを終了し、 次の発話を新しいセッションとして扱うようにしています。

これだけでも、体感レベルで遅延はかなり改善します。


2. audio_ctxの削減でEncoder時間を半減

Whisperは推論時間のほとんどをEncoder部分が占めています。

デフォルトでは audio_ctx = 1500(約30秒相当)になっていますが、 リアルタイム用途ではそこまでのコンテキストは不要です。

そこで、

audio_ctx: 1500 → 750

に削減しました。

これにより、

  • Encoder処理時間が約1000ms → 約500msに短縮
  • レイテンシが半減
  • リアルタイムにかなり近づく

という結果になりました。

リアルタイム文字起こしでは、

「少し長いコンテキスト」よりも「低遅延」の方が重要

なので、このトレードオフは非常に有効でした。


この2つの最適化によって、 Mac(Apple Silicon)上でもリアルタイムに近い低遅延文字起こしが実現できています。


Macでシステム音声を取得する方法(ScreenCaptureKit)

Macで一番難しかったのがシステム音声の取得

通常は仮想オーディオデバイス(BlackHoleなど)を使いますが、 配布アプリとしては扱いづらい。

そこで採用したのが:

  • Apple公式 ScreenCaptureKit
  • Swift実装
  • Rust(Tauri)からブリッジ呼び出し

この構成で、

  • マイク音声
  • Web会議の相手の声(システム音声)
  • 画面録画

を同時取得できるようになりました。

結果的に、文字起こし付きWeb会議ツールのような状態になっています。


他の文字起こしアプリとの違い

比較項目Local Whisper一般的なクラウド型
オフライン動作
サブスク不要
データ外部送信なしあり
Web会議相手音声
OSSベース

技術構成

  • 音声認識:whisper.cpp
  • モデル:large-v3-turbo(Q5_0)
  • 高速化:CoreML
  • VAD:Silero VAD
  • UI:Tauri(Rust + Web)
  • システム音声取得:ScreenCaptureKit(Swift)

ElectronではなくTauriを選択した理由:

  • 軽量
  • Rustで実装可能
  • ビルドが高速

開発期間

約3日。

Claude + Codexを活用し、POCを高速実装。

AIアシストによるプロトタイピングのスピードはかなり強力でした。


今後の予定

  • ローカルLLMと連携し、要約機能を追加
  • リアルタイム翻訳
  • 文字起こし+翻訳の同時表示

完全ローカルで「会議しながら即翻訳」が目標。


まとめ:Macで無料&オフライン文字起こしは実現できる

現在の環境(Apple Silicon + whisper.cpp)なら、

サブスク不要・完全ローカルで実用的な文字起こしアプリは作れる

セキュリティ重視の方や、 コストを抑えたい方には特におすすめです。


ダウンロード・リポジトリ

GitHub: https://github.com/y-dai20/local-whisper

デモ動画も公開しています。