תרגום מכונה · המקור באנגלית

Speech Server

ה-Apple Runtime- PocketTTS

PocketTTS מוסיף Native CoreML סינתזה דיבור ל speech-swift.כל השלבים חדלו מביצוע CPU בלבד.The English Alba presets 1,920-sample מסגרות ב 24 kHz (80 ms למסגרת).

Swift ו- CLI Use

השתמש בכיסים עם קול alba. הזרמת HTTP דורש PCM; WebSocket

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 הוא שרת HTTP + WebSocket אשר חושף כל דגם Soniqo באמצעות REST API, בתוספת ZXQXQ3XZ, בנוסף לדגם ZXQ OpenAI Realtime API תואם WebSocket at at /v1/realtimeזה ספינות באותו בקבוק Homebrew speech CLI - brew install speech שתי טיפות על הרש"פ שלך.

התקנת וריצה

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)

דגלי Command-line

דגל דגל דגלDefaultתיאור תיאור
--host127.0.0.1כתובת: שינוי 0.0.0.0 כדי לחשוף על LAN.
--port8080נמל TCP
--preloadoffלטעון את כל המודלים בלהיטות בסטארט-אפ.אטר (~30-60 s) אבל אפס עצלות ראשונה.

המודלים מועלים לשימוש ראשון וצפוי ב ~/Library/Caches/qwen3-speech/.הבקשה הראשונה עבור מודל נתון משלמת את ההורדה + עלות (30 s - 2 דקות בהתאם לגודל המודל); בקשות לאחר מכן הן חמות.

REST נקודות קצה

POST /transcribe - דיבור-לטקסט

קבלה של גוף WAV או מעטפה JSON עם base64-encoded אודיו.

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

תגובה: {"text": "…", "language": "en", "confidence": 0.93}.

POST /speak - טקסט-to-speech

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

גוף התגובה הוא WAV נפוחה engine ערכים: qwen3 (default), cosyvoice, kokoro.

POST /respond - דיבור-to-speech

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

Runs PersonaPlex 7B - דיבור, דיבור החוצה. Transcript הוא חזר כ X-Response-Text Header. See PersonaPlex

POST /enhance - שיפור דיבור

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. Input מופץ מחדש במידת הצורך.

GET /health - בדיקת חי

curl http://127.0.0.1:8080/health
# {"status":"ok"}

HTTP ו- WebSocket בדיקות לחכות /health כדי להחזיר HTTP 200 עם {"status":"ok"}, עם לוח זמנים של 10 שניות של סטארט-אפ נכשלת נכשלת ההתקנה, ו-Breakdown Server נסגר לפני הפעלת הנמל שלה.

WebSocket: /v1/realtime

Drop-in תואם OpenAI בזמן אמת API אותו אירוע ג'ייסון (JSON Event Sema)session.update, input_audio_buffer.append, response.create, response.audio.deltaעם base64-encoded PCM16 אודיו ב 24 kHz, לקוחות שנכתבו נגד OpenAI, בזמן אמת SDK פועלים נגד ZXK speech-server ללא שינויים בקוד (רק לעבור את כתובת ה- WebSocket).

הפעלות אוטומטית עם השרת VAD

ידני input_audio_buffer.commit נשאר ברירת מחדל. session.turn_detection to to server_vad כדי לרוץ Silero VAD בשרת ובאופן אוטומטי לנטרן כל תור דיבור הושלם. אודיו תיקון נשמר, idle buffering נשאר כבול, והפך פעיל מתמיד הוא סגור בכוח במקסימום מוגדר.

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

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

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

המונחים:

מקור Source

אינדיאנית מקומית

עבור 12B, שוב ושוב סמנים סגורים כלי מיד לאחר שיחה מלאה, מאומתת נצרכת עם שיחת טלפון זו.הם לא יוצרים שיחה אחרת או משנים את טענותיה. Standalone סמנים וטיעונים ממותקים נשארים שגיאות; E4B

כדי לשמור על בקשות צ'אט מקומיות כושלות, להגדיר failureCaptureDirectory בהקצאת ההקצאה, לכידת היא כברירת מחדל.המנהל חייב להכחיש קבוצה וגישה אחרת; מנהלים חדשים משתמשים בדירקטוריון חדש משתמשים 0700 קבצי כישלון משתמשים 0600קבצים כוללים את גוף הבקשה המדויק, בקשה מזהה וטעייה.שלמו 12B דורות גם לשמור על הזיהוי, זיהויים אסימונים, פלטי גלם ופתרון לפני הפיצות. E4B כשלים אינם מכילים תיעוד של דור גולמי.קבצים מקומיים אלה מכילים שיחות ותכנים בכליים; שגיאות HTTP ובקשות מוצלחות אינם כוללים אותם.

הסוכן האופטימי טוען כי הוא מוקרן Gemma 4 12B Unified INT4 מודל טקסט לצד E4Bהשתמש במודל: "gemma4-12b-itעבור צ'אט עם כלים מקומיים, תוצאות היסטוריה וביטול. E4B נשאר זמין עבור בקשות אחרות. Gemma4UnifiedChat שימוש ב- pinned MLX יישום טקסט ומשחרר כל בקשתו של KV cache. Response parsing מסירים ערוץ דלימירים מטקסט מוחזר.המכונים נדריני כלי יתו נדחו כתשובות ממותנות. Gemma 4 12B, תוכן mes-mesage משמר את JSON כטקסט, התאמת תבנית צ'אט במחסום.

מקור: Get Get --inference-manifest מודלים: ג'ייסון לטעון Gemma 4 E4B INT4, VoxCPM2מלא, Whisper Large-v3ו Silero VADשירות זה מתחיל במצב לא מקוון ודוחק זהויות מודל לא מקבילות.

שירות Native סידורי צ'אט, סינתזה, ותעתיק; קל משקל VAD יש מצב זר נפרד. Gemma להעריך כל אחד 256- אצווה לפני תחילת הבא, בקשה KV המדינה שוחרר, ואת המדינה. MLX שפם קפץ 128 MiB עם 20 GB allocator Limit.

נאומו עם זרם: החזרה האמיתית של NDJSON Audio Events 48 kHz, לאחר מכן נעשה או שגיאה.תבטל על ידי בקשה ל- /v1/ Inference / Cancel. GETv1/ סודיות / נקודות ו /v1/ הערכה / שיפור דוח מודל זהויות, פרמטר dtypes, סיכות נכסים ודלפק זיכרון.

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 פרטים

בעלות מודל אופטי

דיבור Runtime מספק טעינה משותפת, כניסה ל-FIFO והוצאה להורג סדרתית Qwen3ASRRuntime בוחרת MLX או מלא CoreML באמצעות פקודות מפורשות; ממשקי API ו- CLI נותרו זמינים.

שרת השמע מחזיקה ברישיון הוצאה להורג אחד בכל בקשה מלאה, כולל פלט מפלט, עם עד 32 בקשות לחכות. ASR כישלונות לייצר שגיאות HTTP או WebSocket אירועים; תמלילים ריקים נותרו מוצלחים.

Voxtral TTS

Voxtral 4B TTS 2603 פועל באופן מקומי על Apple Silicon דרך מודול Voxtral TTS: 20 קולות מוקדמים, תשע שפות ו-24 דיבור מונו הרץ.

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

קולות מוקדמים בלבד; שיבוט הפניה-קולי אינו זמין. SDKCLI, WebSocket ו-HTTP PCM. לספק את הטקסט המלא של קלט למעלה הקדמי.מודל משקולות להשתמש CC BY-NC 4.0.

קרא את Voxtral TTSמדריך

Gemma 4 12B מהיר prefill

שירות ההקצאה המקומי עומס את מודל Gemma 4 12B Unified INT4 agentDirectoryבחר אותו עבור צ'אט עם מודל מזהה gemma4-12b-it.

Gemma 4 12B prefill ממלא את KV המדינה אצווה של עד 256 אסימונים וקובע את יומני הדגימה הראשונים מן הסימון הסופי. תחזיות אוצר המילים ביניים מופצות.

אחד ללא שינוי מערכת / תיקון קליפ יכול להישאר חקוק בלוקים 256-token. כל בקשה מרחיבה עותק עבודה נפרד. הודעות משתמש, היסטוריה של שיחה, ותוצאות כלי לעולם לא להיכנס ל-Switch שנשמר. SPEECH_SWIFT_GEMMA4_PREFIX_CACHE_MB הגבלת ה- MiB, או 0 כדי לבטל את השימוש. clearPrefixCache() הודעות HTTP HTTP מדווחות על אסימונים בשימוש חוזר cachedPrefixTokensרשומות מוכחות gemma4_12b_prefix_cache_budget_bytesבקשות קרות עדיין מעבדות את מלוא המהירות.

Native Gemma ההיסטוריה של כלי שומר תשובות כלי ועוזר המשך בתוך אותו מודל פונה. A לאחר הודעת משתמש קרוב כי המודל פונה לפני פתיחת תור המשתמש הבא. שלח כל תוצאה עם המקורי toolCallID