41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
import argparse
|
|
import json
|
|
import os
|
|
import sys
|
|
import time
|
|
from pathlib import Path
|
|
|
|
# job env has a minimal PATH; whisper shells out to ffmpeg
|
|
os.environ["PATH"] = "/opt/homebrew/bin:/usr/local/bin:" + os.environ.get("PATH", "")
|
|
|
|
ap = argparse.ArgumentParser()
|
|
ap.add_argument("--input", action="append", default=[])
|
|
ap.add_argument("--outdir", required=True)
|
|
ap.add_argument("--params", default="{}")
|
|
a = ap.parse_args()
|
|
p = json.loads(a.params)
|
|
|
|
if not a.input:
|
|
print("ERROR: needs one audio input")
|
|
sys.exit(1)
|
|
|
|
import mlx_whisper # noqa: E402 — import after arg errors so bad calls fail fast
|
|
|
|
t0 = time.time()
|
|
result = mlx_whisper.transcribe(
|
|
a.input[0],
|
|
path_or_hf_repo="mlx-community/whisper-large-v3-turbo",
|
|
language=p.get("language") or None,
|
|
)
|
|
text = result["text"].strip()
|
|
outdir = Path(a.outdir)
|
|
stem = Path(a.input[0]).stem
|
|
(outdir / f"{stem}.txt").write_text(text + "\n")
|
|
(outdir / f"{stem}.whisper.json").write_text(json.dumps({
|
|
"text": text,
|
|
"language": result.get("language"),
|
|
"segments": [{"start": s["start"], "end": s["end"], "text": s["text"].strip()}
|
|
for s in result["segments"]],
|
|
}, indent=2))
|
|
print(f"done in {time.time() - t0:.1f}s: {text[:150]}")
|