תרגום מכונה · המקור באנגלית
Smart Turn – End-of-Turn Detection
Smart Turn v3.2 תשובות לשאלה אחת אחרי VAD דיווחי הפסקה: האם הדובר סיים, או האם הם באמצע התמימות?זה מקשיב לאדיו עצמו - פרוזודי, קצב, לאונציה - ולא תמליל, מכסה 23 שפות, ורץ פעם אחת על האחרון 8 השניות של הסבב הם הפיקט הרשמי Smart Turn v3.2 שחרור (BSD-2-Clause), התאספו ל CoreML עבור פלטפורמות Apple ויצוא ONNX לנאום Core.
גלאי פעילות קול שומע רק שתיקה.אנשים עוצרים את אמצע ההסכמה לחשוב, כך סוכן VAD- בלבד או חותך אותם או ממתין לרצף ארוך, קבוע לאחר כל משפט. Smart Turn מאשר כל הפסקה: משפט מוגמר מקבל תשובה מיידית, הפסקת אמצע החישה שומרת על הסוכן מקשיב.
איך זה עובד
Smart Turn אינו VAD ואינו מזהה דיבור על עצמו.זה מתווסף עם הזרמת Silero VAD
- שאל פעם אחת הפסקה. כאשר Silero מאשר הפסקה (
minSilenceDurationלאחר סף ההתחלה, המעבד מעביר את אודיו של התור עד כה - מ 0.5 s לפני VAD עלה אל החלק הנוכחי, החל האחרון 8 שניות. - Complete. Probability at or above
threshold(0.5):.speechEndedשריפות כרגיל. - Hold. מתחת לסף הסעיף נשאר פתוח.אם הדובר חוזר, אותו קטע ממשיך - שום שנייה
.speechStarted- וההפסקה הבאה אישרה שוב שואל עם התור הארוך יותר. - Silence cap. אם שתיקה מגיעה
maxSilenceDuration(2.0 s, נמדדת מתחילת ההפסקה), הקטע מסתיים בכל מקרה, כך שדובר שדרכות עדיין מקבל תשובה.endTime
flush() מיישבים קטע קבוע בסוף הזרם ו reset() מנקה אותו: מתווך שזרק את הספירה כ"שלמה", כך שמודל כושל אף פעם לא דוחף את השיחה. isHoldingTurn דיווח על המדינה ו lastTurnCompletionProbability התשובה האחרונה.
מודל מודל
| רכוש | ערך |
|---|---|
| ארכיטקטורה | Whisper-Tiny encoder + תשומת לב בריכות + ראש MLP עם פלט sigmoid |
| המונחים: | 8.0M |
| Input | 8 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 MB | 92.9% | 3.5 ms |
| ONNX fp32 (ONNX Runtime, CPU) | 33 MB | 92.9% | 36 ms עם 2 חוטים, 20 ms עם 4 |
| ONNX int8 (ONNX Runtime, CPU) | 11.1 MB | 93.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()
| API | Default | אפקט אפקט |
|---|---|---|
turnCompletionThreshold | 0.5 | ההסתברות להחלפה או מעליה הפסקה VAD מסתיימת תורו של המשתמש. רק בשימוש פעם אחת מחוקק מחובר. |
turnCompletionMaxSilence | 2.0 | שניות של שתיקה, שנמדדו מראשית ההפסקה, שלאחר מכן תורו של המסווג הטילו וטו על קצות בכל מקרה. 0 = אף פעם לא. |
setTurnCompletion(_:) | — | צור קשר עם TurnCompletionProvider התקשר אליו לפני start(); לעבור nil כדי detach. a Classifier אשר זורק ספירה כמושלמה, כך מודל נכשל לעולם לא דוחף את השיחה. |
עם מתווך המצורף, הפסקה VAD רק מסתיימת התור של המשתמש כאשר ההסתברות מגיעה לסף; מתחתיו הצינור ממשיך להקשיב, דיבור חוזר ממשיך את אותו תור (לא שנייה). speechStartedוכן) turnCompletionMaxSilence מסתיים התור המתקיים בכל מקרה, Eager STT מכבד את וטו, ואת המסווג רץ פעם הפסקה על חוט אודיו, אז התקשר. prewarm() לאחר טעינה.
כוונון
| קביעת | Default | אפקט אפקט |
|---|---|---|
threshold | 0.5 | ערכים נמוכים יותר הופכים מוקדם יותר ומפריעים לעתים קרובות יותר; ערכים גבוהים יותר מחכים זמן רב יותר לפני שהם מגיבים. Watch lastTurnCompletionProbability על שיחות אמיתיות לפני העברתו. |
maxSilenceDuration | 2.0 | כובע קשה, שנמדד מראשית ההפסקה.הפסקה שהווטו לא יכולה להחזיק את התור יותר מזה. 0 מקלקל את הכובע: קטע מוחזק אז מחכה לנאום או flush(). |
preRollDuration | 0.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
| אפשרות | פיקוד הפיקוד | תיאור תיאור |
|---|---|---|
--threshold | turn | אחריות או מעליה התפנית נחשבת לשלימה (default 0.5) |
--json | turn | Emit probability, threshold, complete ו latency_ms כמו JSON |
--model, -m | turn | HuggingFace repo עם אותה הפריסה (default aufklarer/Smart-Turn-v3.2-CoreML) |
--model-dir | turn | מנהל מקומי מחזיק smart_turn.mlmodelc ו config.json; לדלג על ההורדה |
--smart-turn | vad-stream | אישור כל הפסקה עם Smart Turn לפני סיום קטע |
--turn-threshold | vad-stream | Smart Turn סף סיום (default 0.5) |
--turn-max-silence | vad-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.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 |
מקור Source
- מקורות / SpeechVAD —
SmartTurnModelוStreamingVADProcessor - docs/מודלים / smart-turn-v3.md - מציין מודל
- docs/inference/Smart-turn.md - הקצאות והכוונון
- speech-core docs/דגמים.md
OnnxSmartTurn - Upstream: pecat-ai/Smart-turn / pipecat-i/smart-turn-v3 (Daily / Pipecat, BSD-2-Clause