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).

Swift ja CLI-käyttö

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.pcm

speech-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

LippuOletus Tavaran kuvaus
--host127.0.0.1Sido osoite. Muutetaan arvoon 0.0.0.0 altistamaan LAN.
--port8080TCP-portti.
--preloadoff 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

Lähde

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"
}

API tiedot

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.wav

Vain 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.

Lue Voxtral TTS Guide

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.