ローカル音声認識 Whisper NAS 導入: より高速な Whisper 音訳チュートリアル

Whisper 音声認識を NAS 上でローカルに展開するための実践的なチュートリアル: より高速な Whisper を使用して音声とビデオを文字起こしし、tiny/base/small/medium モデルを選択し、TXT/SRT を出力し、VAD フィルタリング、CPU/GPU compute_type を構成し、バッチ文字起こしとプライバシー境界を処理します。

Whisper を NAS に導入するための最も適切なシナリオは、「リアルタイムの会議字幕」を追求するのではなく、ホーム ビデオ、インタビュー、コース録画、ポッドキャスト、会議ファイルをプライベート ディレクトリに置き、トランスクリプトと SRT 字幕をオンデマンドまたはバッチで生成することです。

ほとんどの NAS では、faster-whisper から始めることをお勧めします。 CTranslate2 推論エンジンを使用し、CPU または CUDA GPU を使用でき、量子化、VAD 無音フィルタリング、およびワードレベルのタイムスタンプをサポートします。まず小さなモデルを使用してプロセスを実行し、次に精度と待ち時間に基づいてモデルをアップグレードするかどうかを決定します。

まず結論から話しましょう

NAS ローカル音声認識への最も安全なルートは次のとおりです。

1
2
3
4
5
6
准备输入 / 输出目录
-> 安装 ffmpeg 与 faster-whisper
-> 用短音频跑 small 或 base
-> 检查 TXT 和 SRT
-> 开启 VAD 过滤
-> 再做批量任务、GPU 加速或 Docker 封装

個別のグラフィックスを持たない NAS も転写できますが、オフライン タスクとして扱う必要があります。長いビデオを頻繁に文字起こししたり、複数の人物を録画したり、より高速な応答を追求したりする場合、通常は、単純にハード ドライブの容量を増やすよりも GPU の役割がより明確になります。

モデルの選び方

Whisper にはさまざまなサイズのモデルがあります。一般に、モデルが大きいほど、アクセント、ノイズ、複雑なコンテキストの処理に優れていますが、推論が遅くなり、メモリ要件が高くなります。

モデル NASに関するご提案 シーンに合わせて
tiny / base テストプロセス、低電力NAS クリアな短い音声、素早いプレビュー
small ほとんどの家庭用 NAS の出発点 一般的な中国語カンファレンス、コース、ビデオ字幕
medium 通常、CPU NAS は低速で​​す。 GPU がある場合はもう一度試してください ノイズや専門用語が多い音声
large-v3 / turbo 十分なビデオ メモリを備えた GPU ホストにより適しています 高品質のオフライン文字起こし、長時間音声のバッチ処理

モデル名だけで効果を判断しないでください。録音の明瞭さ、スピーカーの重なり、BGM、マイクの距離、固有名詞は、small からより大きなモデルに移行するよりも、最終的なトランスクリプトに大きな影響を与えることがよくあります。

ディレクトリ計画: 個別の入力、出力、およびモデル キャッシュ

Linux NAS を例に挙げます。

1
2
3
mkdir -p ~/asr/inbox
mkdir -p ~/asr/out
mkdir -p ~/asr/models

提案される合意:

1
2
3
~/asr/inbox/   放 MP3、M4A、WAV、MP4 等输入文件
~/asr/out/     放 TXT、SRT、JSON 等结果
~/asr/models/  放下载的模型缓存

バッチ タスクは、同じディレクトリ内に入力、出力、モデル キャッシュが混在することを最も恐れます。分離後のバックアップ、クリーンアップ、権限管理が容易になります。

設置環境

Debian/Ubuntu のような NAS または Linux コンテナーに、まず基本ツールをインストールします。

1
2
sudo apt update
sudo apt install -y python3 python3-venv ffmpeg

独立した仮想環境を作成します。

1
2
3
4
python3 -m venv ~/asr/.venv
source ~/asr/.venv/bin/activate
pip install --upgrade pip
pip install faster-whisper

ffmpeg は、一般的なオーディオおよびビデオ形式を読み取るために使用されます。これがないと、MP4、M4A、または一部のエンコード形式がトランスコードされなかったり、正しく読み取れなかったりする可能性があります。

最小限の音訳スクリプト

~/asr/transcribe.py に次のコードを記述します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from pathlib import Path
from faster_whisper import WhisperModel

input_file = Path("/home/USER/asr/inbox/sample.mp3")
output_dir = Path("/home/USER/asr/out")
output_dir.mkdir(parents=True, exist_ok=True)

model = WhisperModel(
    "small",
    device="cpu",
    compute_type="int8",
    download_root="/home/USER/asr/models",
)

segments, info = model.transcribe(
    str(input_file),
    language="zh",
    vad_filter=True,
    word_timestamps=True,
)

segments = list(segments)

lines = []
for segment in segments:
    text = segment.text.strip()
    lines.append(text)
    print(f"[{segment.start:.2f} -> {segment.end:.2f}] {text}")

(output_dir / f"{input_file.stem}.txt").write_text(
    "\n".join(lines), encoding="utf-8"
)

コード内の /home/USER を実際の Linux ユーザー ディレクトリに変更し、次を実行します。

1
2
source ~/asr/.venv/bin/activate
python ~/asr/transcribe.py

初めて実行するとき、faster-wisper は対応するモデルをダウンロードします。モデルが正常にダウンロードされると、指定した download_root に保存されるため、今後再度ダウンロードする必要はありません。

CPU NASの推奨パラメータ

GPU がない場合は、モデル サイズと計算精度の制御が優先されます。

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cpu",
    compute_type="int8",
    download_root="/home/USER/asr/models",
)

int8 は、多くの場合、CPU 推論の開始点として適しています。 NAS がファイル同期、写真のインデックス作成、ダウンロード、またはメディア サービスも提供する場合は、次のことをお勧めします。

  • base または small から始めます。
  • 複数の文字起こしタスクを同時に実行しないでください。
  • 長いビデオはオフピーク時間にスケジュールされます。
  • システムメモリ、CPU 温度、スワップを観察します。
  • NAS が大量のトランスコーディング、検証、およびトランスコーディングを同時に実行できないようにします。

CPU NAS の目標は、オーディオ再生の進行状況をリアルタイムで追いつくことではなく、「安定した完了」であるべきです。

NVIDIA GPUがある場合の設定方法

NAS または Linux ホストで NVIDIA GPU を利用できる場合は、次のことを試してください。

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cuda",
    compute_type="float16",
    download_root="/home/USER/asr/models",
)

メモリが不足している場合は、次のことを試すことができます。

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cuda",
    compute_type="int8_float16",
    download_root="/home/USER/asr/models",
)

実際に利用可能な compute_type は、CTranslate2、CUDA、ドライバー、および GPU によって異なります。最初に短い音声で確認してから、長いファイルを処理します。これを Docker に配置する場合は、まずコンテナーが GPU を認識できることを確認する必要があります。 nvidia-smi がコンテナーで使用できない場合、トランスクライバーは CUDA アクセラレーションを受け取りません。

VAD フィルタリングをオンにすることが推奨される理由

VAD (音声アクティビティ検出) は、明らかに音声のないセグメントをスキップします。会議の録音、長い一時停止、バックグラウンド ミュージック、または録音の最初と最後に多くの空白スペースがあるファイルの場合、通常、次の 2 つの利点があります。

  • 無意味な推論時間を削減します。
  • 無音セグメントが無関係なテキストとして認識される確率を減らします。

高速ウィスパーで有効化:

1
2
3
4
segments, info = model.transcribe(
    "input.mp3",
    vad_filter=True,
)

ただし、VAD は「絶対に失敗しない」スイッチではありません。声が非常に小さい場合、音楽と人間の声が混在している場合、または電話の録音が断続的である場合は、VAD が有効なコンテンツを誤って遮断していないかどうかをランダムに確認する必要があります。

SRT 字幕の生成

Whisper の各セグメントには開始時間と終了時間があります。上記のスクリプトに基づいて単純な SRT を出力できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def srt_time(seconds: float) -> str:
    milliseconds = round(seconds * 1000)
    hours, milliseconds = divmod(milliseconds, 3_600_000)
    minutes, milliseconds = divmod(milliseconds, 60_000)
    seconds, milliseconds = divmod(milliseconds, 1000)
    return f"{hours:02}:{minutes:02}:{seconds:02},{milliseconds:03}"

blocks = []
for index, segment in enumerate(segments, start=1):
    blocks.append(
        f"{index}\n"
        f"{srt_time(segment.start)} --> {srt_time(segment.end)}\n"
        f"{segment.text.strip()}\n"
    )

(output_dir / f"{input_file.stem}.srt").write_text(
    "\n".join(blocks), encoding="utf-8"
)

単語ごとの強調表示やより詳細な編集を行う場合は、word_timestamps=True の後の単語レベルのタイムスタンプを読み取ることができます。ただし、単語レベルの結果、特に中国語と英語が混在しているもの、人名、場所、略語などは手動によるスポットチェックも必要です。

完全なバッチ転送を一度に実行しないでください

バッチ ファイルをシリアルに処理するか、キューごとに低い同時実行性で処理することをお勧めします。

1
2
3
for file in ~/asr/inbox/*; do
  python ~/asr/transcribe.py "$file"
done

拡張子のフィルタリング、成功/失敗のログ記録、完了したファイルのスキップのためのロジックを実際のスクリプトに追加する必要があります。最も重要なことは、タスクのバッチ全体を開始する前に、最初に 5 つのサンプルを処理し、出力ディレクトリ、言語、モデル、および字幕のタイムラインが正しいことを確認することです。

NAS 上で複数の large-v3 転送タスクをやみくもに同時に実行すると、メモリ、GPU メモリ、または熱放散がボトルネックになりやすくなります。文字起こしサービスがフォト アルバム、バックアップ、ダウンローダーとリソースも共有する場合は、キューを制限する必要があります。

Dockerを安定して使うには

多くの NAS は、Container Manager または Docker を使用してサービスを管理するのに適しています。最初にホストまたは通常の Linux コンテナーで Python バージョンを実行してから、コンテナーをパッケージ化することをお勧めします。コンテナ化する場合は、少なくとも次のことを行ってください。

  • 入力ディレクトリを読み取り専用でマウントします。
  • 出力ディレクトリを個別に書き込み可能にマウントします。
  • モデル キャッシュ ディレクトリを永続的にマウントします。
  • 高速ウィスパー、CTranslate2、Python のバージョンを修正しました。
  • GPU を使用している場合は、最初にコンテナーのランタイムとデバイスのパススルーを確認します。

NAS 共有ディレクトリ全体を読み取り/書き込みモードでトランスコーディング コンテナにマウントしないでください。音声認識タスクでは、音声とビデオを読み取り、テキスト結果を書き込むだけで済みます。権限が小さいほど、誤操作による影響は小さくなります。

精度とプライバシーの境界

ローカル展開の利点は、オーディオをサードパーティのサービスにアップロードする必要がないことですが、これは出力が自然に正確であることを意味するわけではありません。 Whisper は、名前、専門用語、数字、無音部分を聞き間違えたり、ノイズや長い空白にさらされると信頼性の低いテキストを聞き間違えたりする可能性があります。

次のコンテンツは手動で確認する必要があります。

  • 医療、法律、財務、セキュリティの記録。
  • 字幕は一般に公開されます。
  • インタビューの引用と会議の決議。
  • 名前、金額、日付、電話番号、製品モデル。

元の音声を保持し、トランスクリプトを初稿として扱うことは、「トランスクリプトの直後に元のファイルを削除する」よりも安全なプロセスです。

NAS に適した一連のデフォルト構成

専用グラフィックス カードをお持ちでない場合:

1
2
3
4
5
model: base 或 small
device: cpu
compute_type: int8
vad_filter: true
并发: 1

NVIDIA GPU が利用可能な場合:

1
2
3
4
5
model: small 起步,按效果再试 medium
device: cuda
compute_type: float16 或 int8_float16
vad_filter: true
并发: 从 1 开始压测

まず、モデルをアップグレードするかどうかを決定する前に、同じ 10 ~ 30 分間の実際の録画を使用して、時間のかかる省略された単語、タイプミス、字幕のタイムラインを比較します。 NAS が長期転写に適しているかどうかを判断するために、数秒の透明なサンプルだけに依存しないでください。

要約する

Whisper NAS 導入は、小規模モデル、低同時実行性、VAD フィルタリング、入力ディレクトリと出力ディレクトリの分離など、より高速な Whisper から開始できます。 CPU NAS は、低頻度のオフライン転写を処理できます。適切な CUDA 環境を備えた GPU NAS は、多数のビデオや大型モデルに適しています。

実際にエクスペリエンスを決定するのは、「Whisper がインストールできるかどうか」ではなく、オーディオの品質、モデルのサイズ、実際のトランスコーディング キュー、および NAS が担当するその他のサービスの数です。最初に実際のオーディオを実行してから、スケールアップします。

参照:

记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。