ローカル環境での音声文字起こし機能「Whisper」の紹介
本文の状態
日本語全文を表示中
詳細モードで約6分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
KDnuggets
OpenAI が開発した音声認識モデル「Whisper」を、インターネット接続なしでローカル環境で使用できるツールが公開されました。これにより、ユーザーはプライバシーを保護しながらオフラインでも高精度な音声からテキストへの変換が可能になります。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
音声をテキストに変換することは、開発者にとって一般的なニーズです。音声認識アプリの開発、会議の録音データの分析、動画への字幕の追加など、さまざまな場面で必要になります。ローカルで(自前のマシン上で)処理することで、プライバシーの保護とクラウド利用料の継続的発生を回避できます。
この記事では、Whisper とその最適化版である Faster-Whisper を使って、高速でローカルで動作する音声認識システムを構築する方法を学びます。MP3からWAVへの変換といった音声の前処理、Pythonスクリプトの作成、CPUとGPUの両方での実行方法についても解説します。
# Whisperとは何か? なぜローカル版を使うのか?
OpenAIのWhisper は、自動音声認識(ASR: Automatic Speech Recognition)モデルです。多数の多言語音声データで学習されており、背景ノイズや異なるアクセントがあっても高い精度を発揮します。
しかし、オリジナルのWhisperはCPU上で動作すると遅く、メモリを大量に消費します。このような課題を解決するために、最適化されたバージョンが登場します。
- whisper.cpp はC++で書かれており、重い依存関係がありません。CPU上で非常に高速ですが、コンパイルが必要であり、Pythonとの連携はやや不便です。
Faster-Whisper は CTranslate2 を使用した再実装です。オリジナルの Whisper より最大 4 倍速く動作し、メモリ使用量も少なく、Python とスムーズに連携できます。本チュートリアルでは、Faster-Whisper を使用します。
両方のバージョンは 100% ローカルで動作します。データはあなたのコンピュータから一切送信されません。
ほとんどの音声ファイルは、Raw WAV形式ではありません。圧縮形式(MP3)やコンテナ形式(M4A)が使われています。Whisperに渡す前に、それらを16 kHz、モノラル、PCM WAV形式に変換する必要があります。
以下は、pydub(内部でFFmpegを呼び出します)を使用してこの変換を行うPython関数です。
from pydub import AudioSegment
import os
def convert_to_wav(input_path, output_path=None):
"""
任意の音声ファイル(MP3、M4A、OGGなど)をWAV形式(16 kHz、モノラル)に変換します。
output_pathがNoneの場合、同じフォルダ内に拡張子を.wavに置き換えたファイル名で保存されます。
"""
if output_path is None:
base, _ = os.path.splitext(input_path)
output_path = base + ".wav"
# 音声を読み込み(pydubはffmpegを使用)
audio = AudioSegment.from_file(input_path)
# モノラルに変換し、サンプルレートを16000 Hzに設定
audio = audio.set_channels(1).set_frame_rate(16000)
# WAV形式でエクスポート
audio.export(output_path, format="wav")
return output_path
使用例:
wav_file = convert_to_wav("meeting.mp3")
print(f"Converted to: {wav_file}")
ベーシックなトランスクリプションスクリプト(faster-whisperを使用)
それでは、Whisperモデルを読み込み、WAVファイルをトランスクリプトし、結果を出力する完全なPythonスクリプトを作成しましょう。
from faster_whisper import WhisperModel
def transcribe_audio(wav_path, model_size="base", device="cpu"):
"""
Faster-Whisper を使って WAV ファイル(16 kHz モノラル)を音声認識する。
model_size: "tiny", "base", "small", "medium", "large-v2", "large-v3"
device: "cpu" または "cuda"(GPU が利用可能であれば)
"""
# モデルの初期化(初回実行時に自動でダウンロード)
model = WhisperModel(model_size, device=device, compute_type="int8")
# 音声認識の実行
segments, info = model.transcribe(wav_path, beam_size=5, language="en")
print(f"Detected language: {info.language} (probability: {info.language_probability:.2f})")
print("\nTranscription:")
for segment in segments:
print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")
# 必要に応じて全文を返す
full_text = " ".join([seg.text for seg in segments])
return full_text
例の使用方法
if __name__ == "__main__":
text = transcribe_audio("my_recording.wav", model_size="small", device="cpu")
コードの内容は以下の通りです。
- WhisperModel は、最初の実行時に選択されたモデル(例:small)を ~/.cache/huggingface/hub にダウンロードします。
- beam_size=5 は精度と速度のバランスを取るための設定です。値を高く(例:10)すると処理は遅くなりますが、精度は向上します。
- compute_type="int8" は、推論を高速化するために 8 ビット整数演算を使用します。GPU を使用する場合、"float16" を試すこともできます。
| デバイス | 速度 | 設定の複雑さ | 推奨対象 |
|---|---|---|---|
| CPU | ゆっくり(ただし 10 分未満のファイルには問題なし) | なし(インストールのみ) | 初心者、ノートPC、小規模プロジェクト |
GPU(CUDA)
3~5倍の高速化
NVIDIAドライバ、cuBLAS、cuDNNが必要
長時間のファイル、バッチ音声認識
GPUを使用するには、コード内で device="cuda" に変更します。Faster-Whisperは、正しくインストールされていればCUDAを自動で検出します。
ヒント:CPUでも、Faster-WhisperはオリジナルのWhisperよりもはるかに高速です。10分間のMP3ファイルの場合、最新のCPUでベースモデルを使用すると、およそ2分で処理できます。
MP3をトランスクリプトに変換する:完全な例
以下は、任意の音声ファイルをWAV形式に変換し、その後トランスクリプト化する完全なスクリプトです。
import os
from pydub import AudioSegment
from faster_whisper import WhisperModel
def convert_to_wav(input_path):
"""任意の音声ファイルを16kHz単音声WAV形式に変換する。"""
audio = AudioSegment.from_file(input_path)
audio = audio.set_channels(1).set_frame_rate(16000)
wav_path = os.path.splitext(input_path)[0] + ".wav"
audio.export(wav_path, format="wav")
return wav_path
def transcribe_file(audio_path, model_size="base", device="cpu"):
# ステップ1:すでにWAV形式でない場合は変換
if not audio_path.lower().endswith(".wav"):
print(f"Converting {audio_path} to WAV...")
audio_path = convert_to_wav(audio_path)
# ステップ2:トランスクリプト化
print(f"Loading model '{model_size}' on {device.upper()}...")
model = WhisperModel(model_size, device=device, compute_type="int8")
segments, info = model.transcribe(audio_path, beam_size=5)
翻訳全文
print(f"\nLanguage: {info.language} (prob: {info.language_probability:.2f})")
print("\nTranscript:")
for seg in segments:
print(seg.text, end=" ", flush=True)
print() # final newline
if __name__ == "__main__":
# Example: transcribe an MP3 file
transcribe_file("interview.mp3", model_size="small", device="cpu")
Save this as transcribe.py and run:
python transcribe.py
The script will download the model once, convert the file, and output the transcript.
# Conclusion
You now have a local, fast, and privacy-friendly audio transcription system. Some key takeaways:
- Faster-Whisper gives you near-real-time transcription on a CPU and excellent speed on a GPU.
- Always pre-process audio to 16 kHz mono WAV using pydub and FFmpeg.
- The model_size parameter trades accuracy for speed — start with "base" or "small".
- Running locally means no API keys, no data sharing, and no monthly fees.
Try different Whisper model sizes for better accuracy. Add speaker diarisation (identifying who spoke when) using libraries like pyannote.audio. Build a simple web interface with Gradio or Streamlit**.
Shittu Olumide はソフトウェアエンジニアであり、テクニカルライターとしても活躍している。彼は先進技術を活用して魅力的な物語を創り出すことに情熱を注ぎ、細部への配慮と複雑な概念をわかりやすく伝える才能を持つ。Shittu は Twitter でも活動している。
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み