Terjemahan mesin · Versi asli bahasa Inggris

Smart Turn - End-of -Turn Deteksi

p99 · VAP - Model

Smart Turn v3.2 menjawab satu pertanyaan setelah VAD laporan jeda: telah speaker selesai, atau apakah mereka pertengahan-kalimat? mendengarkan audio itu sendiri - prosody, kecepatan, intonasi - daripada transkrip, meliputi 23 bahasa, dan berjalan sekali per jeda pada yang terakhir 8 Detik putaran, bobot adalah Pipecat resmi. Smart Turn v3.2 rilis (BSD-2-Clause), dikompile ke CoreML untuk platform Apple dan diekspor ke ONNX untuk Speech Core.

Mengapa VAD saja tidak cukup

Detektor aktivitas suara hanya mendengar keheningan. Orang berhenti ditengah kalimat untuk berpikir, jadi agen VAD-satu-satunya yang memotong atau menunggu jeda lama setelah setiap kalimat. Smart Turn mengkonfirmasi setiap jeda: sebuah kalimat selesai mendapat jawaban segera, jeda setengah kalimat membuat agen mendengarkan.

Bagaimana cara kerjanya

Smart Turn bukan VAD dan tidak mendeteksi pidatonya sendiri. Ini dipasangkan dengan streaming Silero VADdengan sebuah klasifikasi yang terpasang, jeda yang dikonfirmasi menjadi sebuah pertanyaan daripada vonis:

  1. Tanyakan sekali setiap jeda. Ketika Silero mengkonfirmasi jeda (minSilenceDuration setelah batas ofset), prosesor tangan classifier audio dari belokan begitu jauh - dari 0.5 s sebelum VAD bergabung ke potongan saat ini, capped pada detik terakhir 8.
  2. Lengkap. Kemungkinan pada atau di atas threshold (0.5): .speechEnded kebakaran seperti biasa.
  3. Tahan. Di bawah ambang pintu segmen tetap terbuka. Jika speaker melanjutkan, segmen yang sama terus - tidak ada detik .speechStarted - dan jeda dikonfirmasi berikutnya bertanya lagi dengan giliran yang lebih panjang.
  4. Diam. Jika keheningan mencapai maxSilenceDuration (2.0 s, diukur dari awal jeda), segmen berakhir pula, sehingga pembicara yang trail off masih mendapat jawaban. segmen ini endTime adalah di mana pidato berhenti, bukan ketika topi berakhir.

flush() mengendap segmen diadakan di akhir dari stream dan reset() Sebuah klasifikasi yang melempar dianggap sebagai "lengkap", sehingga model gagal tidak pernah melarang percakapan. isHoldingTurn Melaporkan negara bagian dan lastTurnCompletionProbability jawaban terbaru.

Model

PropertiNilai
ArsitekturWhisper- Tiny encoder + attention pooling + MLP head dengan keluaran sigmoid
Parameter8,0M
Masukan8 terakhir dari 16 kHz mono audio (128.000 sampel); ternyata lebih pendek adalah zero- padded di bagian depan, tingkat sampel lain adalah resabled
KeluaranProbabilitas dalam [0, 1] bahwa gilirannya selesai; baku threshold 0.5
Bahasa23 - Arab, Bengali, Cina, Denmark, Belanda, Inggris, Finlandia, Perancis, Jerman, Hindi, Indonesia, Italia, Jepang, Marathi, Marathi; Norwegia, Polandia, Portugis, Rusia, Turki, Ukraina, Vietnam
LisensiBSD-2-Clause

Expor embed Whisper log -mel front-end, termasuk bentuk gelombang normalisasi model upstream dilatih dengan, sehingga penelepon melewati audio mentah - tidak ada ekstraksi fitur dalam Swift atau C++.

Penampilan

EksporUkuranAkurasiLatensi per jendela 8 s
CoreML (CPU + Neural Engine)16,8 MB92.9%3.5 md
ONNX fp32 (ONNX Runtime, CPU)33 MB92.9%~ 36 m dengan 2 benang, 20 m dengan 4
ONNX int8 (ONNX Runtime, CPU)11.1 MB93.0%~ 36 m dengan 2 benang, 20 m dengan 4

Akurasi diukur pada 1,000 klip dari set tes upstream; CoreML dan fp32 ONNX ekspor cocok dengan upstream fp32 Model persis pada klip tersebut. 8-second window on an Apple M5 Pro. Satu panggilan per jeda tak ada yang terlihat pada jeda VAD sudah menunggu.

Swift API

Satu-shot cek pada ucapan direkam:

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
}

Terkait ke streaming VAD, jadi setiap jeda dikonfirmasi diperiksa sebelum segmen berakhir:

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 konform ke TurnCompletionProvider protokol dalam AudioCommon, sehingga klasifikasi lain dengan bentuk yang sama dapat melekat sebagai gantinya. fromPretrained(cacheDir:offlineMode:) mengikuti cache dan aturan offline yang sama dengan model lainnya.

Baris Piringnya

VoicePipeline mengambil klasifikasi yang sama, sehingga seorang agen suara berhenti memotong orang off tanpa ada perubahan ke STT nya, TTS atau VAD setup. Dua PipelineConfig bidang dan satu metode kawat masuk; mereka membutuhkan speech-swift v0.0.27 atau kemudian (SpeechCorexcframework dari 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()
APIBakuEfek
turnCompletionThreshold0.5Probabilitas penyelesaian pada atau di atas yang VAD jeda berakhir giliran pengguna. Hanya digunakan sekali sebuah classifier dicantolkan.
turnCompletionMaxSilence2.0 sDetik keheningan, diukur dari awal jeda, setelah yang mengubah klasifikasi divetoed tetap berakhir. 0 = Tidak pernah.
setTurnCompletion(_:)—Lampirkan semua TurnCompletionProviderHubungi sebelum start(); lewat nil Sebuah klasifikasi yang melempar dihitung sebagai lengkap, sehingga model gagal tidak pernah melarang percakapan.

Dengan sebuah klasifikasi terpasang, sebuah jeda VAD hanya berakhir ketika pengguna berbelok ketika probabilitas mencapai ambang batas; di bawah itu pipa terus mendengarkan, pidato yang melanjutkan putaran yang sama (tidak ada detik speechStarted), dan turnCompletionMaxSilence Mengakhiri belokan yang ditahan bagaimanapun juga. prewarm() setelah memuat.

Tuning

TatananBakuEfek
threshold0.5Nilai bawah berakhir lebih cepat dan mengganggu lebih sering; nilai lebih tinggi menunggu lebih lama sebelum menjawab. Lihat lastTurnCompletionProbability pada percakapan nyata sebelum memindahkannya.
maxSilenceDuration2.0 sTutup keras, diukur dari awal jeda. Jeda bervetoed tidak pernah dapat menahan pergantian lebih lama dari ini. 0 menonaktifkan tutup: segmen diadakan kemudian menunggu untuk berbicara atau flush().
preRollDuration0.5 sAudio sebelum VAD di set yang termasuk dalam masukan classifier, sehingga suku kata pertama dipotong masih mencapai model.

Silero minSilenceDuration masih memutuskan ketika jeda dikonfirmasi, dan oleh karena itu ketika klasifikasi diminta. Panggil prewarm() setelah memuat sehingga jeda nyata pertama tidak membayar untuk kompilasi grafik.

Penggunaan 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
OpsiPerintahDeskripsi
--thresholdturnProbabilitas di atau di atas yang dihitung sebagai lengkap (baku 0.5)
--jsonturnKeluarkan probability, threshold, complete dan latency_ms sebagai JSON
--model, -mturnHuggingFace repo dengan tata letak yang sama (baku aufklarer/Smart-Turn-v3.2-CoreML)
--model-dirturnDirektori lokal memuat smart_turn.mlmodelc dan config.json; melewati pengunduhan
--smart-turnvad-streamKonfirmasi setiap jeda dengan Smart Turn sebelum mengakhiri sebuah segmen
--turn-thresholdvad-streamSmart Turn threshold pelengkapan (baku 0.5)
--turn-max-silencevad-streamDetik keheningan setelah jeda vetoed yang mengakhiri segmen pula (baku 2.0)

speech turn memuat berkas (setiap contoh), skor terakhir 8 detik dan mencetak probabilitas, apakah itu membersihkan ambang batas, dan waktu inferensi. Gunakan itu untuk menyetel ambang pintu pada rekaman anda sendiri. Daftar bendera lengkap ada di dalam Referensi CLI.

C++ / Android

Speech Core kapal model yang sama seperti OnnxSmartTurn untuk Linux, Windows, dan Android (ONNX Runtime Hanya, tidak ada LiteRT varian). VoicePipeline::set_turn_completion() memasang itu sebelum start(); sebuah jeda VAD kemudian hanya mengakhiri giliran pengguna ketika probabilitas mencapai turn_completion_threshold (0.5), dan turn_completion_max_silence (2.0) akhirnya giliran tertahan pula. C API mengekspos hook yang sama seperti sc_turn_completion_vtable_t + sc_pipeline_set_turn_completion(), jadi Kotlin atau Swift host dapat menjembatani klasifikasi mereka sendiri dengan cara yang sama seperti 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);

The speech CLI of Speech Core mencetak rekaman dengan cara yang sama seperti pada macOS:

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

Berkas model, kontrak C API dan CLI didokumentasikan pada Pidato Inti halaman dan dalam repositori 's docs / models.md.

Unduhan Model

ModelBackendUkuranHuggingFace
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

Sumber