VoiceChat araç çağrıları ve performansına ilişkin en güncel bilgiler için İngilizce sürüme bakın.
Konuşmadan konuşmaya modeller
Soniqo, konuşmadan konuşmaya diyalog için iki native MLX model ailesini destekler: PersonaPlex 7B ve VoiceChat 11B. İkisi de konuşmayı alıp model sesini doğrudan üretir, ancak duplex mimarileri ve runtime sözleşmeleri farklıdır.
Model seçin
| Model | Diyalog modeli | En uygun kullanım |
|---|---|---|
| PersonaPlex 7B | Moshi, Depformer ve Mimi ile eşzamanlı full duplex | Dinleme ve konuşmanın örtüşmesi, seçilebilir 18 ses |
| VoiceChat 11B | FastConformer, Nemotron-H, EAR-TTS ve neural codec ile sürekli frame-synchronous duplex | 80 ms streaming frame'leri, metin/işlev event'leri ve checkpoint-native konuşma |
Bunlar konuşmadan konuşmaya diyalog modelleridir. Hibiki de konuşmayı doğrudan konuşmaya dönüştürür; ancak görevi streaming konuşma çevirisidir ve ayrı belgelenir.
PersonaPlex 7B
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.
VoiceChat 11B
Duplex speech-to-speech referansı: SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspeech 2025); NVIDIA'nın upstream VoiceChat model kartında atıf yapılır.
M5 Pro, 48 GB, Release, 80 ms canlı ritim, korumalı head INT5: üç kontrollü çalıştırma tüm pipeline RTF'sini 0.94, 0.92 ve 0.92; tepe RSS'yi yaklaşık 8.70 GB ölçtü. İlk konuşulan metin 44.3–46.7 ms, ilk oynatılabilir ses 74.0–76.4 ms içinde geldi. Bunlar ısınmış hesaplama değerleridir, öğrenilmiş sıra alma gecikmesi değildir; optimize INT8 performansı henüz yeniden ölçülmedi.
VoiceChat, speech-swift'teki diğer native MLX konuşmadan-konuşmaya runtime'ıdır. Nedensel FastConformer algı, Nemotron-H duplex metin/işlev kanalları, bağımsız metin koşullu EAR-TTS ve 22,05 kHz nöral codec'i birleştirir. Session sürekli 16 kHz mono ses alır ve her 80 ms'de metin olaylarıyla 1.764 örneklik bir çıkış frame'i döndürür.
VoiceChatModel.load(from:) ile yükleyin, bir VoiceChatSession başlatın ve sesi pushAudio ile verin. Eksiksiz bundle encoder/, llm/ ve tts/ içermelidir; eski yalnızca-anlama bundle'ları reddedilir.
INT5, test edilen M5 Pro'da RTF 1'in altında toplam throughput sürdürür. Üç çalıştırmanın tamamında toplam/frame p95 76.2–78.6 ms ile 80 ms'nin altında kaldı; yine de deadline payı dardır. Modelin konuşma başlangıcı ile donanım hesaplama gecikmesini ayrı ölçün.
Canlı VoiceChat CLI
NVIDIA Nemotron VoiceChat 11B tabanlı eksiksiz protected-head INT5 bundle ile Soniqo'yla konuşun. Komut, Apple AEC için yakalama ve oynatmayı tek AVAudioEngine içinde tutar, bundle'ın RNN-T kullanıcı altyazılarını stream eder ve dinlemeye devam ederken 22,05 kHz model sesini oynatır.
Varsayılan Soniqo prompt'u yetenek sınırlarını açıkça belirtir: Bu CLI sohbet edip soruları yanıtlayabilir, ancak takvimlere, hatırlatıcılara, uygulamalara, hesaplara, cihazlara veya harici hizmetlere erişemez. Bu tür isteklerde Soniqo işlemi yapamayacağını açıkça söyler, yerine getiremeyeceği bir onay istemez ve kullanıcının kendi başına ne yapabileceğini kısaca önerir.
speech voice-chat
speech voice-chat --input question.wav --output response.wav
speech voice-chat \\
--mcp-config Examples/VoiceChatMCP/apple-reminders.json
Yapılandırılabilir MCP araçları
Birlikte gelen apple-reminders-eventkit bağdaştırıcısı artık modele yalnızca list_reminders, create_reminder ve update_reminder işlemlerini açar. Liste keşfi bağdaştırıcının içinde gizli kalır. Güncellemede kullanıcı hatırlatıcının adını söyler; çalışma zamanı bunu güvenilir özel EventKit kimliğine çözer ve bu kimlik modelin gördüğü sonuca hiç girmez. Oluşturma ve tarih tek bir EventKit kaydıyla işlenmeye devam eder. İlk sunucu başlangıcına en az 60 saniye, normal araç çağrılarına varsayılan 15 saniye verilir.
MCP yalnızca --mcp-config verildiğinde etkinleşir. Sağlayıcıdan bağımsız JSON herhangi bir stdio MCP server başlatabilir ve enabledTools ile en fazla beş aracı açıkça seçer. readOnlyTools içinde olmayan her araç yazma olarak değerlendirilir. Varsayılan politika confirm'dur: İlk çağrı bekletilir; Soniqo'nun deterministik onayı yorumlanan argümanları tekrarlar ve henüz hiçbir şeyin değişmediğini belirtir. Yalnızca kullanıcının yeni olumlu yanıtı çağrıyı bir kez çalıştırabilir. Yeni kullanıcı konuşması olmadan aynı çağrı allow altında bile iki kez çalıştırılamaz. deny ve açık oturum yetkisi allow da vardır. Gerçek sonuç modelin function channel'ına döner ve başarı için ok yanıtı gerekir.
Yazma argümanları onaydan önce kullanıcı transkriptiyle karşılaştırılır. Göreli tarihler güncel yerel tarihe göre çözülür; uydurulmuş liste adları, eski tarihler, öncelikler ve diğer doğrulanmamış değerler asla çalıştırılmaz. Yeni RNN-T konuşması ve ardından söz sonu, transkript sıfırlansa bile onayı çözer. Soniqo yalnızca MCP server gerçekten ok: true döndürdüğünde başarı bildirir; aksi halde yürütmenin doğrulanamadığını söyler.
“Hangi hatırlatmalarım var?” tüm EventKit listelerini kapsayan tek bir düz list_reminders çağrısı yapar. Liste, tarih, tamamlanma durumu ve yalnızca çalışma zamanında kullanılan kararlı kimlik önbelleğe alınır; ayrıntı soruları ve güvenli güncellemeler her listeyi yeniden okumaz. Pano, işlev kod çözmenin süresini, token adımlarını ve token/s değerini ses RTF’sinden ayrı gösterir; RTF yalnızca öndeki 80 ms ses karelerini ölçmeye devam eder.
Sesli onay, kullanıcının “devam etmek” isteyip istemediğini sorar ve olumlu izin listesindeki tüm ifadelerden özellikle kaçınır; böylece oynatma yankısı bekleyen işlemi yetkilendiremez.
Alt MCP server'lar yalnızca PATH, HOME, geçici dizin ve yerel ayar değişkenlerini devralır. Kimlik bilgileri server'ın env map'inde açıkça verilmelidir; üst process'in ilgisiz secret'ları aktarılmaz.
8-bit function projection yaklaşık 518 MB'tır. Normal konuşma sırasında VoiceChat yalnızca cache edilmiş 36 KB PAD/tool-start probunu değerlendirir. 131.072 satırlık tam head ancak tool-start önce PAD'i geçtiğinde çalışır, global argmax'ı doğrular ve açık JSON çağrısı üretilirken etkin kalır. MCP sonucu bilindiğinde VoiceChat bunu sınırlı 16-token causal-prefill parçalarıyla yeniden oynatır; eğitilmiş function feedback ile language/speech cache durumunu korurken her sonuç token'ı için ayrı bir 11B decode çalıştırmaz. Böylece tool-start kararları zayıflatılmadan MCP konuşması realtime kalır.
Oynatma öncesinde varsayılan olarak üç 80 ms frame, yani 240 ms buffer edilir. Bir kesintiden sonra oynatma sekiz frame'lik kurtarma tamponunu bekler. İlk 88 ms callback veya kuyruktaki üç frame sonrasında ses iyileştirmesi sekiz adımdan ikiye iner; 120 ms, altı frame veya giriş yeniden eşzamanlamasında doğrudan bir adıma iner. Kuyruk yine de sekiz frame'e (640 ms) ulaşırsa yeni girişi kabul etmek için gereken en az miktardaki eski mikrofon sesi atılır. Süren overload tek bir kurtarma dönemi sayılır ve RNN-T tarafından zaten doğrulanmış kullanıcı turu tekrarlanan resetlerle silinmez. Atlanan sözcükler işaretli kalır ve tekrar edilmesi gerekebilir.
Metrikler kullanıcı deneyimini açıklar: behind 0.3 s bekleyen mikrofon sesidir, RTF 0.93× hesaplama süresinin ses süresine oranıdır (1'in altı yetişir, üstü geride kalır) ve last 74 ms for 80 ms audio son hesaplama süresini her model frame'inin temsil ettiği 80 ms sesle karşılaştırır. Hareketli ortalama son 120 mikrofon callback'ini kullanır; replay olayları ek ses süresi sayılmaz.
Mikrofon modu varsayılan olarak NVIDIA tarzı RNN-T konuşma sırası yönetimini kullanır. Modelin öğrendiği BOS/EOS kararları normal düşük gecikmeli yol olarak kalır. Her 80 ms frame'in ilk tahmini blank veya non-blank kabul edilir; kullanıcı konuşması doğrulandıktan sonra art arda 40 blank frame (3,2 sn) yalnızca yanıtı başlatan güvenlik fallback'i olur, 40 yeni non-blank frame ise eşleşen barge-in fallback'ini sağlar. Soniqo başladığında konuşma sayacı sıfırlanır; böylece tamamlanan kullanıcı sırasındaki etkinlik yanıtı hemen kesemez. Tüm ses frame'leri duplex modele ulaşmaya devam eder; bu fallback'leri kapatıp BOS/EOS kararlarını yalnızca öğrenilmiş dil head'ine bırakmak için --no-rnnt-turn-taking kullanın. Panel, RNN-T barge-in'lerini oynatma boşluklarından ayrı gösterir.
Normal modda kullanıcı konuşması doğrulanana kadar modele özgü BOS bastırılır; böylece Soniqo ilk konuşan olmaz. --greet başlangıç selamlamasına açıkça izin verir. Duyulan yanıt içeriğinden sonra blank PAD, en az 16 frame ya da içerik token'ı başına üç frame olacak şekilde daha uzun bütçe boyunca açık sırada kalır. Bütçeyi aşan ilk blank PAD mantıksal sırayı kapatır. İçeriğe göre ölçeklenen bu kuyruk, sabit 1,28 saniyelik kesmenin susturabileceği gecikmeli sözcükleri korur.
Etkileşimli mod terminalin alternatif ekranında sabit bir panel kullanır; durum güncellemeleri kaydırma geçmişini doldurmak yerine yerinde yeniden çizilir. Yalnızca eklenen çıktı için --plain kullanın.
Yerel tanılama için --debug-timeline her kullanıcı ve Soniqo ifadesine zaman damgası ekler; ayrıştırılmış yerel çağrı bağımsız değişkenlerini, MCP başlangıç/tamamlanmasını ve sonuç önbelleği eşitlemesini aynı kronolojiye yerleştirir. Ayrıca son duyulabilir üretilmiş PCM penceresinde pronunciation ended işaretini koyar; bu model çıkış zamanıdır, hoparlörün bitişi değildir. Demo geçmiş aşama süresi bloklarını göstermez; yerel çözümleme, sağlayıcı, önbellek ve mikrofon baskısı ayrıntıları voicechat-bench JSON'unda kalır. Araç bağımsız değişkenlerini açığa çıkarabileceğinden paylaşılan günlüklerde kullanmayın. Aşama zamanlayıcısı yerel çözümleme ile sağlayıcı beklemesi arasında sıfırlanır.
Canlı oturumlar değişmeyen 37 frame'lik konuşmacı istemini ve son 20 saniyelik EAR-TTS geçmişini tutar; anlamsal konuşma durumu Nemotron-H içinde ayrı korunur. İçeriğe göre ölçeklenen akustik kuyruktaki PAD normal üretilir; yalnızca sonrasındaki sessiz PAD frame'leri sekizli gruplar hâlinde nedensel olarak ilerletilir. Böylece konuşulan yanıt kesilmez, TTS attention maliyeti ve boşta çalışma da sınırlı kalır. --live-speech-context-seconds 0 tam TTS geçmişini geri getirir; dosya modu varsayılan olarak tam ve kesin geçmiş kullanır.
M5 Pro üzerindeki güvenli kuyruklu 63,6 saniyelik profilde canlı yol toplam RTF 0,87, son pencere RTF 0,71, son pencere sentezi 4,1 ms/frame, peak RSS 8,72 GB ve peak fiziksel footprint 23,67 GB ölçtü. Sekiz adımlı etkin konuşma pencereleri RTF 1,05 ve 1,12'ye ulaştığı için etkileşimli CLI giriş kuyruğu büyüdüğünde geri alınabilir biçimde iki adıma ve acil durumda bir adıma inmeye devam eder. Sıralı ve toplu boşta-cache durumları arasındaki minimum kosinüs benzerliği 0,9999999 oldu.
voicechat-bench başlangıç tıkırtısı algılayıcısı üretilen giriş bölümünü ve sürekli konuşmanın ilk 50 ms'sini inceler. Yalnızca 0,05 genliği ve kararlı konuşma p99 tabanının altı katını aşan sıçramaları işaretler; senaryo maximum_suspect_onset_transients değerini sıfır yapabilir.
48 GB M5 Pro üzerindeki üç Release çalıştırması RTF 0,92, toplam-frame p95 74,8–75,8 ms, ilk oynatılabilir ses 74,2–74,9 ms ve yaklaşık 8,74 GB peak RSS ölçtü. Transkript ve yanıt üç çalıştırmada aynıydı.
PersonaPlex mimarisi ve kullanımı
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 = model.tokenizer // SentencePieceDecoder?
let result = model.respond(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:
# Basic speech-to-speech
.build/release/speech respond --input question.wav
# Choose a voice preset
.build/release/speech respond --input question.wav --voice NATM0
# Stream audio output during generation
.build/release/speech respond --input question.wav --stream
# Custom system prompt text
.build/release/speech respond --input question.wav --system-prompt-text "You enjoy having a good conversation."
# Use a preset system prompt
.build/release/speech respond --input question.wav --system-prompt customer-service
# Get transcript alongside audio
.build/release/speech respond --input question.wav --transcript
# JSON output with metadata
.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
import AudioCommon
let model = try await PersonaPlexModel.fromPretrained()
let response = model.respond(
userAudio: userSamples,
voice: .NATM0,
systemPrompt: "You are a helpful assistant."
)
try WAVWriter.write(samples: response.audio, sampleRate: 24000, to: URL(filePath: "answer.wav"))