Files
Aime/app/inference/transcribe_batched.py
Claude f9e1eb82c4 feat: komplette Codebase vom Board ins Repo gespiegelt
app/ = /opt/callrec (Node-Backend, Vite-Frontend, Python-Inferenz,
Audio-Skripte, rkllm_server.cpp), system/ = systemd-Units,
WirePlumber/PipeWire-Drop-ins, sudoers. Modelle, Binaries, Aufnahmen
und node_modules bleiben draussen (.gitignore).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 11:18:29 +02:00

59 lines
2.0 KiB
Python

#!/opt/aime-venv/bin/python
"""Batched NPU transcriber A/B test: wav -> JSON words on stdout.
large-v3-turbo decoder CPU (int8), encoder on RK3588 NPU (rknn fp16),
faster-whisper BatchedInferencePipeline (Fabio-style batched+NPU).
Usage: transcribe_batched.py <wav> [batch_size]
"""
import sys, json, time
import numpy as np
WAV = sys.argv[1]
BATCH = int(sys.argv[2]) if len(sys.argv) > 2 else 8
MODEL = "large-v3-turbo"
ROOT = "/opt/callrec/models/whisper"
RKNN = "/opt/callrec/models/turbo-encoder-fp16.rknn"
sys.path.insert(0, "/opt/callrec")
from faster_whisper import WhisperModel, BatchedInferencePipeline
from faster_whisper.transcribe import get_ctranslate2_storage
from inference.rknpu_whisper_encoder import RknnWhisperEncoder
t0 = time.time()
model = WhisperModel(MODEL, device="cpu", compute_type="int8",
download_root=ROOT, cpu_threads=4)
npu = RknnWhisperEncoder(RKNN, lib_path="/usr/lib/librknnrt.so")
def npu_encode(features):
feats = np.asarray(features, dtype=np.float32)
out = npu.run(feats)
return get_ctranslate2_storage(np.ascontiguousarray(out))
model.encode = npu_encode
batched = BatchedInferencePipeline(model=model)
t_load = time.time() - t0
t0 = time.time()
segments, info = batched.transcribe(WAV, language="de", beam_size=1,
batch_size=BATCH, word_timestamps=True)
words = []
texts = []
for seg in segments:
texts.append(seg.text.strip())
for w in (seg.words or []):
words.append({
"word": w.word.strip(),
"t_start_ms": int(round((w.start or 0) * 1000)),
"t_end_ms": int(round((w.end or 0) * 1000)),
"probability": round(w.probability, 3),
})
t_trans = time.time() - t0
out = {
"text": " ".join(texts).strip(),
"n_words": len(words),
"duration": round(float(info.duration or 0), 1),
"load_s": round(t_load, 1),
"transcribe_s": round(t_trans, 1),
"rtf": round(t_trans / max(float(info.duration or 0.1), 0.1), 3),
"batch": BATCH,
}
print(json.dumps(out, ensure_ascii=False))