SSD Nodes Learn Hosting plans →
ガイド Matt Connor著者 Matt Connor

VPSでWhisperとPiperを自ホストする方法

GPUなしのVPSでfaster-whisperとPiperを動かす方法を解説します。CPU時間やディスク容量の実測値、OpenAI互換HTTPエンドポイントの公開方法を確認できます。

セルフホスト型の音声認識とTTSの概要

セルフホスト型の音声認識とTTS(音声合成)は、自分で管理するサーバー上で実行できるAIの中でも、最も低コストなものです。音声の文字起こしには、faster-whisperランタイム経由でWhisperを使用します。音声合成にはPiperを使用します。どちらもGPUなしで、一般的なCPU VPS上で動作します。小型のWhisperモデルに必要なディスク容量は約484 MBです。Piperの音声はONNXモデルと小さなJSON設定ファイルの2つで構成され、合計容量は150 MBを大幅に下回ります。

そのため、音声処理から始めるのが適しています。セルフホスト型の画像生成とセルフホスト型の動画生成は、実用にするにはまずGPUが必要です。音声処理にはGPUは必要ありません。

このガイドでは、音声認識と音声合成の両方、および両者を接続する層を扱います。Whisperは音声をテキストに変換します。Piperはテキストを音声に変換します。両方の前段にOpenAI互換のHTTPサーバーを置くと、既存のクライアントはbase URLを変更するだけで、使用するサーバーを切り替えられます。

ここでコマンドに固定している各バージョンは、2026年10月11日に各プロジェクトのリリースページで確認済みです。障害対応の項目で示すCTranslate2のバージョンは、互換性を示す目印であり、現在のリリースではありません。

faster-whisper を選び、リファレンス版 Whisper パッケージを選ばない理由

OpenAI の whisper パッケージは、PyTorch 上でモデルを実行します。faster-whisper は、Transformer モデル専用に作られた推論エンジンである CTranslate2 上で、同じモデルの重みを実行します。重みは同一なので、文字起こし結果も同じです。違いは完全にランタイムにあります。

CTranslate2 は重みの読み込み時に量子化します。そのため、compute_type="int8" は個別の変換手順ではなく、1 つの引数です。また、PyTorch への依存もありません。pip install faster-whisper は CTranslate2、tokenizer、音声デコード用の PyAV を取得するため、仮想環境の容量は数 GB ではなく数百 MB に収まります。ディスク容量が 40 GB の VPS では、この差によって余裕のある構成になるか、容量が逼迫するかが決まります。

以下は、プロジェクトが small モデルについて公開している CPU 上の実測値です。このベンチマークでは、Intel Core i7-12700K の 8 スレッドを使って 13 分間の音声を文字起こししています。x_realtime 列は、13 分を実測時間で割った値です。7.6 なら、13 分の録音が 1 分 40 秒強で完了したことを示します。

グラフWhisper small on CPU, 13 minutes of audio (published project figures)
このグラフのデータ
[
  {
    "label": "openai/whisper, fp32",
    "x_realtime": 1.9,
    "seconds": 418,
    "memory_mb": "2,335"
  },
  {
    "label": "whisper.cpp, fp32",
    "x_realtime": 6.2,
    "seconds": 125,
    "memory_mb": "1,049"
  },
  {
    "label": "faster-whisper, fp32",
    "x_realtime": 5.0,
    "seconds": 157,
    "memory_mb": "2,257"
  },
  {
    "label": "faster-whisper, int8",
    "x_realtime": 7.6,
    "seconds": 102,
    "memory_mb": "1,477"
  },
  {
    "label": "faster-whisper, int8, batch 8",
    "x_realtime": 15.3,
    "seconds": 51,
    "memory_mb": "3,608"
  }
]

2 行目をそのまま確認してください。この CPU では、fp32 の whisper.cpp は faster-whisper より高速です。速度は 6.2x 対 5.0x で、メモリ使用量も半分未満です。これは、ローカル LLM スタックで llama.cpp が担う部分と同じ ggml 系です。int8 とバッチ処理を有効にすると faster-whisper が上回り、速度は 15.3x に達します。その代わり、3,608 MB の RAM を使用します。したがって、Python API とバッチ処理を重視する場合は faster-whisper を選び、RAM が制約で変更できない場合は whisper.cpp を選んでください。

1 行目がこのセクションの要点です。同じマシンでリファレンス版パッケージはリアルタイムの 1.9x です。つまり、1 時間の音声の処理に CPU で 30 分かかります。

Whisper のモデルウェイトにはどの程度のディスク容量が必要ですか?

グラフfaster-whisper model weights on disk (Systran CTranslate2 conversions, float16)
このグラフのデータ
[
  {
    "label": "tiny",
    "weights_mb": 75.5
  },
  {
    "label": "base",
    "weights_mb": 145
  },
  {
    "label": "small",
    "weights_mb": 484
  },
  {
    "label": "medium",
    "weights_mb": "1,530"
  },
  {
    "label": "large-v3",
    "weights_mb": "3,090"
  }
]

これらは公開されている CTranslate2 変換済みモデルで、float16 形式です。compute_type="int8" が行わないことにも注意してください。ダウンロードサイズは小さくなりません。ウェイトは float16 でダウンロードされ、CTranslate2 はロード時にメモリ上で量子化します。そのため、large-v3 は float16 で実行しても int8 で実行しても、ディスク上では 3,090 MB を使用します。int8 で削減できるのは RAM 使用量と処理時間であり、ディスク使用量ではありません。

モデルは初回使用時に ~/.cache/huggingface/hub へダウンロードされます。ルートボリュームが小さい VPS では、download_root 引数または HF_HOME 環境変数を使って、十分な空き容量のある場所を指定してください。そうしないと、初回実行時にディスクが満杯になり、ダウンロード途中でプロセスが終了します。

システムの Python を壊さずに faster-whisper をインストールする

Ubuntu 24.04 と Debian 13 では、システムの Python が外部管理対象として指定されています。仮想環境の外で pip install faster-whisper を実行すると、次のメッセージを表示して直ちに停止します。

error: externally-managed-environment

これは、パッケージ管理システムが apt の所有するファイルを保護しているためです。仮想環境を使用してください。

sudo apt update
sudo apt install -y python3-venv ffmpeg
python3 -m venv ~/stt
~/stt/bin/pip install --upgrade pip
~/stt/bin/pip install faster-whisper==1.2.1

Version 1.2.1 が現在のリリースで、2025 年 10 月に公開されました。faster-whisper は PyAV 経由で音声をデコードします。PyAV には独自の ffmpeg ライブラリが含まれているため、別途 ffmpeg バイナリを用意しなくても mp3 または m4a を読み込めます。上記の ffmpeg パッケージは、このガイドの後半で動画処理に使用します。

3 gigabytes のモデルウェイトをダウンロードする前に、インストールを確認します。

~/stt/bin/python -c "from faster_whisper import WhisperModel; print('ok')"

ok と表示されれば、wheel のインストールは完了しています。ImportError が ctranslate2 と表示される場合は、ランタイムが不足しているか、コンパイル済みライブラリを読み込めません。メッセージの残りに原因が示されます。32-bit ARM イメージには CTranslate2 の wheel が存在しないため、代わりに pip がインストール時点で失敗します。

会議の録音またはボイスメモを文字起こしする

これを transcribe.py として保存します。

from faster_whisper import WhisperModel

model = WhisperModel("small", device="cpu", compute_type="int8", cpu_threads=4)
segments, info = model.transcribe("meeting.m4a", beam_size=5, vad_filter=True)

print("language: %s (%.2f)" % (info.language, info.language_probability))
for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

~/stt/bin/python transcribe.py で実行します。初回の実行ではモデルの重みをダウンロードするため、しばらく出力がありません。その後は、モデルが数秒でキャッシュから読み込まれます。

segments は generator です。そのため、反復処理を開始するまで文字起こしは始まりません。transcribe() の呼び出しにかかる時間を測定し、すぐに戻るため壊れていると考える人がいます。壊れているわけではありません。処理はループ内で実行されます。

vad_filter=True は最初に Silero VAD(音声活動検出)を実行し、Whisper に渡す前に無音部分を除外します。長い無音区間がある会議録音では、これが利用できる最大の単独の高速化要因です。Whisper は発話を含まない音声の処理に時間をまったく使わなくなるためです。また、無音に対して単語を探そうとして Whisper が生成する同じ文の繰り返しループも抑制します。

cpu_threads には、実際に使用できるコア数を設定します。vCPU 数を超える値を設定すると、同じコアを余分なスレッドが奪い合い、スケジューラーがコンテキストスイッチのたびに処理を行うため、文字起こしが遅くなります。

Jellyfin ライブラリ用の字幕

Jellyfin は、動画の隣にあり、動画と同じ名前を持つ外部字幕ファイルを読み込みます。そのため、Movie (2019).en.srt の隣に Movie (2019).mkv を置くと、ライブラリを再構築しなくても英語トラックとして表示されます。クライアントがその字幕を直接再生するか、サーバーが動画を remux するか、動画に焼き込むかは、そのクライアントの対応状況によって決まります。

まず音声を抽出します。Whisper は内部ですべての音声を 16 kHz のモノラルにリサンプリングします。そのため、最初から 16 kHz のモノラル音声を渡せば、両方の処理で不要な作業を減らせます。

ffmpeg -i "Movie (2019).mkv" -vn -ac 1 -ar 16000 -c:a pcm_s16le "Movie (2019).wav"

faster-whisper には SRT 出力機能がないため、セグメントを自分で整形します。これを srt.py として保存します。

import sys
from faster_whisper import WhisperModel

def ts(seconds):
    ms = int(round(seconds * 1000))
    hours, ms = divmod(ms, 3600000)
    minutes, ms = divmod(ms, 60000)
    secs, ms = divmod(ms, 1000)
    return "%02d:%02d:%02d,%03d" % (hours, minutes, secs, ms)

model = WhisperModel("small", device="cpu", compute_type="int8")
segments, info = model.transcribe(sys.argv[1], vad_filter=True)

with open(sys.argv[2], "w", encoding="utf-8") as out:
    for index, segment in enumerate(segments, start=1):
        out.write("%d\n" % index)
        out.write("%s --> %s\n" % (ts(segment.start), ts(segment.end)))
        out.write("%s\n\n" % segment.text.strip())

次に、ライブラリを処理します。

for f in /srv/media/films/*.mkv; do
  ffmpeg -nostdin -y -i "$f" -vn -ac 1 -ar 16000 -c:a pcm_s16le "${f%.mkv}.wav"
  nice -n 15 ~/stt/bin/python srt.py "${f%.mkv}.wav" "${f%.mkv}.en.srt"
  rm -f "${f%.mkv}.wav"
done

-nostdin は装飾ではありません。これがないと、ffmpeg がループの標準入力から読み込み、残りのファイル一覧を消費します。その結果、エラーメッセージを出さずに最初の 1 本でループが停止します。

開始前に必要な時間を見積もってください。上記の 7.6x という速度では、100 分の動画に CPU で約 13 分かかります。そのため、50 本のライブラリを処理するには一晩かかります。共有 vCPU プランではさらに遅くなります。これが nice の用途です。字幕処理は一時停止し、サーバー上で実行される他の処理に CPU を譲ります。

Piper による音声合成

Piper は、CPU 上で ONNX 音声モデルを実行するニューラル音声合成エンジンです。espeak-ng を組み込んでテキストを音素へ変換するため、別の音素化ツールをインストールする必要はありません。現在のリリースは 1.8.0 で、2026 年 9 月に公開されました。

python3 -m venv ~/tts
~/tts/bin/pip install piper-tts==1.8.0
~/tts/bin/python -m piper.download_voices en_US-lessac-medium
~/tts/bin/python -m piper -m en_US-lessac-medium -f test.wav -- 'This is a test.'

download_voices は、作業ディレクトリに 2 つのファイルを書き込みます。1 つは .onnx の重みで、もう 1 つはサンプルレートと話者一覧を保持する .onnx.json の設定ファイルです。これらは同じ場所に置いてください。音声ファイルを固定の場所に置く場合は、両方のコマンドに --data-dir を渡してください。そうしないと、プレーヤーは作業ディレクトリを検索するため、そこにない音声を見つけられません。

テキストの前に付ける -- も重要です。これがないと、ハイフンで始まる文がコマンドラインオプションとして解析されます。

音声には複数の品質レベルがあります。英語の medium 音声は約 60 MB で、high 音声はおよそ 2 倍です。品質が高いほどモデルが大きくなり、音声 1 秒あたりに必要な CPU も増えます。話者が変わるわけではありません。

CLI をループ内で呼び出さないでください。呼び出すたびにモデルを読み込み、短い文ではモデルの読み込みが処理時間の大半を占めます。代わりに HTTP サーバーを実行します。

~/tts/bin/pip install 'piper-tts[http]==1.8.0'
~/tts/bin/python -m piper.http_server -m en_US-lessac-medium --host 127.0.0.1 --port 5000
curl -X POST -H 'Content-Type: application/json' \
  -d '{ "text": "This is a test." }' \
  -o test.wav localhost:5000/synthesize

再生できる test.wav が返れば、動作しています。このエンドポイントは Piper 独自の形式であり、OpenAI の形式ではありません。そのため、/v1/audio/speech を想定するクライアントは接続できません。次のセクションで対応します。

閉じるターミナルではなく、unit ファイルを使って実行し続けてください。この unit は、ログインできない piper ユーザーとして、同ユーザーのホームディレクトリから Piper を実行します。そのため、サービスが自分のアカウントに依存しません。ユーザーを作成し、そのユーザーで Piper と音声をインストールします。

sudo useradd --system --create-home --home-dir /home/piper --shell /usr/sbin/nologin piper
sudo -u piper python3 -m venv /home/piper/tts
sudo -u piper /home/piper/tts/bin/pip install 'piper-tts[http]==1.8.0'
sudo -u piper /home/piper/tts/bin/python -m piper.download_voices --data-dir /home/piper/voices en_US-lessac-medium

ターミナルで起動したサーバーを停止してから、unit を作成します。

[Unit]
Description=Piper text to speech HTTP server
After=network-online.target

[Service]
User=piper
ExecStart=/home/piper/tts/bin/python -m piper.http_server -m en_US-lessac-medium --data-dir /home/piper/voices --host 127.0.0.1 --port 5000
Restart=on-failure

[Install]
WantedBy=multi-user.target

sudo systemctl enable --now piper によりサーバーが起動し、再起動後も再び起動します。上記の curl が何も返さない場合、journalctl -u piper -n 50 に理由が記録されています。通常は音声ファイルが見つからないことが原因です。

OpenAI互換サーバーの構成

音声を扱うソフトウェアの多くは、すでに OpenAI audio API に対応しています。ファイルには /v1/audio/transcriptions への multipart POST、文章には /v1/audio/speech への JSON POST を使用します。この2つのパスを自分で提供すれば、クライアント側の変更はベース URL だけです。

Speaches は、音声認識と音声合成の両方向に対応するサーバーです。OpenAI のパスの背後で、音声認識には faster-whisper、音声合成には Piper または Kokoro を使用します。2025年12月時点の現行リリースは v0.9.0-rc.3 で、まだ 1.0 未満です。そのため、イメージタグを固定し、アップグレード前にリリースノートを確認してください。

curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.yaml
curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.cpu.yaml
export COMPOSE_FILE=compose.cpu.yaml
docker compose up --detach

compose ファイルを管理したくない場合は、単一コンテナで実行できます。

docker run --rm --detach --publish 8000:8000 --name speaches \
  --volume hf-hub-cache:/home/ubuntu/.cache/huggingface/hub \
  ghcr.io/speaches-ai/speaches:latest-cpu

名前付きボリュームが省略されやすい部分です。これがないとモデルキャッシュがコンテナ内に保存されるため、再起動のたびに数 GB の重みを再ダウンロードするまで、最初のリクエストに応答できません。

音声合成を使用するには、/v1/audio/speech が応答する前に音声をダウンロードしておく必要があります。

uvx speaches-cli model download speaches-ai/Kokoro-82M-v1.0-ONNX

その後は、ベース URL を変更するだけで、任意の OpenAI クライアントを使用できます。

from pathlib import Path
from openai import OpenAI

openai = OpenAI(base_url="http://localhost:8000/v1", api_key="cant-be-empty")
res = openai.audio.speech.create(
    model="speaches-ai/Kokoro-82M-v1.0-ONNX",
    voice="af_heart",
    input="Hello, world!",
    response_format="mp3",
    speed=1,
)
with Path("output.mp3").open("wb") as f:
    f.write(res.response.read())

api_key のプレースホルダーは必須です。OpenAI クライアントライブラリは、これがないとリクエストを送信しないためです。実際のキーを設定するまでは、サーバーはその値を無視します。

vox-box も、ここで挙げる価値のあるプロジェクトです。コンテナではなく Python パッケージで、Whisper、FunASR、Bark、Dia、CosyVoice を使用して同じパスを提供します。2025年12月時点の現行バージョンは 0.0.21 で、Python 3.10 以降が必要です。

python3 -m venv ~/voice
~/voice/bin/pip install vox-box==0.0.21
~/voice/bin/vox-box start --huggingface-repo-id Systran/faster-whisper-small \
  --data-dir ~/voice/data --host 127.0.0.1 --port 8010

このプロジェクトのサンプルは port 80 に bind します。そのため root または CAP_NET_BIND_SERVICE capability が必要です。他の処理も行うサーバーでは、reverse proxy の背後で high port を使用する構成が適しています。vox-box start は1つのモデルしか受け取らないため、両方向に対応するには、speech repo id を指定した2つ目のインスタンスを別の port で起動します。

サーバーが読み込んだモデルを確認し、その id を model field に指定します。

curl http://127.0.0.1:8010/v1/models
curl http://127.0.0.1:8010/v1/audio/transcriptions \
  -H "Content-Type: multipart/form-data" \
  -F file="@voice-note.m4a" \
  -F model="faster-whisper-small"

{"text": "..."} の形式の JSON body が正常に処理されれば、パス全体が機能しています。モデル名で 404 が返る場合は、/v1/models の出力を確認せずに推測したことが原因です。

これらのサーバーはいずれも、デフォルトでは認証を有効にしません。127.0.0.1 に bind し、VPN 経由、または credentials を要求する reverse proxy 経由でアクセスしてください。public IP 上で /v1/audio/transcriptions を公開すると、見つけた者に CPU を無償提供することになります。公開されていれば、必ず見つかります。

セルフホスト型アシスタントの音声フロントエンド

両方向が OpenAI パスで応答できるようになれば、チャットフロントエンドから両方を操作できます。Open WebUI とその代替製品は、設定で音声用の OpenAI 互換 base URL を指定できます。そのため、1 台の環境で Ollama でローカル LLM を実行し、音声の入出力を両端でつなげられます。

3 つの処理は同じ CPU コア上で順番に実行されるため、遅延は現実的に見積もってください。10 秒間の質問は、上記の 7.6x という速度で、文字起こしだけで約 1.3 秒かかります。この時点では、モデルはまだ 1 トークンも読み取っていません。CPU でのトークン生成を加えると、往復に時間がかかり、テスターがクラッシュしたと判断するほど遅くなります。CPU でのバッチ文字起こしには十分な速度です。しかし、会話には向きません。その段階で、GPU 搭載 VPSが価格に見合うようになります。

GPU は実際にどのような場合に導入する価値がありますか?

グラフWhisper large-v2 on an RTX 3070 Ti, 13 minutes of audio (published project figures)
このグラフのデータ
[
  {
    "label": "openai/whisper, fp16",
    "x_realtime": 5.5,
    "seconds": 143,
    "memory_mb": "4,708"
  },
  {
    "label": "faster-whisper, fp16",
    "x_realtime": 12.4,
    "seconds": 63,
    "memory_mb": "4,525"
  },
  {
    "label": "faster-whisper, int8",
    "x_realtime": 13.2,
    "seconds": 59,
    "memory_mb": "2,926"
  },
  {
    "label": "faster-whisper, int8, batch 8",
    "x_realtime": 48.8,
    "seconds": 16,
    "memory_mb": "4,500"
  }
]

GPU では、large モデルが int8 で 13.2 倍のリアルタイム速度で動作し、2,926 MB の VRAM に収まります。バッチ処理にすると 48.8 倍まで高速化します。2 つのグラフが示していない点に注意してください。使用しているモデルが異なります。GPU の行は large-v2、CPU の行は small です。GPU によって small モデルが 6 倍高速になるわけではありません。精度の高いモデルを実用的に使えるようになります。

これらの数値の出典

どちらのグラフも、faster-whisper README に掲載されたベンチマークを再掲しています。音声には 13 分の単一ファイルを使用しています。CPU の行では Intel Core i7-12700K の 8 スレッドを使用し、GPU の行では 8 GB の VRAM を搭載した NVIDIA RTX 3070 Ti で CUDA 12.4 を使用しています。秒数とメモリの列は、公開されている数値です。x_realtime 列は、これらの数値を基に計算した値です。音声 780 秒を実測時間で割り、小数第 1 位に丸めています。メモリ列は、CPU のグラフではシステム RAM、GPU のグラフでは VRAM を示します。

共有 vCPU プランでは、CPU の数値には到達しません。このベンチマークでは、高速なデスクトップ向け CPU の 8 スレッドを専有しています。7.6 倍を上限の目安とし、実際の録音を使って time で自分のサーバーを測定してから、計画を立ててください。

実運用で役立つ 4 つの目安を示します。

  • 自分の録音をたまに文字起こしする場合: CPU、small、int8。専用 vCPU 2 基で十分です。
  • 字幕作成など、夜間にバッチ処理する場合: CPU、small または medium、int8、nice で実行します。
  • 対話的な処理や、ライブラリ全体を一晩で処理する場合: GPU。
  • Piper: 常に CPU を使用します。この規模の音声モデルでは、GPU による性能向上はほとんどありません。

同じハードウェアでほかに何を動かせるか検討している場合は、自己ホストできる AI モデルの種類という、より広い問題で、適合するモデルと適合しないモデルのサイズを確認できます。

エラーの種類と表示される文字列

error: externally-managed-environment がインストール時に発生する場合。ディストリビューションによってシステムの Python が保護されています。前述の手順で仮想環境を作成してください。

GPU ホストで cuDNN のバージョンが一致しない場合。 エラーは次のように表示されます。

Unable to load any of {libcudnn_ops.so.9.1.0, libcudnn_ops.so.9.1, libcudnn_ops.so.9, libcudnn_ops.so}
Invalid handle. Cannot load symbol cudnnCreateTensorDescriptor

CTranslate2 4.5.0 では、CUDA 12 用ビルドが cuDNN 9 に移行しましたが、ホストには cuDNN 8 がインストールされています。cuDNN 9 をインストールするか、pip install --force-reinstall ctranslate2==4.4.0 で古いランタイムを固定してください。どちらか一方だけを実行します。両方を実行すると、元の状態に戻ります。

This CTranslate2 package was not compiled with CUDA support は、似た症状を示す別の問題です。インストールされた wheel が CPU 専用ビルドです。GPU ホスト上で仮想環境を作り直し、pip に wheel を再選択させてください。

トランスクリプトで同じフレーズが繰り返される場合。 1 つの文が 10 回繰り返される場合、ほぼ常に無音または音楽が音声としてデコードされています。まず vad_filter=True を有効にしてください。それでも解消しない場合は、その区間を再生して確認します。ほぼ無音の音声では Whisper が判定の手掛かりを得られず、直前の確信度が高い推測を繰り返します。

検出された言語が正しくない場合。 faster-whisper はデフォルトで、最初の 30 秒間のウィンドウだけを使って推測します。info.language_probability が 1.0 を大きく下回る場合は、判定に確信がありません。録音の冒頭に音楽や複数話者の音声があると、この状態になりやすくなります。言語が分かっている場合は language="en" を指定してください。判定前に調べるウィンドウ数を増やすには language_detection_segments を大きくします。

プロセスが Killed を出力して停止する場合。 これはカーネルの out-of-memory killer による停止です。dmesg に対応する oom-kill の行が表示されます。large-v3 は、作業用メモリを使う前の重みだけで 3 GB を超えるメモリを必要とします。2 GB の VPS では、int8 の small が収まる最大のモデルです。

Piper が音声を見つけられない場合。 --data-dir を指定しない限り、プレーヤーは作業ディレクトリを検索します。想定しているディレクトリに対して ls を実行し、.onnx と .onnx.json の両方が存在することを確認してください。一方だけでは、どちらもない場合と同様に失敗します。

FAQ

CPU のみの VPS で音声をテキストに変換できますか?

はい。バッチ処理では現実的な選択肢です。int8 の small モデルで faster-whisper を使用すると、プロジェクトが公開しているベンチマークでは、デスクトップ向け i7 の 8 スレッドで 13 分の音声を 102 秒で文字起こしします。これはリアルタイムの約 7.6 倍で、使用する RAM は 1,477 MB です。共有 vCPU プランではこれより遅くなるため、自分の環境で測定してください。Piper による音声合成はさらに簡単で、どのような場合でも GPU は必要ありません。

使用する Whisper モデルのサイズを選ぶにはどうすればよいですか?

まずは int8 の small から始めてください。ディスク上のサイズは 484 MB で、明瞭に録音された音声を適切に処理できます。アクセントや背景ノイズによるエラーを許容できない場合は medium に上げてください。精度を他のすべてより優先する場合に限り large-v3 を使用します。large-v3 には 3,090 MB のディスク容量と 3 GB 超のメモリが必要です。逆に、75.5 MB の tiny は、言語検出やパイプラインのテストには便利ですが、人が読む文字起こしには適しません。

faster-whisper はなぜ元の Whisper パッケージより高速なのですか?

モデルは同じです。ランタイムが異なります。リファレンスパッケージは PyTorch で Whisper を実行します。一方、faster-whisper は同じ重みを CTranslate2 上で実行します。CTranslate2 は transformer 推論向けに構築されたエンジンで、ロード時に重みを量子化し、PyTorch のインストールを必要としません。公開されている CPU ベンチマークでは、int8 の faster-whisper がリアルタイムの 7.6 倍であるのに対し、リファレンスパッケージは 1.9 倍です。faster-whisper のほうが使用するメモリも少なくなります。

文字起こしが同じ文を何度も繰り返すのはなぜですか?

Whisper が無音や音楽を音声としてデコードし、直前の確信度の高い推測にフォールバックしている可能性があります。vad_filter=True を transcribe() の呼び出しで設定してください。この呼び出しでは、先に Silero の音声活動検出を実行し、モデルに渡す前に無音部分を除去します。それでも繰り返す場合は、音声レベルを確認してください。録音全体がほぼ無音だと、モデルが処理できる情報がありません。

自分のサーバーで OpenAI 互換の音声エンドポイントを用意するにはどうすればよいですか?

POST /v1/audio/transcriptions と POST /v1/audio/speech を実装するサーバーを実行し、新しいベース URL を指定してクライアントから接続してください。Speaches は選択肢の 1 つです。CPU ビルドを含むコンテナイメージとして公開されており、文字起こしには faster-whisper、音声合成には Piper または Kokoro を使用します。vox-box も別の選択肢です。pip install vox-box でインストールし、vox-box start --huggingface-repo-id で起動します。プロセスごとに 1 つのモデルを提供します。どちらもデフォルトでは認証が有効にならないため、localhost に bind し、前段にプロキシまたは VPN を配置してください。

#whisper#tts#piper#speech-to-text#self-hosted-ai