Skip to main content

Overview

DuplexJevTurnAnalyzer is a turn analyzer backed by DuplexJev, an open-weights speech model that answers multiple-choice questions about raw audio in one forward pass. Instead of a yes/no end-of-turn score it reads four turn states from the user’s audio — finished, still talking, just backchanneling (“mm-hmm”) or asking to wait — so a backchannel or a “hold on” does not trigger a reply. The same request can also return the user’s emotion, non-verbal sounds (laughter, breathing, coughs, sighs) and barge-in, or your own multiple-choice questions. No transcript is needed for the decision.
Not to be confused with the Jev classifier (pipecat-ai[jev]) by TypeSafe — DuplexJev is a separate, open-weights speech model by Adventists.ai.

Source Repository

Source code, examples, and issues for the DuplexJev integration

PyPI Package

The pipecat-duplexjev package on PyPI

Installation

This is a community-maintained package distributed separately from pipecat-ai:

Prerequisites

  • Pipecat 1.0 or later (tested with pipecat-ai 1.12.0)
  • A DuplexJev gateway: a free, rate-limited trial API is used by default (30 requests per minute). For a live bot, serve the model next to your agent; DuplexJev-4B-Para needs about 10 GB of GPU memory:
The plugin code is BSD-2-Clause; the model weights are CC BY-NC 4.0 (non-commercial use; a commercial licence is available from the maintainers).

Usage

Configuration

str
default:"hosted trial API"
Base URL of a duplexjev gateway.
str
default:"None"
Bearer key, if your gateway requires one.
str
default:"\"en\""
"en" or "zh": wording of the questions (the model hears both languages either way).
float
default:"0.5"
Probability of “finished” from which the turn is complete.
list
default:"[]"
"emotion", "sound", "barge_in", or dicts {"id", "text", "options"}. Answers arrive in last_answers and on_answers, from the same forward pass as the turn decision.
Callable
default:"None"
Callback with every answer dict.
SmartTurnParams
default:"SmartTurnParams()"
Pipecat’s usual stop_secs, pre_speech_ms and max_duration_secs.
If the gateway cannot be reached, the analyzer logs the error and reports “not finished”, so Pipecat falls back to its silence timeout and the conversation never blocks.