Strojový překlad · Anglický originál

Smart Turn - Detekce konce-of-Turn

p99 · VAP - Modely

Smart Turn v3.2 odpoví na jednu otázku po VAD reports a pauza: dokončil reproduktor, nebo je to uprostřed věty? Poslouchá zvuk sám - prosody, tempo, intonace - spíše než přepis, kryty 23 jazyky, a běží jednou za pauzu na poslední 8 sekundy zatáčky. Váhy jsou oficiální Pipecat Smart Turn v3.2 uvolnění (BSD-2-Clause), sestaveno CoreML pro platformy Apple a vyvážené do ONNX pro Speech Core.

Proč samotný VAD nestačí

Detektor hlasové aktivity slyší pouze ticho. Lidé zastavují půlvětu k zamyšlení, takže pouze VAD- agent je buď odřízne, nebo čeká dlouhý, pevný timeout po každé větě. Smart Turn potvrzuje každou pauzu: dokončená věta dostane okamžitou odpověď, mid- věta pauza udržuje agenta poslouchat.

Jak to funguje

Smart Turn není VAD a nezaznamenává vlastní řeč. Je spárován s streamingem Silero VADS přiloženým klasifikátorem se potvrzená pauza stává spíše otázkou než verdiktem:

  1. Zeptejte se jednou za pauzu. Když Silero potvrdí pauzu (minSilenceDuration po posunutí prahu), procesor podává klasifikátor zvukové otáčky tak daleko - od 0.5 s před nástupem VAD až do aktuálního kuku, omezena na poslední 8 sekund.
  2. Kompletní. Pravděpodobnost při nebo nad threshold (0.5): .speechEnded požáry jako obvykle.
  3. Vydrž. Pod prahem zůstává segment otevřený. Pokud reproduktor pokračuje, pokračuje stejný segment - žádná druhá .speechStarted - a další potvrzená pauza se ptá znovu s delším otočením.
  4. Tichá čepice. Pokud se dostane mlčení maxSilenceDuration (2.0 s, měřeno od začátku pauzy), segment končí tak jako tak, takže reproduktor, který vede stále dostane odpověď. endTime je místo, kde se řeč zastavila, ne, když čepice vypršela.

flush() udává ustálený segment na konci proudu a reset() Klasifikátor, který hází se počítá jako "kompletní", takže selhávající model nikdy nezastaví konverzaci. isHoldingTurn podává zprávy o stavu držení a lastTurnCompletionProbability Poslední odpověď.

Vzor

VlastnostHodnota
ArchitekturaWhisper- Tiny kodér + soustředění pozornosti + hlava MLP s sigmoidním výstupem
Parametry8.0M
VstupPosledních 8 s mono zvuku 16 kHz (128,000 vzorků); kratší otáčky jsou zepředu 0-padded, ostatní počty vzorků jsou resamovány
VýstupPravděpodobnost v [0, 1], že obrat je kompletní; výchozí práh 0.5
Jazyky23 - arabština, bengálština, čínština, dánština, holandština, angličtina, finština, francouzština, němčina, hindština, indonéština, italština, japonština, korejština, marathi, norština, polština, portugalština, ruština, španělština, turečtina, ukrajinština, vietnamština
LicenceBSD-2-Clause

Vývoz zahrnoval Whisper log- mel front-end, včetně normalizace vlnových forem, s níž byl vyškolen model proti proudu, takže volající projdou syrovým zvukem - v Swift ani C++ není žádná extrakce.

Výkonnost

VývozVelikostPřesnostLatency per 8 s window
CoreML (CPU + Neural Engine)16.8 MB92.9%3.5 ms
ONNX fp32 (ONNX Runtime, CPU)33 MB92.9%~ 36 ms se 2 závity, 20 ms se 4
ONNX int8 (ONNX Runtime, CPU)11.1 MB93.0%~ 36 ms se 2 závity, 20 ms se 4

Přesnost je měřena na klipech 1,000 z testovací sady; CoreML a fp32 ONNX export se shoduje s výstupním modelem fp32 přesně na těchto klipech. Latence je jedno 8- druhé okno na Apple M5 Pro. Jeden hovor za pauzu nepřidává nic znatelného k pauze VAD již čekal.

Swift API

Jednorázová kontrola zaznamenané řeči:

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
}

Připojeno k streamingu VAD, takže každá potvrzená pauza je kontrolována před koncem 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 je v souladu TurnCompletionProvider protokol v AudioCommon, takže každý jiný klasifikátor se stejným tvarem lze připojit místo. fromPretrained(cacheDir:offlineMode:) řídí se stejnými cache a off-line pravidly jako ostatní modely.

VoicePipeline

VoicePipeline bere stejný klasifikátor, takže hlasový agent přestane odříznout lidi beze změny na STT, TTS nebo VAD nastavení. PipelineConfig pole a jedna metoda ji napojit; vyžadují speech-swift v0.0.27 nebo později (SpeechCore.xcframework od 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()
APIVýchozíÚčinek
turnCompletionThreshold0.5Pravděpodobnost dokončení na nebo nad tím, kdy zastavení VAD ukončí zatáčku uživatele. Použije se pouze tehdy, když je přiložen klasifikátor.
turnCompletionMaxSilence2.0Sekundy ticha, měřené od začátku pauzy, po kterých se stejně otočí vetoed klasifikátoru. 0 Nikdy.
setTurnCompletion(_:)—Připevnit TurnCompletionProviderZavolej to dřív, než to uděláš. start(); projít nil Klasifikátor, který hází se počítá jako kompletní, takže selhávající model nikdy nezastaví konverzaci.

S přiloženým klasifikátorem, přestávka VAD končí na místě uživatele, pouze když pravděpodobnost dosáhne prahu; pod ním ropovod stále poslouchá, řeč, která pokračuje ve stejné zatáčce (žádná sekunda speechStarted) a turnCompletionMaxSilence Stejně končí udržovaný obrat. Eager STT respektuje veto, a klasifikátor běží jednou za pauzu na zvukové vlákno, tak volat prewarm() po naložení.

Tuning

NastaveníVýchozíÚčinek
threshold0.5Nižší hodnoty končí dříve a častěji přerušují; vyšší hodnoty vyčkávají déle než odpověď. lastTurnCompletionProbability o opravdových rozhovorech, než s nimi pohnu.
maxSilenceDuration2.0Tvrdé víčko, měřeno od začátku pauzy. Přerušovaná pauza nikdy neudrží zatáčku déle, než je tato. 0 vypne čepice: podržený segment pak čeká na řeč nebo flush().
preRollDuration0.5Audio před nástupem VAD, který je zahrnut do vstupu klasifikátoru, takže svorkovaný první slabika stále dosáhne modelu.

Silero minSilenceDuration stále rozhoduje o tom, kdy je potvrzena pauza, a tedy kdy je požádán o klasifikaci. prewarm() po načtení tak, že první skutečná pauza neplatí za sestavení grafu.

Použití 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
MožnostPříkazPopis
--thresholdturnPravděpodobnost, že při nebo nad kterou se zatáčka počítá jako kompletní (výchozí 0.5)
--jsonturnEmit probability, threshold, complete a latency_ms jako JSON
--model, -mturnHuggingFace repo se stejným rozvržením (výchozí aufklarer/Smart-Turn-v3.2-CoreML)
--model-dirturnLokální držba adresářů smart_turn.mlmodelc a config.json; Přeskočí stahování
--smart-turnvad-streamPotvrďte každou pauzu s Smart Turn před ukončením segmentu
--turn-thresholdvad-streampráh dokončení Smart Turn (výchozí hodnota 0.5)
--turn-max-silencevad-streamSekundy ticha po vetované pauze, která stejně ukončí segment (výchozí 2.0)

speech turn načte soubor (libovolný počet vzorků), načte poslední 8 sekundy a vytiskne pravděpodobnost, zda se vymaže práh a čas inference. Použijte jej k vyladění prahu na vlastních nahrávkách. Úplný seznam příznaku je v seznamu Odkaz na CLI.

C++ / Android

Projev hlavní lodě stejný model jako OnnxSmartTurn pro Linux, Windows a Android (pouze ONNX Runtime; není žádná varianta LiteRT). VoicePipeline::set_turn_completion() Připevňuje to před start(); a VAD pauza pak končí na straně uživatele pouze tehdy, když pravděpodobnost dosáhne turn_completion_threshold (0.5) a turn_completion_max_silence (2.0 s) stejně končí vykonaný obrat. C API vystavuje stejný hák jako sc_turn_completion_vtable_t + sc_pipeline_set_turn_completion(), Takže Kotlin nebo Swift hostitelé mohou přemostit svůj vlastní klasifikátor stejným způsobem jako 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);

V speech CLI Speech Core skóruje stejně jako na macOS:

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

Modelové soubory, smlouva C API a CLI jsou zdokumentovány na Řečnické jádro stránka a v úložišti docs / models.md.

Stáhnout model

VzorBackendVelikostHuggingFace
Smart-Turn-v3.2CoreML16.8 MBaufklarer / Smart-Turn-v3.2-CoreML
Smart-Turn-v3.2ONNX (fp32 + int8)33 MB / 11.1 BNsoniqo/Smart-Turn-v3.2-ONNX

Zdroj