feat: API router + pipeline — toggle, status, transcripts, WebSocket, auth stub
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
import os
|
||||
import tempfile
|
||||
|
||||
from api.state import state, Status
|
||||
from config import load as load_config
|
||||
from transcription import engine as transcription_engine
|
||||
from llm import OllamaClient
|
||||
from output import save_transcript
|
||||
from api.router import broadcast
|
||||
|
||||
|
||||
async def run_pipeline():
|
||||
cfg = load_config()
|
||||
recorder = getattr(state, "_recorder", None)
|
||||
if recorder is None:
|
||||
return
|
||||
|
||||
output_dir = getattr(state, "_recording_output_dir", cfg["output"]["path"])
|
||||
instructions = getattr(state, "_recording_instructions", "")
|
||||
|
||||
recorder.stop()
|
||||
await state.set_status(Status.PROCESSING)
|
||||
await broadcast({"event": "processing"})
|
||||
|
||||
wav_path = None
|
||||
try:
|
||||
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
|
||||
wav_path = f.name
|
||||
recorder.save_wav(wav_path)
|
||||
|
||||
raw_text = await transcription_engine.transcribe_file(
|
||||
wav_path,
|
||||
language=cfg["whisper"]["language"],
|
||||
model_name=cfg["whisper"]["model"],
|
||||
device=cfg["whisper"]["device"],
|
||||
)
|
||||
await broadcast({"event": "transcribed", "raw": raw_text})
|
||||
|
||||
client = OllamaClient(base_url=cfg["ollama"]["base_url"])
|
||||
refined = await client.refine(
|
||||
raw_text=raw_text,
|
||||
instructions=instructions,
|
||||
model=cfg["ollama"]["model"],
|
||||
)
|
||||
await broadcast({"event": "refined", "markdown": refined})
|
||||
|
||||
title = "Diktat"
|
||||
for line in refined.splitlines():
|
||||
if line.startswith("# "):
|
||||
title = line[2:].strip()
|
||||
break
|
||||
|
||||
path = save_transcript(
|
||||
title=title,
|
||||
content=refined,
|
||||
output_dir=output_dir,
|
||||
)
|
||||
await broadcast({"event": "saved", "path": path, "title": title})
|
||||
await state.set_status(Status.IDLE)
|
||||
|
||||
except Exception as e:
|
||||
state.last_error = str(e)
|
||||
await state.set_status(Status.ERROR)
|
||||
await broadcast({"event": "error", "message": str(e)})
|
||||
finally:
|
||||
state.recording_user = None
|
||||
state._recording_output_dir = None
|
||||
state._recording_instructions = ""
|
||||
if wav_path:
|
||||
try:
|
||||
os.unlink(wav_path)
|
||||
except OSError:
|
||||
pass
|
||||
Reference in New Issue
Block a user