Strojový překlad · Anglický originál
Smart Turn - Detekce konce-of-Turn
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.
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:
- Zeptejte se jednou za pauzu. Když Silero potvrdí pauzu (
minSilenceDurationpo 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. - Kompletní. Pravděpodobnost při nebo nad
threshold(0.5):.speechEndedpožáry jako obvykle. - 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. - 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ěď.endTimeje 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
| Vlastnost | Hodnota |
|---|---|
| Architektura | Whisper- Tiny kodér + soustředění pozornosti + hlava MLP s sigmoidním výstupem |
| Parametry | 8.0M |
| Vstup | Poslední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ýstup | Pravděpodobnost v [0, 1], že obrat je kompletní; výchozí práh 0.5 |
| Jazyky | 23 - 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 |
| Licence | BSD-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ývoz | Velikost | Přesnost | Latency per 8 s window |
|---|---|---|---|
| CoreML (CPU + Neural Engine) | 16.8 MB | 92.9% | 3.5 ms |
| ONNX fp32 (ONNX Runtime, CPU) | 33 MB | 92.9% | ~ 36 ms se 2 závity, 20 ms se 4 |
| ONNX int8 (ONNX Runtime, CPU) | 11.1 MB | 93.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()
| API | Výchozí | Účinek |
|---|---|---|
turnCompletionThreshold | 0.5 | Pravdě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. |
turnCompletionMaxSilence | 2.0 | Sekundy 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 |
|---|---|---|
threshold | 0.5 | Nižší 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. |
maxSilenceDuration | 2.0 | Tvrdé 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(). |
preRollDuration | 0.5 | Audio 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žnost | Příkaz | Popis |
|---|---|---|
--threshold | turn | Pravděpodobnost, že při nebo nad kterou se zatáčka počítá jako kompletní (výchozí 0.5) |
--json | turn | Emit probability, threshold, complete a latency_ms jako JSON |
--model, -m | turn | HuggingFace repo se stejným rozvržením (výchozí aufklarer/Smart-Turn-v3.2-CoreML) |
--model-dir | turn | Lokální držba adresářů smart_turn.mlmodelc a config.json; Přeskočí stahování |
--smart-turn | vad-stream | Potvrďte každou pauzu s Smart Turn před ukončením segmentu |
--turn-threshold | vad-stream | práh dokončení Smart Turn (výchozí hodnota 0.5) |
--turn-max-silence | vad-stream | Sekundy 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
| Vzor | Backend | Velikost | HuggingFace |
|---|---|---|---|
| Smart-Turn-v3.2 | CoreML | 16.8 MB | aufklarer / Smart-Turn-v3.2-CoreML |
| Smart-Turn-v3.2 | ONNX (fp32 + int8) | 33 MB / 11.1 BN | soniqo/Smart-Turn-v3.2-ONNX |
Zdroj
- Zdroje / SpeechVAD —
SmartTurnModelaStreamingVADProcessor - docs / models / smart-turn-v3.md - vzorové poznámky
- docs / inference / smart-turn.md - odvodnění a ladění
- speech-core docs / models.md —
OnnxSmartTurn - Vnější proud: pipecat- ai / smart- turn / pipecat- ai / smart-turn-v3 (Denní / Pipecat, BSD-2-Clause)