Tłumaczenie automatyczne · Oryginał angielski
Smart Turn - wykrywanie zakrętu
Smart Turn v3.2 odpowiada na jedno pytanie po VAD raportuje pauzę: czy głośnik skończył, czy jest to zdanie środkowe? Słucha samego dźwięku - prosodia, tempo, intonacja - zamiast transkrypcji, pokrywa 23 języki, i działa raz na pauzę na ostatni 8 Sekundy zakrętu. Wagi są oficjalne Pipecat Smart Turn v3.2 uwalnianieBSD-2-Clause), skompilowane do CoreML w przypadku platform Apple i eksportowanych do ONNX dla Speech Core.
Czujnik aktywności głosu słyszy tylko ciszę. Ludzie zatrzymują się w połowie zdania, aby myśleć, więc tylko VAD- agent albo odcina je lub czeka długi, ustalony czas po każdym zdaniu. Smart Turn potwierdza każdą pauzę: zakończone zdanie otrzymuje natychmiastową odpowiedź, a środkowe pauza powoduje, że agent słucha.
Jak to działa?
Smart Turn nie jest VAD i nie samodzielnie wykrywa mowy. Silero VADZ dołączonym klasyfikatorem potwierdzona przerwa staje się raczej pytaniem niż werdyktem:
- Poproś raz na pauzę. Kiedy Silero potwierdza pauzę (
minSilenceDurationpo progu offsetu), procesor daje klasyfikator dźwięk z zakrętu do tej pory - od 0.5 Przed VAD początek do bieżącego kawałka, w ostatniej części 8 Sekundy. - Kompletny. Prawdopodobieństwo na lub powyżej
threshold(0.5):.speechEndedjak zwykle. - Czekaj. Poniżej progu segment pozostaje otwarty. Jeśli głośnik ponownie, ten sam segment nadal - nie drugi
.speechStarted- i następna potwierdzona przerwa prosi ponownie z dłuższym zakrętem. - Kapelusz milczenia. Jeśli cisza dotrze
maxSilenceDuration(2.0 s, mierzone od początku przerwy), segment i tak się kończy, więc mówca, który szlaki nadal dostaje odpowiedź.endTimejest miejscem, w którym przemowa ustała, nie wtedy, gdy wygasła nasadka.
flush() ustawia utrzymywany segment na końcu strumienia i reset() Klasyfikator, który rzuca liczy się jako "kompletny", więc wadliwy model nigdy nie blokuje rozmowy. isHoldingTurn raportuje stan przetrzymywania oraz lastTurnCompletionProbability najnowszą odpowiedź.
Wzór
| Własność | Wartość |
|---|---|
| Architektura | Whisper- Tiny encoder + pooling uwagi + głowica MLP z wyjściem sigmoid |
| Parametry | 8.0M |
| Wejście | Ostatnie 8 s z 16 kHz mono audio (128,000 próbek); krótsze obroty są zero-wyściełane z przodu, inne częstotliwości próbkowania są resemplowane |
| Wyjście | Prawdopodobieństwo w [0, 1], że zakręt jest kompletny; próg domyślny 0.5 |
| Języki | 23 - Arabski, bengalski, chiński, duński, holenderski, angielski, fiński, francuski, niemiecki, hindi, indonezyjski, włoski, japoński, koreański, marathi, norweski, polski, portugalski, rosyjski, hiszpański, turecki, ukraiński, wietnamski |
| Licencja | BSD-2-Clause |
Eksport osadził Whisper log- mel front- end, w tym normalizację fali model wyższego szczebla został przeszkolony, więc dzwoniący przechodzą surowe audio - nie ma ekstrakcji funkcji w Swift lub C++.
Wydajność
| Eksport | Rozmiar | Dokładność | Opóźnienie na 8 oknach |
|---|---|---|---|
| CoreML (CPU + Neural Engine) | 16.8 MB | 92.9% | 3.5 ms |
| ONNX fp32 (ONNX Runtime, CPU) | 33 MB | 92.9% | ~ 36 ms z 2 nitkami, 20 ms z 4 |
| ONNX int8 (ONNX Runtime, CPU) | 11.1 MB | 93.0% | ~ 36 ms z 2 nitkami, 20 ms z 4 |
Dokładność mierzy się na 1,000 klipy z zestawu do badań na początku badania; CoreML oraz fp32 ONNX eksport pasuje do wyższego szczebla fp32 model dokładnie na tych klipach. 8- drugie okno na Apple M5 Pro. Jedno wywołanie na pauzę nie dodaje nic zauważalnego do pauzy VAD Już na to czekałam.
Swift API
Jeden strzał sprawdzić na nagranej wypowiedzi:
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
}
Dołączony do strumieniowego strumieniowego VAD, więc każda potwierdzona pauza jest sprawdzana przed zakończeniem segmentu:
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 jest zgodny z TurnCompletionProvider protokół w AudioCommon, więc każdy inny klasyfikator o tym samym kształcie może być przymocowany zamiast. fromPretrained(cacheDir:offlineMode:) stosuje się do tych samych zasad cache i offline co inne modele.
VoicePipeline
VoicePipeline pobiera ten sam klasyfikator, tak że czynnik głosowy przestaje odcinać ludzi bez zmiany konfiguracji STT, TTS lub VAD. Dwa PipelineConfig pola i jedna metoda podłączyć go; wymagają one speech-swift v0.0.27 lub później (SpeechCore.xcframework z 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 | Domyślne | Efekt |
|---|---|---|
turnCompletionThreshold | 0.5 | Prawdopodobieństwo ukończenia, na którym przerwa VAD kończy kolej użytkownika. Używany tylko po dołączeniu klasyfikatora. |
turnCompletionMaxSilence | 2.0 s | Sekundy ciszy, mierzone od początku pauzy, po której skręt weta klasyfikatora i tak się kończy. 0 = nigdy. |
setTurnCompletion(_:) | — | Dołącza dowolny TurnCompletionProviderZadzwoń wcześniej. start(); pass nil Klasyfikator, który rzuca liczy się jako kompletny, więc wadliwy model nigdy nie blokuje rozmowy. |
Z dołączonym klasyfikatorem, pauza VAD kończy obrót tylko wtedy, gdy prawdopodobieństwo osiągnie próg; poniżej gazociąg nadal słucha, mowa, która wznawia kontynuuje ten sam obrót (nie drugi speechStarted), oraz turnCompletionMaxSilence i tak kończy się ruch. Eager STT szanuje weto, a klasyfikator działa raz na pauzę na gwincie audio, więc wywołaj prewarm() po załadunku.
Dostrajanie
| Ustawienie | Domyślne | Efekt |
|---|---|---|
threshold | 0.5 | Niższe wartości kończą się szybciej i częściej przerywać; wyższe wartości czekają dłużej przed odpowiedzią. Oglądaj lastTurnCompletionProbability na prawdziwych rozmowach przed przenoszeniem go. |
maxSilenceDuration | 2.0 s | Twarda nasadka, mierzona od początku przerwy. Zawetowana przerwa nigdy nie utrzyma zakrętu dłużej niż to. 0 wyłącza nasadkę: trzymany segment, a następnie czeka na mowę lub flush(). |
preRollDuration | 0.5 s | Audio przed początkiem VAD, który jest zawarty w wejściu klasyfikatora, więc klipowana pierwsza sylaba nadal dociera do modelu. |
Silero minSilenceDuration nadal decyduje, kiedy pauza jest potwierdzona, a zatem, kiedy classifier jest proszony. prewarm() po załadowaniu, więc pierwsza prawdziwa pauza nie płaci za kompilację wykresu.
Zastosowanie 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
| Opcja | Polecenie | Opis |
|---|---|---|
--threshold | turn | Prawdopodobieństwo, że zakręt jest kompletny lub wyższy (domyślnie 0.5) |
--json | turn | Emit probability, threshold, complete oraz latency_ms jako JSON |
--model, -m | turn | HuggingFace repo z tym samym układem (domyślnie aufklarer/Smart-Turn-v3.2-CoreML) |
--model-dir | turn | Local directory holding smart_turn.mlmodelc oraz config.json; pomija pobieranie |
--smart-turn | vad-stream | Potwierdź każdą przerwę za pomocą Smart Turn przed zakończeniem segmentu |
--turn-threshold | vad-stream | Próg zakończenia Smart Turn (domyślnie 0.5) |
--turn-max-silence | vad-stream | Sekundy ciszy po zawetowanej pauzie, która i tak kończy segment (domyślnie 2.0) |
speech turn ładuje plik (jakakolwiek częstotliwość próbkowania), zdobywa ostatnie sekundy 8 i drukuje prawdopodobieństwo, czy oczyszcza próg, i czas trwania wnioskowania. Użyj go, aby dostroić próg na własnych nagraniach. Pełna lista flag znajduje się na Odniesienie do CLI.
C++ / Android
Przemowa Rdzeń statków ten sam model jak OnnxSmartTurn dla Linux, Windows i Android (tylko ONNX Runtime; nie ma wariantu LiteRT). VoicePipeline::set_turn_completion() przymocowuje go wcześniej start(); a VAD pauza wtedy kończy kolej użytkownika tylko wtedy, gdy prawdopodobieństwo osiągnie turn_completion_threshold (0.5), oraz turn_completion_max_silence (2.0 s) i tak kończy się obrotem. API eksponuje ten sam hak co sc_turn_completion_vtable_t + sc_pipeline_set_turn_completion(), więc Kotlin lub Swift hosty mogą mostkować swój własny klasyfikator w taki sam sposób jak 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);
W speech CLI of Speech Core zdobywa nagranie w taki sam sposób jak na macOS:
speech download-models # fetches the int8 graph with the other ONNX models
speech turn recording.wav --threshold 0.5 --json
Pliki modelu, kontrakt C API i CLI są udokumentowane na Rdzeń przemowy strona i w repozytorium docs / models.md.
Pobieranie modeli
| Wzór | Wstecz | Rozmiar | 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 | soniqo/Smart-Turn-v3.2-ONNX |
Źródło
- Źródła / przemówienie —
SmartTurnModelorazStreamingVADProcessor - docs / models / smart-turn-v3.md - Noty modelowe
- docs / inference / smart- turn.md - wnioskowanie i strojenie
- speech-core docs / models.md —
OnnxSmartTurn - Upstream: pipecat- ai / smart- turn / pipecat- ai / smart-turn-v3 (Daily / Pipecat, BSD-2-Clause)