Maskinöversättning · Engelskt original

Smart Turn - End-of-Turn Detection

p99 VAP -- Models

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.

Varför en VAD ensam är inte tillräckligt

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:

  1. Fråga en gång per paus. När Silero bekräftar en paus (minSilenceDuration efter 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.
  2. Complete. Sannolikhet vid eller över threshold (0.5): .speechEnded bränder som vanligt.
  3. 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.
  4. 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. segmentets endTime ä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

FastighetVärde
ArkitekturWhisper-Tiny encoder + uppmärksamhet pooling + MLP huvud med sigmoid utgång
Parametrar8.0M
InputSista 8 s av 16 kHz mono ljud (128.000 prover); kortare svängar är noll vadderade på framsidan, andra prov priser återförsäljs
OutputSannolikheten i [0, 1] att turen är fullständig; standardtröskeln 0,5
Språk23 - Arabiska, Bengali, kinesiska, danska, holländska, engelska, finska, franska, tyska, hindi, indonesiska, italienska, japanska, koreanska, maraton, norska, polska, portugisiska, ryska, spanska, turkiska, ukrainska, vietnamesiska,
LicensBSD-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

ExportStorlekNoggrannhetLatency per 8 s fönster
CoreML (CPU + Neural Engine)16,8 MB92.9%3,5 ms
ONNX fp32 (ONNX Runtime, CPU)33 MB92.9%~36 ms med 2 trådar, 20 ms med 4
ONNX int8 (ONNX Runtime, CPU)11.1 MB93.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()
APIStandardEffekt
turnCompletionThreshold0.5Slutför sannolikheten vid eller över vilken en VAD paus slutar användarens tur. Används endast när en klassificering är bifogad.
turnCompletionMaxSilence2.0 sSekunder 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ällningStandardEffekt
threshold0.5Lä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.
maxSilenceDuration2.0 sHå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().
preRollDuration0,5 sLjud 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
AlternativKommandoBeskrivning
--thresholdturnSannolikhet vid eller över vilken vändningen räknas som fullständig (standard 0,5)
--jsonturnEmit probability, threshold, complete och latency_ms Som JSON
--model, -mturnHuggingFace repo med samma layout (standard aufklarer/Smart-Turn-v3.2-CoreML)
--model-dirturnLokal katalog innehav smart_turn.mlmodelc och config.json; hoppar över nedladdningen
--smart-turnvad-streamBekräfta varje paus med Smart Turn innan du slutar ett segment
--turn-thresholdvad-streamSmart Turn slutförandegräns (standard 0.5)
--turn-max-silencevad-streamSekunder 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

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

Källa