Konekäännös · Englanninkielinen alkuperäinen

Smart Turn ...

p99 · VAP ... Mallit

Smart Turn v3.2 vastaa yhteen kysymykseen sen jälkeen VAD raportoi tauko: onko puhuja valmis, vai ovatko ne puolivälissä sentence? Se kuuntelee äänen itse prosodia, vauhti, intonaatio ... 23 kielet, ja kulkee kerran per tauko viime 8 painot ovat virallinen Pipecat Smart Turn v3.2 Julkaisu (BSD-2-Clause), joka on laadittu CoreML Apple-alustojen osalta ja viety ONNX Puheen ytimeen.

Miksi VAD yksinään ei riitä

Äänen toiminnan ilmaisin kuulee vain hiljaisuuden. Ihmiset pysähtyvät ajattelemaan kesken lauseen, joten vain VAD-agentti joko katkaisee ne tai odottaa pitkää, kiinteää aikakatkaisua jokaisen lauseen jälkeen. Smart Turn vahvistaa jokaisen tauon: valmis lause saa välittömän vastauksen, välilauseen tauko pitää agentin kuuntelemassa.

Miten se toimii?

Smart Turn ei ole VAD eikä havaitse puhetta yksinään. Se on yhdistetty streamaukseen Silero VAD, joka päättää milloin kysyä. Kun siihen on liitetty luokituslaite, vahvistettu tauko muuttuu kysymykseksi eikä tuomioksi:

  1. Kysy kerran taukoa kohti. Kun Silero vahvistaa tauon (minSilenceDuration offset-kynnyksen jälkeen), prosessori ohjaa käännöksen äänen tähän mennessä 0,5 sekunnista ennen VAD -nousua nykyiseen osaan asti, joka on rajattu 8 sekunniksi.
  2. Täydellinen. Todennäköisyys threshold (0,5): .speechEnded tulipalot kuten tavallisesti.
  3. Pidä. Kynnysrajan alapuolella segmentti pysyy auki. Jos puhuja jatkaa, sama segmentti jatkuu: ei sekunti .speechStarted .
  4. Hiljainen korkki. Jos hiljaisuus saavuttaa maxSilenceDuration (2.0 s, mitattuna tauon alusta), segmentti loppuu joka tapauksessa, joten pois jäänyt puhuja saa silti vastauksen. endTime ei silloin, kun korkki on vanhentunut.

flush() selvittää hallussa segmentin lopussa stream ja reset() Heittoa kuvaava luokittelu on "täydellinen," joten epäonnistunut malli ei koskaan viivytä keskustelua. isHoldingTurn ilmoittaa, että tila on kunnossa ja lastTurnCompletionProbability viimeisin vastaus.

Malli

Omaisuus Arvo
Arkkitehtuuri Whisper-Tiny kooder + huomiota sammio + MLP pää kanssa sigmoid ulostulo
Parametrit8,0M
Syöte Viimeiset 8 s 16 kHz:n monoääni (128,000-näytteet); lyhyemmät käännökset on nollattu edessä, muut näytemäärät otetaan uudelleen
TuotosTodennäköisyys [0, 1], että kierros on täydellinen; oletusarvo 0,5
Kieli23 ... arabia, bengali, kiina, tanska, hollanti, englanti, suomi, ranska, saksa, hindi, indonesia, italia, japani, korea, marathi, norja, puola, portugali, venäjä, espanja, turkki, ukraina, vietnam
LisenssiBSD-2-Clause

Viennin upottaa Whisper log-mel etupää, mukaan lukien aaltomuoto normalisointi ylämallin oli koulutettu, joten soittajat siirtää raaka audio ... ei ole ominaisuus uuttaminen Swift tai C++.

Tulos

Vie KokoTarkkuusLatenssi 8 sekunnin ikkunaa kohti
CoreML (CPU + Neural Engine)16.8 MB92.9%3,5 ms
ONNX fp32 (ONNX Runtime, CPU)33 Mt92.9%~36 ms 2langalla, 20 ms 4
ONNX int8 (ONNX Runtime, CPU)11,1 Mt93.0%~36 ms 2langalla, 20 ms 4

Tarkkuus mitataan 1,000-leikkeitä ylävirtaan testi setti; CoreML ja fp32 ONNX vienti vastaa ylävirtaan fp32 malli täsmälleen näissä leikkeissä. Latenssi on yksi 8 sekunnin ikkuna Apple M5 Pro. Yksi puhelu per tauko lisää mitään huomaamatonta tauko VAD jo odottanut.

Swift API

Yhden shotin tarkistus nauhoitettuun lauseeseen:

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
}

Striimaukseen VAD kiinnitettynä, joten jokainen vahvistettu tauko tarkistetaan ennen segmentin päättymistä:

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 on TurnCompletionProvider -protokollassa AudioCommon, joten kaikki muut samanmuotoiset luokittelut voidaan liittää. fromPretrained(cacheDir:offlineMode:) noudattaa samoja välimuisti- ja offline-sääntöjä kuin muissa malleissa.

Äänipipeliini

VoicePipeline ottaa saman kategorian, joten ääniagentti lopettaa ihmisten katkaisemisen ilman muutoksia sen STT, TTS tai VAD asetukset. Kaksi PipelineConfig kentät ja yksi menetelmä kytkeä se; ne vaativat speech-swift v0.0.27 tai myöhemmin (SpeechCore.xcframework alkaen 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()
APIOletus Vaikutus
turnCompletionThreshold0.5 Täydentymistodennäköisyys, jonka yläpuolella VAD -tauko päättää käyttäjän vuoron. Käytetään vain, kun luokituslaite on kiinnitetty.
turnCompletionMaxSilence2,0 sHiljaisuuden sekunteja mitattuna tauon alusta, jonka jälkeen kategorian veto-oikeus päättyy joka tapauksessa. 0 = ei koskaan.
setTurnCompletion(_:)— Kiinnittää kaikki TurnCompletionProvider. Soita ennen start(); välitä nil irrota. Luokituslaite, joka heittää lasketaan kokonaan, joten epäonnistuva malli ei koskaan keskeytä keskustelua.

Kun luokittelulaite on kiinnitettynä, käyttäjän kääntöpysäkki VAD päättyy vain, kun todennäköisyys saavuttaa kynnyksen; sen alapuolella putkisto kuuntelee, puhe, joka jatkuu samalla käännöksellä (ei sekunti speechStarted) ja turnCompletionMaxSilence päättää käännöksen joka tapauksessa. Eager STT kunnioittaa veto-oikeutta ja luokittelija toimii kerran taukoa kohti äänilangassa, joten soita prewarm() latauksen jälkeen.

Viritys

AsetuksetOletus Vaikutus
threshold0.5Alemmat arvot päättyvät nopeammin ja keskeytyvät useammin; korkeammat arvot odottavat kauemmin ennen vastaamista. Katso lastTurnCompletionProbability todellisista keskusteluista ennen niiden siirtämistä.
maxSilenceDuration2,0 s Vetotauko ei voi koskaan pitää kierrosta tätä pidempinä. 0 poistaa korkin käytöstä: pidetty segmentti odottaa sitten puhetta tai flush().
preRollDuration0.5 s Ääni ennen VAD -alkua, joka sisältyy luokituslaitteen tuloon, joten ensimmäinen tavu on vielä mallissa.

Silero's minSilenceDuration päättää edelleen, milloin tauko vahvistetaan, ja sen vuoksi, kun luokittelulaitetta pyydetään. Soita prewarm() ladattuasi, joten ensimmäinen todellinen tauko ei maksa kaavion kokoamista.

CLI-käyttö

# 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
VaihtoehtoKomento Tavaran kuvaus
--thresholdturnTodennäköisyys at tai yli, jonka kierros lasketaan täydellinen (oletus 0,5)
--jsonturnEmit probability, threshold, complete sekä latency_ms JSONina
--model, -mturnHuggingFace repo, jossa on sama ulkoasu (oletus aufklarer/Smart-Turn-v3.2-CoreML)
--model-dirturn Paikallinen hakemisto, jossa smart_turn.mlmodelc ja config.json; jättää latauksen väliin
--smart-turnvad-stream Vahvista jokainen tauko Smart Turn:lla ennen segmentin päättymistä
--turn-thresholdvad-streamSmart Turn valmistumiskynnys (oletusarvo 0,5)
--turn-max-silencevad-streamSekunteja hiljaisuuden jälkeen vetotauko, joka lopettaa segmentin joka tapauksessa (oletus 2.0)

speech turn lataa tiedoston (mikä tahansa näytenopeus), tekee pisteet viimeisten 8 sekunnin aikana ja tulostaa todennäköisyyden, tyhjentääkö se kynnyksen, ja sen vaikutusajan. Käytä sitä omien äänitteiden kynnyksen viritykseen. Täysi lippuluettelo on CLI-viittauksessa .

C++ / Android

Puhe Ydinalukset saman mallin kuin OnnxSmartTurn Linux, Windows ja Android (vain ONNX Runtime; LiteRT-varianttia ei ole). VoicePipeline::set_turn_completion() Kiinnittää sen ennen start(); VAD-tauko päättyy käyttäjän vuoroon vain, kun todennäköisyys saavuttaa turn_completion_threshold (0.5) ja turn_completion_max_silence (2.0 s) päättää kuitenkin pidetyn käännöksen. C API paljastaa saman koukun kuin sc_turn_completion_vtable_t + sc_pipeline_set_turn_completion(), joten Kotlin tai Swift isännät voivat silta oman luokittelun 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 tekee nauhoituksen samalla tavalla kuin macOS:

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

Mallitiedostot, C API -sopimus ja CLI-sopimus on dokumentoitu Puheydin -sivulla ja arkiston docs/models.md .

Mallilataukset

Malli Taustaosa KokoHuggingFace
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

Lähde