PersonaPlex

Moshi आर्किटेक्चर (Kyutai) पर आधारित Full-duplex speech-to-speech dialogue मॉडल। PersonaPlex 7B सीधे बोले गए input से बोले गए responses उत्पन्न करता है — कोई intermediate text pipeline आवश्यक नहीं। मॉडल 18 voice presets के साथ आता है और 8-bit (अनुशंसित) और 4-bit क्वांटिज़ेशन में उपलब्ध है। 8-bit डिफ़ॉल्ट है — यह 30% तेज़ है और coherent responses उत्पन्न करता है, जबकि 4-bit output गुणवत्ता को degrade करता है।

आर्किटेक्चर

PersonaPlex तीन core कॉम्पोनेंट वाला multi-stream autoregressive मॉडल है:

कॉम्पोनेंटविवरण
Temporal Transformer32 layers, dim=4096, 32 heads, SwiGLU (hidden_scale=4.125), RoPE, 8-bit क्वांटाइज़्ड (डिफ़ॉल्ट)
Depformer6 layers, dim=1024, 16 heads, MultiLinear (weights_per_step=true), dep_q=16
Mimi Codec16 codebooks, 12.5 Hz frame rate, 24 kHz ऑडियो आउटपुट

मॉडल एक साथ 17 streams प्रोसेस करता है: 1 text stream + 8 user audio streams + 8 agent audio streams। यह आर्किटेक्चर full-duplex conversation सक्षम करती है जहाँ मॉडल एक साथ सुन और बोल सकता है।

Voice Presets

PersonaPlex में natural और varied styles में 18 बिल्ट-इन voice presets शामिल हैं:

श्रेणीPresets
Natural FemaleNATF0, NATF1, NATF2, NATF3
Natural MaleNATM0, NATM1, NATM2, NATM3
Varied FemaleVARF0, VARF1, VARF2, VARF3, VARF4
Varied MaleVARM0, VARM1, VARM2, VARM3, VARM4

Inner Monologue

PersonaPlex प्रत्येक चरण पर दो parallel streams उत्पन्न करता है: Mimi codec के लिए 8 audio codebook tokens और मॉडल के आंतरिक monologue के लिए एक text token। Text stream वह है जो मॉडल बोलते समय "सोच रहा है" — यह अंतिम ऑडियो से थोड़ा diverge हो सकता है, लेकिन व्यवहार में यह spoken response को live transcript के रूप में उपयोग करने के लिए पर्याप्त रूप से closely mirror करता है।

Text tokens raw SentencePiece piece IDs के रूप में वापस आते हैं। उन्हें SentencePieceDecoder के साथ decode करें जो PersonaPlex ship करता है:

import PersonaPlex
import AudioCommon

let model = try await PersonaPlexModel.fromPretrained()
let decoder = try model.makeTextDecoder()  // SentencePieceDecoder

let result = model.respondWithTranscript(userAudio: userSamples, voice: .NATM0)
let transcript = decoder.decode(result.textTokens)
print(transcript)        // "Sure, I can help with that..."
playAudio(result.audio)  // 24 kHz mono Float32

Streaming mode में, respondStream textTokens chunks उत्पन्न होने के साथ उत्सर्जित करता है — ऑडियो अभी भी generate हो रहा होता है तब एक live caption view को drive करने के लिए उन्हें incrementally decode करें। --transcript CLI flag ठीक यही व्यवहार पर्दे के पीछे करता है।

यह क्यों मायने रखता है: SentencePieceDecoder shared AudioCommon.SentencePieceModel protobuf reader पर बना है, इसलिए PersonaPlex, OmnilingualASR और कोई भी भविष्य का SentencePiece-आधारित मॉडल उसी tokenizer कार्यान्वयन के माध्यम से decode करता है। SentencePieceModel reference देखें।

System Prompts

किसी भी custom system prompt को एक plain string के रूप में pass करें — कोई external tokenization आवश्यक नहीं:

let response = model.respond(
    userAudio: audio,
    voice: .NATM0,
    systemPrompt: "You enjoy having a good conversation."
)

या एक बिल्ट-इन preset का उपयोग करें:

CLI उपयोग

एक ऑडियो input से एक spoken response उत्पन्न करें:

# Basic speech-to-speech
.build/release/audio respond --input question.wav

# Choose a voice preset
.build/release/audio respond --input question.wav --voice NATM0

# Stream audio output during generation
.build/release/audio respond --input question.wav --stream

# Custom system prompt text
.build/release/audio respond --input question.wav --system-prompt-text "You enjoy having a good conversation."

# Use a preset system prompt
.build/release/audio respond --input question.wav --system-prompt customer-service

# Get transcript alongside audio
.build/release/audio respond --input question.wav --transcript

# JSON output with metadata
.build/release/audio respond --input question.wav --json

विकल्प

विकल्पविवरण
--inputInput ऑडियो फ़ाइल (WAV, आवश्यक)
--voiceVoice preset नाम (जैसे, NATM0, VARF2)
--system-promptSystem prompt preset: assistant, focused, customer-service, teacher
--system-prompt-textCustom system prompt text (--system-prompt को override करता है)
--max-stepsअधिकतम generation steps
--streamGeneration के दौरान ऑडियो chunks उत्सर्जित करें
--compileतेज़ generation के लिए MLX compiled inference का उपयोग करें
--transcriptऑडियो के साथ text transcript output करें
--jsonमेटाडेटा के साथ JSON आउटपुट

Sampling पैरामीटर भी override किए जा सकते हैं:

विकल्पडिफ़ॉल्टविवरण
--audio-temp0.8Audio token sampling temperature
--audio-top-k250Audio token top-k sampling
--text-temp0.7Text token sampling temperature
--text-top-k25Text token top-k sampling

Streaming

--stream flag रियल-टाइम ऑडियो आउटपुट सक्षम करता है। ऑडियो chunks उत्पन्न होने के साथ उत्सर्जित होते हैं, इसलिए playback पूर्ण response पूरा होने से पहले शुरू हो सकता है। यह विशेष रूप से interactive applications के लिए उपयोगी है जहाँ low latency मायने रखता है।

परफ़ॉर्मेंस

मेट्रिकमान
Real-time factor (RTF)~1.4 (8-bit, near real-time)
Step latencyM2 Max पर ~112 ms/step (8-bit)
मॉडल आकार (8-bit)~9.1 GB
Peak RAM (8-bit)~11 GB
मॉडल आकार (4-bit)~4.9 GB
Peak RAM (4-bit)~7 GB
महत्वपूर्ण

PersonaPlex 7B (8-bit) को कम से कम 24 GB RAM की आवश्यकता है। 4-bit वेरिएंट 16 GB डिवाइस पर फिट होता है लेकिन degraded output उत्पन्न करता है। 8 GB डिवाइस पर, कोई भी वेरिएंट फिट नहीं होगा। समर्थित हार्डवेयर पर सर्वश्रेष्ठ परफ़ॉर्मेंस के लिए --compile का उपयोग करें।

मॉडल वेरिएंट

मॉडलआकारHuggingFace
PersonaPlex-7B (8-bit) अनुशंसित9.1 GBaufklarer/PersonaPlex-7B-MLX-8bit
PersonaPlex-7B (4-bit)4.9 GBaufklarer/PersonaPlex-7B-MLX-4bit

Swift API

import PersonaPlex

let model = try await PersonaPlexModel.loadFromHub()
let response = try await model.respond(
    audioFile: "question.wav",
    voice: .NATM0,
    systemPrompt: .assistant
)
try response.audio.write(to: "answer.wav")