Awtomatikong salin · Orihinal sa Ingles

Smart Turn — End-of-turn Diagnosis

p99 · VAP — Mga Modelo

Smart Turn v3.2 ang sagot ng isang tanong pagkatapos ng VAD Nagpapahinto: tapos na ba ang tagapagsalita, o ang mga ito ba'y mid-sensentence? Ito'y nakikinig sa audio mismo — prosody, bilis, tono — sa halip na isang transcription, mga pabalat 23 wika, at tumakbo nang minsan sa bawat sandali sa huli 8 Mga segundo ng pag-ikot. Ang mga pabigat ay ang opisyal na Pipecat Smart Turn v3.2 (IsinilangBSD-2-Clause), tinipon CoreML para sa mga plataporma ng mansanas at iniluluwas sa ibang bansa ONNX para sa Speak Core.

Kung bakit ang VAD lamang ay hindi sapat

Ang isang voice activity detector ay nakaririnig lamang ng katahimikan.Ang mga tao ay humihinto sa mid-sentence upang mag-isip, kaya ang isang VAD-lamang agent ay alin sa nagpuputol sa kanila o naghihintay ng isang mahaba at nakapirmeng timeout pagkatapos ng bawat pangungusap. Smart Turn ay nagpapatunay sa bawat paghinto: ang isang tapos na pangungusap ay nakakakuha agad ng isang tugon, ang isang mid-sence ay nagpapanatili sa ahente na nakikinig.

Kung paano ito gumagana

Ang Smart Turn ay hindi isang VAD at hindi natutukoy ang pagsasalita sa ganang sarili nito. Ito ay katambal ng dumadaloy na ekwasyon. Silero VAD, na nagpapasiya kung kailan magtatanong. Dahil sa nakakabit na classifier, ang isang natiyak na sandaling paghinto ay nagiging isang tanong sa halip na isang hatol:

  1. Tanungin minsan sa bawat sandali. Kapag ang Silero ay nagpatunay ng paghinto (.minSilenceDuration Pagkatapos ng pasukang offset), ang processor ay nag - aanunsyo sa audio of the turve — mula sa 0.5 s bago ang VAD na nagsisimula hanggang sa kasalukuyang scaffle, na nasa huling 8 segundo.
  2. Kumpleto. Kakayahan sa o sa itaas threshold (0.5): .speechEnded gaya ng dati.
  3. Hawak. Kung ang tagapagsalita ay magpapatuloy, ang bahagi ring iyon ay nagpapatuloy — hindi ikalawang bahagi .speechStarted — at ang sumunod na tiniyak na paghinto ay muling nagtatanong nang mas matagal.
  4. Tahimik na gora. Kapag sumapit ang katahimikan maxSilenceDuration (2.0 s, sinusukat mula sa simula ng paghinto), ang bahagi ay natatapos pa rin, kaya ang tagapagsalita na bumaba ay tumatanggap pa rin ng sagot. endTime ay kung saan huminto ang talumpati, hindi nang matapos ang takip.

flush() ang bahaging hawak sa dulo ng batis at reset() Ang isang classifier na nagpapalagay na "kumpleto", kaya ang isang bigong modelo ay hindi kailanman nagreresulta sa usapan. isHoldingTurn ulat ngwist state at lastTurnCompletionProbability ang pinakahuling sagot.

Huwaran

Mga ari - arian Halaga
ArkitekturaWhisper-Tony Despresser + pagtutuon ng pansin + MLP head na may segmoid output
Mga Parameter8.0M
Ilagay Huling 8 s ng 16 kHz mono audio (128,000 sampol); mas maikling mga ikot ay sero-pandido sa harapan, ang ibang sampol na rate ay rempated
IlabasSang - ayon sa [0, 1] na ang ikot ay kumpleto; default circulation 0.5.
Wika23 — Arabe, Bengali, Intsik, Danes, Olandes, Ingles, Pinlandes, Pranses, Aleman, Hindi, Indonesian, Italyano, Hapones, Koreano, Marathi, Norwego, Polako, Portuges, Ruso, Kastila, Turko, Ukrainian, Vietnamese
LisensiyaBSD-2-Clause

Ang mga iniluluwas na Whisper log-mel front-end, kabilang na ang waveform normalisation ang modelong pang-itaas ay sinanay, kaya ang mga tumatawag ay nagpapasa ng hilaw na audio – walang tampok na pag-eebolb sa Swift o C++.

Pag - aasikaso

Pag - aalis Laki Pagiging MakatuwiranLatensiya sa bawat 8 s window
CoreML (CPU + Neural Engine)16.8 MB92.9%3.5 ms
ONNX fp32 (ONNX Runtime, CPU)33 MB92.9%°36 ms na may 2 sinulid, 20 m na may 4
ONNX int8 (ONNX Runtime, CPU)11.1 MB93.0%°36 ms na may 2 sinulid, 20 m na may 4

Sinusukat ang pagiging tumpak 1,000 Mga clip mula sa pagsubok sa gawing itaas ng ilog; ang CoreML at fp32 ONNX Ang pagluluwas ay katugma ng pasalungat sa agos ng ilog fp32 modelong eksakto sa mga clip na iyon. 8- Pangalawang bintana sa Mansanas M5 Ang isang tawag sa bawat sandali ay hindi nakadaragdag ng anumang kapansin - pansin sa paghinto VAD ay naghintay na.

Swift API

One-shot check sa isang nakatalang kasabihan:

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
}

Kalakip sa umaagos na VAD, kaya bawat natiyak na paghinto ay sinusuri bago matapos ang isang bahagi:

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 ay umaayon sa TurnCompletionProvider protocol sa AudioCommon, kaya't ang anumang iba pang klasipikasyon na may katulad na hugis ay maaaring idikit sa halip. fromPretrained(cacheDir:offlineMode:) ay sumusunod sa parehong casculine at sa ibang mga modelo.

Boses

VoicePipeline ang parehong classifier, kaya ang isang voice agent ay humihinto sa pagputol sa mga tao nang walang anumang pagbabago sa STT nito, TTS o VAD setup. PipelineConfig at isang paraan ang nag - iikid nito; kailangan nila ito speech-swift v0.0.27 o mamaya (SpeechCore.xcramework mula sa 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 Pagkawasak Epekto
turnCompletionThreshold0.5 Ang komplementasyong probabilidad sa o sa itaas kung saan ang isang VAD stop ay nagtatapos sa pag-ikot ng gumagamit.Gumamit lamang ng minsang isang classifier ang nakakabit.
turnCompletionMaxSilence2.0 s Ang mga segundo ng katahimikan, na sinusukat mula sa simula ng sandaling paghinto, pagkatapos nito ang classifier vetoed ay nagwawakas sa paano man. 0
setTurnCompletion(_:)—Attaches anumang TurnCompletionProvider. Tawagin ito bago ang start(); ipasa ang nil sa berso. Isang classifier na naghuhusga ng bilang kumpleto, kaya't ang isang bigong modelo ay hindi kailanman nag-aayos ng usapan.

Dahil sa nakakabit na classifier, ang isang paghinto ng VAD ay natatapos lamang sa pagliko ng gumagamit kapag ang probabilidad ay umabot na sa pasukan; sa ibaba nito ang tubo ay patuloy na nakikinig, ang pagsasalita na nagpapatuloy ay nagpapatuloy sa gayunding pagliko (walang segundo speechStarted), at turnCompletionMaxSilence Iginagalang ng sabik na STT ang veto, at ang classifier ay tumatakbo nang minsan sa bawat sandali sa audio thream, kaya tumawag ng tawag prewarm() pagkatapos magkarga.

Pagtuto

Pagtatakda Pagkawasak Epekto
threshold0.5 Mas madaling magbago ang dulo ng mas mababang mga pagpapahalaga at mas madalas na sumasabad; mas matagal na naghihintay ang mas mataas na halaga bago sumagot. Watch lastTurnCompletionProbability sa mga tunay na usapan bago ito ilipat.
maxSilenceDuration2.0 s Mahirap na gora, na sinusukat mula sa pasimula ng sandaling paghinto. 0 Sinisira ang gora: isang bahagi na hawak ang takip ang saka naghihintay ng pagsasalita o flush().
preRollDuration 0.5 sAudio bago ang VAD na simula na kasama sa classifier input, kaya't ang isang naka-claim na unang pantig ay umaabot pa rin sa modelo.

Silero's minSilenceDuration ay nagpapasiya pa rin kapag ang isang paghinto ay napatunayan, at samakatuwid kapag ang classifier ay tinanong.Tall prewarm() pagkatapos magkarga upang ang unang tunay na paghinto ay hindi mabayaran para sa grap na republish.

Paggamit ng 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
Mapagpipilian Utos Paglalarawan
--thresholdturnSample o sa itaas kung saan ang pagliko ay mahalaga bilang kompleto (default 0.5)
--jsonturnUso probability, threshold, complete at latency_ms bilang JSON
--model, -mturnHuggingFace repo na may parehong pagkakaayos (default aufklarer/Smart-Turn-v3.2-CoreML)
--model-dirturn Ang lokal na directory na may hawak na smart_turn.mlmodelc at config.json; nilalampasan ang download
--smart-turnvad-stream Tiyakin ang bawat paghinto sa pamamagitan ng Smart Turn bago wakasan ang isang bahagi
--turn-thresholdvad-streamSmart Turn tapusin ang pasukan (default 0.5)
--turn-max-silencevad-stream Mga segundo ng katahimikan pagkatapos ng sandaling paghinto na nagwawakas sa bahagi (default 2.0)

speech turn ay naglalaman ng file (anumang sampol na halaga), iskor sa huling 8 segundo at naglilimbag ng probabilidad, ito man ay nag - aalis sa pasukan, at ang takdang panahon. Gamitin ito upang i - tune ang pasukan sa iyong sariling mga rekording. KLI reference.

C++ / Android

Ang paraan ng pagsasalita ng Core ay katulad din ng modelo OnnxSmartTurn Para sa Linux, Windows at Android (ONNX Runtime lamang; walang LiteRT variant). VoicePipeline::set_turn_completion() Ikinakabit ito bago start(); ang paghinto ng VAD ay nagwawakas lamang sa pagliko ng gumagamit kapag umabot na ang probabilidad turn_completion_threshold (0.5), at turn_completion_max_silence (2.0 s) ay nagtatapos sa isang stack turn. Ang C API ay naglalantad ng parehong witch na katulad ng sa witch sc_turn_completion_vtable_t + sc_pipeline_set_turn_completion(), kaya't ang mga host ng Kotlin o Swift ay maaaring mag-code ng kanilang sariling classifier na kapareho ng 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);

Ang speech CLI ng Speech Core ay nag - uulat ng isang rekording na katulad ng sa macOS:

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

Model files, ang kontratang C API at ang CLI ay dokumentado sa LI Uso sa Pagsasalita pahina at sa loob ng libingan docs/models.md.

Modelong mga Pagpapababa ng Pabigat

Huwaran Likod LakiHuggingFace
Smart-Turn-v3.2CoreML16.8 MB Aufklarer/Smart-Turn-v3.2-CoreML
Smart-Turn-v3.2ONNX (fp32 + int8)33 MB / 11.1 MBsoniqo/Smart-Turn-v3.2-ONNX

Pinagmumulan