Konekäännös · Englanninkielinen alkuperäinen
Speech Server
Native Applen ajoaika · PocketTTS
PocketTTS lisää natiivin CoreML puheen synteesin speech-swift. Kaikki vaiheet oletuksena CPU-yksinomaan suoritukseen. Englanti Alba esiasetetut virrat 1,920-0 näytekehys 24 kHz (80 ms per runko).
Käytä tasku-tts kanssa ääni alba. Streaming HTTP edellyttää PCM; WebSocket lähettää äänideltaa. Olemassa olevat oletusmallit ovat muuttumattomia.
curl http://localhost:8080/v1/audio/speech \
-H 'Content-Type: application/json' \
-d '{"model":"pocket-tts","voice":"alba","input":"Hello world.","response_format":"pcm","stream":true}' \
-o hello.pcmspeech-server on paikallinen HTTP + WebSocket-palvelin, joka paljastaa jokaisen Soniqo -mallin yksinkertaisen REST API:n avulla. OpenAI Realtime API-yhteensopiva WebSocket klo /v1/realtime. Se kuljettaa samassa Homebrew pullo kuin speech CLI brew install speech Molemmat putoavat polullenne.
Asenna ja suorita
brew install speech
speech-server --port 8080
# Starting server on http://127.0.0.1:8080
# Endpoints:
# POST /transcribe - Speech-to-text (WAV body or JSON with audio_base64)
# POST /speak - Text-to-speech (JSON: {text, engine?, language?})
# POST /respond - Speech-to-speech (WAV body, voice/max_steps via query)
# POST /enhance - Speech enhancement (WAV body)
# GET /health - Health check
# WS /v1/realtime - OpenAI Realtime API (JSON events, base64 PCM16 audio)
Komentorivin liput
| Lippu | Oletus | Tavaran kuvaus |
|---|---|---|
--host | 127.0.0.1 | Sido osoite. Muutetaan arvoon 0.0.0.0 altistamaan LAN. |
--port | 8080 | TCP-portti. |
--preload | off | Lataa kaikki mallit innolla käynnistettäessä.30–60 s) mutta ei ensimmäisen pyynnön latenssia. |
Mallit ladataan ensimmäisen käyttökerran yhteydessä ja välimuisti säilytetään ~/Library/Caches/qwen3-speech/. Ensimmäinen pyyntö tietystä mallista maksaa latauksen + kuorman kustannukset (30 s ... 2 min mallin koosta riippuen); myöhemmät pyynnöt ovat lämpimät.
REST päätetapahtumat
POST /transcribe ...
Hyväksyy joko raa'an WAV -kehon tai JSON-kuoren base64-encoded -äänen.
# WAV body (preferred — lower overhead)
curl -X POST http://127.0.0.1:8080/transcribe \
-H "Content-Type: audio/wav" \
--data-binary @recording.wav
# JSON with base64
curl -X POST http://127.0.0.1:8080/transcribe \
-H "Content-Type: application/json" \
-d '{"audio_base64":"'"$(base64 -i recording.wav)"'","language":"en"}'
Vastaus: {"text": "…", "language": "en", "confidence": 0.93}.
POST /speak ...
curl -X POST http://127.0.0.1:8080/speak \
-H "Content-Type: application/json" \
-d '{"text":"Hello, world!","engine":"kokoro","language":"en"}' \
--output hello.wav
Vasteelin on WAV blob. Tuettu engine arvot: qwen3 (oletusarvo), cosyvoice, kokoro.
POST /respond Puheesta puheen
curl -X POST "http://127.0.0.1:8080/respond?voice=en_female_calm&max_steps=256" \
-H "Content-Type: audio/wav" \
--data-binary @question.wav \
--output answer.wav
Suorittaa PersonaPlex 7B .Puhelin palautetaan X-Response-Text otsikkona. Katso PersonaPlex opas äänien preset-nimille.
POST /enhance Puheenparannus
curl -X POST http://127.0.0.1:8080/enhance \
-H "Content-Type: audio/wav" \
--data-binary @noisy.wav \
--output clean.wav
DeepFilterNet3 48 kHz:ssä. Syöte otetaan tarvittaessa uudelleen.
GET /health ...
curl http://127.0.0.1:8080/health
# {"status":"ok"}
HTTP ja reaaliaikainen WebSocket testit odottavat /health palauttaakseen HTTP 200:n {"status":"ok"}, 10 sekunnin käynnistysmääräajalla. Käynnistysvirheet epäonnistuvat testiasennuksessa ja remontin odotetaan palvelimen sulkemista ennen portin uudelleenkäyttöä.
WebSocket: /v1/realtime
Pudotus yhteensopiva OpenAI Realtime API Sama JSON-tapahtuman skeema (session.update, input_audio_buffer.append, response.create, response.audio.delta, ...) kanssa base64-encoded PCM16 ääni klo 24 kHz. Asiakkaat kirjoitettu vastaan OpenAI Realtime SDK speech-server ilman koodin muutoksia (vain vaihtaa WebSocket URL).
Automaattiset käännökset, joissa palvelimen VAD
Manuaalinen input_audio_buffer.commit pysyy oletuksena. Aseta session.turn_detection to server_vad to run Silero VAD on palvelimella ja kopioi automaattisesti jokaisen valmiin puheen käännöksen. Prefix-ääni säilyy, joutokäynti pysyy rajoitettuna ja jatkuva aktiivinen käännös on voimasuljettuna suurimmalla sallitulla.
ws.send(JSON.stringify({
type: "session.update",
session: {
turn_detection: {
type: "server_vad",
threshold: 0.5,
prefix_padding_ms: 300,
silence_duration_ms: 500,
max_turn_duration_ms: 120000
}
}
}));
// Event order for each detected turn:
// input_audio_buffer.speech_started
// input_audio_buffer.speech_stopped
// input_audio_buffer.committed
// conversation.item.input_audio_transcription.completed
// Set turn_detection to null (or { type: "none" }) for manual commits.
JavaScript esimerkki
const ws = new WebSocket("ws://127.0.0.1:8080/v1/realtime");
ws.onopen = () => {
ws.send(JSON.stringify({
type: "session.update",
session: { modalities: ["audio", "text"] }
}));
// Stream PCM16 mono 24kHz audio from the mic:
const audioBase64 = await capturePCM16Chunk();
ws.send(JSON.stringify({
type: "input_audio_buffer.append",
audio: audioBase64
}));
ws.send(JSON.stringify({ type: "response.create" }));
};
ws.onmessage = ev => {
const msg = JSON.parse(ev.data);
if (msg.type === "response.audio.delta") {
playPCM16Base64(msg.delta);
}
};
Python esimerkki
import asyncio, base64, json, wave, websockets
async def main():
async with websockets.connect("ws://127.0.0.1:8080/v1/realtime") as ws:
await ws.send(json.dumps({"type": "session.update",
"session": {"modalities": ["audio", "text"]}}))
with wave.open("question.wav", "rb") as wav:
pcm16 = wav.readframes(wav.getnframes())
await ws.send(json.dumps({"type": "input_audio_buffer.append",
"audio": base64.b64encode(pcm16).decode()}))
await ws.send(json.dumps({"type": "response.create"}))
async for raw in ws:
msg = json.loads(raw)
if msg["type"] == "response.audio.delta":
open("answer.pcm", "ab").write(base64.b64decode(msg["delta"]))
elif msg["type"] == "response.done":
break
asyncio.run(main())
Käyttöönottopöytäkirjat
- Ei oletuksena.
speech-serversitoo127.0.0.1ja luottaa jokaiseen soittajaan. Laita se käänteisen välityspalvelimen taakse (Caddy, nginx, hännän mittakaava), jos paljastat sen paikallisenhostin ulkopuolelle. - Mallit ovat laiskoja. Ensimmäinen pyyntö
/transcribekäynnistää ASR lataa + lataa (~700 MB, 30–60 s). Käyttö--preloadnollaan kylmäkäynnistykseen, mutta hitaampaan. - Ei vielä streaming transkriptiota.
POST /transcribeodottaa täyttä WAV etukäteen. Käytä/v1/realtimestreamaustilassa. - Järjestelmä / lanseerattu. Ei huoltoyksikön aluksia tänään. Pelkkä
nohup speech-server &tai tavanomainen prosessinvalvojasi toimii.
Lähde
- Lähteet/AudioServer ... HTTP-reititin, laiska mallirekisteri,
/v1/realtimeWebSocket käsittelijä. - Sources/AudioServerCLI ...
@mainparametrin parametri. - Etuvirta: OpenAI Reaaliaika API referenssi .
Paikallinen syntyperäinen päätelmä
12B:n osalta toistuvat vierekkäiset työkalujen puhelun sulkeutumismerkit välittömästi täydellisen, validoidun puhelun jälkeen kulutetaan tällä puhelulla. Ne eivät luo toista puhelua tai muuta sen argumentteja. Erilliset merkkiaineet ja epämuodostuneet argumentit pysyvät virheinä; E4B säilyttää tiukan käsittelyn.
Jos haluat säilyttää epäonnistuneet chat-pyynnöt, valitse failureCaptureDirectory inferenssissä. Capture on pois päältä oletusarvoisesti. Hakemiston on evättävä ryhmä- ja muu pääsy; uusien hakemistojen käyttö 0700 ja epäonnistumistiedostojen käyttö 0600. Tiedostot sisältävät tarkan pyyntörungon, pyyntötunnuksen ja virheen. Valmistuneet 12B-sukupolvet säilyttävät myös ripeät, tunnistetut tunnukset, raaka-tuotoksen ja pysäytä syyn ennen jäsentelyä. E4B viat eivät sisällä raaka sukupolven tietuetta. Nämä paikalliset tiedostot sisältävät keskustelu- ja työkalusisällön; HTTP-virheet ja onnistuneet pyynnöt eivät sisällä niitä.
Valinnainen agenttiHallinto kuormittaa vaiheistettua Gemma 4 12B Yhdistetty INT4 tekstimalli rinnakkain E4B. Käytä mallia: "gemma4-12b-it" keskustella natiivi työkaluja, tulos historia, ja peruutus. E4B on edelleen käytettävissä muita pyyntöjä varten. Gemma4UnifiedChat käyttää pinted MLX tekstin toteuttaminen ja julkaisee jokaisen pyynnön. Vastausten jäsentäminen poistaa kanavan erottimia palautetusta tekstistä. Orvot työkalu- puhelu terminaattorit hylätään epämuodostuneita vastauksia. Epäonnistuneet ei- streaming pyynnöt kirjautua pyyntö ID, käyttö, ja taustalla virhe palvelimen prosessissa. Gemma 4 12B, työkalu-viesti sisältö säilyttää JSON tekstin, joka vastaa tarkistuspiste chat malli.
Lähteen rakenne hyväksyy --inference-manifest mallit.json lataamiseen Gemma 4 E4B INT4, VoxCPM2, täysi Whisper Large-v3 ja Silero VAD. Tämä palvelu alkaa offline-verkosta ja hylkää yhteensopimattomat mallitunnisteet.
Natiivipalvelu serialisoi chatin, synteesin ja transkription; kevyt VAD on erillinen stream-tila. Gemma esitäyttö arvioi jokaisen 256-token- erän ennen seuraavaa alkua, pyytää KV-tilan vapauttamista ja MLX välimuistin yläraja on 128 MiB ja 20 Gib allokaattorin raja.
Puhe virralla: tosi palauttaa NDJSONin äänitapahtumat 48 kHz:ssä, minkä jälkeen on tehty tai virhe. Peruuta pyynnöstäID osoitteessa /v1/ference/cancel. GET /v1/ferenssi/voimakkuus ja/v1
speech-server --inference-manifest models.json --port 8080{
"runtimeRevision": "your-source-revision",
"gemmaDirectory": "/models/gemma4-e4b-it-int4",
"voxDirectory": "/models/voxcpm2-unquantized",
"whisperDirectory": "/models/whisper-large-v3-coreml",
"vadDirectory": "/models/silero-vad-coreml"
}Valinnainen malliomistus
PuheRuntime tarjoaa yhteisen latauksen, peruutettavissa olevan FIFO:n sisäänpääsyn ja sarjatoteutuksen. Qwen3ASRRuntime selecks MLX or full CoreML identifikaatioiden avulla; alkuperäisiä API- ja CLI-lippuja on edelleen saatavilla.
Äänipalvelimella on yksi suorituslupa jokaisen täydellisen pyynnön kautta, myös streamed-ulostulo, jossa on enintään 32 pyyntöä odottamassa. ASR viat tuottavat HTTP-virheitä tai WebSocket virhetapahtumia; voimassa olevat tyhjät transkriptiot pysyvät onnistuneina.
Voxtral TTS
Voxtral 4B TTS 2603 toimii paikallisesti Apple Silicon kautta VoextralTTS-moduuli: 20 esiasetettua ääntä, yhdeksän kieltä ja 24 kHz monopuhe.
curl http://localhost:8080/v1/audio/speech \
-H 'Content-Type: application/json' \
-d '{"model":"voxtral-tts","input":"Hello, welcome to Voxtral.","voice":"casual_male","response_format":"wav"}' \
-o hello.wavVain esiasetetut äänet; viite-audio kloonaaminen ei ole saatavilla. Äänitehovirta SDK, CLI, WebSocket ja HTTP PCM. Toimita täydellinen tuloteksti eteen. Mallipainot käyttävät CC BY-NC 4.0:a.
Gemma 4 12B nopea esitäyttö
Naapuruuspäätepalvelu kuormittaa vaiheittaista Gemma 4 12B Yhtenäistetty INT4 -mallia käyttäen agentDirectory. Valitse se chattiin mallilla gemma4-12b-it.
Gemma 4 12B täyttää KV-tilan enintään 256 rahakkeen erässä ja laskee ensimmäiset näytteenottokirjaukset viimeisestä pikaviestistä. Välimuotoiset sanastoennusteet ohitetaan. Pyyntö. KV-välimuisti vapautuu valmistumisen tai peruutuksen jälkeen.
Yksi muuttumaton järjestelmä/työkalun etuliite voi pysyä välimuistissa täydellisissä 256-tallennetuissa lohkoissa. Jokainen pyyntö laajentaa erillistä työkopiota. Käyttäjäviestit, keskusteluhistoria ja työkalun tulokset eivät koskaan syötä säilytettyä kuvaketta. Aseta SPEECH_SWIFT_GEMMA4_PREFIX_CACHE_MB rajoittaa MIB:tä, tai 0 uudelleenkäytön poistaminen käytöstä. clearPrefixCache() vapauttaa tilannekuvan. HTTP raportit uudelleen rahakkeita cachedPrefixTokens; lähtöpaikkatiedot gemma4_12b_prefix_cache_budget_bytes. Kylmät pyynnöt edelleen käsitellä koko kehotus.
Native Gemma -työkaluhistoria pitää työkalun vastaukset ja apuohjelman jatkoa samassa mallissa. Seuraava käyttäjäviesti sulkee tämän mallin ennen seuraavan käyttäjän käännöksen avaamista. Lähetä jokainen tulos alkuperäisellä toolCallID.