PersonaPlex
Moshi mimarisine (Kyutai) dayanan çift yönlü speech-to-speech diyalog modeli. PersonaPlex 7B, konuşulan girdiden doğrudan konuşulan yanıtlar üretir — ara metin pipeline'ı gerekmez. Model 18 ses preset'i ile birlikte gelir ve 8-bit (önerilen) ile 4-bit niceleme olarak sunulur. Varsayılan 8-bit'tir — %30 daha hızlıdır ve tutarlı yanıtlar üretir; 4-bit ise çıktı kalitesini düşürür.
Mimari
PersonaPlex, üç temel bileşene sahip çok akışlı otoregresif bir modeldir:
| Bileşen | Detaylar |
|---|---|
| Temporal Transformer | 32 katman, dim=4096, 32 head, SwiGLU (hidden_scale=4.125), RoPE, 8-bit nicelenmiş (varsayılan) |
| Depformer | 6 katman, dim=1024, 16 head, MultiLinear (weights_per_step=true), dep_q=16 |
| Mimi Codec | 16 codebook, 12,5 Hz frame oranı, 24 kHz ses çıktısı |
Model aynı anda 17 akış işler: 1 metin akışı + 8 kullanıcı ses akışı + 8 ajan ses akışı. Bu mimari, modelin aynı anda dinleyip konuşabildiği çift yönlü konuşmayı mümkün kılar.
Ses preset'leri
PersonaPlex, doğal ve çeşitli stillerde 18 yerleşik ses preset'i içerir:
| Kategori | Preset'ler |
|---|---|
| Doğal Kadın | NATF0, NATF1, NATF2, NATF3 |
| Doğal Erkek | NATM0, NATM1, NATM2, NATM3 |
| Çeşitli Kadın | VARF0, VARF1, VARF2, VARF3, VARF4 |
| Çeşitli Erkek | VARM0, VARM1, VARM2, VARM3, VARM4 |
İç monolog
PersonaPlex her adımda iki paralel akış üretir: Mimi codec için 8 audio codebook token'ı ve modelin iç monoloğu için bir metin token'ı. Metin akışı, modelin konuşurken “düşündüğü” şeydir — nihai sesten hafifçe sapabilir ama pratikte konuşulan yanıtı, canlı bir transkript olarak kullanmaya yetecek kadar yakından yansıtır.
Metin token'ları ham SentencePiece piece ID'leri olarak geri döner. Onları PersonaPlex'in sunduğu SentencePieceDecoder ile çözün:
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 modunda respondStream, textTokens chunk'larını üretildikçe yayar — ses hâlâ üretilmekteyken bir canlı altyazı görünümünü sürmek için bunları artımlı olarak çözün. --transcript CLI bayrağı tam olarak bunu perde arkasında yapar.
Neden önemli: SentencePieceDecoder, paylaşılan AudioCommon.SentencePieceModel protobuf okuyucusu üzerine inşa edilmiştir; bu nedenle PersonaPlex, OmnilingualASR ve gelecekteki tüm SentencePiece tabanlı modeller aynı tokenizer uygulaması üzerinden çözer. SentencePieceModel referansına bakın.
System prompt'ları
Herhangi bir özel system prompt'u düz bir string olarak iletin — harici tokenize gerekmez:
let response = model.respond(
userAudio: audio,
voice: .NATM0,
systemPrompt: "You enjoy having a good conversation."
)
Veya yerleşik bir preset kullanın:
assistant— Genel amaçlı yardımcı asistan (varsayılan)focused— Kısa ve net yanıtlarcustomer-service— Nazik, çözüm odaklı destek ajanıteacher— Sabırlı, açıklayıcı öğretim tarzı
CLI kullanımı
Bir ses girdisinden konuşulan yanıt üretin:
# Temel speech-to-speech
.build/release/speech respond --input question.wav
# Bir ses preset'i seç
.build/release/speech respond --input question.wav --voice NATM0
# Üretim sırasında ses çıktısını streaming
.build/release/speech respond --input question.wav --stream
# Özel system prompt metni
.build/release/speech respond --input question.wav --system-prompt-text "You enjoy having a good conversation."
# Preset system prompt kullan
.build/release/speech respond --input question.wav --system-prompt customer-service
# Sesle birlikte transkript al
.build/release/speech respond --input question.wav --transcript
# Metadata ile JSON çıktısı
.build/release/speech respond --input question.wav --json
Seçenekler
| Seçenek | Açıklama |
|---|---|
--input | Giriş ses dosyası (WAV, gerekli) |
--voice | Ses preset adı (örn. NATM0, VARF2) |
--system-prompt | System prompt preset'i: assistant, focused, customer-service, teacher |
--system-prompt-text | Özel system prompt metni (--system-prompt'u geçersiz kılar) |
--max-steps | Maksimum üretim adımı |
--stream | Üretim sırasında ses chunk'larını yay |
--compile | Daha hızlı üretim için MLX derlenmiş çıkarımı kullan |
--transcript | Sesle birlikte metin transkriptini çıkar |
--json | Metadata ile JSON çıktısı |
Örnekleme parametreleri de geçersiz kılınabilir:
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
--audio-temp | 0.8 | Ses token örnekleme sıcaklığı |
--audio-top-k | 250 | Ses token top-k örnekleme |
--text-temp | 0.7 | Metin token örnekleme sıcaklığı |
--text-top-k | 25 | Metin token top-k örnekleme |
Streaming
--stream bayrağı gerçek zamanlı ses çıktısını etkinleştirir. Ses chunk'ları üretildikçe yayılır; böylece tam yanıt tamamlanmadan önce çalma başlayabilir. Bu, düşük gecikmenin önemli olduğu etkileşimli uygulamalar için özellikle yararlıdır.
Performans
| Metrik | Değer |
|---|---|
| Gerçek zaman katsayısı (RTF) | ~1,4 (8-bit, gerçek zamana yakın) |
| Adım gecikmesi | M2 Max'ta ~112 ms/adım (8-bit) |
| Model boyutu (8-bit) | ~9,1 GB |
| Tepe RAM (8-bit) | ~11 GB |
| Model boyutu (4-bit) | ~4,9 GB |
| Tepe RAM (4-bit) | ~7 GB |
PersonaPlex 7B (8-bit) en az 24 GB RAM gerektirir. 4-bit varyant 16 GB cihazlara sığar ancak düşük kaliteli çıktı üretir. 8 GB cihazlarda hiçbir varyant sığmaz. Desteklenen donanımda en iyi performans için --compile kullanın.
Model varyantları
| Model | Boyut | HuggingFace |
|---|---|---|
| PersonaPlex-7B (8-bit) önerilen | 9,1 GB | aufklarer/PersonaPlex-7B-MLX-8bit |
| PersonaPlex-7B (4-bit) | 4,9 GB | aufklarer/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")