ubuntu
カテゴリ
aac音声ファイルをテキスト変換する whisper
2026/07/10 09時whisper
iPhoneのボイスメモには「文字起こし」機能が標準で搭載されているので、そのデータをAiに貼り付ければ、それを要約してくれた、同じくAndroidの レコーダーにも、同様の機能を期待したが、それがなかった、ブラウザでレコーダーで録画した、aacファイルをテキスト化可能だが、無料で使用できる範囲が少なかった。

そこで、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  # 変換スクリプト

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
処理中: 20260602 金子眼科.aac
音声長: 757.5秒
完了: 20260602 金子眼科.txt (101セグメント)
real 16m28.250s
user 55m53.895s
sys 2m29.498s

眼科で説明を受けた医学用語もきちんと変換されてテキストファイルが出来上がった、iPhone の場合は誤字が多かった、まぁAiに要約してもらえば同じ事かもしれないが、精度が高くなるのは嬉しい。

あっ!Geminiならaacファイルを読み込んで要約してくれてたのを忘れていた、それは凄い!!。
記事一覧