WeSpeakerで話者分離(Speaker Diarization)を試してみた【日本語音声での検証結果】
要約
WeSpeakerの3モデル(ResNet34・ResNet152・SimAMResNet34)を日本語音声(14話者・468秒)で評価した結果、DERは最良でも**64.91%**という厳しい数値でした。英語中心のモデルを日本語に適用する限界を実測データで示します。セットアップ手順・コードも完全再現可能な形で掲載しています。
話者分離(Speaker Diarization)とは
**話者分離(Speaker Diarization)**とは、音声データの中から「誰がいつ話しているか」を自動で識別する技術です。
たとえば以下のような用途で実用されています。
- 動画の自動吹き替え・字幕生成:話者ごとに異なる声優や翻訳を割り当てる
- 議事録の自動作成:「Aさん:〜」「Bさん:〜」と発言者を自動付与
- インタビュー音声の整理:インタビュアーと回答者を分離して書き起こす
- コールセンターの応対品質分析:オペレーターと顧客の発話を区別
技術的には、VAD(Voice Activity Detection:音声区間検出)で無音部分を除いたうえで、各発話区間の話者埋め込み(Speaker Embedding)を抽出し、クラスタリングによって「同じ話者か否か」を判定します。
DER(Diarization Error Rate) は話者分離の精度指標で、値が低いほど優秀です。0%が理想で、業務活用の目安は一般的にDER 20〜30%以下とされています。
WeSpeakerとは
WeSpeakerはWeNet開発チームが公開しているOSS(オープンソースソフトウェア)で、Speech Embedding(話者特徴ベクトル)に特化したツールキットです。
- GitHubリポジトリ:https://github.com/wenet-e2e/wespeaker
- ONNX形式での推論をサポートしており、本番環境への組み込みも想定されている
- HuggingFace経由で事前学習済みモデルを配布
公開されている主な事前学習済みモデルは以下のとおりです。
| データセット | 対応言語 | モデル |
|---|---|---|
| VoxCeleb | 英語(EN) | ResNet34 / ResNet34_LM |
| VoxCeleb | 英語(EN) | ResNet152_LM |
| VoxCeleb | 英語(EN) | ResNet221_LM / ResNet293_LM |
| VoxBlink2 + VoxCeleb2 | 多言語(Multilingual) | SimAMResNet34 |
セットアップ手順(完全再現版)
1. インストール
公式ドキュメントには以下のコマンドしか記載されていませんが、実際には複数の依存ライブラリが必要です。
pip install git+https://github.com/wenet-e2e/wespeaker.git
実際に動作させるために必要な依存関係をまとめた requirements.txt は以下のとおりです。
peft>=0.18.1
requests>=2.32.5
scikit-learn<1.6
s3prl>=0.4.18
torch==2.4.*
torchaudio==2.4.*
wespeaker
whisper>=1.1.10
⚠️
scikit-learnは 1.6 以上だと互換性の問題が出るため、バージョン指定が必要です。
2. モデルのダウンロード
HuggingFaceからGit LFSを使ってダウンロードします。大容量ファイルが含まれるため、LFSのインストールを先に行ってください。
# Git LFSをインストール(未インストールの場合)
git lfs install
# ResNet34_LMモデルをダウンロード
git clone https://huggingface.co/Wespeaker/wespeaker-voxceleb-resnet34-LM
# ResNet152_LMモデルをダウンロード
git clone https://huggingface.co/Wespeaker/wespeaker-voxceleb-resnet152-LM
3. ファイル名の調整(ここでつまずきやすい)
WeSpeakerはモデルディレクトリ内に config.yaml と avg_model.pt という名前のファイルを期待しています。しかし、HuggingFaceからダウンロードしたファイルはモデル名がプレフィックスになっているため、そのままでは読み込めません。
シンボリックリンクで対応するのが最も簡単です。
# ResNet152の場合
cd wespeaker-voxceleb-resnet152-LM
ln -s voxceleb_resnet152_LM.yaml config.yaml
ln -s voxceleb_resnet152_LM.pt avg_model.pt
4. 話者分離の実行
uv run wespeaker \
--task diarization \
--audio_file ./test.wav \
--pretrain ./wespeaker-voxceleb-resnet152-LM/ \
--output_file inference.rttm
出力ファイルについて: --output_file に指定した .rttm ファイルは、NIST Rich Transcription Time Mark形式で、各行が「話者ID・開始時刻・継続時間」を示します。このRTTMファイルをもとにDERを計算できます。
評価条件
今回の評価では以下の条件で実験しました。
- 音声データ: 日本語音声、約468秒(7分48秒)
- 話者数(正解): 14名
- 評価指標: DER(Diarization Error Rate)
- 評価ツール: md-eval(NIST標準評価スクリプト)
DERの内訳は以下の3要素で構成されます。
- Missed Detection(検出漏れ): 実際に音声があるのに無音と判定した区間
- False Alarm(誤検出): 無音なのに音声と判定した区間
- Speaker Confusion(話者混同): 音声は検出できたが話者IDが間違っている区間
評価結果:3モデルの日本語DER実測値
ResNet34(英語モデル)
DER: 64.91%
話者数(正解): 14 / 推定: 14
正確に分類: 178.0秒
誤分類(話者混同): 148.3秒
検出漏れ: 141.4秒
誤検出: 13.9秒
3モデル中で最も良いDERを記録。推定話者数も正確に14名と一致しており、話者の存在自体は検出できているものの、約半分の時間で話者の混同が発生しています。
ResNet152(英語モデル)
DER: 82.80%
話者数(正解): 14 / 推定: 23(過検出)
正確に分類: 94.3秒
誤分類(話者混同): 232.0秒
検出漏れ: 141.4秒
誤検出: 13.9秒
モデルが大規模になったにもかかわらず、DERは最も悪い結果でした。推定話者数が23名と実際の14名を大幅に上回っており、1人の話者を複数の異なる話者として誤認識する「過検出」が多発しています。モデルの表現力が高い分、日本語音声の特徴をノイズとして拾いすぎた可能性があります。
SimAMResNet34(多言語モデル)
DER: 74.08%
話者数(正解): 14 / 推定: 3(大幅な過小検出)
正確に分類: 135.1秒
誤分類(話者混同): 191.2秒
検出漏れ: 141.4秒
誤検出: 13.9秒
多言語対応を謳っているものの、DERは中間の74%でした。特筆すべきは推定話者数が3名と大幅に過小評価している点で、14名の話者をわずか3つのクラスタに押し込めてしまっています。話者の分離そのものが機能しておらず、異なる話者の発話が同一人物として扱われています。
結果サマリー
| モデル | 言語 | DER | 推定話者数 | 正確(秒) | 話者混同(秒) | 検出漏れ(秒) | 誤検出(秒) |
|---|---|---|---|---|---|---|---|
| ResNet34 | 英語 | 64.91% | 14(正解) | 178.0 | 148.3 | 141.4 | 13.9 |
| SimAMResNet34 | 多言語 | 74.08% | 3(過小) | 135.1 | 191.2 | 141.4 | 13.9 |
| ResNet152 | 英語 | 82.80% | 23(過大) | 94.3 | 232.0 | 141.4 | 13.9 |
なぜ精度が低いのか:技術的考察
1. 英語モデルの音韻空間と日本語の乖離
ResNet34・ResNet152はVoxCelebデータセット(英語話者)で学習されています。話者分離モデルは音声の音韻・韻律的特徴を話者埋め込みに変換しますが、日本語は英語と根本的に異なる特性を持ちます。
- 日本語はモーラ(拍)リズムであり、英語のストレスリズムとは構造が異なる
- 母音の分布が異なる(日本語は5母音、英語は15〜20程度)
- 英語話者データで学習した埋め込み空間では、日本語話者の特徴が適切に分離されない
これは「英語の地図を使って日本の道を走ろうとしている」状況に近く、地形の基本構造が異なるため根本的な限界があります。
2. 多言語モデルでも日本語への最適化が不十分
SimAMResNet34の学習データはVoxBlink2 + VoxCeleb2の組み合わせですが、日本語話者のデータ比率は限られます。多言語モデルは言語共通の話者特徴を学習しますが、話者数の過小評価(14名→3名)は、日本語の話者間差異をモデルが正確に捉えられていないことを示しています。
3. VADの精度問題が全モデルで共通
3モデルすべてで「Missed Detection(検出漏れ)」が約141.4秒と一定しています。これはモデル自体の話者識別能力ではなく、VAD(音声区間検出)の精度に起因している可能性が高いです。WeSpeakerが内部で使用するVADが日本語の音声区間境界を適切に検出できていないと考えられます。
4. クラスタリングのハイパーパラメータ依存
話者分離の後段であるクラスタリング(AHC/スペクトラルクラスタリング)は、閾値設定によって推定話者数が大きく変動します。英語データで調整されたデフォルト設定が日本語に最適ではない可能性もあります。
日本語話者分離の現実的な代替手段
今回の結果を踏まえ、日本語音声での話者分離を実現するための現実的な選択肢を整理します。
pyannote.audio
現時点で最も実績のある話者分離フレームワークです。HuggingFaceでモデルが公開されており、使用にはアクセストークンが必要です。日本語音声に対しても比較的良好な結果が得られるケースがあります。
NeMo(NVIDIA)
NVIDIAが開発するConversational AI向けツールキットで、話者分離に特化したモデルを提供しています。GPU環境での処理が前提となりますが、精度・速度のバランスが取れています。
日本語話者データによるファインチューニング
WeSpeakerを含む既存モデルを日本語話者データでファインチューニングする方法も有効です。ただし、ラベル付き日本語話者データセットの確保が課題になります。
FAQ
Q1. WeSpeakerは商用利用できますか?
WeSpeakerはApache 2.0ライセンスで公開されており、商用利用が可能です。ただし、HuggingFaceで配布されている事前学習済みモデルの学習データ(VoxCeleb等)の利用規約は別途確認が必要です。
Q2. DER 64%という結果は実用に耐えますか?
業務利用の目安は一般的にDER 20〜30%以下とされています。DER 64%は、約2/3の時間で何らかの誤りが発生しているため、そのままの実用は難しいと考えるのが妥当です。後処理や人手修正の組み合わせが現実的です。
Q3. GPUなしで動きますか?
WeSpeakerはCPU推論も対応しています。ただし、処理速度はGPU比で大幅に低下します。468秒の音声をCPUで処理した場合、実時間の数倍〜十数倍の処理時間が必要になることがあります。
Q4. 話者数を事前に指定できますか?
WeSpeakerのdiarizationタスクでは、デフォルトで話者数を自動推定しますが、クラスタリング設定を変更することで話者数を固定することも可能です。ただし、コード側での調整が必要になります。
Q5. 日本語対応のWeSpeakerモデルは今後リリースされる可能性がありますか?
WeSpeakerはアクティブに開発されているOSSです。VoxBlink2のような多言語大規模データセットを活用した新しいモデルが継続的にリリースされており、将来的に日本語精度が改善される可能性はあります。GitHubのIssueやリリースノートを定期的に確認することを推奨します。
Q6. RTTMファイルを可視化する方法はありますか?
RTTMファイルは pyannote.core ライブラリで読み込み・可視化できます。また、ELAN などの音声アノテーションツールでも読み込み可能です。
from pyannote.core import Annotation, Segment
# RTTMファイルを読み込む例
annotation = Annotation()
with open("inference.rttm") as f:
for line in f:
parts = line.strip().split()
start = float(parts[3])
duration = float(parts[4])
speaker = parts[7]
annotation[Segment(start, start + duration)] = speaker
まとめ
WeSpeakerを使って日本語音声(14話者・468秒)に対して3モデルを評価した結果、最良でもDER 64.91% という厳しい結果でした。
英語で学習されたモデルを日本語に転用することの限界を実測データで確認できました。音韻構造の違い・VADの誤検出・クラスタリングのパラメータ最適化不足が複合的に影響しています。
英語音声の話者分離が目的であれば、WeSpeakerは十分に試す価値があります。セットアップのポイント(シンボリックリンクの作成)さえ押さえれば、比較的簡単に動かせます。
日本語音声が対象の場合は、pyannote.audioやNeMoなど日本語に対してより多くの実績があるフレームワークの検討を先に進めることを推奨します。