Spaces:
Sleeping
Sleeping
import argparse | |
import json | |
import os | |
import tempfile | |
import shutil | |
import whisper | |
import torch | |
from core.processor import ( | |
download_video, | |
extract_audio, | |
transcribe, | |
classify_accent, | |
compute_fluency | |
) | |
from core.logger import logger | |
def main(): | |
parser = argparse.ArgumentParser(description="Accent & Fluency Detection CLI") | |
parser.add_argument('--url', required=True, help='Public video URL (YouTube, Loom, MP4)') | |
parser.add_argument('--output', help='Output path for JSON result') | |
parser.add_argument('--device', default='auto', choices=['auto', 'cpu', 'cuda'], help='Device to run Whisper') | |
parser.add_argument('--keep', action='store_true', help='Keep temporary files') | |
args = parser.parse_args() | |
whisper_device = 'cuda' if args.device == 'cuda' and torch.cuda.is_available() else 'cpu' | |
whisper_model = whisper.load_model("small", device=whisper_device) | |
temp_dir = tempfile.mkdtemp() | |
audio_path = os.path.join(temp_dir, "audio.wav") | |
try: | |
download_video(args.url, temp_dir) | |
video_file = next((f for f in os.listdir(temp_dir) if f.endswith(".mp4")), None) | |
if not video_file: | |
raise FileNotFoundError("No .mp4 file found in temp dir") | |
extract_audio(os.path.join(temp_dir, video_file), audio_path) | |
transcript, segments, language = transcribe(audio_path, whisper_model) | |
top_accent, confidence, top3 = classify_accent(audio_path) | |
fluency = compute_fluency(segments) | |
result = { | |
"accent": top_accent, | |
"accent_confidence": confidence, | |
"top_3_predictions": top3, | |
"fluency_score": fluency, | |
"language_detected_by_whisper": language, | |
"transcript_sample": transcript[:300] | |
} | |
print(json.dumps(result, indent=2)) | |
if args.output: | |
with open(args.output, 'w') as f: | |
json.dump(result, f, indent=2) | |
logger.info(f"Saved output to {args.output}") | |
except Exception as e: | |
logger.error(f"FAILED: {e}") | |
finally: | |
if args.keep: | |
logger.info(f"Temporary files kept in: {temp_dir}") | |
else: | |
shutil.rmtree(temp_dir) | |
if __name__ == "__main__": | |
main() |