Closed10

Speaker Identification

kun432kun432

音声認識における「話者」関連の処理は以下のようなものがある(ChatGPTしらべ)

英語 よく使われる日本語訳 主な役割 ユースケース
speaker diarization 話者分離 /
話者ダイアライぜーション
音声を時間で区切って「誰がいつ話したか」をラベル付けする 会議録で「話者A / 話者B」を自動で振り分ける、マルチスピーカの会話ログ作成
speaker segmentation 話者セグメンテーション 音声を話者変化点などで区切る(境界を見つける) 一般的にはspeaker diarizationとセットで使用される。
speaker recognition 話者認識 /
話者識別(広義)
声から「誰か」を判別する処理の総称 音声ログから同一人物かどうかざっくり見分ける
speaker verification 話者照合 /
話者認証
「この声は本当にXさんか?」をYes/Noで判定 声紋を使った本人認証(ログイン、電話での本人確認など)
speaker identification 話者識別 /
話者特定
候補リストの中から「この声は誰か」を当てる 登録済みユーザ数十人の中から話者を特定する

日本語だと 「話者識別」「話者認識」 の区別がちょっとゆるめに使われているかな、自分も結構適当な言い方をしているかも。話者分離とかは「ダイアライぜーション」とそのまま使われていることも多い印象。

speaker diarizationは、最近のASRだとほぼほぼ対応していることが多くて、"Speaker 1"、"Speaker 2" みたいな話者IDがラベルとして付与される。ただし、その入力音声「内」の区別としてのラベルなので、異なる音声データを渡しても同じようなラベリングになるし、話者IDが特定の話者を示すものではない。

特定話者を識別するのは、speaker identification になるが、ASRサービスで対応しているものはほとんどないように思う。speaker identificationの場合は固有の音声から特徴量を抽出して類似度を図るといった仕組みになるので、事前に話者の音声データとラベルを用意する必要がある。まあASRサービスからするとspeaker diarizationにもうひと手間加えることになるし、ビジネスとしてそこまでのニーズがないのかもしれない。

kun432kun432

いろいろ調べてみると、話者ダイアライぜーションについてはいろいろ情報があって、定番は pyannote.audio を使う方法。

https://dev.classmethod.jp/articles/pyannote-intro/

https://book.st-hakky.com/docs/whisper-pyannote-diarization

https://qiita.com/sayo0127/items/e22fdc229d2dfd879f75

https://zenn.dev/morioka/scraps/b13316c2660ed0

自分も過去試している

https://zenn.dev/kun432/scraps/da47e9a971b117

で、speaker identification になると情報が一気に少なくなるけど、どうやらpyannote.audioで使えるモデルがあるみたい

https://huggingface.co/pyannote/wespeaker-voxceleb-resnet34-LM

pyannoteがやってるクラウドサービスでも対応している

https://docs.pyannote.ai/tutorials/identification-with-voiceprints

kun432kun432

あとASRプロバイダーのGradiaが出している記事に、話者識別のPoC実装をしている記事があった。

https://www.gladia.io/blog/build-a-speaker-identification-system-for-online-meetings

ざっと見た感じ、pyannoteの話者ダイアライぜーションモデルと SpeechBrainというところの話者識別モデルを組み合わせている様子

https://huggingface.co/speechbrain/spkrec-ecapa-voxceleb

ここでもpyannote.audioよりSpeechBrainがおすすめされていた

https://x.com/hbredin/status/1588093777113223169

あとこのスレには他にもいろいろ話者識別関連のリンクがある

pyannote自身がだしている話者embeddingモデルみたい

https://huggingface.co/pyannote/embedding

NVIDIAのドキュメント

https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/asr/speaker_recognition/intro.html

スレ主が提供している音声embeddingツールキットらしい
https://github.com/wenet-e2e/wespeaker

キーワード検出用もある
https://github.com/wenet-e2e/wekws

kun432kun432

VOSK でもできるっぽいが、ドキュメントが皆無・・・

https://github.com/alphacep/vosk-api/issues/405

サンプルコードっぽいものはレポジトリ内にある。

https://github.com/alphacep/vosk-api/blob/master/python/example/test_speaker.py

ここにSpeaker identification model (vosk-model-spk-0.4)があるのでこれを使えばよさそう。

https://alphacephei.com/vosk/models

embeddingはどうやってつくればいいのかな?と思ったけど、上のコードの中で比較してるところから引っ張れば良さそう。

kun432kun432

次はpyannote.audio。

これがpyannote公式の音声ベクトル化モデルかな、ただしpyannote.audio 2.1に依存しているらしい(今のpyannote.audioの最新バージョンは4)

https://huggingface.co/pyannote/embedding

もう一つ、こちらはWeSpeakerが提供しているモデルの一部を、pyannote.audioがラッパーという形で使えるようにしているみたい。

https://huggingface.co/pyannote/wespeaker-voxceleb-resnet34-LM

後者は多く使われている定番パターンのようなので、試してみた。

https://zenn.dev/kun432/scraps/6c08085364c614

このスクラップは17日前にクローズされました