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

そこで、OpenAIがMITライセンスで公開しているオープンソースの Whisper をインストールし、aacファイルをローカルで文字起こしが可能となり、日本語精度もかなり高く、ThinkPad L380 の CPUでも mediumモデル程度なら変換に、実録画時間の30%増し程度で医学用語も正確に変換され実用範囲。

モデルサイズ処理速度(目安)精度
tiny約75MB実時間の1/10以下低い
base約145MB速い実時間の1/10程度
small約460MB実時間の1/4程度実用レベル
medium約1.5GB実時間の1/2程度高い。医療用語などもかなり改善
large-v3約3GB実時間の8割程度最高。L380でも十分実用範囲の可能性

ディレクトリ構成
/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 os
os.nice(19)  # 最低優先度で実行(エンコード等と競合時にCPUを譲る)
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(
    "large-v3",                      # 速度重視なら "small" "medium"
    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 9m49.322s
user 37m17.381s
sys 1m24.304s

9分49秒=589秒÷757.5秒=0.777⇒実録画時間の8割程度の処理時間
37分17秒÷9分49秒=3.8⇒ほぼ4コアをフル稼働させていた
Ubuntu Server がエンコード等を動いている時には危ないので、他が忙しいときは譲る、暇なら全力の設定「nos.nice(19)」を付加した。

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

出先のスマートフォンでも操作できるように、/etc/samba/smb.conf に以下を追記
[whisper]
   path = /mnt/data/docker/whisper
   read only = No
   create mask = 0644
   force user = vafee
   veto files = /venv/models/

スマートフォン二画面ファイラー「X-plore」に、LAN接続を行い、レコーダーの音声を共有から「/mnt/data/docker/whisper/input」に、コピーして、「Termius」からコマンドを実行すれば、外出先でもテキスト変換が可能となった。

また、発言者を特定して議事録の作成は、Whisper単体では不可だが、WhisperX等の組み合わせで可能になるらしい、これも面白いのかも。

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