Maskinöversättning · Engelskt original

Tal-till-tal modeller

Soniqo stöder två infödda MLX modellfamiljer för konversationstal-till-tal: PersonaPlex 7B och VoiceChat 11B. Båda konsumerar tal och genererar modellljud direkt, men de använder olika duplexarkitekturer och runtimekontrakt.

Välj en modell

ModellKonversationsmodellBästa passform
PersonaPlex 7Bsamtidig full duplex med Moshi, Depformer och MimiÖverlappande lyssna/tala beteende och 18 utvalda röster
VoiceChat 11BKontinuerlig, ramsynkron duplex med FastConformer, Nemotron-H, EAR-TTS och en neural codec80 ms streaming ramar, text/funktionshändelser och checkpoint-native tal

Dessa är konversationstal-till-tal-modeller. Hibiki kartlägger också tal direkt till tal, men dess uppgift är att strömma talöversättning, så det dokumenteras separat.

PersonaPlex 7B

Full-duplex tal-till-tal dialog modell baserat på Moshi arkitektur (Kyutai). PersonaPlex 7B genererar talade svar direkt från talad ingång - ingen mellanliggande text pipeline krävs. Modellen fartyg med 18 röst förinställningar och är tillgänglig i 8-bit (rekommenderad) och 4 -bit kvantisering. 8-bit är standarden - Det är 30% snabbare och producerar sammanhängande svar, medan 4-bit nedbryter produktionskvaliteten.

VoiceChat 11B

Duplex tal-till-tal referens: SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspeech 2025), citerad av NVIDIA uppströms VoiceChat modellkort.

M5 Pro, 48 GB, Släpp, 80 Ms live cadence, skyddad huvud INT5: tre kontrollerade körningar mätt helpipeline RTF 0.94, 0.92och 0.92med omkring 8.70 GB-topp RSS. Först talad text anlände till 44.3–46.7 ms och första spelbara ljud i 74.0–76.4 ms. De är heta beräkningsfigurer, inte lärt sig vändning latens; optimerad INT8 prestanda har ännu inte blivit remeasured.

VoiceChat är den andra infödda MLX tal-till-tal runtime i speech-swiftDet kombinerar orsakssamband FastConformer perception, Nemotron-H duplex text/funktionskanaler, fristående text-konditionerade EAR-TTS och en 22.05 kHz neural codec. En session accepterar 16 kHz mono ljud kontinuerligt och returnerar text händelser plus en 1,764Sample output ram varje 80 ms.

Använd VoiceChatModel.load(from:), starta en VoiceChatSession, och mata ljud med pushAudio. En komplett bunt måste innehålla encoder/, llm/, och tts/

Aktuell prestanda

INT5 upprätthåller aggregat genomströmning under RTF 1 på den testade M5 Pro. Alla tre körningarna höll också total/ram p95 under 80 ms, vid 76,2–78,6 ms; deadline headroom förblir därför smal. Behandla modellen svängs och hårdvarukompensens som separata mätningar.

Live VoiceChat CLI

Prata med Soniqo med hjälp av den fullständiga skyddade huvudet INT5 bunt, drivs av NVIDIA Nemotron VoiceChat 11B. Kommandot fortsätter att fånga och spela upp på en AVAudioEngine för Apple AEC, strömmar buntens RNN-T-användarkaptioner och spelar 22,05 kHz-modellljud medan du fortsätter att lyssna.

Standarden Soniqo prompt är kapabilitetsgrundad: detta CLI kan konversera och svara på frågor, men det kan inte komma åt kalendrar, påminnelser, appar, konton, enheter eller externa tjänster. För dessa förfrågningar Soniqo tydligt säger att det inte kan utföra åtgärden, inte be om en bekräftelse det inte kan uppfylla, och kort föreslår vad användaren kan göra istället.

speech voice-chat

speech voice-chat --input question.wav --output response.wav

Konfigurerbara MCP verktyg

MCP är inaktiverad såvida inte --mcp-config levereras. Den leverantörsneutrala JSON-filen kan starta någon stdio MCP server och uttryckligen väljer vilka upptäckta verktyg som når VoiceChat. Den medvetet smala Apple Reminders-exem exponerar listan, skapar och uppdaterar verktyg:

speech voice-chat \
  --mcp-config Examples/VoiceChatMCP/apple-reminders.json

Det buntade exemplet stift en EventKit-stödd leverantör bakom en apple-reminders-eventkit adapter. VoiceChat exponerar endast den kanoniska list_reminders, create_reminderoch update_reminder Operationer - inte leverantörens borttagning, list-mutation, kalender eller subtask åtgärder. Lista upptäckten förblir privat till adaptern. En påminnelse och dess förfallodatum begås i en EventKit spara, undvika den tidigare partiell-skriva misslyckande som kan lämna en oundated påminnelse bakom. Leverantören kan sammanställa sin lilla Swift-hjälpare vid första användningen, så start har en separat 60 sekund ersättning; normala verktygssamtal hålla 15

Endast endast endast endast endast enabledTools visas för modellen, med högst fem per session. Verktyg är skrivna om inte konfigurationen uttryckligen listar dem i readOnlyToolsWrites default to --mcp-write-policy allow, så en fullständig infödd samtal exekverar omedelbart och dess verkliga leverantör resultat driver svaret; påminnelser demo inte lägga till en andra bekräftelse tur. En identisk färdig skriv är fortfarande undertryckt tills fräsch akustisk aktivitet. confirm för explicit modellmedierad bekräftelse eller deny att inaktivera skrifter.

Det finns ingen transkript router, regelbunden-expression matcher, slot extraktor, påminnelse utkast stat, argument reparation, talat namn beslutsfattare eller skript assistent tal. checkpoint ensam väljer verktyget och argumenten. Samordnaren validerar aktiverat verktyg medlemskap och JSON-typer, tillämpar politik, kallar MCP, och returnerar strukturerad framgång eller misslyckande genom den utbildade funktionsresponskanalen. Misslyckade leverantörsresultat, ogiltiga argument, nekade författare och otillgängliga verktyg suspenderar nya funktioner startar bara inleder. name för att skapa och platta alla EventKit listor i en list_reminders Det presenterar långa leverantörs-UUID som stabila, sessionskodade referenser som r1, sedan löser en exakt modell-återställd referens innan update_reminder Det här är förlustfri ID-komprimering, inte transkript eller avsiktsmatchning. saknade eller ogiltiga värden går tillbaka till modellen för en naturlig förtydligande; de är aldrig tysta härledda från den visade utskriften.

Modell-inhemska samtal JSON körs asynkront på en cachad tyst inbäddning. När ett samtal är öppet hoppar den tvångs-PAD textkanalen över sin oanvända 131,072-row projection. Efter EOTC fryser tvåfasvägen det delade språket och tidslinjen EAR-TTS medan det externa resultatet väntar, matchar NVIDIA"S referens wrapper; mikrofonramar fortsätter genom uppfattning och RNN-T men inte införs som syntetiska PAD-positioner. Kända resultattokens återspelar i gränsade 16-token causal-prefill chunks. sessionen ger mellan call tokens och resultat partier, externa MCP I/O körs i en separat uppgift, och levande mikrofon perception plus RNN-T-kaptioner förblir berättigade hela. Behållna användartal återinträder den delade tidslinjen vid inte mer än en gammal semantisk ram per live callback; den nuvarande ramen förblir köad, förflutet replay ljud är dämpad, och tomgång EAR-TTS positioner synkronisera senare i bundna åtta-ram bitar. Live loopen läser sammanhängande funktion och MCP Status ögonblicksbilder varje 160 ms istället för att göra flera skådespelare samtal efter varje mikrofonram. Den interaktiva instrumentpanelen rapporterar den aktiva verktygsfasen; den strukturerade referensposten registrerar inhemsk avkodning, MCP rundtur, resultat synkronisering, modell / cache compute, och live interleave kvarvarande separat. Vanlig konversation och pråm hålla NVIDIA 40-ramsäkerhetsnedgång; en redan föreslagen inhemsk verktygskandidat kan begå efter åtta tomma ramar.

På en Idle M5 Pro med 48 GB, tre inhemska påminnelse-list fraser nådde modell-auktoriserad post-tool tal 3.56–4.00 sekunder efter slutet av ingången med en fast 200 Native JSON tog emot 1.15–1.28 sekunder för 27–31 steg; 67-token resultat tog 0.58–0.72 sekunder i fem prefills. En fokuserad uppdatering regression krävs 67 inhemska steg / 5.25 sekunder när modellen upprepade en realistisk EventKit UUID, jämfört med 37 Steg / om 2.29 sekunder med förlustlöst löst r1 referens—45% färre token steg och om 56% mindre avkodningstid. En separat tvåsekunders-leverantörs stress hålls leverantörsvänta mikrofonarbete på 19.6 Ms p95 och 19.8 ms maximum, så extern I/O lägger till svarsfördröjning utan att hålla fånga. En sista ren kör mätt 118 Mikrofon-service p95 och 139 Ms p95 separering bortom 80 ms ingång deadlines; den senare exponerar korta resultatsynkk köer sprickor dolda av förgrunden RTFDen lokala EventKit läste sig mätt 358 ms efter engångs MCP Startup. En testad skapande fras transkriberades korrekt men valde vanligt tal snarare än ett inhemskt samtal; Detta är fortfarande modellverktygsval kvalitet, inte en dold runtime router.

Samtidighetsgränsen är den delade Nemotron-H KV-cache: vanliga resulterade tal kan inte bilda en andra oberoende kausal framtid medan funktionstokens genereras eller återspelas. Soniqo återupptar sammanhängande, modell-auktoriserat tal efter <SPECIAL_22> stänger verktygsresponsen. Fullt överlappande godtyckligt tal skulle kräva en spekulativ andra cache och sammanslagning, eller en separat funktionsfunktion.

Child MCP servrar ärver endast PATH, HOME, tillfälliga kataloger och lokalvariabler. Krediterier måste passeras uttryckligen i serverns env karta; orelaterade föräldraprocesshemligheter vidarebefordras inte. Det konfigurerade kommandot körs fortfarande lokalt med den aktuella användarens filsystem och applikationsbehörigheter, så använd endast betrod MCP

Den som 8-bit funktionsprojektion handlar om 518 MB Under ordinarie tal, VoiceChat utvärderar endast en cached 36 KB PAD / verktygsstart sond. Om verktygsstarten vinner före turn gränsen, bara dess 4,096-värde dold status kandidat behålls; full-vocabulary verifiering körs när lärt BOS anländer eller den slutliga RNN-T säkerhets endpoint löper ut. För en generisk infödd samtal, verifierad call JSON körs sedan med full språkmodell hastighet på en uppfattning inbäddning cachelagd från en sekund av tystnad i stället för en gång per per perception 80 Ms mikrofonram. En gång en MCP Resultatet är känt, VoiceChat replays it in bounded 16-token causal-prefill chunks, bevara den utbildade funktionen feedback och språk / tal cache stat utan en 11B dekod per resultat token. sessionen ger mellan genererade call tokens och svar-prefill-bitar så levande mikrofonuppfattning, RNN-T-kaptioner och långvarig-tal avbrottsdetektering fortsätter; separata samtal och svarsgränser omvandlar missbildade PAD-bara arbete till en explicit retry snarare än en permanent stall.

Uppspelning prebuffers tre 80 ms ramar (från240 ms) som standard. Efter en högtalare gap, väntar det på en åtta-ram återhämtning kudde innan omstart. Voice refinement droppar från åtta till två steg efter den första. 88 ms callback eller när tre ramar kö; en 120 ms callback, sex köade ramar, eller ingång resynkronisering går direkt till ett nödsteg. Endast akustiska förfining förändringar - perception, RNN-T och språktillstånd förblir intakt. Om köen fortfarande når sin standard åtta-ram /640 ms limit, endast den minsta äldsta mikrofon ljud som behövs för att erkänna färsk inmatning kasseras. Sustained överbelastning behandlas som en återhämtning episod, och en användarvridning som redan bekräftats av RNN-T förblir beväpnad i stället för att raderas av upprepade återställningar. Skippade ord är fortfarande markerade och kan kräva upprepning.

Dashboard använder mänskligt motsatta mätvärden: behind är queued microphone audio, RTF 0.93× är rullande medelvärdet över de senaste 120-mikrofonuppkopplingarna av väggtid dividerad med 80 ms ljud (under 1 håller upp; över 1 faller bakom), och last 74 ms for 80 ms audio innebär att den senaste återkopplingen tog 74 ms. Replay-evenemang räknas inte som extra ljudbeteckningar. Eftersom RTF är ett fönster, kan det förbli högt kort efter en dyr operation även när last har återhämtat sig. nedanför konversationen, speaker gaps, old-audio skipsoch microphone audio skipped Gör återhämtningen explicit. PLEASE REPEAT visas bara när mikrofonljud faktiskt hoppades.

Mikrofonläge använder NVIDIA-stil RNN-T som standard. Det transkripta huvudet behandlar sin första förutsägelse på varje 80 ms ram som tomma eller icke-blank. Två initiala talramar och tre på senare turer förblir långvariga-aktivitetsnedgångar, medan en erkänd lexisk token omedelbart beväpnar en tomgång så en komplett "ja" eller "vem är du?" kan inte visas i bildtexten och sedan vänta på mer tal. Punctuation och okända etiketter använder inte den genvägen. VoiceChat"De lärda BOS / EOS förutsägelser förblir de normala låg latens beslut. Fyrtio tomma ramar (fyrtio blanka ramar).3.2 sekunder) tvinga BOS endast om det lärda huvudet aldrig öppnar ett svar, och fyrtio fräscha icke-blank ramar ger matchande RNN-T EOS-säkerhetsnedgång. Soniqo startar, så aktivitet från den färdiga användarvridningen kan inte omedelbart skära svaret. Varje ljudram når fortfarande duplex-modellen; användning --no-rnnt-turn-taking Att lämna BOS/EOS-beslut helt till det lärda språkhuvudet. Dashboard rapporterar RNN-T barge-ins separat från uppspelningsunderstöd.

RNN-T-frontend matchar NeMos reflektion padding vid varje rullande mikrofon-fönsterkant. Detta tar bort en noll-padding felmatch som kan förändra marginella giriga token beslut; det ersätter inte checkpointens kompakta 1,024-token transkript huvud med en allmän stor-vocabulary ASR.

I normalläge undertrycks modellinfödda BOS tills användartal bekräftas, så Soniqo talar inte först. --greet explicit tillåter den ursprungliga hälsningen. Efter hörbart svarsinnehåll stannar blank PAD inuti den öppna svängen för åtminstone 16-ramar och för tre ramar per innehållstoken när det är längre. Den första överskotts tomma PAD stänger den logiska svängningen. Denna innehållsskalade svans bevarar fördröjda ord som en fast 1.28 sekund cutoff kan stänga.

Interaktivt läge använder en fast instrumentbräda i terminalens alternativa skärm, så statusuppdateringar ritas på plats istället för att fylla rullning. Använd --plain för append-only utgång.

För lokal diagnos, --debug-timeline tidsstämplar varje användare och Soniqo fras och infogar de parsed inhemska samtalsargumenten, MCP start / slutförande, och resultat-cache synkronisering i samma kronologi. Det markerar också pronunciation ended vid det slutliga hörbara genererade-PCM-fönstret; detta är modell-output tid, inte högtalar-enhet slutförande. Demo avsiktligt utelämnar historiska fas-timing block; detaljerade inhemska-dekod, leverantör, cache och mikrofon-tryck mätvärden kvar i voicechat-bench Tidslinjen kan exponera verktygsargument, så använd inte det i delade loggar. Fas timers återställs mellan inhemsk avkodning och leverantör vänta.

Mätad med live captions

Tre M5 Pro 48 GB release körs mätt RTF 0,92, total-frame p95 74,8-75,8 ms, första spelbara ljud 74,2-74,9 ms, och ca 8,74 GB topp RSS. Transcript och svar var identiska över körningarna.

Live-sessioner håller den oföränderliga 37-ramshögtalaren snabb plus 20 sekunder av den senaste EAR-TTS-historien, medan Nemotron-H håller semantiskt konversationstillstånd separat. PAD inuti det innehållsskalade akustiska svansen görs normalt; endast senare tysta PAD-förskott kausalt i partier av åtta. Detta förhindrar TTS uppmärksamhet och tomt arbete från att växa utan bunden utan att skära det talade svaret; --live-speech-context-seconds 0

I en 63.6-andra M5 Proprofil med innehållssäkra svansen, den levande vägen mätt aggregat RTF 0.87, final-window RTF 0.71, 4.1 ms/frame final-window synthesis, 8.72 GB peak RSS och 23.67 GB-topp fysiskt fotavtryck. Tal-aktiva åttastegsfönster nådde RTF 1.05 och 1.12, så den interaktiva CLI använder en reversibel tvåstegsnedgång och enstegs nödläge. Enstegssyntes tilldelar alla 31 RVQ-kodböcker i ett enda pass; det skyddar live-fångst men är inte akustisk paritet med åttastegsschemat. Sequential och batched idle-cache-stater hade minsta kosin 0.9999999.

För ljuddiagnos jämför riktmärket den gränsade live codec-window render med en kontinuerlig full-kontext render. En lång paus närvarande i båda genererades av EAR-TTS eller codec, inte av högtalarköen; en diskontinuitet som bara finns i live render-punkterna mot codec-vindow-sömning. Speaker luckor förblir en separat uppspelningsunderflöd metrisk. En dedikerad onset-pop-detektor skannar den genererade lead-in plus den första 50 ms av långvarigt tal och flaggor sampling hoppar över båda 0.05 amplitude och sex gånger den stadiga tal p99 Baslinje. Scenarios kan ställa in maximum_suspect_onset_transients noll, medan perceptuell lyssning är den slutliga kvalitetskontrollen.

PersonaPlex arkitektur och användning

PersonaPlex är en multi-stream autoregressiv modell med tre kärnkomponenter:

KomponentDetaljer
Temporal Transformer32 lager, dim=4096, 32 huvuden, SwiGLU (dolden_scale=4.125), RoPE, 8-bitars kvantiserad (standard)
Depformer6 lager, dim=1024, 16 huvuden, MultiLinear (weights_per_step=true), dep_q=16
Mimi Codec16 kodböcker, 12,5 Hz-ramhastighet, 24 kHz ljudutgång

Modellen processer 17 streams samtidigt: 1 text stream + 8 användar ljudströmmar + 8 agent ljudströmmar. Denna arkitektur möjliggör full-duplex konversation där modellen kan lyssna och tala samtidigt.

Voice Presets

PersonaPlex innehåller 18 inbyggda röstförinställningar över naturliga och varierade stilar:

KategoriFörinställningar
Naturligt KvinnaNATF0, NATF1, NATF2, NATF3
Naturligt MaleNATM0, NATM1, NATM2, NATM3
Varierad kvinnaVARF0, VARF1, VARF2, VARF3, VARF4
Varierade MaleVARM0, VARM1, VARM2, VARM3, VARM4

Inre Monolog

PersonaPlex genererar två parallella strömmar vid varje steg: 8 ljudkodbokstokens för Mimi codec och en texttoken för modellens interna monolog. Textströmmen är vad modellen är "tänkande" som den talar - det kan avvika något från det slutliga ljudet, men i praktiken speglar det talade svaret tillräckligt nära att använda som ett levande transkript.

Texten tokens kommer tillbaka som rå SentencePiece bit IDs. Avkoda dem med SentencePieceDecoder som PersonaPlex fartyg:

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

I streamingläge, respondStream avger textTokens bitar som de produceras - avkoda dem stegvis för att driva en live caption-vy medan ljudet fortfarande genererar. --transcript CLI-flaggan gör exakt detta bakom kulisserna.

Varför det spelar roll: SentencePieceDecoder är byggd på den delade AudioCommon.SentencePieceModel protobufläsare, så PersonaPlex, OmnilingualASR och eventuella framtida SentencePiece-baserade modellavkodning genom samma tokenizer implementering. SentencePieceModel referens.

Systemansökningar

Passera alla anpassade system som en vanlig sträng - ingen extern tokenization behövs:

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

Eller använd en inbyggd förinställning:

CLI Användning

Skapa ett talat svar från en ljudinmatning:

# 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

Alternativ

AlternativBeskrivning
--inputInmatningsljudfil (WAV krävs)
--voiceRöstförinställt namn (t.ex. NATM0, VARF2)
--system-promptSystem snabb förinställning: assistent, fokuserad, kundservice, lärare
--system-prompt-textAnpassad systemansökan text (överskridande --system-prompt)
--max-stepsMaximala generationssteg
--streamEmit ljud bitar under generation
--compileAnvänd MLX sammanställd slutsats för snabbare generation
--transcriptUtskrift texten transkript tillsammans med ljud
--jsonJSON-utgång med metadata

Provtagningsparametrar kan också överskridas:

AlternativStandardBeskrivning
--audio-temp0.8Audio token provtagningstemperatur
--audio-top-k250Audio token top-k sampling
--text-temp0.7Text token provtagningstemperatur
--text-top-k25Text token top-k sampling

Streaming

Den --stream flaggan möjliggör realtid ljudutgång. Audio chunks släpps som de genereras, så uppspelning kan börja innan hela svaret är slutfört. Detta är särskilt användbart för interaktiva applikationer där låg latens är viktiga.

Prestanda

MetricVärde
Realtidsfaktor (RTF)~1.4 (8-bitars, nära realtid)
Steg latens~112 ms/steg på M2 Max (8-bit)
Modellstorlek (8-bit)~9.1 GB
Peak RAM (8-bit)~11 GB
Modellstorlek (4-bit)~4.9 GB
Peak RAM (4-bit)~7 GB
Viktigt

PersonaPlex 7B (8-bit) kräver minst 24 GB RAM. Den 4-bitars varianten passar på 16 GB-enheter men producerar degraderad utgång. På 8 GB-anordningar passar varken varianten. Använd --compile för bästa prestanda på stödd hårdvara.

Modellvarianter

ModellStorlekHuggingFace
PersonaPlex-7B (8-bit) rekommenderas 9.1 GBaufklarer/PersonaPlex-7B-MLX-8bit
PersonaPlex-7B (4-bitars)4,9 GBaufklarer/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"))