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


## 1. 誰向け？

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

---

## 2. 前提スペック

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

---

## 3. マジでハマるポイント（先に言っとく）

* **pyannoteの「gated model」系は全部“規約同意”しないと絶対落ちてこない**
* アクセストークン周りが超わかりづらい（GitHubと勘違いするやつ多発）
* トークン貼っても「cannot find file on the Hub」地獄
* Speaker-Diarization本体だけ同意してもダメ、依存モデル（segmentation, embedding, labeling, aggregation）もぜんぶ同意しろ
* だいたい初回は音声分離激遅。進んでるか不安になってもPC叩き割るな

---

## 4. インストール（.command派用）

`.command`にしてFinderダブルクリックできるやつ（失敗しない版）

```bash
#!/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. モデル規約は**全部**同意しろ

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

  * [pyannote/speaker-diarization](https://huggingface.co/pyannote/speaker-diarization)
  * [pyannote/segmentation](https://huggingface.co/pyannote/segmentation)
  * [pyannote/embedding](https://huggingface.co/pyannote/embedding)
  * [pyannote/embedding-aggregation](https://huggingface.co/pyannote/embedding-aggregation)
  * [pyannote/labeling](https://huggingface.co/pyannote/labeling)
* これをサボると**どこかで100%エラーで止まる**
* 「前も押した気がする？」→また押せ。仕様変わってて権限切れてる時がある

---

## 6. 動作テスト（対話シェルでやれ）

```bash
cd ~/pyannote_audio_env
source venv/bin/activate
python
```

```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依存）

```python
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)
* [Hugging Faceのトークン発行ページ](https://huggingface.co/settings/tokens)