Tłumaczenie automatyczne · Oryginał angielski

Smart Turn - wykrywanie zakrętu

p99 · VAP

Smart Turn v3.2 odpowiada na jedno pytanie po VAD raportuje pauzę: czy głośnik skończył, czy jest to zdanie środkowe? Słucha samego dźwięku - prosodia, tempo, intonacja - zamiast transkrypcji, pokrywa 23 języki, i działa raz na pauzę na ostatni 8 Sekundy zakrętu. Wagi są oficjalne Pipecat Smart Turn v3.2 uwalnianieBSD-2-Clause), skompilowane do CoreML w przypadku platform Apple i eksportowanych do ONNX dla Speech Core.

Dlaczego sam VAD nie wystarczy

Czujnik aktywności głosu słyszy tylko ciszę. Ludzie zatrzymują się w połowie zdania, aby myśleć, więc tylko VAD- agent albo odcina je lub czeka długi, ustalony czas po każdym zdaniu. Smart Turn potwierdza każdą pauzę: zakończone zdanie otrzymuje natychmiastową odpowiedź, a środkowe pauza powoduje, że agent słucha.

Jak to działa?

Smart Turn nie jest VAD i nie samodzielnie wykrywa mowy. Silero VADZ dołączonym klasyfikatorem potwierdzona przerwa staje się raczej pytaniem niż werdyktem:

  1. Poproś raz na pauzę. Kiedy Silero potwierdza pauzę (minSilenceDuration po progu offsetu), procesor daje klasyfikator dźwięk z zakrętu do tej pory - od 0.5 Przed VAD początek do bieżącego kawałka, w ostatniej części 8 Sekundy.
  2. Kompletny. Prawdopodobieństwo na lub powyżej threshold (0.5): .speechEnded jak zwykle.
  3. Czekaj. Poniżej progu segment pozostaje otwarty. Jeśli głośnik ponownie, ten sam segment nadal - nie drugi .speechStarted - i następna potwierdzona przerwa prosi ponownie z dłuższym zakrętem.
  4. Kapelusz milczenia. Jeśli cisza dotrze maxSilenceDuration (2.0 s, mierzone od początku przerwy), segment i tak się kończy, więc mówca, który szlaki nadal dostaje odpowiedź. endTime jest miejscem, w którym przemowa ustała, nie wtedy, gdy wygasła nasadka.

flush() ustawia utrzymywany segment na końcu strumienia i reset() Klasyfikator, który rzuca liczy się jako "kompletny", więc wadliwy model nigdy nie blokuje rozmowy. isHoldingTurn raportuje stan przetrzymywania oraz lastTurnCompletionProbability najnowszą odpowiedź.

Wzór

WłasnośćWartość
ArchitekturaWhisper- Tiny encoder + pooling uwagi + głowica MLP z wyjściem sigmoid
Parametry8.0M
WejścieOstatnie 8 s z 16 kHz mono audio (128,000 próbek); krótsze obroty są zero-wyściełane z przodu, inne częstotliwości próbkowania są resemplowane
WyjściePrawdopodobieństwo w [0, 1], że zakręt jest kompletny; próg domyślny 0.5
Języki23 - Arabski, bengalski, chiński, duński, holenderski, angielski, fiński, francuski, niemiecki, hindi, indonezyjski, włoski, japoński, koreański, marathi, norweski, polski, portugalski, rosyjski, hiszpański, turecki, ukraiński, wietnamski
LicencjaBSD-2-Clause

Eksport osadził Whisper log- mel front- end, w tym normalizację fali model wyższego szczebla został przeszkolony, więc dzwoniący przechodzą surowe audio - nie ma ekstrakcji funkcji w Swift lub C++.

Wydajność

EksportRozmiarDokładnośćOpóźnienie na 8 oknach
CoreML (CPU + Neural Engine)16.8 MB92.9%3.5 ms
ONNX fp32 (ONNX Runtime, CPU)33 MB92.9%~ 36 ms z 2 nitkami, 20 ms z 4
ONNX int8 (ONNX Runtime, CPU)11.1 MB93.0%~ 36 ms z 2 nitkami, 20 ms z 4

Dokładność mierzy się na 1,000 klipy z zestawu do badań na początku badania; CoreML oraz fp32 ONNX eksport pasuje do wyższego szczebla fp32 model dokładnie na tych klipach. 8- drugie okno na Apple M5 Pro. Jedno wywołanie na pauzę nie dodaje nic zauważalnego do pauzy VAD Już na to czekałam.

Swift API

Jeden strzał sprawdzić na nagranej wypowiedzi:

import SpeechVAD

let turn = try await SmartTurnModel.fromPretrained()
try turn.prewarm()   // compile the graph before the first real pause

let probability = try turn.turnCompleteProbability(
    audio: utterance, sampleRate: 16_000)
if probability >= SmartTurnModel.defaultThreshold {
    // finished turn — reply now
}

Dołączony do strumieniowego strumieniowego VAD, więc każda potwierdzona pauza jest sprawdzana przed zakończeniem segmentu:

let vad = try await SileroVADModel.fromPretrained(engine: .coreml)
let turn = try await SmartTurnModel.fromPretrained()

let processor = StreamingVADProcessor(
    model: vad,
    config: .sileroDefault,
    turnCompletion: turn,
    turnCompletionConfig: TurnCompletionConfig(threshold: 0.5, maxSilenceDuration: 2.0))

for chunk in microphoneChunks {            // Float32 @ 16 kHz
    for event in processor.process(samples: chunk) {
        switch event {
        case .speechStarted(let time): print("speech at \(time)s")
        case .speechEnded(let segment): print("turn \(segment.startTime)–\(segment.endTime)s")
        }
    }
}
let remaining = processor.flush()

SmartTurnModel jest zgodny z TurnCompletionProvider protokół w AudioCommon, więc każdy inny klasyfikator o tym samym kształcie może być przymocowany zamiast. fromPretrained(cacheDir:offlineMode:) stosuje się do tych samych zasad cache i offline co inne modele.

VoicePipeline

VoicePipeline pobiera ten sam klasyfikator, tak że czynnik głosowy przestaje odcinać ludzi bez zmiany konfiguracji STT, TTS lub VAD. Dwa PipelineConfig pola i jedna metoda podłączyć go; wymagają one speech-swift v0.0.27 lub później (SpeechCore.xcframework z speech-core v0.0.14).

import SpeechCore
import SpeechVAD

let smartTurn = try await SmartTurnModel.fromPretrained()
try smartTurn.prewarm()

var config = PipelineConfig()
config.turnCompletionThreshold = 0.5   // pause ends the turn when p >= this
config.turnCompletionMaxSilence = 2.0  // seconds of silence that end a held turn anyway; 0 = never

let pipeline = VoicePipeline(stt: stt, tts: tts, vad: vad, config: config, onEvent: { print($0) })
pipeline.setTurnCompletion(smartTurn)   // before start(); nil detaches
pipeline.start()
APIDomyślneEfekt
turnCompletionThreshold0.5Prawdopodobieństwo ukończenia, na którym przerwa VAD kończy kolej użytkownika. Używany tylko po dołączeniu klasyfikatora.
turnCompletionMaxSilence2.0 sSekundy ciszy, mierzone od początku pauzy, po której skręt weta klasyfikatora i tak się kończy. 0 = nigdy.
setTurnCompletion(_:)—Dołącza dowolny TurnCompletionProviderZadzwoń wcześniej. start(); pass nil Klasyfikator, który rzuca liczy się jako kompletny, więc wadliwy model nigdy nie blokuje rozmowy.

Z dołączonym klasyfikatorem, pauza VAD kończy obrót tylko wtedy, gdy prawdopodobieństwo osiągnie próg; poniżej gazociąg nadal słucha, mowa, która wznawia kontynuuje ten sam obrót (nie drugi speechStarted), oraz turnCompletionMaxSilence i tak kończy się ruch. Eager STT szanuje weto, a klasyfikator działa raz na pauzę na gwincie audio, więc wywołaj prewarm() po załadunku.

Dostrajanie

UstawienieDomyślneEfekt
threshold0.5Niższe wartości kończą się szybciej i częściej przerywać; wyższe wartości czekają dłużej przed odpowiedzią. Oglądaj lastTurnCompletionProbability na prawdziwych rozmowach przed przenoszeniem go.
maxSilenceDuration2.0 sTwarda nasadka, mierzona od początku przerwy. Zawetowana przerwa nigdy nie utrzyma zakrętu dłużej niż to. 0 wyłącza nasadkę: trzymany segment, a następnie czeka na mowę lub flush().
preRollDuration0.5 sAudio przed początkiem VAD, który jest zawarty w wejściu klasyfikatora, więc klipowana pierwsza sylaba nadal dociera do modelu.

Silero minSilenceDuration nadal decyduje, kiedy pauza jest potwierdzona, a zatem, kiedy classifier jest proszony. prewarm() po załadowaniu, więc pierwsza prawdziwa pauza nie płaci za kompilację wykresu.

Zastosowanie CLI

# Probability, complete/incomplete verdict and inference time for one utterance
speech turn utterance.wav

# Custom threshold, JSON output
speech turn utterance.wav --threshold 0.7 --json

# Local bundle, no download
speech turn utterance.wav --model-dir ~/smart-turn-coreml

# Streaming VAD with Smart Turn confirming each pause; mid-sentence pauses merge
speech vad-stream call.wav --smart-turn
speech vad-stream call.wav --smart-turn --turn-threshold 0.6 --turn-max-silence 1.5
OpcjaPolecenieOpis
--thresholdturnPrawdopodobieństwo, że zakręt jest kompletny lub wyższy (domyślnie 0.5)
--jsonturnEmit probability, threshold, complete oraz latency_ms jako JSON
--model, -mturnHuggingFace repo z tym samym układem (domyślnie aufklarer/Smart-Turn-v3.2-CoreML)
--model-dirturnLocal directory holding smart_turn.mlmodelc oraz config.json; pomija pobieranie
--smart-turnvad-streamPotwierdź każdą przerwę za pomocą Smart Turn przed zakończeniem segmentu
--turn-thresholdvad-streamPróg zakończenia Smart Turn (domyślnie 0.5)
--turn-max-silencevad-streamSekundy ciszy po zawetowanej pauzie, która i tak kończy segment (domyślnie 2.0)

speech turn ładuje plik (jakakolwiek częstotliwość próbkowania), zdobywa ostatnie sekundy 8 i drukuje prawdopodobieństwo, czy oczyszcza próg, i czas trwania wnioskowania. Użyj go, aby dostroić próg na własnych nagraniach. Pełna lista flag znajduje się na Odniesienie do CLI.

C++ / Android

Przemowa Rdzeń statków ten sam model jak OnnxSmartTurn dla Linux, Windows i Android (tylko ONNX Runtime; nie ma wariantu LiteRT). VoicePipeline::set_turn_completion() przymocowuje go wcześniej start(); a VAD pauza wtedy kończy kolej użytkownika tylko wtedy, gdy prawdopodobieństwo osiągnie turn_completion_threshold (0.5), oraz turn_completion_max_silence (2.0 s) i tak kończy się obrotem. API eksponuje ten sam hak co sc_turn_completion_vtable_t + sc_pipeline_set_turn_completion(), więc Kotlin lub Swift hosty mogą mostkować swój własny klasyfikator w taki sam sposób jak VAD.

#include <speech_core/models/onnx_smart_turn.h>

speech_core::OnnxSmartTurn model("/models/smart-turn-v3.2-int8.onnx");

// Audio of the turn so far at any rate (resampled to 16 kHz internally).
float p = model.turn_complete_probability(turn.data(), turn.size(), rate);

// Or let the pipeline ask it on every VAD pause (before start()).
pipeline.set_turn_completion(&model);

W speech CLI of Speech Core zdobywa nagranie w taki sam sposób jak na macOS:

speech download-models        # fetches the int8 graph with the other ONNX models
speech turn recording.wav --threshold 0.5 --json

Pliki modelu, kontrakt C API i CLI są udokumentowane na Rdzeń przemowy strona i w repozytorium docs / models.md.

Pobieranie modeli

WzórWsteczRozmiarHuggingFace
Smart-Turn-v3.2CoreML16.8 MBaufklarer / Smart-Turn-v3.2-CoreML
Smart-Turn-v3.2ONNX (fp32 + int8)33 MB / 11.1soniqo/Smart-Turn-v3.2-ONNX

Źródło