• #speaker-diarization
  • #pyannote
  • #whisper
  • #transcription

話者認識(Speaker Diarization)技術の検証と代替案

出典

本ドキュメントは以下の記事の話者識別部分を参照・検証したものです:

1$未満でできる動画AI分析パイプライン構築の解説 著者: ekusiadadus プラットフォーム: Zenn


元記事の話者識別アプローチ

使用技術

処理フロー

  1. 長時間音声を 8分チャンク(30秒オーバーラップ)に分割
  2. 各チャンクで 独立した話者分離を実施
  3. 各話者の音声特徴を埋め込みベクトルとして抽出
  4. チャンク間でコサイン類似度75%以上を同一話者と判定
  5. 統一された話者ごとに音声を再分割

技術検証: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より話者混同を大幅削減今から始めるならこれ
WhisperXtranscription + diarization統合、セットアップ簡単プロトタイプ、学習用
NVIDIA NeMoSortformer採用、end-to-end大規模処理(要NVIDIA GPU)

推奨事項

元記事のアプローチを改善する場合

  1. pyannote を 4.0(community-1)にアップグレード - 話者混同が改善
  2. 閾値の自動チューニングを導入 - 上記の方法A参照
  3. 話者数がわかる場合は num_speakers を指定 - 閾値より確実
  4. 日本語音声での精度検証を実施

まとめ

元記事の pyannote.audio 3.1 選択は妥当です。AWS Transcribe より高精度で、オープンソースとして十分な品質があります。

改善すべき点

  1. pyannote 4.0 への移行 - 話者混同が大幅に改善されている
  2. 閾値の固定値(0.75)を避ける - Optimizerで自動チューニングするか、話者数を指定
  3. 日本語での検証が必要 - 英語で訓練されたモデルのため
  4. オーバーラップ音声が多い場合は精度低下を覚悟

参考リンク