0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[音系AI解説]NeMo Speaker Diarization(MSDD)、お前は何者だ?「誰が喋ったか」を解き明かすAI

Posted at

はじめに:VADだけじゃ足りない

NeMoのVAD解説で、MarbleNetを使った音声区間検出を紹介した。「いつ喋っているか」は分かるようになった。

でも、それだけじゃ足りない。

会議の録音を文字起こししたい。でも、「誰が」喋っているのかが分からなければ、議事録にならない。

電話の通話記録を分析したい。でも、オペレーターと顧客の発言が区別できなければ、分析の意味がない。

そう、「いつ」だけでなく「誰が」喋ったかを知りたいのだ。

この「誰が喋ったか」を解決するのが、**Speaker Diarization(話者ダイアライゼーション)**だ。

NeMoには、この話者ダイアライゼーションのための強力なモジュールが実装されている。その中核がMSDD(Multi-Scale Diarization Decoder)

今回は、このNeMo Speaker Diarizationの全体像と、MSDDの仕組み、そして実際に使う方法を徹底解説していく。

ねらい

  • Speaker Diarization(話者ダイアライゼーション)の概念を理解する
  • NeMoのSpeaker Diarizationパイプラインの構成を把握する
  • TitaNet(話者埋め込みモデル)の仕組みを知る
  • MSDD(Multi-Scale Diarization Decoder)のアーキテクチャを理解する
  • Sortformer(End-to-End Diarizer)との違いを把握する

対象読者

  • VADの先に進みたいエンジニア
  • 会議録音の話者分離に興味がある開発者
  • 音声認識(ASR)に話者ラベルを付けたい人
  • 通話分析、コールセンター分析に取り組む人

ゴール

この記事を読み終えた後、あなたは:

  • Speaker Diarizationが「何をするもの」かを説明できる
  • NeMoのDiarizationパイプライン(VAD→埋め込み→クラスタリング→MSDD)を理解している
  • TitaNetがどうやって話者の特徴を抽出するかを把握している
  • MSDDのマルチスケールアプローチの利点を説明できる
  • NeMoでDiarizationを実行するコードを書ける

TL;DR

Speaker Diarizationとは:

  • 「誰が、いつ喋ったか」を推定するタスク
  • 音声認識(ASR)と組み合わせて、話者ラベル付き文字起こしを実現
  • 会議録音、通話記録、インタビューなど複数話者の音声に必須

NeMoのDiarizationパイプライン:

  1. VAD(MarbleNet):音声区間を検出
  2. Speaker Embedding(TitaNet):話者の特徴ベクトルを抽出
  3. Clustering(NME-SC):話者数を推定し、埋め込みをグループ化
  4. Neural Diarizer(MSDD):クラスタリング結果を精緻化、オーバーラップ検出

主要モデル:

  • TitaNet:1D深度分離可能畳み込み + SE層 + Channel Attention Pooling、約23Mパラメータ
  • MSDD:マルチスケール入力 + LSTM、クラスタリングより最大60% DER改善
  • Sortformer:End-to-End Transformer、到着順ソートで順序問題を解決

性能:

  • CALLHOME: DER 3.92%(MSDD)
  • AMI MixHeadset: DER 1.05%(MSDD)
  • 従来のクラスタリング手法より大幅に精度向上

1. Speaker Diarizationってなんだ?

基本概念

Speaker Diarization(話者ダイアライゼーション)は、音声処理における基本タスクの一つ。

公式ドキュメントより(原文):

"Speaker diarization is the process of segmenting audio recordings by speaker labels and aims to answer the question 'who spoke when?'."

(日本語訳)
「Speaker Diarizationは、音声録音を話者ラベルでセグメント化するプロセスであり、『誰が、いつ喋ったか』という問いに答えることを目的とします。」

音声認識(ASR)が「何を喋っているか」を解決するのに対し、Diarizationは「誰が喋っているか」を解決する。

ASR: "会議の資料を確認してください" → 「何を」喋っているか
Diarization: [0:00-0:03] Speaker A, [0:03-0:05] Speaker B → 「誰が」喋っているか

組み合わせ:
[Speaker A] 会議の資料を確認してください
[Speaker B] 承知しました

なぜ難しいのか

Diarizationが難しい理由は複数ある。

1. 未知の話者

事前に話者の声を登録していない状態で、「この声は誰か」を判断する必要がある。Speaker Verification(話者認証)とは違い、「未知の話者を区別する」というオープンな問題。

2. 話者数が不明

録音を聴くまで、何人が喋っているか分からない。2人かもしれないし、10人かもしれない。

3. 短い発話

「はい」「うん」「えーと」のような極端に短い発話は、話者の特徴を捉えにくい。

公式ドキュメントより(原文):

"Human conversation often involves very short back-channel words such as 'yes', 'uh-huh' or 'oh' and these words are very challenging for machines to transcribe and tell the speaker."

(日本語訳)
「人間の会話には、『はい』『うーん』『おお』のような非常に短いバックチャンネル発話が頻繁に含まれ、機械がこれらを文字起こしし話者を識別するのは非常に困難です。」

4. オーバーラップ(同時発話)

複数の人が同時に喋っている場面。従来のクラスタリング手法では対応が難しい。

評価指標:DER

Diarizationの性能は、**DER(Diarization Error Rate)**で測定される。

DER = (Miss + False Alarm + Speaker Confusion) / Total Speech Duration
  • Miss(ミス):音声があるのに検出されなかった
  • False Alarm(誤警報):音声がないのに検出された
  • Speaker Confusion(話者混同):音声は検出されたが、話者が間違っている

DERは低いほど良い。現在のSoTA(State of the Art)は、CALLHOMEデータセットで約4%、AMI MixHeadsetで約1%。


2. NeMoのDiarizationパイプライン

NeMoのSpeaker Diarizationは、複数のモジュールを組み合わせたカスケード(パイプライン)構成を取る。

全体構成

┌─────────────────────────────────────────────────────────────────┐
│              NeMo Speaker Diarization Pipeline                   │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐         │
│  │   Audio     │───▶│     VAD     │───▶│  Speech     │         │
│  │   Input     │    │ (MarbleNet) │    │  Timestamps │         │
│  └─────────────┘    └─────────────┘    └──────┬──────┘         │
│                                               │                 │
│                                               ▼                 │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐         │
│  │  Speaker    │◀───│   TitaNet   │◀───│  Segment    │         │
│  │  Embeddings │    │  Extractor  │    │  Audio      │         │
│  └──────┬──────┘    └─────────────┘    └─────────────┘         │
│         │                                                       │
│         ▼                                                       │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐         │
│  │  Spectral   │───▶│  Cluster    │───▶│  Initial    │         │
│  │  Clustering │    │  Embeddings │    │  Labels     │         │
│  │  (NME-SC)   │    │             │    │             │         │
│  └─────────────┘    └─────────────┘    └──────┬──────┘         │
│                                               │                 │
│                                               ▼                 │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐         │
│  │   Final     │◀───│    MSDD     │◀───│  Multi-scale│         │
│  │   Labels    │    │  (Neural)   │    │  Embeddings │         │
│  └─────────────┘    └─────────────┘    └─────────────┘         │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

各モジュールの役割

公式ドキュメントより(原文):

"NeMo speaker diarization system consists of the following modules: Voice Activity Detector (VAD), Speaker Embedding Extractor, Clustering Module, Neural Diarizer."

(日本語訳)
「NeMoのSpeaker Diarizationシステムは、以下のモジュールで構成されます:Voice Activity Detector(VAD)、Speaker Embedding Extractor、Clustering Module、Neural Diarizer。」

1. VAD(Voice Activity Detector)

音声区間を検出する。前回の記事で紹介したMarbleNetがここで使われる。

2. Speaker Embedding Extractor(TitaNet)

音声セグメントから、話者の特徴を表すベクトル(埋め込み)を抽出する。

3. Clustering Module(NME-SC)

話者埋め込みをクラスタリングし、話者数を推定。各セグメントに初期ラベルを割り当てる。

4. Neural Diarizer(MSDD)

クラスタリング結果を初期値として、ニューラルネットワークでラベルを精緻化。オーバーラップ(同時発話)も検出可能。


3. TitaNet:話者埋め込みの心臓部

TitaNetとは

TitaNetは、NeMoで使用される話者埋め込み抽出モデル。

公式ドキュメントより(原文):

"TitaNet model is based on the ContextNet architecture for extracting speaker representations. We employ 1D depth-wise separable convolutions with Squeeze-and-Excitation (SE) layers with global context followed by channel attention based statistics pooling layer to map variable-length utterances to a fixed-length embedding (t-vector)."

(日本語訳)
「TitaNetモデルは、話者表現を抽出するためにContextNetアーキテクチャをベースにしています。1D深度分離可能畳み込みにグローバルコンテキストを持つSqueeze-and-Excitation(SE)層を適用し、その後チャンネルアテンションベースの統計プーリング層で可変長発話を固定長埋め込み(t-vector)にマッピングします。」

アーキテクチャの特徴

┌─────────────────────────────────────────────────────────────────┐
│                        TitaNet Architecture                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌─────────────┐                                                │
│  │   Audio     │  Mel-Spectrogram (80 features)                 │
│  │   Input     │                                                │
│  └──────┬──────┘                                                │
│         │                                                       │
│         ▼                                                       │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │              1D Depth-wise Separable Conv               │   │
│  │                    + SE Layer                           │   │
│  │              (Multiple Blocks × Layers)                 │   │
│  └──────────────────────┬──────────────────────────────────┘   │
│                         │                                       │
│                         ▼                                       │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │          Channel Attention Statistics Pooling            │   │
│  │           (Mean + Std across time axis)                  │   │
│  └──────────────────────┬──────────────────────────────────┘   │
│                         │                                       │
│                         ▼                                       │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    Linear Layers                         │   │
│  │                 (512 or 192 dim output)                  │   │
│  └──────────────────────┬──────────────────────────────────┘   │
│                         │                                       │
│                         ▼                                       │
│  ┌─────────────┐                                                │
│  │  t-vector   │  Fixed-length speaker embedding               │
│  │  (192 dim)  │                                                │
│  └─────────────┘                                                │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

主要な技術:

  1. 1D Depth-wise Separable Convolution

    • 計算量を削減しつつ、効果的な特徴抽出
    • MarbleNet(VAD)と同じ設計思想
  2. Squeeze-and-Excitation(SE)Layer

    • チャンネル間の重要度を学習
    • グローバルコンテキストを考慮
  3. Channel Attention Statistics Pooling

    • 時間軸方向の平均と標準偏差を計算
    • 可変長入力を固定長ベクトルに変換

モデルバリエーション

モデル パラメータ数 出力次元 VoxCeleb1 EER
TitaNet-L ~23M 192 0.66%
TitaNet-M ~6M 192 ~1.0%
TitaNet-S ~3M 192 ~1.5%

Hugging Faceより(原文):

"This model extracts speaker embeddings from given speech, which is the backbone for speaker verification and diarization tasks. It is a 'large' version of TitaNet (around 23M parameters)."

(日本語訳)
「このモデルは与えられた音声から話者埋め込みを抽出し、話者認証およびダイアライゼーションタスクの基盤となります。これはTitaNetの『large』バージョン(約2300万パラメータ)です。」

学習データ

TitaNetは、大規模な単一話者データセットで事前学習されている。

  • VoxCeleb-1, VoxCeleb-2:セレブの動画音声
  • Fisher, Switchboard:電話会話
  • LibriSpeech:オーディオブック
  • SRE (2004-2010):NISTの話者認識評価データ

合計数千時間の英語音声データ。


4. クラスタリング:話者数の推定とグループ化

NME-SC(Normalized Maximum Eigengap Spectral Clustering)

TitaNetで抽出した話者埋め込みを、クラスタリングでグループ化する。

NeMoで使用されているのは、NME-SC(正規化最大固有値ギャップスペクトラルクラスタリング)。

GitHub READMEより(原文):

"NME-SC, Auto-tuning spectral clustering is now maintained at NVIDIA NeMo. NeMo version of NME-SC clustering is faster and more accurate while GPU based NME-SC is supported."

(日本語訳)
「NME-SC、自動チューニングスペクトラルクラスタリングは現在NVIDIA NeMoでメンテナンスされています。NeMo版のNME-SCクラスタリングは、GPUベースのNME-SCをサポートしながら、より高速で正確です。」

スペクトラルクラスタリングの仕組み

  1. アフィニティ行列の構築:埋め込みベクトル間のコサイン類似度を計算
  2. ラプラシアン行列の計算:グラフラプラシアンを構築
  3. 固有値分解:固有値と固有ベクトルを計算
  4. 話者数推定:固有値ギャップから最適なクラスタ数を推定
  5. クラスタリング:K-meansで固有ベクトルをクラスタリング

マルチスケールクラスタリング

NeMoはマルチスケールアプローチを採用している。

公式ドキュメントより(原文):

"NeMo comes with a multiscale approach of clustering which allows performing the diarization based on temporal multiscale embedding. It means that the segments are embedded with different time scales."

(日本語訳)
「NeMoには、時間的マルチスケール埋め込みに基づいてダイアライゼーションを実行するマルチスケールアプローチが含まれています。これは、セグメントが異なる時間スケールで埋め込まれることを意味します。」

デフォルトの設定では、5つのスケール(1.5秒、1.25秒、1.0秒、0.75秒、0.5秒)を使用。

window_length_in_sec: [1.5, 1.25, 1.0, 0.75, 0.5]
shift_length_in_sec: [0.75, 0.625, 0.5, 0.375, 0.25]
multiscale_weights: [1, 1, 1, 1, 1]

これにより、長いスケールで話者特徴を安定して捉えつつ、短いスケールで時間解像度を確保できる。


5. MSDD:ニューラルダイアライザーの本丸

MSDDとは

MSDD(Multi-Scale Diarization Decoder)は、NeMoのニューラルダイアライザー

公式ドキュメントより(原文):

"MSDD is a speaker diarization model based on initializing clustering and multi-scale segmentation input. A neural network model named multi-scale diarization decoder (MSDD) is trained to take advantage of a multi-scale approach by dynamically calculating the weight of each scale."

(日本語訳)
「MSDDは、初期化クラスタリングとマルチスケールセグメンテーション入力に基づく話者ダイアライゼーションモデルです。Multi-scale Diarization Decoder(MSDD)というニューラルネットワークモデルは、各スケールの重みを動的に計算することでマルチスケールアプローチを活用するように学習されます。」

なぜクラスタリングだけじゃダメなのか

クラスタリングベースのダイアライザーには限界がある。

  1. オーバーラップ検出ができない:同時に複数の話者が喋っている場面を検出できない
  2. 時間解像度が粗い:セグメント単位での判断になるため、細かい話者交代に対応しにくい
  3. 学習ができない:固定アルゴリズムなので、データから改善できない

MSDDはこれらの問題を解決する。

MSDDのアーキテクチャ

┌─────────────────────────────────────────────────────────────────┐
│                      MSDD Architecture                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │              Multi-scale Speaker Embeddings               │  │
│  │  [Scale 1: 1.5s] [Scale 2: 1.25s] ... [Scale 5: 0.5s]   │  │
│  └──────────────────────┬───────────────────────────────────┘  │
│                         │                                       │
│                         ▼                                       │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │              Cluster-Average Embeddings                   │  │
│  │         (Reference vectors for each speaker)              │  │
│  └──────────────────────┬───────────────────────────────────┘  │
│                         │                                       │
│                         ▼                                       │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │                  Scale Weight Network                     │  │
│  │              (1D CNN or Attention-based)                  │  │
│  │           Dynamically weight each scale                   │  │
│  └──────────────────────┬───────────────────────────────────┘  │
│                         │                                       │
│                         ▼                                       │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │                   Context Vector                          │  │
│  │      (Cosine similarity × Scale weights)                  │  │
│  └──────────────────────┬───────────────────────────────────┘  │
│                         │                                       │
│                         ▼                                       │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │                 Multi-layer LSTM                          │  │
│  │              (3 layers, 256 hidden size)                  │  │
│  └──────────────────────┬───────────────────────────────────┘  │
│                         │                                       │
│                         ▼                                       │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │              Per-speaker Sigmoid Output                   │  │
│  │    P(Speaker A), P(Speaker B) at each timestep           │  │
│  └──────────────────────────────────────────────────────────┘  │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

動作原理

公式ドキュメントより(原文):

"MSDD module uses cluster-average speaker embedding vectors to compare these with input speaker embedding sequences. The scale weights for each step is estimated to weigh the importance of each scale. Finally, the sequence model is trained to output speaker label probabilities for each speaker."

(日本語訳)
「MSDDモジュールは、クラスター平均話者埋め込みベクトルを入力話者埋め込みシーケンスと比較します。各ステップでスケールの重要度を重み付けするためにスケール重みが推定されます。最終的に、シーケンスモデルは各話者の話者ラベル確率を出力するように学習されます。」

処理フロー:

  1. クラスター平均埋め込みの計算:クラスタリング結果から、各話者の「代表ベクトル」を計算
  2. マルチスケール入力の準備:各スケールの埋め込みシーケンスを用意
  3. スケール重み推定:1D CNNで各スケールの重要度を動的に計算
  4. コンテキストベクトル生成:クラスター平均と入力埋め込みのコサイン類似度に重みを適用
  5. LSTM処理:コンテキストベクトルをLSTMに入力し、時系列依存性を捉える
  6. 話者確率出力:各タイムステップで、各話者の存在確率(シグモイド)を出力

MSDDの強み

公式ドキュメントより(原文):

"Overlap-aware diarization: MSDD independently estimates the probability of two speaker labels of two speakers at each step. This enables overlap detection where two speakers are speaking at the same time."

(日本語訳)
「オーバーラップ対応ダイアライゼーション:MSDDは各ステップで2人の話者の話者ラベル確率を独立して推定します。これにより、2人の話者が同時に喋っているオーバーラップの検出が可能になります。」

主要な利点:

  1. オーバーラップ検出

    • 各話者の確率を独立に出力
    • 両方が0.5以上なら同時発話と判断
  2. 高い時間解像度

    • 単位決定長が0.25秒(シングルスケールの0.75秒より細かい)
    • 短い発話や素早い話者交代に対応
  3. エンドツーエンド学習

    • TitaNetと一緒に学習可能
    • ドメイン固有データでファインチューニング可能
  4. 性能向上

公式ドキュメントより(原文):

"MSDD can reduce the diarization error rate up to 60% on two speaker datasets when compared to the single-scale clustering diarizer."

(日本語訳)
「MSDDは、シングルスケールクラスタリングダイアライザーと比較して、2話者データセットでダイアライゼーションエラー率を最大60%削減できます。」

ペアワイズモデル

MSDDは内部的に2話者モデルとして実装されている。

公式ドキュメントより(原文):

"For example, if there are 4 speakers, 6 pairs will be extracted, and inference results from MSDD are averaged to obtain results for each of the 4 speakers."

(日本語訳)
「例えば、4人の話者がいる場合、6ペアが抽出され、MSDDの推論結果が平均化されて4人の話者それぞれの結果が得られます。」

4話者の場合:(A,B), (A,C), (A,D), (B,C), (B,D), (C,D) の6ペアを処理し、結果を統合。


6. Sortformer:End-to-Endの新星

Sortformerとは

NeMo 2.0では、MSDDに加えてSortformerというEnd-to-Endダイアライザーが追加された。

公式ドキュメントより(原文):

"Sortformer is a Transformer encoder-based end-to-end speaker diarization model that generates predicted speaker labels directly from input audio clips. Sortformer resolves permutation problem in diarization following the arrival-time order of the speech segments from each speaker."

(日本語訳)
「Sortformerは、入力音声クリップから直接予測話者ラベルを生成するTransformerエンコーダーベースのEnd-to-End話者ダイアライゼーションモデルです。Sortformerは、各話者の音声セグメントの到着時間順に従ってダイアライゼーションの順序問題を解決します。」

MSDD vs Sortformer

特徴 MSDD Sortformer
アーキテクチャ クラスタリング + LSTM End-to-End Transformer
前処理 VAD + 埋め込み + クラスタリング必要 音声から直接
話者数制限 制限なし(ペアワイズ) 最大4話者(モデル依存)
セッション長 制限なし 90秒程度(長い場合は分割)
オーバーラップ 対応 対応
ストリーミング 非対応(NeMo 1.x) 対応(Streaming Sortformer)
ASR統合 後処理で統合 直接統合可能

Sortformerの仕組み

Sortformerの革新は、Sort Lossによる到着順ソートにある。

arXiv論文より(原文):

"We introduce Sort Loss, which enables a diarization model to autonomously resolve permutation, with or without PIL. The ATS-based multispeaker ASR system is achieved by developing an end-to-end neural diarizer model, Sortformer, which generates speaker-label timestamps in arrival time order (ATO)."

(日本語訳)
「Sort Lossを導入し、ダイアライゼーションモデルがPIL(Permutation Invariant Loss)の有無にかかわらず順序を自律的に解決できるようにしました。ATSベースのマルチスピーカーASRシステムは、到着時間順(ATO)で話者ラベルタイムスタンプを生成するEnd-to-Endニューラルダイアライザーモデル、Sortformerを開発することで実現されます。」

従来のEnd-to-End Diarization(EEND)は、話者の「順序」を固定できない問題(Permutation Problem)があった。Sortformerは、「最初に喋り始めた人がSpeaker 0」というルールで順序を決定し、これを学習可能にした。


7. 実装:NeMoでDiarizationを動かす

事前学習済みモデルのロード

import nemo.collections.asr as nemo_asr
from nemo.collections.asr.models import NeuralDiarizer

# クラスタリングダイアライザー(MSDDなし)
clustering_diarizer = nemo_asr.models.ClusteringDiarizer.from_pretrained(
    model_name="diar_infer_telephonic"
)

# MSDDモデルをロード(TitaNet込み)
msdd_model = nemo_asr.models.EncDecDiarLabelModel.from_pretrained(
    model_name="diar_msdd_telephonic"
)

# Sortformerモデルをロード
sortformer = nemo_asr.models.SortformerEncLabelModel.from_pretrained(
    model_name="diar_sortformer_4spk-v1"
)

マニフェストファイルの準備

import json

# 入力マニフェストの作成
manifest_data = {
    "audio_filepath": "/path/to/meeting.wav",
    "offset": 0,
    "duration": 300,  # 5分
    "label": "infer",
    "text": "-",
    "num_speakers": None,  # 不明な場合はNone
    "rttm_filepath": None  # 評価時はRTTMを指定
}

with open("input_manifest.json", "w") as f:
    json.dump(manifest_data, f)
    f.write("\n")

クラスタリングダイアライザーの実行

from omegaconf import OmegaConf

# 設定ファイルをロード
config = OmegaConf.load("diar_infer_telephonic.yaml")

# パラメータ設定
config.diarizer.manifest_filepath = "input_manifest.json"
config.diarizer.out_dir = "diarization_output"
config.diarizer.oracle_vad = False  # VADモデルを使用

# VADモデルを指定
config.diarizer.vad.model_path = "vad_multilingual_marblenet"

# TitaNetを指定
config.diarizer.speaker_embeddings.model_path = "titanet_large"

# マルチスケール設定
config.diarizer.speaker_embeddings.parameters.window_length_in_sec = [1.5, 1.25, 1.0, 0.75, 0.5]
config.diarizer.speaker_embeddings.parameters.shift_length_in_sec = [0.75, 0.625, 0.5, 0.375, 0.25]

# ダイアライザーの実行
diarizer = nemo_asr.models.ClusteringDiarizer(cfg=config)
diarizer.diarize()

MSDDを使ったダイアライゼーション

from nemo.collections.asr.models import NeuralDiarizer

# MSDDモデルで推論
config.diarizer.msdd_model.model_path = "diar_msdd_telephonic"
config.diarizer.msdd_model.parameters.sigmoid_threshold = [0.7, 0.5]

# Neural Diarizerの実行
neural_diarizer = NeuralDiarizer(cfg=config)
neural_diarizer.diarize()

出力形式(RTTM)

ダイアライゼーションの出力は、**RTTM(Rich Transcription Time Marked)**形式。

SPEAKER meeting 1 0.00 2.50 <NA> <NA> speaker_0 <NA> <NA>
SPEAKER meeting 1 2.30 3.80 <NA> <NA> speaker_1 <NA> <NA>
SPEAKER meeting 1 3.50 5.20 <NA> <NA> speaker_0 <NA> <NA>

各列:タイプ、ファイル名、チャンネル、開始時間、持続時間、NA×3、話者ラベル、NA×2

オーバーラップ区間(2.30-2.50秒)では、両話者のエントリが存在する。

ASRとの統合

# ASR + Diarizationの統合
# NeMoのチュートリアルノートブック参照
# tutorials/speaker_tasks/ASR_with_SpeakerDiarization.ipynb

# 出力例:
# [speaker_0] 会議の議題を確認しましょう
# [speaker_1] はい、まず売上報告からお願いします
# [speaker_0] 第三四半期の売上は前年比120%でした

8. 公開モデルと性能

NGC公開モデル

モデル名 用途 特徴
titanet_large 話者埋め込み 汎用、23Mパラメータ
diar_msdd_telephonic MSDD推論 電話音声用、TitaNet込み
diar_infer_telephonic クラスタリング推論 電話音声用設定
diar_infer_meeting クラスタリング推論 会議音声用設定
diar_sortformer_4spk-v1 Sortformer 4話者対応
diar_streaming_sortformer_4spk-v2 ストリーミング リアルタイム対応

ベンチマーク性能

MSDD(Multi-scale Speaker Diarization with Dynamic Scale Weighting)論文より:

データセット DER
CALLHOME 3.92%
AMI MixHeadset 1.05%

Sortformer(HuggingFaceモデルカードより):

データセット DER(Offline) DER(Streaming)
DIHARD III ~14% ~16%
CALLHOME-part2 ~8% ~10%
CH109 ~6% ~8%

9. NeMo Diarizationの強みと限界

強み

  1. 統合されたパイプライン

    • VAD、埋め込み、クラスタリング、MSPDがすべてNeMoで完結
    • ASRとの統合もサポート
  2. マルチスケールアプローチ

    • 複数の時間スケールで話者特徴を捉える
    • 短い発話と安定した話者認識の両立
  3. オーバーラップ対応

    • MSPDで同時発話を検出可能
    • 会議録音などリアルなシナリオに対応
  4. エンドツーエンド学習

    • TitaNet + MSPDの同時学習が可能
    • ドメイン固有データでのファインチューニング
  5. ストリーミング対応

    • Streaming Sortformerでリアルタイム処理
    • NVIDIA Rivaとの統合

限界

  1. 計算リソース

    • GPUが事実上必須
    • マルチスケール処理でメモリ消費大
  2. 言語依存

    • 公開モデルは主に英語データで学習
    • 日本語など他言語はファインチューニング推奨
  3. 話者数の上限(Sortformer)

    • 現在のSortformerは最大4話者
    • 大規模会議には不向き
  4. 依存関係の複雑さ

    • NeMoの依存関係問題は健在
    • Dockerコンテナ推奨

10. 参考リンク

NVIDIA NeMo公式リソース

モデル・チェックポイント

論文・技術ブログ

関連NeMoモジュール


あとがき

VADで「いつ喋っているか」を知り、Speaker Diarizationで「誰が喋っているか」を知る。

この2つが揃って初めて、音声認識は「実用的」になる。

会議の録音を文字起こししても、話者が分からなければ議事録にならない。コールセンターの通話を分析しても、オペレーターと顧客が区別できなければ意味がない。

NeMoのSpeaker Diarizationは、この「誰が」問題を本格的に解決するツールキットだ。

TitaNetで話者の「声紋」を抽出し、クラスタリングで話者数を推定し、MSPDで精緻化する。マルチスケールアプローチで短い発話も長い発話も捉え、オーバーラップ(同時発話)も検出する。

正直、最初は「クラスタリングで十分じゃね?」と思っていた。でも、MSPDを使ってみると、その差は歴然。特にオーバーラップの検出は、クラスタリング単体では不可能な芸当だ。

そして、Sortformerの登場で、End-to-End Diarizationの時代が来た。ストリーミング対応で、リアルタイムの話者識別も現実のものになっている。

NeMoのVAD(MarbleNet)から始まって、Diarization(TitaNet + MSDD)、そしてASR。音声AIのフルスタックがNeMoで揃う。

次回は、これらを統合した「ASR + Speaker Diarization」のパイプライン構築について触れていければと思う。

あなたの音声AIプロジェクトは、「誰が喋ったか」を解き明かすことで、次のステージへ進む。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?