👋

[音源を話者別に分離]Apple Silicon/Macでpyannote-audioを導入する方法

に公開

1. 誰向け?

Mac (M1/M2/M3) 持ち
Pythonとっつき済み
公式のREADMEでエラー吐かれてキレてるやつ
pyannoteで話者分離を最速でやりたい

2. 前提スペック

Apple M1 Max, 64GB, macOS
pyenv or Homebrew, Python 3.10.x, Docker不要
pip, git, condaどれでもいける

3. ハマるポイント(先に言っとく)

pyannoteの「gated model」系は全部“規約同意”しないと絶対落ちてこない
アクセストークン周りが超わかりづらい4. インストール(.command派用)
.commandにしてFinderダブルクリックできるやつ(失敗しない版)

4. インストール(.command派用)

#!/bin/bash
set -e
WORKDIR="$HOME/pyannote_audio_env"
VENV="$WORKDIR/venv"
if ! command -v brew &>/dev/null; then
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
if ! command -v pyenv &>/dev/null; then
  brew install pyenv
fi
pyenv install -s 3.10.6
mkdir -p "$WORKDIR"
cd "$WORKDIR"
eval "$(pyenv init -)"
pyenv shell 3.10.6
python3 -m venv venv
source "$VENV/bin/activate"
pip install --upgrade pip wheel setuptools
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install numpy ffmpeg-python pydub huggingface_hub pyannote.audio
huggingface-cli login
echo "Hugging Faceトークン入れてログインしろ(未取得なら https://huggingface.co/settings/tokens へ)"
echo "終わったら ENTER で続行"
read

※ chmod +x install_pyannote.command してダブルクリックな

5. モデル規約は全部同意しろ

トークン貼っても「cannot find file on the Hub」地獄
Speaker-Diarization本体だけ同意してもダメ、依存モデル(segmentation, embedding, labeling, aggregation)もぜんぶ同意しろ
だいたい初回は音声分離激遅。進んでるか不安になってもPC叩き割るな

5. モデル規約は全部同意しろ

必ずログインして↓アクセスして**「Agree and access」ボタン全部押せ**

pyannote/speaker-diarization
pyannote/segmentation
pyannote/embedding
pyannote/embedding-aggregation
pyannote/labeling
これをサボるとどこかで100%エラーで止まる

「前も押した気がする?」→また押せ。仕様変わってて権限切れてる時がある

6. 動作テスト(対話シェルでやれ)

cd ~/pyannote_audio_env
source venv/bin/activate
python
from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization",
use_auth_token="hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxx" # おまえのトークン
)
print("モデルロード成功")
ここで「config.yaml: 100%」や「pytorch_model.bin: 100%」とか出てエラー吐かなければOK

7. 分離スクリプト例

コピペ用(話者ごとに分割保存。pydub依存)

from pyannote.audio import Pipeline
from pydub import AudioSegment
import os

pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization",
use_auth_token="hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxx" # おまえのトークン
)
wav_path = "input.wav" # おまえのファイル
diarization = pipeline(wav_path)
audio = AudioSegment.from_file(wav_path)
base = os.path.splitext(wav_path)[0]

speakers = {}
for turn, _, speaker in diarization.itertracks(yield_label=True):
segment = audio[int(turn.start * 1000):int(turn.end * 1000)]
speakers.setdefault(speaker, []).append(segment)

for i, (spk, segs) in enumerate(speakers.items()):
out = base + f"_speaker{i+1}.wav"
combined = sum(segs[1:], segs[0]) if len(segs) > 1 else segs[0]
combined.export(out, format="wav")
print(f"保存したぞ: {out}")

8. よくある質問(全部ここで詰まる)

Q.「Speaker A/Bみたいに自動で人間名で分けたいんだけど?」
A. pyannoteだけじゃ無理。Resemblyzerとか使って事前に「Aさんの声」登録→照合しろ。声サンプルで判定するのはcos類似度で一発。

Q. トークン全部合ってるのに「cannot find」エラーが消えねぇ
A. モデル依存のgatedリポジトリ全部規約同意したか?全部やれ。家の回線がゴミじゃないかも見ろ。

Q. 警告たくさん出るけど?
A. pyannote.audioやtorchのバージョン違いの警告はだいたい動く。動かなかったらバージョン合わせろ。

9. まとめ

pyannoteは「規約同意地獄」さえ乗り越えれば普通に使える
トークン、仮想環境ログイン、pip install、全部間違えんな
本当に詰まったら「公式リポジトリのDiscussions」に泣きつけ

10. 参考

[pyannote-audio公式: https://github.com/pyannote/pyannote-audio]
[Resemblyzer: https://github.com/resemble-ai/Resemblyzer]

Discussion