import gradio as gr from transformers import pipeline import torch # Load model Whisper medium fine-tuned Indonesia (paling direkomendasikan untuk bahasa Indo) device = "cuda" if torch.cuda.is_available() else "cpu" pipe = pipeline( "automatic-speech-recognition", model="cahya/whisper-medium-id", device=device, torch_dtype=torch.float16 if device == "cuda" else torch.float32, ) # Force bahasa Indonesia biar lebih akurat pipe.model.config.forced_decoder_ids = pipe.tokenizer.get_decoder_prompt_ids(language="id", task="transcribe") def transcribe(audio): if audio is None: return "Silakan rekam suara atau upload file audio dulu ya!" try: text = pipe(audio, chunk_length_s=30, max_new_tokens=256)["text"] return text.strip().capitalize() + "." except Exception as e: return f"Error: {str(e)} (coba audio lebih pendek)" # Interface Gradio yang bagus with gr.Blocks(title="Transkripsi Suara Bahasa Indonesia 🇮🇩") as demo: gr.Markdown("# Demo Transkripsi Suara ke Teks Bahasa Indonesia") gr.Markdown("Rekam via mikrofon atau upload audio (.wav/.mp3) → langsung jadi teks akurat! Model: [cahya/whisper-medium-id](https://huggingface.co/cahya/whisper-medium-id) – fine-tuned khusus Indo.") with gr.Row(): with gr.Column(scale=1): audio_input = gr.Audio( sources=["microphone", "upload"], type="filepath", label="Rekam atau Upload Audio" ) with gr.Column(scale=2): text_output = gr.Textbox(label="Hasil Transkripsi", lines=10, placeholder="Hasil akan muncul di sini...") btn = gr.Button("Transkripsi Sekarang!", variant="primary", size="lg") btn.click(fn=transcribe, inputs=audio_input, outputs=text_output) gr.Markdown("### Tips biar akurat:") gr.Markdown("- Audio pendek (<60 detik) lebih cepat & bagus hasilnya.") gr.Markdown("- Bicara jelas, coba contoh: 'Halo, apa kabar? Hari ini saya mau ke pasar beli sayuran segar.'") gr.Markdown("- Kalau Space lambat, tunggu build selesai atau upgrade ke ZeroGPU (gratis).") demo.launch()