見出し画像

ローカル環境で無料文字起こし/RTX3050でも速い!faster-whisperで環境構築してみた

前回はノートパソコンとブラウザだけでPythonが使えるGoogle Colabを利用し、Whisperで文字起こしを試してみました。
ただGPUを使わない場合には処理にやや時間がかかるのが気になりました。

そこで今回は、RTX 3050(6GB)を搭載したエントリークラスのデスクトップPCを使いfaster-whisperをローカル環境に構築してみましたが、最弱クラスのGPUでも十分に実用的な速度が出すことができました。

ローカルで動かすことで処理速度の向上するだけでなく、ネット接続に依存しない点や、長時間の音声でも安定して処理できる点がメリットです。

またローカル環境で動作させることで、音声データを外部サーバーに送信する必要がなくなり、秘密保持やプライバシーの観点でもメリットがあります

この記事ではPCやPythonにあまり詳しくない方でも流れを追えるように整理したつもりですが、自分自身もPythonの素人で手探りで進めた部分が多いため、あくまで備忘録としての側面が強い内容です。
環境やバージョンの違いによっては同じ手順でうまくいかない可能性もあると思いますので、参考にされる際は自己責任でお願いいたします。




◆Pythonのダウンロード、インストール

以下のサイトから「Python 3.11.9 - April 2, 2024」を探して「Download Windows installer (64-bit)」を選択してダウンロード、インストールします。

インストール画面の最初に表示される「Add Python to PATH」にチェックを入れてる必要があるようです。
(自分がインストールした時にチェックを入れたかどうか覚えていないのですが・・・)

Pythonは複数のバージョンがありますがfaster-whisperとの相性や安定性を考えると、現時点では3.11系が無難だという情報もがありました。
そのため今回は3.11.9を使い自分の環境では問題なく動きましたが、おそらく他のバージョンでも動く可能性は高いと思います。


Pythonが正しくインストールされているか確認

インストールが終わったらコマンドプロンプトまたはPowerShellを開いて、次のコマンドを入力します。

python --version

「Python 3.11.9」と表示されれば準備完了です。




◆仮想環境を作る

いきなりライブラリをインストールすると、環境が壊れたり他のプロジェクトと競合したりすることがあるので、重要なポイントのようです。

コマンドプロンプトまたはPowerShellを開いて次のコマンドを入力します。

python -m venv whisper_env

このコマンドの意味を簡単に整理しておきます。

「python」
Python本体を実行する命令です。

「-m」
モジュールを実行するオプションでPythonに標準で入っている機能を直接呼び出すときに使います。

「venv」:
仮想環境を作るための標準モジュールです。

「whisper_env」:
作成される仮想環境の名前(フォルダ名)です。
ここは自由に変更可能なはずで、「myenv」や「test_env」などでも問題ないと思います。

つまりこの1行で「whisper_envという名前の独立したPython環境を作る」という意味になります。


■仮想環境とは?

イメージとしては「プロジェクトごとに分かれた専用のPython環境」です。

通常の環境ではPCに1つのPythonがあり全てプロジェクトが同じ環境を共有します。
そのためライブラリのバージョン違いなどで衝突が起きやすくなります。

一方、仮想環境を使うとプロジェクトごとに独立した環境が作られます。
それぞれ別々にライブラリを管理できるため、他の環境に影響を与えません。

■実際に作られるもの

「whisper_env」というフォルダが作成されその中に以下のような構成ができると思います。

Scripts:仮想環境を有効化するためのファイル(activateなど)
Lib:インストールしたライブラリが入る場所
pyvenv.cfg:仮想環境の設定ファイル


今回使うfaster-whisperやPyTorch(GPU版)は依存関係が多く環境に影響を与えやすいパッケージのようです。
仮想環境を使わないと他のプロジェクトと競合したり、最悪の場合Python自体の環境が壊れてしまって再インストールが必要になるかも知れないので、手間がかかっても仮想環境は構築しておいたほうが安全だと思います。



◆仮想環境を有効化する


×間違った手順


その後にコマンドプロンプトで以下の方法で有効化しようとしたらエラーが出てしまいました。

whisper_env\Scripts\activate

試しにPowerShellで試してみてもエラー。
(.\はcmdなら不要だけどPowerShellは必要)

.\whisper_env\Scripts\Activate
Set-ExecutionPolicy -Scope CurrentUser RemoteSignedPS C:\WINDOWS\system32>

今回の原因はシンプルで「仮想環境がある場所にいない状態でコマンドを実行していた」ことです。
たとえばPowerShellを開いた直後はこのような場所にいることがあります。

PS C:\WINDOWS\system32>

このフォルダには「whisper_env」が存在しないため当然ながら実行しようとしてもエラーになります。
存在しないフォルダを指定している状態です。


○正しい手順

まずは仮想環境を作成したフォルダに移動します。
多くの場合はユーザーフォルダ直下に作られていると思います。

cd C:\Users\OWNER

※ユーザー名によってフォルダの名前も異なりますので「OWNER」の部分は適宜変更してください。

移動できたら、次にフォルダの中身を確認します。

dir

ここで「whisper_env」が表示されれば、その場所で合っています。

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----

d-----        2026/04/21     22:57                whisper_env


仮想環境の有効化

PowerShellに次のコマンドを入力します。


.\whisper_env\Scripts\Activate

※ コマンドプロンプト(cmd)の場合は「.\ 」不要ですがPowerShellでは必要になります。

正常に有効化されると、プロンプトの先頭に環境名が表示されます。
この表示になれば、仮想環境が有効になっています。

(whisper_env) PS C:\Users\OWNER>


実行ポリシーのエラーが出る場合

PowerShellではセキュリティの関係で、スクリプトの実行が制限されていることがあります。
その場合は、以下のコマンドを一度だけ実行します。

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

これでローカルで作成したスクリプトが実行できるようになると思います



◆ライブラリのインストール


仮想環境を有効化したら続けて必要なライブラリをインストールします。

まずはGPU対応のPyTorchをインストールします。
続いて、faster-whisperをインストールします。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install faster-whisper

このとき大きなファイル(2GB以上)をダウンロードするため環境によっては数分〜30分程度かかります。

インストール中は以下の点に注意してください。
・途中でウィンドウを閉じない
・Ctrl+Cで中断しない
・PCを再起動しない

インストールが完了し「Successfully installed ... faster-whisper」などと表示されれば準備完了です。
この状態でローカル環境でfaster-whisperを動かす準備が整いました。

PS C:\Users\OWNER> .\whisper_env\Scripts\Activate
(whisper_env) PS C:\Users\OWNER> pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
Looking in indexes: https://download.pytorch.org/whl/cu121
Collecting torch
  Downloading https://download-r2.pytorch.org/whl/cu121/torch-2.5.1%2Bcu121-cp311-cp311-win_amd64.whl (2449.4 MB)


なお、自分の環境は以下の部分で一度止まりましたが、Enterキーを押したら再び走り始めました。

(whisper_env) PS C:\Users\OWNER> pip install faster-whisper




◆実行用の「.py」ファイルを作る


環境が整ったら実際に文字起こしを行うPythonファイルを作成します。

メモ帳などのテキストエディタを開いて以下のコードを貼り付けます。
用途に応じていくつかパターンを用意してみました。

・WAVファイルを文字起こしする場合(モデル:small)

from faster_whisper import WhisperModel

model = WhisperModel(
    "small",
    device="cuda",
    compute_type="float16"
)

segments, info = model.transcribe("test.wav")

for segment in segments:
    print(segment.text)

・MP3ファイルを文字起こしする場合(モデル:small)

from faster_whisper import WhisperModel

model = WhisperModel(
    "small",
    device="cuda",
    compute_type="float16"
)

segments, info = model.transcribe("test.mp3")

for segment in segments:
    print(segment.text)

・MP3ファイルを文字起こしする場合(モデル:medium)

from faster_whisper import WhisperModel

model = WhisperModel(
    "medium",
    device="cuda",
    compute_type="float16"
)

segments, info = model.transcribe("test.mp3")

for segment in segments:
    print(segment.text)

・MP3ファイルを文字起こしする場合(モデル:large-v3)

from faster_whisper import WhisperModel

model = WhisperModel(
    "large-v3",
    device="cuda",
    compute_type="int8_float16"
)

segments, info = model.transcribe("test.mp3")

for segment in segments:
    print(segment.text)

※large と large-v3 の違い
 large-v3:現在はこちらがおすすめ。日本語を含め認識精度が向上。
 large:旧世代のLargeモデル。
※compute_type="float16" と compute_type="int8_float16" の違い
 float16 → すべて半精度浮動小数点で計算(高精度・VRAM多め)
 int8_float16 → モデルの重みを8bit整数化し、一部計算をfloat16で行う(VRAM節約・少し高速)

基本的には読み込むファイル名(test.wav / test.mp3)を変えるだけでOKです。

モデルサイズは「small」のほかに「medium」「large」なども選べますが、モデルが大きいほど精度は上がりますがその分VRAM使用量と処理時間も増えます。
RTX 3050(6GB)の場合は「medium」あたりが現実的かなと思います。


保存方法

ファイル名を「test.py」として保存します。

保存場所は仮想環境を作成したフォルダにしておくと分かりやすいと思います。

C:\Users\OWNER

※「OWNER」の部分は使用しているPCのユーザー名に置き換えてください。

保存時は「ファイルの種類」を「すべてのファイル」に変更しておくのがポイントです。
これを忘れると「test.py.txt」になってしまい正しく実行できません。




◆音声ファイルの準備


文字起こししたい音声ファイルも「test.py.txt」と同じフォルダに置きます。

ファイル名はコードに合わせて「test.wav」や「test.mp3」にしておくと、そのまま動きます。



◆PowerShellで文字起こしを実行

PowerShellで先ほどのフォルダに移動したうえで次のコマンドを実行します。

(すでに以下のフォルダに移動している場合は以下の「cd C:\Users\…」は省略可)

cd C:\Users\OWNER

文字起こしを実行

python test.py

初回実行時はモデルデータのダウンロードが自動的に始まります。
モデルサイズによっては数百MB〜数GBあるため少し時間がかかります。

ダウンロードが完了すると音声の文字起こし結果がターミナル上に順番に表示されます。

もしエラーが出る場合は仮想環境が有効になっているか、ファイルの場所が合っているかを確認してみてください。
ここでつまずいているケースが多いと思います。



◆2回目以降の手順

一度環境を作ってしまえば2回目以降はシンプルです。

毎回やることはほぼ決まっています。

① 音声ファイルの準備

文字起こししたい音声ファイルを「test.py」と同じフォルダに置きます。
ファイル名は「test.py」内のコードに合わせて「test.wav」や「test.mp3」などにしておきます。

② PowerShellを開きます。

③ 次に、作業フォルダへ移動します。


cd C:\Users\OWNER

※「OWNER」は自分のユーザー名に置き換えてください。


④ 続いて仮想環境を有効化します。


.\whisper_env\Scripts\Activate

コマンドを実行すると先頭に「(whisper_env)」と表示されます。
この状態が仮想環境ONのサインです。

⑤ スクリプトを実行します。



python test.py


これで文字起こしがスタートします。

初回と違ってモデルはすでにダウンロード済みなので待ち時間はほとんどありません。すぐに処理が始まります。

もし動かない場合は「仮想環境が有効になっているか」「実行しているフォルダが合っているか」の2点を確認すると、だいたい解決できると思います。


◆複数の音声ファイルをまとめて文字起こししたい場合


上記の方法は作業フォルダ(ユーザーフォルダ)内にある「test」というファイル名の1個のファイルのみを文字起こしすることしかできません。

任意のファイル内の大量のデータを文字起こししたい場合もあると思います。

例えば「R:\Dropbox\●●●」というフォルダ内の全てもMP3データを文字起こし、一つのテキストファイルにまとめる、ただし上記フォルダ内にある「済」というフォルダ内のファイルは除外するという場合、まず「C:\Users\OWNER」内に以下の内容の「py」ファイルを作っておきます。
ファイル名・拡張子は「transcribe_all.py」などとします。
フォルダ名はは適宜置き換えてください。

# -*- coding: utf-8 -*-
r"""
R:\Dropbox\●●● 配下の MP3 を一括文字起こしして 1 つの txt にまとめる。

除外ルール:
  - パスの途中に「済」というフォルダが含まれるものは対象外
  - .mp3 以外(.mp4 等)は対象外

実行:
  cd C:\Users\OWNER
  .\whisper_env\Scripts\Activate
  python transcribe_all.py
"""

import os
import sys
import time
import traceback

# ========= 設定 =========
TARGET_DIR = r"R:\Dropbox\●●●"
OUTPUT_FILE = r"R:\Dropbox\●●.txt"
EXCLUDE_DIR_NAMES = {"済"}          # このフォルダ名以下は丸ごと除外
TARGET_EXT = ".mp3"
LANGUAGE = "ja"                      # 自動判定にしたい場合は None
MODEL_SIZE = "large-v3"
DEVICE = "cuda"
COMPUTE_TYPE = "int8_float16"
# =======================

from faster_whisper import WhisperModel


def collect_files(root):
    """除外ルールを適用して対象 MP3 を列挙"""
    found = []
    for dirpath, dirnames, filenames in os.walk(root):
        # 「済」フォルダには入らない(その配下も丸ごとスキップ)
        dirnames[:] = [d for d in dirnames if d not in EXCLUDE_DIR_NAMES]
        for name in sorted(filenames):
            if os.path.splitext(name)[1].lower() == TARGET_EXT:
                found.append(os.path.join(dirpath, name))
    return sorted(found)


def load_done_set(path):
    """途中で止まった場合の再開用: 既に書き出したファイル名を読み取る"""
    done = set()
    if os.path.exists(path):
        with open(path, "r", encoding="utf-8-sig", errors="ignore") as f:
            for line in f:
                if line.startswith("### FILE: "):
                    done.add(line[len("### FILE: "):].strip())
    return done


def fmt_sec(s):
    m, s = divmod(int(s), 60)
    h, m = divmod(m, 60)
    return f"{h:d}:{m:02d}:{s:02d}"


def main():
    if not os.path.isdir(TARGET_DIR):
        print(f"[エラー] フォルダが見つかりません: {TARGET_DIR}")
        sys.exit(1)

    files = collect_files(TARGET_DIR)
    if not files:
        print("[情報] 対象の MP3 が見つかりませんでした。")
        sys.exit(0)

    done = load_done_set(OUTPUT_FILE)
    todo = [p for p in files if os.path.basename(p) not in done]

    print(f"対象 MP3: {len(files)} 件 / 未処理: {len(todo)} 件")
    if done:
        print(f"({len(done)} 件は出力済みのためスキップします)")
    print("-" * 60)

    print(f"モデル読み込み中 ({MODEL_SIZE} / {DEVICE})...")
    try:
        model = WhisperModel(MODEL_SIZE, device=DEVICE, compute_type=COMPUTE_TYPE)
    except Exception:
        print("[警告] GPU での読み込みに失敗しました。CPU にフォールバックします(処理は遅くなります)。")
        traceback.print_exc()
        model = WhisperModel(MODEL_SIZE, device="cpu", compute_type="int8")
    print("モデル読み込み完了")
    print("-" * 60)

    t_all = time.time()
    errors = []

    # 追記モード。1 ファイル終わるごとに書き出すので途中で止めても内容は残る
    for i, path in enumerate(todo, 1):
        name = os.path.basename(path)
        rel = os.path.relpath(path, TARGET_DIR)
        print(f"[{i}/{len(todo)}] {rel} ... ", end="", flush=True)
        t0 = time.time()
        try:
            segments, info = model.transcribe(
                path,
                language=LANGUAGE,
                vad_filter=True,
                vad_parameters=dict(min_silence_duration_ms=500),
                beam_size=5,
            )
            text = "".join(seg.text for seg in segments).strip()
            dur = getattr(info, "duration", 0) or 0

            with open(OUTPUT_FILE, "a", encoding="utf-8-sig") as out:
                out.write("=" * 70 + "\n")
                out.write(f"### FILE: {name}\n")
                out.write(f"パス: {rel}\n")
                out.write(f"長さ: {fmt_sec(dur)}\n")
                out.write("=" * 70 + "\n\n")
                out.write(text + "\n\n\n")

            print(f"完了 ({time.time() - t0:.0f}秒 / 音声 {fmt_sec(dur)})")
        except Exception as e:
            print(f"失敗: {e}")
            errors.append((rel, str(e)))
            with open(OUTPUT_FILE, "a", encoding="utf-8-sig") as out:
                out.write("=" * 70 + "\n")
                out.write(f"### FILE: {name}\n")
                out.write(f"パス: {rel}\n")
                out.write("=" * 70 + "\n\n")
                out.write(f"[文字起こしに失敗しました: {e}]\n\n\n")

    print("-" * 60)
    print(f"全体所要時間: {fmt_sec(time.time() - t_all)}")
    print(f"出力先: {OUTPUT_FILE}")
    if errors:
        print(f"\n失敗 {len(errors)} 件:")
        for rel, e in errors:
            print(f"  - {rel}: {e}")


if __name__ == "__main__":
    main()

上記は無音区間をVAD(Voice Activity Detection)で除外する設定にしていますが、音量変化が極端な録音などでは、音声と認識されずに一部が落ちる可能性がありますので、その場合は

segments, info = model.transcribe(
    path,
    language=LANGUAGE,
    vad_filter=True,
    vad_parameters=dict(min_silence_duration_ms=500),
    beam_size=5,
)

の部分を以下のように書き換えます。

segments, info = model.transcribe(
    path,
    language=LANGUAGE,
    vad_filter=False,
    beam_size=5,
)

あとはWindowsのPowerShellで以下を実行します。

cd C:\Users\OWNER
.\whisper_env\Scripts\Activate
python transcribe_all.py




◆スピードと精度は?

実際に使ってみると、ノートパソコン+Google ColabでWhisperを動かしたときよりも、ローカル環境のfaster-whisperのほうが体感的に高速でした。

特にGPU(RTX 3050)を使うことで処理はリアルタイムを超えるスピードで進みます。
mediumモデルでも会話の再生時間より明らかに速く処理が終わることが多い印象です。

このあたりはColabだと環境の初期化や共有リソースの影響を受けるのに対し、ローカル環境ではGPUを専有できることが大きく効いているのかも知れません。

精度についても、実用レベルでかなり優秀です。
試しにテープに録音された古い音源をMP3化したノイズ多めの音声で試しましたが、ザラついた背景ノイズがある状態でも会話の内容をかなりの精度で拾ってくれました。
もちろん完璧ではありませんが多少のノイズや環境音があっても大きく崩れない印象です。

精度を重視する場合はモデルサイズを上げる(small → medium → large)ことで改善できますが、その分VRAM使用量と処理時間が増えるためRTX 3050(6GB)ではmediumがバランスのいいラインのような気がします。

もっと性能の高いグラフィックボードであれば largeでも問題ないかも知れません。


◆グラフィックボードを搭載したPCを持っていない場合には?

「グラボを積んだPCを持っていない」という場合は、ブラウザ上でプログラミング言語のPythonが動かせる「Google Colab(Google Colaboratory)」を使って、無料で高精度な文字起こし環境を作る方法もあります。




◆もっと簡単に「文字起こし」する方法はないの?


「PCにファイルを入れたり、PowerShellを立ち上げるのが面倒だ」と感じる人も多いと思います。

最近のスマートフォン、特にGoogle PixelやGalaxy Sシリーズ、そしてiPhoneには、会話を録音しながら高精度に文字に書き起こしてくれる機能が標準で搭載されていますので、面倒な人はそちらを活用するのも1つの手だと思います。


① Google Pixel

Pixelシリーズに搭載されている「レコーダー」アプリは、数あるスマホの中でも頭一つ抜けた性能を持っています。


  • リアルタイムの認識精度: 喋っているそばから高い精度で文字が生成されます。

  • 強力な話者識別: 「誰が何を話したか」を自動で判別してアイコン分けしてくれるため、対談やインタビューの議事録作成には最適です。

  • AIによる要約: 録音終了後に内容を短く要約してくれる機能もあり、単なる音声入力の枠を超えたツールとして完成されています。


② Galaxy Sシリーズ

最新のGalaxy Sシリーズは、独自のAI機能「Galaxy AI」の搭載によって、文字起こしの実用性が一気に向上しました。


  • 多機能な編集: 録音したデータの文字起こしはもちろん、要約や翻訳といった付加機能が非常にスムーズに動作します。

  • 利便性: リアルタイムでの安定感についてはPixelに一歩譲る面もありますが、録音後のデータ処理(後から文字起こしをする場合など)のスピードは非常に優秀です。


③ iPhone

iPhoneも標準の「メモ」アプリや「ボイスメモ」内で直接文字起こしができるようになっています。


  • 安定した変換: 誤字が少なく、日常的なメモや短いフレーズの入力には非常に使いやすいのが特徴です。

  • 今後の進化に期待: 現時点では、複雑な会議での「話者分離(誰が話したかの区別)」や、長時間の処理能力という点ではAndroid勢に一歩及ばない部分もあります。しかし、普段からiPhoneをメインに使っている方なら、まずはこの標準機能から試してみるのが一番スムーズです。

  • 日常的な音声入力や短文の文字起こしでは使いやすく、多くの人にとってはiPhoneの文字起こしでも十分かも知れません。



◆話者分離とフィラー削除(ケバ取り)

一部のスマートフォンには「話者分離(誰が話しているかを識別する機能)」が搭載されているものもありますが、Whisperなどの文字起こしツールや一般的な録音機能には識別機能がありません。
また文字起こしされたテキストには「えー」「あの」「まあ」といったフィラー(無駄な言葉)や言い直しが多く含まれ、読みにくかったりします。

こうしたテキストを整理するにはClaudeなどのAIを活用すると便利です。
以下のプロンプト(指示文)を入力することで、かなりの精度で「誰が何を言ったか」を整理し、読みやすい形式に整えることができます。

【AIへの指示文例】

提供された文字起こしテキストから、「えー」「あの」「まあ」などのフィラーや、言い直し・重複を削除(ケバ取り)してください。その上で、発言者ごとに内容を整理し、読みやすい文章に再構成してください。









いいなと思ったら応援しよう!