話者認識(Speaker Diarization)技術の検証と代替案
出典
本ドキュメントは以下の記事の話者識別部分を参照・検証したものです:
1$未満でできる動画AI分析パイプライン構築の解説 著者: ekusiadadus プラットフォーム: Zenn
元記事の話者識別アプローチ
使用技術
- pyannote.audio 3.1: オープンソースの話者分離ライブラリ
処理フロー
- 長時間音声を 8分チャンク(30秒オーバーラップ)に分割
- 各チャンクで 独立した話者分離を実施
- 各話者の音声特徴を埋め込みベクトルとして抽出
- チャンク間でコサイン類似度75%以上を同一話者と判定
- 統一された話者ごとに音声を再分割
技術検証:pyannote.audio 3.1
結論:記事の選択は妥当
pyannote.audio は、フランス国立科学研究センター(CNRS)の Hervé Bredin 氏が開発した、最も広く採用されているオープンソース話者分離ソリューションです。
ベンチマーク性能
| 指標 | 値 |
|---|---|
| DER(Diarization Error Rate) | 約10%(最適化時) |
| 処理速度 | リアルタイムの2.5%(GPU使用時) |
| オーバーラップ対応 | あり |
Picovoice のベンチマークやSDBenchによると、pyannote は AWS Transcribe よりも高い精度を示しています。
批評・問題点
1. pyannote 3.1 は最新版ではない
2025年9月に pyannote.audio 4.0(community-1)がリリースされています。
pyannoteAI のブログによると:
- 話者混同(speaker confusion)を大幅に削減
- オープンソース話者分離で最高性能
- 音声活動検出とオーバーラップ検出は 3.1 と同等
→ 今から実装するなら 4.0 を使うべき
2. チャンク分割による精度リスク
8分チャンク + 30秒オーバーラップという設計には以下の問題:
- チャンク境界での話者認識の不連続性
- 30秒オーバーラップでは話者の特徴を十分に捉えられない場合がある
- グローバル話者統一の計算コストが増加
3. コサイン類似度75%閾値の問題
固定閾値 0.75 は経験則であり:
- 類似した声の話者を同一人物と誤認識するリスク
- 同一話者の声質変化(感情、疲労、マイク位置)で別人と判定するリスク
具体的な改善案
方法A: pyannote.pipeline.Optimizer による自動チューニング
Hervé Bredin氏のブログで推奨されている2段階最適化:
from pyannote.pipeline import Optimizer
from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization-3.1")
# Step 1: segmentation.threshold を最適化(OracleClusteringで完璧なクラスタリングを仮定)
# Step 2: clustering.threshold を最適化
pipeline.freeze({
"segmentation": {
"threshold": 0.44, # Step1で得た最適値
"min_duration_off": 0.0,
},
"clustering": {
"method": "centroid",
"min_cluster_size": 15,
},
})
optimizer = Optimizer(pipeline)
# 開発セット(実際に使う音声のサンプル)で20-50回イテレーション
best_params = optimizer.tune(dev_set, iterations=50)
方法B: 話者数の事前情報を活用
話者数がわかっている場合は閾値より確実:
diarization = pipeline(audio_file, num_speakers=3)
# または範囲指定
diarization = pipeline(audio_file, min_speakers=2, max_speakers=5)
方法C: HDBSCAN によるクラスタリング
Vakyanshプロジェクトの手法:
- コサイン類似度 94-96% で類似クラスタを反復マージ
- 固定閾値ではなく密度ベースでクラスタ数を自動決定
- ノイズ(どの話者にも属さないセグメント)を自動除外
from hdbscan import HDBSCAN
from sklearn.metrics.pairwise import cosine_distances
# 埋め込みベクトルから距離行列を計算
distance_matrix = cosine_distances(embeddings)
clusterer = HDBSCAN(
metric='precomputed',
min_cluster_size=15,
min_samples=5
)
labels = clusterer.fit_predict(distance_matrix)
推奨: まず方法Bで話者数を指定できるか検討 → 無理なら方法Aで自動チューニング
4. オーバーラップ音声の限界
pyannote 3.1 はオーバーラップ対応ですが、WhisperX の GitHub でも指摘されているように:
"Overlapping speech is not handled particularly well by whisper nor whisperx"
複数人が同時に話す場面では精度が低下します。
5. 日本語での精度未検証
pyannote のモデルは主に英語で訓練されています。日本語での精度は別途検証が必要。
代替アプローチ(オープンソース)
コスト重視の場合、以下のオープンソースツールが選択肢:
| ツール | 特徴 | 推奨用途 |
|---|---|---|
| pyannote 4.0 (community-1) | 3.1より話者混同を大幅削減 | 今から始めるならこれ |
| WhisperX | transcription + diarization統合、セットアップ簡単 | プロトタイプ、学習用 |
| NVIDIA NeMo | Sortformer採用、end-to-end | 大規模処理(要NVIDIA GPU) |
推奨事項
元記事のアプローチを改善する場合
- pyannote を 4.0(community-1)にアップグレード - 話者混同が改善
- 閾値の自動チューニングを導入 - 上記の方法A参照
- 話者数がわかる場合は
num_speakersを指定 - 閾値より確実 - 日本語音声での精度検証を実施
まとめ
元記事の pyannote.audio 3.1 選択は妥当です。AWS Transcribe より高精度で、オープンソースとして十分な品質があります。
改善すべき点:
- pyannote 4.0 への移行 - 話者混同が大幅に改善されている
- 閾値の固定値(0.75)を避ける - Optimizerで自動チューニングするか、話者数を指定
- 日本語での検証が必要 - 英語で訓練されたモデルのため
- オーバーラップ音声が多い場合は精度低下を覚悟
参考リンク
- pyannote/pyannote-audio - GitHub
- pyannote/speaker-diarization-3.1 - Hugging Face
- community-1: Unleashing open-source diarization - pyannoteAI
- How I won 2022 diarization challenges(閾値チューニング解説) - Hervé Bredin
- Speaker Clustering with HDBSCAN - Vakyansh
- m-bain/whisperX - GitHub
- Open-Source Speaker Diarization Benchmark - Picovoice