neptrans-v4-ct2 / transcribe.py
DontHash's picture
Release NepTrans v4 with verified weights, model card, offline usage and evaluation provenance
7af30bb verified
Raw History Blame Contribute Delete
2.68 kB
# SPDX-License-Identifier: MIT
"""Transcribe a local audio file with NepTrans v4 and faster-whisper."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from faster_whisper import WhisperModel
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("audio", type=Path)
parser.add_argument("--model", default="DontHash/neptrans-v4-ct2")
parser.add_argument("--revision", default="v4.0.0")
parser.add_argument("--device", choices=["cpu", "cuda"], default="cpu")
parser.add_argument("--compute-type", default=None)
parser.add_argument("--language", choices=["ne", "en"], default=None)
parser.add_argument("--beam-size", type=int, default=1)
parser.add_argument("--local-files-only", action="store_true")
parser.add_argument("--output", type=Path)
parser.add_argument("--json-output", type=Path)
args = parser.parse_args()
if not args.audio.is_file():
parser.error(f"Audio file not found: {args.audio}")
if args.beam_size < 1:
parser.error("--beam-size must be positive")
if args.output and args.output.resolve() == args.audio.resolve():
parser.error("Output must not overwrite the input audio")
if args.json_output and args.json_output.resolve() == args.audio.resolve():
parser.error("JSON output must not overwrite the input audio")
if args.output and args.json_output and args.output.resolve() == args.json_output.resolve():
parser.error("Text and JSON outputs must be different files")
compute_type = args.compute_type or ("int8_float16" if args.device == "cuda" else "int8")
model = WhisperModel(
args.model, revision=args.revision, device=args.device,
compute_type=compute_type, local_files_only=args.local_files_only,
)
segments, info = model.transcribe(
str(args.audio), language=args.language, task="transcribe",
beam_size=args.beam_size, condition_on_previous_text=False,
)
rows = [{"start": s.start, "end": s.end, "text": s.text.strip()} for s in segments]
text = "\n".join(row["text"] for row in rows) + "\n"
if args.output:
args.output.write_text(text, encoding="utf-8")
else:
print(text, end="")
if args.json_output:
args.json_output.write_text(json.dumps({
"language": info.language,
"language_probability": info.language_probability,
"duration": info.duration,
"segments": rows,
}, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
if __name__ == "__main__":
main()