Skip to main content

Penulis

Taishin Maeda - Universiti Waseda

Abstrak

Kertas ini menilai dan membandingkan dua rangka kerja diarisasi penutur sumber terbuka terkini: Pyannote.audio dan Nvidia Nemo. Penilaian memberi tumpuan kepada Diarization Error Rate (DER), masa pelaksanaan, dan penggunaan sumber GPU merentasi senario audio yang berbeza. Selain itu, pendekatan pasca-pemprosesan menggunakan GPT-4-Turbo OpenAI diterokai untuk meningkatkan ketepatan diarisasi. Keputusan Utama:
  • Nvidia Nemo mencapai ~9% DER lebih rendah untuk senario 2 penutur
  • Pyannote.audio berprestasi lebih baik untuk senario berbilang penutur (9+)
  • Pasca-pemprosesan GPT-4-Turbo menunjukkan potensi tetapi memerlukan integrasi konteks audio
  • Aplikasi web diarisasi penutur masa nyata ditunjukkan

1. Pengenalan

Apakah Diarisasi Penutur?

Diarisasi Penutur adalah proses mensegmenkan dan melabelkan audio berdasarkan penutur yang berbeza - menjawab soalan “siapa bercakap bila?” dalam audio yang diberikan. Ia adalah alat analisis perbualan yang penting digabungkan dengan Pengecaman Pertuturan Automatik (ASR).
Saluran Paip Diarisasi Penutur
Sistem diarisasi penutur terdiri daripada:
  1. Pengesanan Aktiviti Suara (VAD) - Cap masa di mana pertuturan berlaku
  2. Model Penyematan Audio - Ekstrak penyematan dari segmen bercap masa
  3. Pengelompokan - Kumpulkan penyematan untuk menganggarkan bilangan penutur

Pyannote.audio

Pyannote.audio adalah kit alat Python sumber terbuka untuk diarisasi penutur dan penyematan penutur berdasarkan PyTorch.

Nvidia Nemo

Nvidia Nemo menggunakan pendekatan yang berbeza dengan segmentasi berbilang skala dan Neural Diarizer (model MSDD) untuk mengendalikan pertuturan bertindih.
Saluran Paip Diarisasi Penutur Nvidia Nemo

Segmentasi Berbilang Skala

Nemo menangani pertukaran antara kualiti pengenalan penutur dan granulariti temporal:
  • Segmen lebih panjang -> Representasi penutur lebih baik, resolusi temporal lebih rendah
  • Segmen lebih pendek -> Representasi kualiti lebih rendah, resolusi temporal lebih tinggi
Segmentasi Berbilang Skala

Perbandingan Rangka Kerja

KomponenPyannote.audioNvidia Nemo
VADPyannet dari SyncnetMultilingual MarbleNet
Penyematan PenuturECAPA-TDNNTitanet Large
PengelompokanHidden Markov ModelPengelompokan Berbilang Skala (MSDD)

2. Kaedah Penilaian

Diarization Error Rate (DER)

Metrik standard untuk diarisasi penutur, diperkenalkan oleh NIST pada tahun 2000:
DER = (False Alarm + Missed Detection + Confusion) / Total
Di mana:
  • False Alarm: Pertuturan dikesan tetapi tiada penutur hadir
  • Missed Detection: Tiada pertuturan dikesan tetapi penutur hadir
  • Confusion: Pertuturan diberikan kepada penutur yang salah
Matlamatnya adalah untuk meminimumkan DER ke arah 0, menunjukkan tiada ralat.

Format Fail RTTM

Rich Transcription Time Marked (RTTM) adalah format standard untuk output diarisasi penutur:
SPEAKER obama_zach(5min).wav 1 66.32 0.27 <NA> <NA> SPEAKER_01 <NA> <NA>
Medan utama: masa mula segmen (66.32), tempoh (0.27), label penutur (SPEAKER_01)

3. Persediaan Eksperimen

Set Data

  1. Audio 5 minit - Dua penutur (temuduga Obama-Zach), dianotasi secara manual menggunakan Audacity
  2. Audio 9 minit - Sembilan penutur dari set data VoxConverse dengan kebenaran asas profesional

Perkakasan

  • GPU: Nvidia GeForce RTX 3090
  • Masa diukur menggunakan modul time Python

Kod Pyannote.audio

from pyannote.audio import Pipeline
import torch

pipeline = Pipeline.from_pretrained(
    "pyannote/speaker-diarization-3.1",
    use_auth_token="your_auth_token"
)
if torch.cuda.is_available():
    pipeline.to(torch.device("cuda"))

def diarization(audio_path):
    diarization = pipeline(audio_path)
    rttm = "SPEAKER {file} 1 {start:.2f} {duration:.2f} <NA> <NA> {speaker} <NA> <NA>"
    return [
        rttm.format(file=audio_path, start=turn.start,
                   duration=turn.duration, speaker=speaker)
        for turn, _, speaker in diarization.itertracks(yield_label=True)
    ]

Kod Nvidia Nemo

from nemo.collections.asr.models import NeuralDiarizer
from omegaconf import OmegaConf

config = OmegaConf.load('diar_infer_telephonic.yaml')
config.diarizer.msdd_model.model_path = 'diar_msdd_telephonic'
config.diarizer.msdd_model.parameters.sigmoid_threshold = [0.7, 1.0]

msdd_model = NeuralDiarizer(cfg=config)
diarization_result = msdd_model.diarize()

4. Keputusan dan Perbincangan

Keputusan DER - Dua Penutur (5 min)

Rangka KerjaDER
Pyannote.audio0.252
Pyannote.audio (penutur dikenal pasti terlebih dahulu)0.214
Nvidia Nemo0.161
Nvidia Nemo (penutur dikenal pasti terlebih dahulu)0.161
Nvidia Nemo menghasilkan kira-kira 9% kurang DER daripada Pyannote.audio untuk senario dua penutur.

Keputusan DER - Sembilan Penutur (9 min)

Rangka KerjaDER
Pyannote.audio0.083
Pyannote.audio (penutur dikenal pasti terlebih dahulu)0.098
Nvidia Nemo (penutur dikenal pasti terlebih dahulu)0.097
Untuk senario berbilang penutur, Pyannote.audio mencapai ~1.4% DER lebih rendah daripada Nvidia Nemo.

Keputusan Pasca-Pemprosesan GPT-4

Rangka KerjaDER GPT-4-TurboDER GPT-3.5
Pyannote (5min, 2 penutur)0.4270.494
Nemo (5min, 2 penutur)0.1790.544
Pyannote (9min, 9 penutur)0.1030.214
Nemo (9min, 9 penutur)0.1280.179
Pasca-pemprosesan GPT-4 menunjukkan DER yang lebih tinggi kerana ia tidak mempunyai akses audio langsung. Menyediakan pemasaan penutur dan konteks audio boleh meningkatkan keputusan.

Prestasi Masa Pelaksanaan

Rangka KerjaAudio 5-minAudio 9-min
Pyannote.audio31.3s44.5s
Pyannote (dikenal pasti terlebih dahulu)29.8s41.5s
Nvidia Nemo63.9s-
Nemo (dikenal pasti terlebih dahulu)49.9s108.2s
Nvidia Nemo mengambil kira-kira dua kali ganda masa pelaksanaan berbanding Pyannote.audio.
Penggunaan GPU untuk Pyannote.audio
Penggunaan GPU untuk Nvidia Nemo

5. Aplikasi Masa Nyata

Aplikasi web diarisasi penutur masa nyata dibangunkan menggunakan:
  • WebSockets untuk penstriman audio
  • FastAPI untuk backend
  • Pyannote.audio untuk diarisasi

Butiran Pelaksanaan Utama

Aplikasi menggunakan potongan audio 3 saat berbanding potongan 30 saat untuk prestasi masa nyata yang lebih baik:
class PyannoteService:
    def __init__(self):
        self.pipeline = Pipeline.from_pretrained(
            "pyannote/speaker-diarization-3.1",
            use_auth_token=config.hugging_face.token,
        )
        self.pipeline.to(torch.device("cuda"))

        self.embedding_model = Model.from_pretrained(
            "pyannote/embedding",
            use_auth_token=config.hugging_face.token
        )
        self.embedding_inference = Inference(
            self.embedding_model, window="whole"
        )

Perbandingan Keputusan

Sebelum Pengubahsuaian Logik Potongan
Selepas Pengubahsuaian Logik Potongan
Logik potongan yang diubahsuai mengurangkan ralat pemasaan dengan ketara dan menyediakan peralihan penutur yang lebih lancar.

6. Kesimpulan

Penemuan Utama

  1. Nvidia Nemo unggul dalam audio yang lebih pendek dengan penutur yang lebih sedikit (DER: 0.161 vs 0.252)
  2. Pyannote.audio berprestasi lebih baik dengan lebih ramai penutur dan apabila bilangan penutur dikenal pasti terlebih dahulu
  3. Pasca-pemprosesan GPT-4 menunjukkan potensi tetapi memerlukan integrasi konteks audio
  4. Masa pelaksanaan: Pyannote.audio adalah kira-kira 2x lebih pantas
  5. Aplikasi masa nyata: Logik potongan yang diubahsuai meningkatkan ketepatan

Kerja Masa Depan

  1. Sesuaikan model Nvidia Nemo untuk senario bukan telefonik
  2. Integrasikan konteks audio ke dalam pasca-pemprosesan GPT
  3. Tala halus ambang pengenalan penutur untuk aplikasi masa nyata
  4. Terokai LLM khusus domain yang dilatih untuk tugas diarisasi

7. Rujukan

  1. NIST Rich Transcription Evaluation (2022)
  2. Nvidia NeMo Documentation - Speaker Diarization
  3. Pyannote.audio GitHub Repository
  4. OpenAI GPT-4 Turbo Documentation
  5. VoxConverse Speaker Diarization Dataset

Penghargaan

  • Akinori Nakajima - Pengarah Wakil VoicePing Corporation
  • Melnikov Ivan - Pembangun AI VoicePing Corporation