そこで、OpenAIがMITライセンスで公開しているオープンソースの Whisper をインストールし、aacファイルをローカルで文字起こしが可能となり、日本語精度もかなり高く、ThinkPad L380 の CPUでも mediumモデル程度なら変換に、実録画時間の30%増し程度で医学用語も正確に変換され実用範囲。
| モデル | サイズ | 処理速度(目安) | 精度 |
|---|---|---|---|
| tiny | 約75MB | 非常に速い | 低い |
| base | 約145MB | 速い | やや低い |
| small | 約460MB | 実時間程度の半分程 | 実用レベル |
| medium | 約1.5GB | 実時間の2〜3割増 | 高い。医療用語などもかなり改善 |
| large-v3 | 約3GB | 実時間の5倍以上 | 最高。ただしL380のCPUだと厳しい |
ディレクトリ構成
/mnt/data/docker/whisper/
├── venv/ # Python仮想環境
├── models/ # Whisperモデル(自動DL)
├── input/ # ここにaacを置く
├── output/ # テキストが出力される
├── done/ # 処理済みaacの移動先
└── transcribe.py # 変換スクリプト
├── venv/ # Python仮想環境
├── models/ # Whisperモデル(自動DL)
├── input/ # ここにaacを置く
├── output/ # テキストが出力される
├── done/ # 処理済みaacの移動先
└── transcribe.py # 変換スクリプト
python3-venvパッケージをインストール
sudo apt install python3.12-venv
Whisper docker以下にインストール
sudo mkdir -p /mnt/data/docker/whisper/{models,input,output,done}
cd /mnt/data/docker/whisper
sudo chown -R $USER:$USER .
python3 -m venv venv
./venv/bin/pip install faster-whisper
スクリプトファイル /mnt/data/docker/whisper/transcribe.py
#!/usr/bin/env python3
"""input/ 内の音声ファイルをffmpegでwav変換後、文字起こしして output/ に出力"""
import shutil
import subprocess
import tempfile
from pathlib import Path
from faster_whisper import WhisperModel
BASE = Path("/mnt/data/docker/whisper")
INPUT, OUTPUT, DONE = BASE / "input", BASE / "output", BASE / "done"
EXTS = {".aac", ".m4a", ".mp3", ".wav", ".flac"}
model = WhisperModel(
"medium", # 速度重視なら "small"
device="cpu",
compute_type="int8",
download_root=str(BASE / "models"),
)
for audio in sorted(INPUT.iterdir()):
if audio.suffix.lower() not in EXTS:
continue
print(f"処理中: {audio.name}")
# ffmpegで16kHzモノラルwavに変換(Whisper推奨形式)
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp:
wav_path = tmp.name
result = subprocess.run(
["ffmpeg", "-y", "-i", str(audio),
"-ar", "16000", "-ac", "1", "-c:a", "pcm_s16le", wav_path],
capture_output=True, text=True,
)
if result.returncode != 0:
print(f"変換失敗: {audio.name}")
print(result.stderr[-500:])
Path(wav_path).unlink(missing_ok=True)
continue
segments, info = model.transcribe(wav_path, language="ja", vad_filter=True)
print(f"音声長: {info.duration:.1f}秒")
out = OUTPUT / f"{audio.stem}.txt"
count = 0
with out.open("w", encoding="utf-8") as f:
for seg in segments:
f.write(f"[{seg.start:7.1f}s] {seg.text.strip()}\n")
count += 1
print(f"完了: {out.name} ({count}セグメント)")
Path(wav_path).unlink(missing_ok=True)
shutil.move(str(audio), DONE / audio.name)
input/ に aacファイルを置いて
cd /mnt/data/docker/whisper time ./venv/bin/python transcribe.py
音声長: 757.5秒
完了: 20260602 金子眼科.txt (101セグメント)
real 16m28.250s
user 55m53.895s
sys 2m29.498s
眼科で説明を受けた医学用語もきちんと変換されてテキストファイルが出来上がった、iPhone の場合は誤字が多かった、まぁAiに要約してもらえば同じ事かもしれないが、精度が高くなるのは嬉しい。
あっ!Geminiならaacファイルを読み込んで要約してくれてたのを忘れていた、それは凄い!!。