Maskinöversättning · Engelskt original
Smart Turn - End-of-Turn Detection
Smart Turn v3.2 svarar på en fråga efter VAD rapporterar en paus: har högtalaren avslutats, eller är de mitten av meningen? Det lyssnar på ljudet självt - prosody, takt, intonation - snarare än ett utskrift, täcker 23 språk och körs en gång per paus på sista 8 sekunder av turen. Vikterna är den officiella pipecat Smart Turn v3.2 frisläppande (BSD-2-Clause), sammanställd till CoreML för Apple-plattformar och exporteras till ONNX För tal Core.
En röstaktivitetsdetektor hör bara tystnad. Människor pausar mitten av meningen att tänka, så en VAD-bara agent antingen skär dem eller väntar en lång, fast timeout efter varje mening. Smart Turn bekräftar varje paus: en färdig mening får ett omedelbart svar, en mellansyn paus håller agenten lyssna.
Hur det fungerar
Smart Turn är inte en VAD och detekterar inte tal på egen hand. Det är parat med streaming Silero VAD, som bestämmer sig för att fråga. Med en klassificeringsansluten blir en bekräftad paus en fråga snarare än en dom:
- Fråga en gång per paus. När Silero bekräftar en paus (
minSilenceDurationefter kompensationströskeln) gör processorn klassificerar ljudet av svängningen så långt - från 0,5 s före VAD inställd upp till den nuvarande chunk, kapad på de senaste 8 sekunderna. - Complete. Sannolikhet vid eller över
threshold(0.5):.speechEndedbränder som vanligt. - Hold. Nedanför tröskeln förblir segmentet öppet. Om högtalaren återupptar fortsätter samma segment - ingen andra
.speechStarted- och nästa bekräftade paus frågar igen med den längre svängningen. - Silence cap. Om tystnaden når
maxSilenceDuration(2,0 s, mätt från början av pausen), slutar segmentet ändå, så en högtalare som spårar av fortfarande får ett svar. segmentetsendTimeär där talet stannade, inte när locket löpte ut.
flush() avgör ett hållet segment i slutet av strömmen och reset() rensar det. En klassificerare som kastar räknas som "fullständig", så en misslyckad modell stallar aldrig konversationen. isHoldingTurn rapporterar hold state och lastTurnCompletionProbability det senaste svaret.
Modell
| Fastighet | Värde |
|---|---|
| Arkitektur | Whisper-Tiny encoder + uppmärksamhet pooling + MLP huvud med sigmoid utgång |
| Parametrar | 8.0M |
| Input | Sista 8 s av 16 kHz mono ljud (128.000 prover); kortare svängar är noll vadderade på framsidan, andra prov priser återförsäljs |
| Output | Sannolikheten i [0, 1] att turen är fullständig; standardtröskeln 0,5 |
| Språk | 23 - Arabiska, Bengali, kinesiska, danska, holländska, engelska, finska, franska, tyska, hindi, indonesiska, italienska, japanska, koreanska, maraton, norska, polska, portugisiska, ryska, spanska, turkiska, ukrainska, vietnamesiska, |
| Licens | BSD-2-Clause |
Exporten bäddade in Whisper log-mel front-end, inklusive vågform normalisering uppströms modellen utbildades med, så kallare passerar rå ljud - det finns ingen funktion utvinning i Swift eller C++.
Prestanda
| Export | Storlek | Noggrannhet | Latency per 8 s fönster |
|---|---|---|---|
| CoreML (CPU + Neural Engine) | 16,8 MB | 92.9% | 3,5 ms |
| ONNX fp32 (ONNX Runtime, CPU) | 33 MB | 92.9% | ~36 ms med 2 trådar, 20 ms med 4 |
| ONNX int8 (ONNX Runtime, CPU) | 11.1 MB | 93.0% | ~36 ms med 2 trådar, 20 ms med 4 |
Noggrannhet mäts på 1,000-klipp från den uppströms testuppsättningen; CoreML och fp32 ONNX export matchar den uppströmda fp32 modellen exakt på dessa klipp. Latency är en 8 sekund fönster på en Apple M5 Pro. En samtal per paus lägger inget märkbart till pausen VAD redan väntade på.
Swift API
En-shot check på en inspelad yttrande:
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
}
Bifogad till streaming VAD, så varje bekräftad paus kontrolleras innan ett segment slutar:
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 överensstämmer med TurnCompletionProvider-protokollet i AudioCommon, så att alla andra klassificerare med samma form kan fästas istället. fromPretrained(cacheDir:offlineMode:) följer samma cache och offline regler som de andra modellerna.
VoicePipeline
VoicePipeline tar samma klassificerare, så en röstagent slutar skära människor utan någon förändring till STT, TTS eller VAD-inställningen. PipelineConfig fält och en metod trådar in den; de kräver speech-swift v0.0.27 eller senare (SpeechCore.xcframework från 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 | Standard | Effekt |
|---|---|---|
turnCompletionThreshold | 0.5 | Slutför sannolikheten vid eller över vilken en VAD paus slutar användarens tur. Används endast när en klassificering är bifogad. |
turnCompletionMaxSilence | 2.0 s | Sekunder av tystnad, mätt från början av pausen, varefter en vändning klassificeraren vetoed slutar ändå. 0 = aldrig. |
setTurnCompletion(_:) | — | Fäster någon TurnCompletionProvider. Ring det före start(); passera nil för att lossa. En klassificerare som kastar räknas som komplett, så en misslyckande modell stallar aldrig konversationen. |
Med en klassificerare bifogad slutar en VAD-paus bara användarens tur när sannolikheten når tröskeln; under den fortsätter rörledningen att lyssna, tal som återupptar fortsätter samma sväng (ingen sekund). speechStarted), och turnCompletionMaxSilence slutar den hållna turen ändå. Eager STT respekterar veto, och klassificeraren körs en gång per paus på ljudtråden, så ring prewarm() Efter lastning.
Tuning
| Inställning | Standard | Effekt |
|---|---|---|
threshold | 0.5 | Lägre värden slutar vända förr och avbryta oftare; högre värden väntar längre innan du svarar. Titta på lastTurnCompletionProbability på riktiga samtal innan du flyttar den. |
maxSilenceDuration | 2.0 s | Hårt lock, mätt från början av pausen. En vetoed paus kan aldrig hålla svängen längre än detta. 0 inaktiverar locket: ett hållet segment väntar sedan på tal eller flush(). |
preRollDuration | 0,5 s | Ljud före VAD start som ingår i klassificeringsinmatningen, så en klippt första stavelse når fortfarande modellen. |
Silero minSilenceDuration bestämmer fortfarande när en paus bekräftas, och därför när klassificeraren tillfrågas. Call prewarm() efter lastning så att den första riktiga pausen inte betalar för grafkompilering.
CLI Användning
# 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
| Alternativ | Kommando | Beskrivning |
|---|---|---|
--threshold | turn | Sannolikhet vid eller över vilken vändningen räknas som fullständig (standard 0,5) |
--json | turn | Emit probability, threshold, complete och latency_ms Som JSON |
--model, -m | turn | HuggingFace repo med samma layout (standard aufklarer/Smart-Turn-v3.2-CoreML) |
--model-dir | turn | Lokal katalog innehav smart_turn.mlmodelc och config.json; hoppar över nedladdningen |
--smart-turn | vad-stream | Bekräfta varje paus med Smart Turn innan du slutar ett segment |
--turn-threshold | vad-stream | Smart Turn slutförandegräns (standard 0.5) |
--turn-max-silence | vad-stream | Sekunder av tystnad efter en vetoad paus som slutar segmentet ändå (standard 2.0) |
speech turn laddar filen (någon provfrekvens), gör de senaste 8 sekunderna och skriver ut sannolikheten, oavsett om det rensar tröskeln och inferenstiden. Använd den för att ställa in tröskelvärdet på dina egna inspelningar. Den fullständiga flagglistan finns i CLI-referensen .
C++ / Android
Speech Core levererar samma modell som OnnxSmartTurn för Linux, Windows och Android (ONNX Runtime endast; det finns ingen LiteRT variant). VoicePipeline::set_turn_completion() fäster den innan start()En VAD paus slutar sedan bara användarens tur när sannolikheten når turn_completion_threshold (0.5) och turn_completion_max_silence (2.0) slutar en hållen sväng ändå. C API exponerar samma krok som sc_turn_completion_vtable_t + sc_pipeline_set_turn_completion()Kotlin eller Swift värdar kan överbrygga sin egen klassificerare på samma sätt som 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);
speech CLI of Speech Core gör en inspelning på samma sätt som på macOS:
speech download-models # fetches the int8 graph with the other ONNX models
speech turn recording.wav --threshold 0.5 --json
Modellfiler, C API kontrakt och CLI dokumenteras på sidan Speech Core och i förvarets docs/models.md.
Modell nedladdningar
| Modell | Backend | Storlek | 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 MB | soniqo/Smart-Turn-v3.2-ONNX |
Källa
- Källor/SpeechVAD --
SmartTurnModelochStreamingVADProcessor - docs/models/smart-turn-v3.md -- modellanteckningar
- docs/inference/smart-turn.md -- inferens och tuning
- speech-core docs/models.md --
OnnxSmartTurn - Uppströms: pipecat-ai/smart-turn/pipecat–ai/smart-turn-v3 (Daily/Pipecat, BSD-2-Clause)