Traducere automată · Originalul în engleză

Modele de vorbire în vorbire

Soniqo suportă două familii native MLX model pentru vorbirea conversațională-la-discurs: PersonaPlex 7B și VoiceChat 11B. Ambele consumă vorbire și generează direct modelul audio, dar utilizează diferite arhitecturi duplex și contracte de funcționare.

Alegeți un model

ModelModel de conversație Cea mai bună potrivire
PersonaPlex 7B Duplex complet simultan cu Moshi, Depformer și Mimi Suprapunerea comportamentului de ascultare/vorbire și 18 voci selectabile
VoiceChat 11B Duplex continuu, cadru-sincronos cu FastConformer, Nemotron-H, EAR-TTS, și un codec neuralRame de streaming 80 ms, evenimente text/funcție și vorbire nativă

Acestea sunt modele conversaționale de vorbire-la-discurs. Hibiki, de asemenea, hărți discurs direct la vorbire, dar sarcina sa este streaming traducere vorbire, astfel încât este documentat separat.

PersonaPlex 7B

Model complet de dialog de vorbire-la-discurs bazat pe Moshi arhitectura (Kyutai). PersonaPlex 7B genereaza raspunsuri vorbite direct de la intrare vorbit 18 preseturi vocale și este disponibil în 8-bit (recomandat) şi 4- Cuantizare bit. 8-bit este implicit Este 30% mai rapid și produce răspunsuri coerente, în timp ce 4-bit degradează calitatea de ieșire.

VoiceChat 11B

Discursul Dulex-to-speech referince: SALM-Dulex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspection 2025), citat de NVIDIA's in amonte VoiceChat model card.

M5 Pro, 48 GB, eliberare, 80 ms cadență vie, cap protejat INT5: trei rulaje controlate măsurate cu toată țeava RTF 0.94, 0.92, și 0.92, cu aproximativ 8.70 GB vârf RSS. Primul text vorbit a sosit în 44.3–46.7 ms și primul audio redat în 74.0–76.4 Ms. Acestea sunt cifre de calcul fierbinte, nu învățat latență turn-taking; optimizat INT8 performanța nu a fost încă remăsurată.

VoiceChat este celălalt nativ MLX timpul de vorbire-la-discurs în speech-swift. Acesta combină percepția cauzală FastConformer, Nemotron-H canale duplex text/funcție, SPE-TTS cu text independent și un 22.05 kHz codec neural. O sesiune acceptă 16 kHz mono audio continuu și returnează evenimente text plus unul 1,764- cadru de ieșire eșantion fiecare 80 Ms.

Se utilizează VoiceChatModel.load(from:), se începe cu VoiceChatSession și se alimentează audio cu pushAudio. Un pachet complet trebuie să conțină encoder/, llm/ și tts/; se resping pachete de înțelegere mai vechi.

Performanță curentă

INT5 susţine suprapusul agregat de mai jos RTF 1 privind testul M5 Pro. Toate cele trei rulaje au avut loc, de asemenea, total / cadru p95 mai jos 80 ms, la 76.2–78.6 ms; headroom termenul rămâne, prin urmare, îngust. Trata modelul de turn debut și hardware calcul latență ca măsurători separate.

Live VoiceChat CLI

Discutați cu Soniqo folosind cap complet protejat INT5 pachet, alimentat cu NVIDIA Nemotron VoiceChat 11B. Comanda păstrează captarea și redarea pe un AVAudioEngine pentru Apple AEC, fluturați subtitrările de utilizator RNN-T ale pachetului, și joacă 22.05 kHz model audio în timp ce continuați să ascultați.

Implicit Soniqo prompt este bazat pe capacitate: acest CLI poate conversa și răspunde la întrebări, dar nu poate accesa calendare, memento-uri, aplicații, conturi, dispozitive sau servicii externe. Pentru aceste cereri Soniqo spune în mod clar că nu poate efectua acțiunea, nu solicită o confirmare pe care nu o poate îndeplini, și sugerează pe scurt ce poate face utilizatorul în schimb.

speech voice-chat

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

Instrumente configurabile MCP

MCP este dezactivat cu excepția cazului în care --mcp-config este furnizat. Furnizorul-neutral JSON poate lansa orice stdio MCP server și alege în mod explicit care instrumente descoperite ajung VoiceChat. Îngust în mod deliberat Apple Reminders exemplu expune lista, creează și actualizează fluxurile de lucru; configurațiile personalizate pot permite alte instrumente de server:

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

Exemplul încolțit pinuri un furnizor sprijinit de EventKit în spatele unui apple-reminders-eventkit adaptor. VoiceChat expune doar furnizorul canonic list_reminders, create_reminder și update_reminder operations nu este șters, lista-mutare, calendar, sau acțiuni subtasask. Descoperirea listei rămâne privată la adaptor. Un memento și data sa datorată sunt angajate într-un EvenimentKit salvează, evitându-se fostul eșec parțial-scriere care ar putea lăsa un mement neanunțat în urmă. Furnizorul poate compila mica sa Swift ajutor la prima utilizare, astfel încât startup are o alocație separată de 60 secunde; un instrument normal solicită de 15 secunde.

Doar enabledTools sunt prezentate modelului, cu un maxim de cinci per sesiune. Uneltele sunt scrise cu excepția cazului în care configurația le enumeră explicit în readOnlyTools. Scrie implicit la --mcp-write-policy allow, astfel încât un apel nativ complet execută imediat și rezultatul real al acestuia conduce răspunsul; demo-ul deamintirile nu adaugă o a doua cotitură de confirmare. O scriere completă identică este încă suprimată până la o activitate acustică proaspătă. Utilizați confirm pentru confirmarea mediată de model explicit sau deny pentru a dezactiva scrie.

Nu există nici un router transcriere, meci regulat-exprimare, extractor de sloturi, reamintire proiect de stat, repararea argumentului, spook-name rezolvator, sau scripted discurs asistent. Doar punctul de control selectează instrumentul și argumentele. Coordonatorul validează activate-instrument de membru și tipuri JSON, aplică politica, solicită MCP, și returnează succes structurat sau eșec prin intermediul canalului de funcție-răspuns instruit. Rezultatele furnizate de furnizor, argumente invalide, negat scrie, și instrumente indisponibile suspendă noua funcție începe până când punctul de control deschide un apel de asistent vorbit; acest lucru previne o buclă de retur imediat tăcut în timp ce lasă modelul retries mai târziu controlate. name pentru creație și aplatizează toate listele EventKit într-o singură list_reminders citeste. Prezintă IUID-uri de lung furnizor ca referinţe stabile, telescopice, cum ar fi r1, apoi rezolvă o referință exactă de returnare model înainte de update_reminder executare. Aceasta este compresie ID fără pierderi, nu transcriere sau potrivire intenție. Valori lipsă sau invalide du-te înapoi la modelul pentru o clarificare naturală; acestea nu sunt niciodată deduse în tăcere din transcrierea afișată.

Apelul de model nativ JSON rulează asincronizat pe o tacere cache tacerea. Odată ce un apel este deschis, canalul de text fortat-PAD sare nefolosite sale 131,072 După EOTC, calea bifazică îngheaţă limbajul comun şi linia temporală EAR-TTS în timp ce rezultatul extern este în aşteptare, potrivire NVIDIA Învelișul de referință al microfonului; ramele de microfon continuă prin percepție și RNN-T, dar nu sunt introduse ca poziții PAD sintetice. 16Sesiunea produce între jetoane de apel şi loturi de rezultat, externe MCP I/O rulează într-o sarcină separată, iar percepția microfonului live plus legende RNN-T rămân eligibile pe tot parcursul. Discursul de utilizator reținut re-intra în cronologia comună la cel mult un cadru semantic vechi pe apel live înapoi; cadrul curent rămâne la coadă, replay-ul expirat audio este dezactivat, iar pozițiile EAR-TTS inactiv sincronizează mai târziu în bucăți delimitate opt-frame. Bucla live citește funcție coerentă și MCP capturi de stare la fiecare 160 ms în loc de a face mai multe apeluri de actor după fiecare cadru microfon. Tabloul interactiv raportează faza activă instrument; indicele de referință structurat înregistrează decodarea nativă, MCP călătorie dus-întors, sincronizarea rezultatelor, model / cache calcul, și live interleave conversație obișnuită și barjă-in păstrați NVIDIA lui 40-cadru de siguranță de rezervă; un candidat instrument nativ deja propus poate comite după opt cadre goale.

Pe un inactiv M5 Pro cu 48 GB, trei fraze native-listă de memento a ajuns la discursul de model-autor post-instrument 3.56–4.00 secunde după sfârșitul intrării cu un fix 200 Nativ JSON a luat 1.15–1.28 secunde pentru 27–31 etapele; 67- Rezultatul a fost luat. 0.58–0.72 secunde în cinci prefill-uri. O regresie de actualizare concentrată necesară 67 pași nativi / 5.25 secunde atunci când modelul a repetat un realist EventKit UUID, versus 37 pași / despre 2.29 secunde cu pierderea de sine rezolvată r1 de referință45% mai puțini pași simbolici și aproximativ 56% mai puțin timp de decodare. Un stres separat de două secunde furnizor păstrat de furnizor-așteptare microfon de lucru la 19.6 ms p95 şi 19.8 ms maxim, astfel încât I/O externe adaugă întârziere de răspuns fără a ține captura. 118 Serviciul-microfon ms p95 şi 139 ms p95 întârziere dincolo de 80 ms termenele de intrare; acesta din urmă expune scurte izbucniri de sincronizare a rezultatelor ascunse de prim-plan RTF. Evenimentul localKit citit în sine măsurat 358 ms după o singură dată MCP startup. O frază de creare testată a fost transcrisă corect, dar a selectat discursul obișnuit mai degrabă decât un apel nativ; aceasta rămâne model de calitate instrument-selectare, nu un router rula ascuns.

Granița convailităților este cache-ul comun Nemotron-H KV: vorbirea condiționată de rezultat obișnuită nu poate forma un al doilea viitor de cauzalitate independent în timp ce jetoanele de funcții sunt generate sau reluate. Soniqo reia un discurs coerent, autorizat de model după <SPECIAL_22> închide răspunsul instrumentului. Discursul arbitrar care se suprapun complet ar necesita o a doua politică speculativă de cache și fuziune, sau un decodor de funcție instruit separat.

Copilul MCP serverele moștenesc doar PATH, HOME, depozitar temporar și variabile locale.Credențialele trebuie transmise în mod explicit în harta serverului env; secretele părinte-proces nu sunt transmise. Comanda configurată încă rulează la nivel local cu sistemul de fișiere și permisiunile de aplicare ale utilizatorului actual, astfel încât să se utilizeze doar fișierele de configurare și pachetele servere de încredere MCP

ă 8-Proiecţia funcţiei bit este despre 518 MB. În timpul discursului obișnuit, VoiceChat evaluează doar o cache 36 KB PAD / instrument-start sonda. În cazul în care instrumentul-start câștigă înainte de limita de cotitură, numai sale 4,096-value hidden-state candidate is reţinute; verificarea completă a vocabularului se execută atunci când BOS învăţat soseşte sau obiectivul final de siguranţă RNN-T expiră. Pentru un apel generic nativ, verificat apel JSON apoi ruleaza la viteza de limbaj complet pe o percepţie înglobarea cached dintr-o secundă de tăcere în loc de o dată per 80 Rama microfonului ms. MCP se cunoaşte rezultatul, VoiceChat redă-l în limite 16-atenţie de precipitaţii cauzale, menţinerea feedback-ului funcţional instruit şi a stării cache-ului limbaj/discurs fără unul 11B decodează per jeton rezultat. Sesiunea produce între jetoanele de apel generate și bucățile de răspuns prefill astfel încât percepția microfonului live, subtitrări RNN-T și detectarea întreruperii vorbirii susținute continuă; legăturile separate de apel și răspuns convertesc activitatea malformată PAD doar într-o retrimitere explicită, mai degrabă decât un stand permanent.

Playback prebuffers trei 80 ms cadre (240 ms) în mod implicit. După un decalaj difuzor, se așteaptă pentru o pernă de recuperare opt-frame înainte de repornire. rafinament vocal scade de la opt la doi pași după primele 88 ms callback sau atunci când coada de trei cadre; un apel înapoi 120 ms, șase cadre coadă, sau resincronizare intrare merge direct la o singură etapă de urgență. Numai modificări acustice rafinament, RNN-T, și starea lingvistică rămâne intactă. În cazul în care coada ajunge în continuare implicit opt-framă/640 ms limită, doar cel mai vechi audio microfon necesar pentru a admite intrare proaspătă este aruncat. Supraîncărcarea susținută este tratată ca un episod de recuperare, și un utilizator deja confirmat de RNN- T rămâne înarmat în loc de a fi șterse prin resetări repetate. Cuvintele omise sunt încă marcate și pot necesita repetiție.

Tabloul de bord utilizează indicatori cu vedere la om: behind este audio microfon la coadă; RTF 0.93× este media de rulare pe cele mai recente apeluri de microfon 120 din timpul de perete împărțit la 80 ms de audio (sub 1 ține în sus; deasupra 1 cade în urmă); și last 74 ms for 80 ms audio inseamna ca ultimul apel a luat 74 ms. Evenimentele de reluare nu sunt numărate ca numitori audio suplimentare. Deoarece RTF este o fereastră, ea poate rămâne mare pentru scurt timp după o operațiune costisitoare chiar și atunci când last sub conversaţie, speaker gaps, old-audio skips, și microphone audio skipped să facă recuperarea explicită. PLEASE REPEAT apare doar atunci când microfonul audio a fost de fapt sărit.

Modul de microfon foloseste NVIDIA-stil RNN-T rotire implicit. Capul de transcriere tratează prima predicție pe fiecare 80 ms cadru ca gol sau non-blank. Două cadre de vorbire inițială și trei pe mai târziu viraje rămân pase de activitate susținută, în timp ce unul recunoscut lexic brațe imediat un viraj inactiv, astfel încât un complet dayseys sau VoiceChatPreviziunile BOS/EOS învăţate rămân deciziile normale cu grad scăzut de latenţă. 40 cadre oarbe (3.2 secunde) forţa BOS numai în cazul în care capul învăţat nu deschide un răspuns, şi patruzeci de cadre proaspete non-blank oferă potrivirea RNN-T EOS siguranţă de rezervă. Contorul de vorbire se resetează atunci când Soniqo începe, astfel încât activitatea de la rotirea completă a utilizatorului nu poate tăia imediat răspunsul. Fiecare cadru audio încă ajunge la modelul duplex; utilizați --no-rnnt-turn-taking pentru a lăsa deciziile BOS/EOS în întregime la capul limba învățată. Tabloul de bord raportează barje RNN-T separat de playback subruns.

Frontul RNN-T se potrivește cu padding-ul de reflexie al lui NeMo la fiecare margine a microfonului de rulare. Aceasta elimină o nepotrivire zero-padging care ar putea modifica deciziile lacome marginale; nu înlocuiește capul compact de transcriere de 1,024-token al punctului de control cu un vocabular general larg ASR.

În mod normal, modelul-nativ BOS este suprimat până când discursul utilizatorului este confirmat, astfel încât Soniqo nu vorbeşte primul. --greet permite în mod explicit salutul iniţial. După răspunsul sonor, PAD gol rămâne în interiorul turnului deschis pentru cel puţin 16 cadre şi pentru trei cadre pe jet de conţinut atunci când este mai mult. Primul exces de culoare albă PAD închide rândul logic. Această coadă scalată conţine cuvinte întârziate că o tăiere fixă de 1,28 secunde poate muta.

Modul interactiv utilizează un tablou de bord fix în ecranul alternativ al terminalului, astfel încât actualizările stării redraw în loc de umplere defilare. Utilizați --plain pentru ieșire numai pentru apendice.

Pentru diagnosticul local, --debug-timeline fiecare utilizator și Soniqo fraza și introduce argumentele de apel nativ parsed, MCP start/completion, și sincronizarea rezultatelor-cache în aceeași cronologie. De asemenea, marchează pronunciation ended la fereastra finală generată sonor-PCM; acest lucru este model-timp de ieșire, nu de completare difuzor- dispozitiv. Demo omite intenționat blocuri istorice de fază-Timing; decodarea detaliată nativ, furnizor, cache, și indicatori de presiune microfon rămân în voicechat-bench JSON. Linia temporală poate expune argumente instrument, astfel încât să nu-l utilizați în jurnale comune.

Măsurat cu subtitrări live

Trei. M5 Pro 48 Rulează eliberarea GB măsurată RTF 0.92, total-cadru p95 74.8–75.8 ms, primul audio redat 74.2–74.9 ms, și despre 8.74 GB vârf RSS. Transcrierea și răspunsul au fost identice pe parcurs.

Sesiunile live păstrează prompt vorbitorul imuabil 37-frame plus 20 de secunde de istorie recentă EAR-TTS, în timp ce Nemotron-H păstrează convorbirea semantică în mod separat. PAD în interiorul cozii acustice de tip conţinut scalat este redat în mod normal; numai progresele TAD tăcute mai târziu cauzal în loturi de opt. Acest lucru previne TTS atenţia şi munca inactivă să crească fără a fi legat fără a tăia răspunsul vorbit; --live-speech-context-seconds 0 restabileşte complet TTS istorie, şi modul fişier rămâne complet istoric implicit.

În 63.6- Al doilea M5 Pro profil cu coada de conţinut-sigur, calea live măsurate agregate RTF 0.87, fereastra finală RTF 0.71, 4.1 sinteza ms/frame-ului final al ferestrei; 8.72 GB vârf RSS; și 23.67 Amprentă fizică maximă GB. Ferestrele cu opt trepte active de vorbire au ajuns RTF 1.05 şi 1.12, astfel încât CLI interactive utilizează un pas de rezervă reversibil cu două etape și modul de urgență un pas. Sinteza un pas atribuie toate 31 RVQ codebooks într-o singură trecere; protejează captura live, dar nu este paritate acustică cu programul de opt etape. Sequential și loted-cache state au avut cosinus minim 0.9999999.

Pentru diagnosticul audio, indicele de referință compară redările codec-wind-ului live delimitate cu o redare continuă a contextului. O pauză lungă prezentă în ambele a fost generată de EAR-TTS sau de codec, nu de coada difuzorului; o discontinuitate găsită doar în punctele de redare live spre cusături de fereastră-codec. golurile difuzorului rămân un metric separat de redare-subflux. Un detector dedicat de debut-pop scanează plumbul generat în plus față de primul 50 ms de vorbire susţinută şi steaguri eşantion sare peste ambele 0.05 Amplitudinea și de șase ori vorbirea constantă p99 Scenariile pot fi stabilite maximum_suspect_onset_transients la zero, în timp ce ascultarea perceptivă rămâne verificarea finală a calității.

PersonaPlex arhitectura și utilizarea

PersonaPlex este un model multi-stream autoregresiv cu trei componente principale:

Componentă Detalii
Temporal Transformer 32 straturi, dim=4096, 32 capete, SwiGLU (ascuns_scale=4.125), RoPE, 8 biți cuantic (default)
Depformer6 straturi, dim=1024, 16 capete, MultiLinear (greutate_per_step=true), dep_q=16
Mimi Codec16 coduri, 12,5 Hz rata de cadru, 24 kHz ieșire audio

Modelul procesează 17 fluxuri simultan: 1 flux text + 8 fluxuri audio de utilizator + 8 fluxuri de audio agent. Această arhitectură permite conversație full-duplex în cazul în care modelul poate asculta și vorbi în același timp.

Previziuni vocale

PersonaPlex include 18 presetări de voce încorporate în stiluri naturale și variate:

CategoriePreseturi
Femeie naturalăNATF0, NATF1, NATF2, NATF3
Bărbat naturalNATM0, NATM1, NATM2, NATM3
Femeie varietăVARF0, VARF1, VARF2, VARF3, VARF4
Barbat VariedVARM0, VARM1, VARM2, VARM3, VARM4

Monolog interior

PersonaPlex generează două fluxuri paralele la fiecare pas: 8 jetoane de codebook audio pentru codec Mimi și un token text pentru monologul intern al modelului. Fluxul de text este ceea ce modelul este gândit

Jetoanele de text revin ca acte de identitate ale lui SentincePiece. Decodează-le cu navele SentencePieceDecoder care PersonaPlex:

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

În modul de streaming, respondStream emițătoare textTokens bucăți ca acestea sunt produse bază le decodeze treptat pentru a conduce o vedere de legenÄ live în timp ce audio este încă generatoare. --transcript Steagul CLI face exact acest lucru în spatele scenei.

De ce contează: SentencePieceDecoder este construit pe un sistem comun de date AudioCommon.SentencePieceModel cititor protobuf, așa că PersonaPlex, OmnilingualASR și orice model bazat pe SentencePiace decodează prin aceeași implementare a tokenizerului. A se vedea numărul SentențăPieceModel de referință.

Prompturi de sistem

Trece orice sistem personalizat prompt ca un șir de caractere simplu bază nu este necesară tokenizare externă:

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

Sau să folosiţi un set încorporat:

Utilizarea CLI

Generează un răspuns vorbit de la o intrare audio:

# 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

Opțiuni

Opțiune Descriere
--input Fișier audio de intrare (WAV, necesar)
--voice Denumirea anterioară vocală (de exemplu, NATM0, VARF2)
--system-promptPreset prompt de sistem: asistent, concentrat, client-service, profesor
--system-prompt-text Textul prompt al sistemului personalizat (suprascrieri --system-prompt)
--max-stepsEtapele de generare maximă
--streamEmit bucăți audio în timpul generației
--compile Utilizare MLX inferență compilată pentru generarea mai rapidă
--transcriptIeșire transcriere text alături de audio
--jsonIeșire JSON cu metadate

De asemenea, parametrii de prelevare a probelor pot fi depăşiţi:

OpțiuneImplicit Descriere
--audio-temp0.8 Temperatura de eșantionare a jetonului audio
--audio-top-k250Eșantionare de top-k pentru jeton audio
--text-temp0.7 Temperatura de prelevare a probelor de text
--text-top-k25Eșantionare de top-k a textului

Streaming

Steagul --stream permite ieşirea audio în timp real. Bucăţile audio sunt emise pe măsură ce sunt generate, astfel încât redarea poate începe înainte ca răspunsul complet să fie complet. Acest lucru este deosebit de util pentru aplicaţiile interactive unde latenţa scăzută contează.

Performanță

Metrică Valoare
Factor în timp real (RTF)~1.4 (8-biţi, aproape în timp real)
Pasul latenţei~112 ms/pas pe M2 Max (8-bit)
Dimensiunea modelului (8-bit)~9.1 GB
Vârf RAM (8-bit)~11 GB
Dimensiunea modelului (4-bit)~4.9 GB
Vârf RAM (4-bit)~7 GB
Important

PersonaPlex 7B (8-bit) necesită cel puțin 24 GB RAM. Varianta de 4 biți se potrivește pe 16 dispozitive GB, dar produce o ieșire degradată. Pe dispozitive 8 GB, nici o variantă nu se va potrivi. Utilizați --compile pentru cea mai bună performanță pe hardware-ul susținut.

Model Variante

ModelDimensiuneHuggingFace
PersonaPlex-7B (8-bit) recomandat9,1 GBaufklarer/PersonaPlex-7B-MLX-8bit
PersonaPlex-7B (4-bit)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"))