Robo Pest app: voice -> STT relay (nightmare GPU) -> WorkBrain RAG -> lens display. STT relay service included. Verified end-to-end: speech->answer with citations in ~12s
This commit is contained in:
45
apps/robo-pest/server/stt_relay.py
Normal file
45
apps/robo-pest/server/stt_relay.py
Normal file
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Robo Pest STT relay — faster-whisper on nightmare's RTX 4080 SUPER.
|
||||
|
||||
POST /transcribe (body: raw PCM 16kHz s16le mono bytes) -> {"text": "..."}
|
||||
GET /health -> {"status": "ok", "model": ...}
|
||||
"""
|
||||
import io
|
||||
import os
|
||||
import struct
|
||||
import numpy as np
|
||||
from fastapi import FastAPI, Request
|
||||
from faster_whisper import WhisperModel
|
||||
|
||||
MODEL_NAME = os.environ.get("STT_MODEL", "small.en")
|
||||
DEVICE = os.environ.get("STT_DEVICE", "cuda")
|
||||
|
||||
app = FastAPI()
|
||||
model = WhisperModel(MODEL_NAME, device=DEVICE, compute_type="float16")
|
||||
|
||||
|
||||
def pcm16_to_float32(data: bytes) -> np.ndarray:
|
||||
n = len(data) // 2
|
||||
ints = struct.unpack(f"<{n}h", data[: n * 2])
|
||||
return np.array(ints, dtype=np.float32) / 32768.0
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
def health():
|
||||
return {"status": "ok", "model": MODEL_NAME, "device": DEVICE}
|
||||
|
||||
|
||||
@app.post("/transcribe")
|
||||
async def transcribe(request: Request):
|
||||
body = await request.body()
|
||||
if not body:
|
||||
return {"text": ""}
|
||||
audio = pcm16_to_float32(body)
|
||||
segments, info = model.transcribe(audio, language="en", beam_size=1, vad_filter=True)
|
||||
text = " ".join(s.text.strip() for s in segments).strip()
|
||||
return {"text": text, "duration": round(info.duration, 2)}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="0.0.0.0", port=8765)
|
||||
Reference in New Issue
Block a user