תרגום מכונה · המקור באנגלית

Smart Turn – End-of-Turn Detection

p99 VAP - מודלים

Smart Turn v3.2 תשובות לשאלה אחת אחרי VAD דיווחי הפסקה: האם הדובר סיים, או האם הם באמצע התמימות?זה מקשיב לאדיו עצמו - פרוזודי, קצב, לאונציה - ולא תמליל, מכסה 23 שפות, ורץ פעם אחת על האחרון 8 השניות של הסבב הם הפיקט הרשמי Smart Turn v3.2 שחרור (BSD-2-Clause), התאספו ל CoreML עבור פלטפורמות Apple ויצוא ONNX לנאום Core.

מדוע VAD לבדה לא מספיק

גלאי פעילות קול שומע רק שתיקה.אנשים עוצרים את אמצע ההסכמה לחשוב, כך סוכן VAD- בלבד או חותך אותם או ממתין לרצף ארוך, קבוע לאחר כל משפט. Smart Turn מאשר כל הפסקה: משפט מוגמר מקבל תשובה מיידית, הפסקת אמצע החישה שומרת על הסוכן מקשיב.

איך זה עובד

Smart Turn אינו VAD ואינו מזהה דיבור על עצמו.זה מתווסף עם הזרמת Silero VAD

  1. שאל פעם אחת הפסקה. כאשר Silero מאשר הפסקה (minSilenceDuration לאחר סף ההתחלה, המעבד מעביר את אודיו של התור עד כה - מ 0.5 s לפני VAD עלה אל החלק הנוכחי, החל האחרון 8 שניות.
  2. Complete. Probability at or above threshold (0.5): .speechEnded שריפות כרגיל.
  3. Hold. מתחת לסף הסעיף נשאר פתוח.אם הדובר חוזר, אותו קטע ממשיך - שום שנייה .speechStarted - וההפסקה הבאה אישרה שוב שואל עם התור הארוך יותר.
  4. Silence cap. אם שתיקה מגיעה maxSilenceDuration (2.0 s, נמדדת מתחילת ההפסקה), הקטע מסתיים בכל מקרה, כך שדובר שדרכות עדיין מקבל תשובה. endTime

flush() מיישבים קטע קבוע בסוף הזרם ו reset() מנקה אותו: מתווך שזרק את הספירה כ"שלמה", כך שמודל כושל אף פעם לא דוחף את השיחה. isHoldingTurn דיווח על המדינה ו lastTurnCompletionProbability התשובה האחרונה.

מודל מודל

רכושערך
ארכיטקטורהWhisper-Tiny encoder + תשומת לב בריכות + ראש MLP עם פלט sigmoid
המונחים:8.0M
Input8 s אחרון של 16 kHz מונו אודיו (128,000 דגימות); סיבובים קצרים יותר הם אפס מוקרן בחזית, שיעורי דגימה אחרים הם resampledled.
Outputאחריות ב [0, 1] כי התור הוא שלם; ברירת מחדל של סף 0.5
שפות23 - ערבית, בנגלי, סינית, דנית, הולנדית, אנגלית, פינית, צרפתית, גרמנית, הינדי, אינדונזית, איטלקית, יפנית, קוריאנית, מארהתי, נורוויג'יניה, פולין, פורטוגלית, רוסית, טורקית, אוקראינית, וייטנאמית, וייטנאמית
רישיון רישיון רישיוןBSD-2-Clause

היצוא הטמיע את Whisper קדמית, כולל הנרמל גלפוריזציה מודל upstream היה מאומן עם, ולכן קוראנים עוברים אודיו גולמי - אין מיצוי תכונה Swift או C++.

ביצועי ביצועים

יצוא היצואגודלדמוקרטיהתדירות לחלון 8
CoreML (CPU + Neural Engine)16.8 MB92.9%3.5 ms
ONNX fp32 (ONNX Runtime, CPU)33 MB92.9%36 ms עם 2 חוטים, 20 ms עם 4
ONNX int8 (ONNX Runtime, CPU)11.1 MB93.0%36 ms עם 2 חוטים, 20 ms עם 4

הדיוק נמדד 1,000 קליפים מהמבחן upstream; CoreML ו fp32 ONNX היצוא תואם את Upstream fp32 מודל בדיוק על קליפים אלה.לאטי הוא אחד 8חלון שני על Apple M5 קריאה אחת לעצירה לא מוסיפה שום דבר בולט להפסקה VAD כבר מחכה.

Swift API

One-shot Check on a Record:

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
}

המצורף לסטרימינג VAD, כך שכל הפסקה מאושרת נבדקת לפני שקטע מסתיים:

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 תואם ל TurnCompletionProvider פרוטוקול AudioCommon, כך שכל מסווג אחר עם אותה צורה יכול להיות מחובר במקום. fromPretrained(cacheDir:offlineMode:)

תגית: Pink

VoicePipeline לוקח את אותו מתווך, כך סוכן קול מפסיק לחתוך אנשים ללא כל שינוי STT, TTS או VAD ההתקנה. PipelineConfig שדות ושיט אחד בו; הם דורשים speech-swift v0.0.27 או מאוחר יותר (SpeechCore.xcframework from 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()
APIDefaultאפקט אפקט
turnCompletionThreshold0.5ההסתברות להחלפה או מעליה הפסקה VAD מסתיימת תורו של המשתמש. רק בשימוש פעם אחת מחוקק מחובר.
turnCompletionMaxSilence2.0שניות של שתיקה, שנמדדו מראשית ההפסקה, שלאחר מכן תורו של המסווג הטילו וטו על קצות בכל מקרה. 0 = אף פעם לא.
setTurnCompletion(_:)—צור קשר עם TurnCompletionProvider התקשר אליו לפני start(); לעבור nil כדי detach. a Classifier אשר זורק ספירה כמושלמה, כך מודל נכשל לעולם לא דוחף את השיחה.

עם מתווך המצורף, הפסקה VAD רק מסתיימת התור של המשתמש כאשר ההסתברות מגיעה לסף; מתחתיו הצינור ממשיך להקשיב, דיבור חוזר ממשיך את אותו תור (לא שנייה). speechStartedוכן) turnCompletionMaxSilence מסתיים התור המתקיים בכל מקרה, Eager STT מכבד את וטו, ואת המסווג רץ פעם הפסקה על חוט אודיו, אז התקשר. prewarm() לאחר טעינה.

כוונון

קביעתDefaultאפקט אפקט
threshold0.5ערכים נמוכים יותר הופכים מוקדם יותר ומפריעים לעתים קרובות יותר; ערכים גבוהים יותר מחכים זמן רב יותר לפני שהם מגיבים. Watch lastTurnCompletionProbability על שיחות אמיתיות לפני העברתו.
maxSilenceDuration2.0כובע קשה, שנמדד מראשית ההפסקה.הפסקה שהווטו לא יכולה להחזיק את התור יותר מזה. 0 מקלקל את הכובע: קטע מוחזק אז מחכה לנאום או flush().
preRollDuration0.5אודיו לפני הופעת VAD הכלולה בקלט המסווג, כך סינקל הראשון עדיין מגיע המודל.

Silero של minSilenceDuration עדיין מחליט מתי הפסקת אישור, ולכן כאשר המגדיר מתבקש.Call prewarm() לאחר טעינה כך הפסקה האמיתית הראשונה אינה משלמת עבור איסוף.

CLI Usage

# 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
אפשרותפיקוד הפיקודתיאור תיאור
--thresholdturnאחריות או מעליה התפנית נחשבת לשלימה (default 0.5)
--jsonturnEmit probability, threshold, complete ו latency_ms כמו JSON
--model, -mturnHuggingFace repo עם אותה הפריסה (default aufklarer/Smart-Turn-v3.2-CoreML)
--model-dirturnמנהל מקומי מחזיק smart_turn.mlmodelc ו config.json; לדלג על ההורדה
--smart-turnvad-streamאישור כל הפסקה עם Smart Turn לפני סיום קטע
--turn-thresholdvad-streamSmart Turn סף סיום (default 0.5)
--turn-max-silencevad-streamשניות של שתיקה לאחר הפסקה וטועה שסיימת את הקטע בכל מקרה (default 2.0)

speech turn לטעון את הקובץ (כל שיעור הדגימה), מעלה את 8 השניות האחרונות ומדפיס את ההסתברות, בין אם זה מנקה את הסף, ואת זמן ההפרעה. השתמש בו כדי לכוון את הסף על הקלטות משלך. רשימת הדגל המלא היא ב I Reference.

C++ / Android

נאומים קוויים זהים לדגם OnnxSmartTurn עבור Linux, Windows ו- Android (ONNX Runtime בלבד; אין גרסה LiteRT). VoicePipeline::set_turn_completion() נספח אותו לפני start()הפסקה VAD מסתיימת רק את התור של המשתמש כאשר ההסתברות מגיעה. turn_completion_threshold (0.5) turn_completion_max_silence (2.0) מסיים את התור המתקיים בכל מקרה.ה-C API חושף את אותו המיזוג כמו sc_turn_completion_vtable_t + sc_pipeline_set_turn_completion()לכן, Kotlin או Swift מארחים יכולים לגשר על המסווג שלהם כמו 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 מציג הקלטה דומה ל- macOS:

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

מודל קבצים, C API החוזה וה-CLI מתועדים דיבור Core דף ובתוך ה-Repository docs/מודלים.

דגם Downloads

מודל מודלחזרהגודלHuggingFace
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

מקור Source