Diaryzacja mówców w czasie rzeczywistym na dużą skalę
July 20, 2025
•min read
Inżynieria
Rysunek 1: rozdzielanie strumieni audio w czasie rzeczywistym
Problem „cocktail party”
Ludzie świetnie skupiają się na jednym głosie w hałaśliwym pomieszczeniu. Komputery mają z tym trudność.
W jednokanałowym połączeniu VoIP (typowym dla starszej telefonii) konsultant i klient są zmieszani w jeden strumień.
Aby zbudować agenta AI, który wie, kiedy przerwać, musisz wiedzieć, kto mówi.
Architektura
1. Embedding na poziomie ramki
Dzielimy dźwięk na okna po 500 ms i przepuszczamy je przez lekki koder (SpeechBrain ECAPA-TDNN).
Wynik: wektor 192-wymiarowy opisujący „barwę” tego wycinka.
2. Architektura hybrydowa
Odeszliśmy od diaryzacji wykonywanej wyłącznie w aplikacji (Pyannote) na rzecz podejścia hybrydowego:
- Diaryzacja zewnętrzna: pobieramy wstępnie zdiaryzowane segmenty z wysokoprzepustowych API (takich jak Google speech-to-text lub OpenAI).
- Weryfikacja wewnętrzna: lokalnie uruchamiamy naszą 192-wymiarową weryfikację ECAPA-TDNN, aby „sprawdzić ponownie” i powiązać tożsamości ze znanymi profilami głosu.
3. Ograniczenia opóźnień
API w chmurze zajmują się mapą „kto i kiedy mówił?”.
IdentityCall zajmuje się weryfikacją „czy to konsultant X?”.
- Budżet: 50ms czasu przetwarzania na ramkę na weryfikację.
- Optymalizacja: uruchamiamy koder w ONNX Runtime na GPU, skwantyzowany do INT8.
Obsługa nakładania się mowy
Najtrudniejsza część to „nakładająca się mowa” (około 10-15% połączenia).
Standardowe modele wybierają „najgłośniejszego” mówcę.
Używamy diaryzacji wieloetykietowej, przypisując dwie etykiety mówców do jednego przedziału czasu, jeśli embedding sugeruje mieszaninę.
Podsumowanie
Dobra diaryzacja to warunek wstępny dobrej transkrypcji. Jeśli przypiszesz „Dzień dobry” konsultanta klientowi, cały Twój kontekst startuje z błędem.
Tags: